File: qpage.h

package info (click to toggle)
qpage 3.3final-1
  • links: PTS
  • area: non-free
  • in suites: potato
  • size: 648 kB
  • ctags: 330
  • sloc: ansic: 5,421; makefile: 156; sh: 48
file content (316 lines) | stat: -rw-r--r-- 8,766 bytes parent folder | download | duplicates (2)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
/*
** This is the header file for qpage.  It should not necessary to
** change anything in this file.  Edit config.input as appropriate
** and then type "./configure" to create a customized config.h for
** your system.  Then just type "make" to build qpage.
*/
#include	"config.h"


#define		PROGRAM_NAME		"qpage"


#ifndef		TRUE
#define		TRUE			1
#endif
#ifndef		FALSE
#define		FALSE			0
#endif


/*
** tell lint to shut up
*/
#ifdef lint
#define		printf			(void)printf
#define		fprintf			(void)fprintf
#endif

#define		VERSION			"3.3"
#define		COMMENTS_ANYWHERE

#ifndef		QPAGE_CONFIG
#define		QPAGE_CONFIG		"/etc/qpage.cf"
#endif

#ifndef		DEFAULT_LOCKDIR
#define		DEFAULT_LOCKDIR		"/var/spool/locks"
#endif

#ifndef		SYSLOG_FACILITY
#define		SYSLOG_FACILITY		LOG_DAEMON
#endif

#ifndef		HAVE_STRERROR
extern char	*sys_errlist[];
#define		strerror(x)		sys_errlist[x]
#endif

#ifndef		SNPP_SERVER
#define		SNPP_SERVER		"localhost"
#endif

#ifndef		DAEMON_USER
#define		DAEMON_USER		"nobody"
#endif

#define		SNPP_SVC_NAME		"snpp"
#define		SNPP_SVC_PORT		444

#define		MAXMSGSIZE		250 /* imposed by TAP blocksize */

#define		MAXBADCOMMANDS		10
#define		BUFCHUNKSIZE		1024

#define		DEFAULT_LEVEL		1
#define		DEFAULT_IDENTTIMEOUT	10
#define		DEFAULT_SNPPTIMEOUT	60
#define		DEFAULT_QUEUEDIR	"/var/spool/qpage"

/*
** default values for paging services
*/
#define		DEFAULT_INITCMD		"ATZ"
#define		DEFAULT_DIALCMD		"ATDT"
#define		DEFAULT_BAUDRATE	B300
#define		DEFAULT_PARITY		EVEN	/* see parity_t below */
#define		DEFAULT_MAXMSGSIZE	80
#define		DEFAULT_MAXPAGES	9
#define		DEFAULT_MAXTRIES	6
#define		DEFAULT_IDENTFROM	TRUE
#define		DEFAULT_ALLOWPID	FALSE
#define		DEFAULT_STRIP		TRUE
#define		DEFAULT_PREFIX		TRUE

/*
** service level at which e-mail notifications shold be sent
*/
#define		LEVEL_SENDMAIL		0

#define		F_SENT			(1<<0) /* msg sent successfully */
#define		F_FAILED		(1<<1) /* msg failed */
#define		F_BUSY			(1<<2) /* modem got BUSY */
#define		F_NOCARRIER		(1<<3) /* modem got NO CARRIER */
#define		F_NOMODEM		(1<<4) /* modem was unavailable */
#define		F_FORCED		(1<<5) /* remote sent <RS> */
#define		F_NOPROMPT		(1<<6) /* didn't find ID= prompt */
#define		F_UNKNOWN		(1<<7) /* unknown error */
#define		F_REJECT		(1<<8) /* page rejected by service */
#define		F_RAWPID		(1<<9) /* user specified a PID */
#define		F_SENDMAIL		(1<<10) /* send mail to sender */
#define		F_SENTMAIL		(1<<11) /* sent mail to sender */
#define		F_SENTADMIN		(1<<12) /* sent mail to administrator */
#define		F_BADPAGE		(1<<13) /* the entire page is bad */

#define		CALLSTATUSFLAGS		0x01ff /* per-call status flags */

#define		CHAR_STX		'\002'
#define		CHAR_ETX		'\003'
#define		CHAR_ETB		'\027'
#define		CHAR_US			'\037'

#define		INVALID_TIME		((time_t)-1)


/*
** select.h is broken for Solaris 2.x.  It defines FD_ZERO
** as a macro which calls memset().  Unfortunately memset()
** returns a value, which means FD_ZERO returns a value,
** contrary to the description in the "select" man page.
**
** We cannot blindly cast this to (void) at compile time
** because it breaks on some platforms (e.g. Linux).
*/
#if defined(lint) && defined(SOLARIS2)
#define		FD_ZERO_LINTED(x)	(void)FD_ZERO(x)
#else
#define		FD_ZERO_LINTED(x)	FD_ZERO(x)
#endif


enum parity {
	NONE = 0,
	ODD = 1,
	EVEN = 2
};
typedef enum parity parity_t;


struct modem {
	struct modem		*next;		/* next node in the list */
	char			*name;		/* name of this modem */
	char			*text;		/* optional text description */
	char			*device;	/* path to modem device */
	char			*initcmd;	/* initialization command */
	char			*dialcmd;	/* dial command */
};
typedef struct modem modem_t;


