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);
|