File: procServ.h

package info (click to toggle)
procserv 2.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, sid, stretch, trixie
  • size: 880 kB
  • ctags: 467
  • sloc: sh: 4,154; cpp: 1,684; ansic: 1,319; makefile: 32
file content (148 lines) | stat: -rw-r--r-- 4,379 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Process server for soft ioc
// David H. Thompson 8/29/2003
// Ralph Lange <ralph.lange@gmx.de> 2007-2016
// Michael Davidsaver 2017
// GNU Public License (GPLv3) applies - see www.gnu.org


#ifndef procServH
#define procServH

#include <ostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <poll.h>

#include <assert.h>
#include <stdio.h>
#include <time.h>

/* whether to enable UNIX domain sockets */
#ifdef __unix__
#include <sys/un.h>
# define USOCKS
#endif

#ifndef PRINTF
#define PRINTF if (inDebugMode) printf
#endif

#define PROCSERV_VERSION_STRING PACKAGE_STRING

extern bool   inDebugMode;
extern bool   logPortLocal;
extern bool   autoRestart;
extern bool   waitForManualStart;
extern volatile bool shutdownServer;
extern bool   setCoreSize;
extern char   *procservName;
extern char   *childName;
extern char   *ignChars;
extern const char   *timeFormat;
extern char   killChar;
extern char   toggleRestartChar;
extern char   restartChar;
extern char   quitChar;
extern char   logoutChar;
extern int    killSig;
extern const size_t INFO1LEN;
extern const size_t INFO2LEN;
extern const size_t INFO3LEN;
extern char   infoMessage1[];
extern char   infoMessage2[];
extern char   infoMessage3[];
extern pid_t  procservPid;
extern rlim_t coreSize;
extern char   *chDir;
extern time_t holdoffTime;

#define NL "\r\n"

#define CTL_SC(c) c > 0 && c < 32 ? "^" : "", c > 0 && c < 32 ? c + 64 : c

class connectionItem;

extern time_t procServStart; // Time when this IOC started
extern time_t IOCStart;      // Time when the current IOC was started

// Connection items call this to send messages to others
// This is a party line system, messages go to everyone
// the sender's this pointer keeps it from getting its own
// messages.
void SendToAll(const char * message,
               int count,
               const connectionItem * sender);

// Call this to add the item to the list of connections
void AddConnection(connectionItem *);
void DeleteConnection(connectionItem *ci);

// connectionItems are made in class factories so none of the
// constructors are public:

// processFactory creates the process that we are managing
connectionItem * processFactory(char *exe, char *argv[]);
bool processFactoryNeedsRestart(); // Call to test status of the server process
void processFactorySendSignal(int signal);

// clientFactory manages an open socket connected to a user
connectionItem * clientFactory(int ioSocket, bool readonly=false);

// acceptFactory opens a socket creating the inital listening
// service and calls clientFactory when clients are accepted
// local: restrict to localhost (127.0.0.1)
// readonly: discard any input from the client
connectionItem * acceptFactory( const char *spec, bool local=true, bool readonly=false );

extern connectionItem * processItem; // Set if it exists
 

// connectionItem class definition
// This is an abstract class that all of the other classes use
// 
class connectionItem
{
public:
    virtual ~connectionItem();

    // Called from main() when input from this client is ready to be read.
    virtual void readFromFd(void) = 0;

    // Send characters to this client.
    virtual int Send(const char * message, int count) = 0;
    virtual int Send(const char * stamp, int stamp_len,
                     const char * message, int count) { return Send(message, count); }

    virtual void markDeadIfChildIs(pid_t pid);   // called if parent receives sig child

    int getFd() const { return _fd; }
    bool IsDead() const { return _markedForDeletion; }

    // Return false unless you are the process item (processClass overloads)
    virtual bool isProcess() const { return false; }
    virtual bool isLogger() const { return _readonly; }

    virtual void writeAddress(std::ostream& fp) {}
protected:
    connectionItem ( int fd = -1, bool readonly = false );
    int _fd;                 // File descriptor of this connection
    bool _markedForDeletion; // True if this connection is dead
    bool _readonly;          // True if input has to be ignored
    bool _log_stamp_sent;    // Flag for timestamping log output

public:
    connectionItem * next,*prev;
    static connectionItem *head;

private:
    // This should never happen
    connectionItem(const connectionItem & item)
    {
        assert(0);
    };
};

#endif /* #ifndef procServH */