struct service {
	struct service		*next;		/* next node in the list */
	char			*name;		/* name of the service */
	char			*text;		/* optional text description */
	char			*device;	/* path to modem device */
	char			*dialcmd;	/* dial command */
	char			*phone;		/* IXO/TAP phone number */
	char			*password;	/* service password */
	int			baudrate;	/* modem speed */
	parity_t		parity;		/* modem parity */
	int			maxmsgsize;	/* max length of a page */
	int			maxpages;	/* max segments per page */
	int			maxtries;	/* max tries per page */
	int			identfrom;	/* who page is from */
	int			allowpid;	/* page must be in qpage.cf? */ 
	int			msgprefix;	/* prefix msgs with <from> */ 
	int			flags;		/* not used at this time */
};
typedef struct service service_t;


struct pager {
	struct pager		*next;		/* next node in the list */
	char			*name;		/* name of this entry */
	char			*text;		/* optional text description */
	char			*pagerid;	/* IXO pagerid */
	service_t		*service;	/* associated paging service */
	int			flags;		/* status flags */
};
typedef struct pager pager_t;


struct member {
	struct member		*next;		/* next node in the list */
	pager_t			*pager;		/* list member */
	char			*schedule;	/* when this member is valid */
	int			flags;		/* status flags */
};
typedef struct member member_t;


struct pgroup {
	struct pgroup		*next;		/* next node in the list */
	char			*name;		/* name of this group */
	char			*text;		/* optional text description */
	member_t		*members;	/* list of group members */
	int			flags;		/* status flags */
};
typedef struct pgroup pgroup_t;


struct rcpt {
	struct rcpt		*next;		/* next node in the list */
	char			*pager;		/* name of this recipient */
	char			*coverage;	/* name of paging service */
	time_t			holduntil;	/* hold page until this time */
	time_t			lasttry;	/* time of last page attempt */
	int			goodtries;	/* number of dial attempts */
	int			tries;		/* total number of attempts */
	int			level;		/* level of service */
	int			flags;		/* status flags */
};
typedef struct rcpt rcpt_t;


typedef struct page {
	struct page		*next;		/* next node in the list */
	FILE			*peer;		/* connected TCP socket */
	char			*filename;	/* name of queue file */
	rcpt_t			*rcpts;		/* recipient list */
	time_t			created;	/* time page was submitted */
	char			*message;	/* page contents */
	char			*messageid;	/* unique ID */
	char			*auth;		/* authenticated submitter */
	char			*ident;		/* RFC-1413 results */
	char			*from;		/* CALLerid argument */
	char			*hostname;	/* page origin */
	char			*status;	/* IXO status */
	int			flags;		/* status flags */
} PAGE;


struct job {
	struct job		*next;		/* next node in the list */
	PAGE			*p;		/* page structure */
	rcpt_t			*rcpt;		/* single recipient */
	service_t		*service;	/* associated service */
	pager_t			*pager;		/* name of recipient */
};
typedef struct job job_t;


/*
** global variables
*/
extern int		Debug;
extern int		Silent;
extern int		Interactive;
extern int		IdentTimeout;
extern int		SNPPTimeout;
extern volatile int	JobsPending;
extern volatile int	ReReadConfig;
extern int		Synchronous;
extern char		*PIDfile;
extern char		*ConfigFile;
extern char		*Administrator;
extern char		*ForceHostname;
extern char		*SigFile;
extern char		*QueueDir;
extern char		*LockDir;
extern service_t	*Services;
extern pager_t		*Pagers;
extern pgroup_t		*Groups;
extern modem_t		*Modems;

#ifndef CLIENT_ONLY
extern jmp_buf		TimeoutEnv;
#endif

/*
** misc functions
*/
extern void		*lookup(void *list, char *name);
extern void		*my_realloc(void *ptr, int len);
extern void		my_free(void *ptr);
extern void		clear_page(PAGE *p, int save);
extern void		send_pages(job_t *jobs);
extern void		read_mail(PAGE *p);
extern void		qpage_log(int pri, char *fmt, ...);
extern time_t		snpptime(char *arg);
extern time_t		parse_time(char *str);
extern int		become_daemon(int sleeptime, short port);
extern int		submit_page(PAGE *p, char *server);
extern int		lock_file(int fd, int mode, int block);
extern int		lock_queue(void);
extern int		write_page(PAGE *p, int new);
extern int		runqueue(void);
extern int		insert_jobs(job_t **joblist, PAGE *p);
extern int		lock_modem(char *device);
extern void		unlock_modem(char *device);
extern char		*ident(int peer);
extern char		*getinput(FILE *fp, int oneline);
extern char		*get_user(void);
extern char		*safe_string(char *str);
extern char		*safe_strtok(char *str, char *sep, char **l, char *r);
extern char		*strjoin(char *str1, char *str2);
extern int		get_qpage_config(char *filename);
extern int		on_duty(char *schedule, time_t when);
extern int		showqueue(void);
extern char		*my_ctime(time_t *clock);
extern char		*msgcpy(char *dst, char *src, int len);
extern void		strip(char **str);
extern void		get_sysinfo(void);
extern void		notify_submitter(PAGE *p);
extern void		notify_administrator(PAGE *p);
extern void		newmsgid(char *buff);
extern void		drop_root_privileges(void);
extern void		dump_qpage_config(char *filename);

/*
** signal handlers
*/
extern void		sigalrm(void);
extern void		sigchld(void);
extern void		sighup(void);
extern void		sigterm(void);
extern void		sigusr1(void);