#include "stdio.h"
#include "sys/types.h"
#include "memory.h"
#include "string.h"
#include "pwd.h"
#include "fcntl.h"
#include "errno.h"
#include "signal.h"
#include "unistd.h"
#include "stdlib.h"
#include "lp.h"
#include "access.h"
#include "form.h"
#include "requests.h"
#include "filters.h"
#include "printers.h"
#include "class.h"
#include "users.h"
#include "secure.h"
#include "msgs.h"
#include "nodes.h"
#define PST_MAX 8
# define PST_BRK 0
# define PST_NAME 1
# define PST_STATUS 2
# define PST_DATE 3
# define PST_DISREAS 4
# define PST_REJREAS 5
# define PST_PWHEEL 6
# define PST_FORM 7
#define CST_MAX 5
# define CST_BRK 0
# define CST_NAME 1
# define CST_STATUS 2
# define CST_DATE 3
# define CST_REJREAS 4
#define EXEC_EXIT_OKAY 0
#define EXEC_EXIT_USER 0177
#define EXEC_EXIT_NMASK 0340
#define EXEC_EXIT_FAULT 0201
#define EXEC_EXIT_HUP 0202
#define EXEC_EXIT_INTR 0203
#define EXEC_EXIT_PIPE 0204
#define EXEC_EXIT_EXIT 0237
#define EXEC_EXIT_NDIAL 0240
#define EXEC_EXIT_NPORT 0300
#define EXEC_EXIT_TMOUT 0301
#define EXEC_EXIT_NOPEN 0340
#define EXEC_EXIT_NEXEC 0341
#define EXEC_EXIT_NOMEM 0342
#define EXEC_EXIT_NFORK 0343
#define EXEC_EXIT_NPUSH 0344
#define EXIT_RETRY 129
#define KILLED(x) (!(x & 0xFF00)? (x & 0x7F) : 0)
#define EXITED(x) (!(x & 0xFF)? ((x >> 8) & 0xFF) : -1)
#define EV_SLOWF 1
#define EV_INTERF 2
#define EV_NOTIFY 3
#define EV_LATER 4
#define EV_ALARM 5
#define EV_MESSAGE 6
#define EV_ENABLE 7
#define EV_FORM_MESSAGE 8
#define CLOCK_TICK 10
#define MINUTE (60/CLOCK_TICK)
#define WHEN_FORK (MINUTE)
#define WHEN_PRINTER (1*MINUTE)
#define A_PRINTER 1
#define A_PWHEEL 2
#define A_FORM 3
#define DISABLE_STOP 0
#define DISABLE_FINISH 1
#define DISABLE_CANCEL 2
#define validate_request(PRS,PREFIXP,MOVING) \
_validate((PRS), (PSTATUS *)0, (PSTATUS *)0, (PREFIXP), (MOVING))
#define evaluate_request(PRS,PPS,MOVING) \
_validate((PRS), (PPS), (PSTATUS *)0, (char **)0, (MOVING))
#define reevaluate_request(PRS,PPS) \
_validate((PRS), (PSTATUS *)0, (PPS), (char **)0, 0)
#define NEEDS_FILTERING(PRS) \
((PRS)->slow && !((PRS)->request->outcome & RS_FILTERED))
#define isadmin(ID) (!(ID) || (ID) == Lp_Uid)
#define makereqerr(PRS) \
makepath( \
Lp_Temp, \
getreqno((PRS)->secure->req_id), \
(char *)0 \
)
#define EVER ;;
#define DEFAULT_SHELL "/bin/sh"
#define BINMAIL "/bin/mail"
#define BINWRITE "/bin/write"
#define RMCMD "/usr/bin/rm -f"
#if defined(MLISTENDEL_WORKS)
#define DROP_MD(MD) if (MD) { \
mlistendel (MD); \
mdisconnect (MD); \
MD = 0; \
} else
#else
#define DROP_MD(MD) if (MD) { \
Close ((MD)->readfd); \
if ((MD)->writefd == (MD)->readfd) \
(MD)->writefd = -1; \
(MD)->readfd = -1; \
MD = 0; \
} else
#endif
typedef int (*qchk_fnc_type)( RSTATUS * );
CLASS * Getclass ( char * );
extern void GetRequestFiles(REQUEST *req, char *buffer, int length);
PRINTER * Getprinter ( char * );
PWHEEL * Getpwheel ( char * );
REQUEST * Getrequest ( char * );
RSTATUS * request_by_id ( char * );
RSTATUS * request_by_id_num ( long );
RSTATUS * request_by_jobid ( char * , char * );
SECURE * Getsecure ( char * );
USER * Getuser ( char * );
_FORM * Getform ( char * );
char * _alloc_files ( int , char * , uid_t , gid_t);
char * dispatchName(int);
char * statusName(int);
char * getreqno ( char * );
int Loadfilters ( char * );
int Putsecure(char *, SECURE *);
int cancel ( RSTATUS * , int );
int disable ( PSTATUS * , char * , int );
int enable ( PSTATUS * );
int exec ( int , ... );
int one_printer_with_charsets ( RSTATUS * );
int open_dialup ( char * , PRINTER * );
int open_direct ( char * , PRINTER * );
int qchk_filter ( RSTATUS * );
int qchk_form ( RSTATUS * );
int qchk_pwheel ( RSTATUS * );
int qchk_waiting ( RSTATUS * );
int queue_repel ( PSTATUS * , int , int (*)( RSTATUS * ) );
int rsort ( RSTATUS ** , RSTATUS ** );
long getkey ( void );
long _alloc_req_id ( void );
off_t chfiles ( char ** , uid_t , gid_t );
short _validate ( RSTATUS * , PSTATUS * , PSTATUS * , char ** , int );
void add_flt_act ( MESG * , ... );
void alert ( int , ... );
void cancel_alert ( int , ... );
void check_children ( void );
void check_form_alert ( FSTATUS * , _FORM * );
void check_pwheel_alert ( PWSTATUS * , PWHEEL * );
void check_request ( RSTATUS * );
void del_flt_act ( MESG * , ... );
void dial_problem ( PSTATUS * , RSTATUS * , int );
void dispatch ( int , char * , MESG * );
void dowait ( void );
void dump_cstatus ( void );
void dump_fault_status(PSTATUS *);
void dump_pstatus ( void );
void dump_status ( void );
void execlog ( char * , ... );
void fail ( char * , ... );
void free_form ( _FORM * );
void freerstatus ( register RSTATUS * );
void init_memory ( void );
void init_messages ( void );
void insertr ( RSTATUS * );
void load_sdn ( char ** , SCALED );
void load_status ( void );
void load_str ( char ** , char * );
void lp_endpwent ( void );
void lp_setpwent ( void );
void lpfsck ( void );
void lpshut ( int );
void mallocfail ( void );
void maybe_schedule ( RSTATUS * );
void note ( char * , ... );
void notify ( RSTATUS * , char * , int , int , int );
void printer_fault ( PSTATUS * , RSTATUS * , char * , int );
void clear_printer_fault ( PSTATUS * , char * );
void putjobfiles ( RSTATUS * );
void queue_attract ( PSTATUS * , int (*)( RSTATUS * ) , int );
void queue_check ( int (*)( RSTATUS * ) );
void queue_form ( RSTATUS * , FSTATUS * );
void queue_pwheel ( RSTATUS * , char * );
void remount_form(register PSTATUS *, FSTATUS *, short);
void remover ( RSTATUS * );
void rmfiles ( RSTATUS * , int );
void rmreq ( RSTATUS * );
void schedule ( int , ... );
void take_message ( void );
void terminate ( EXEC * );
void unload_list ( char *** );
void unload_str ( char ** );
void unqueue_form ( RSTATUS * );
void unqueue_pwheel ( RSTATUS * );
void update_req ( char * , long );
int isFormMountedOnPrinter ( PSTATUS *, FSTATUS * );
int isFormUsableOnPrinter ( PSTATUS *, FSTATUS * );
char *allTraysWithForm ( PSTATUS *, FSTATUS * );
extern int list_append(void ***, void *);
extern void list_remove(void ***, void *);
extern RSTATUS *new_rstatus(REQUEST *, SECURE *);
extern PSTATUS *new_pstatus(PRINTER *);
extern CLSTATUS *new_cstatus(CLASS *);
extern FSTATUS *new_fstatus(_FORM *f);
extern PWSTATUS *new_pwstatus(PWHEEL *p);
extern ALERT *new_alert(char *fmt, int i);
extern EXEC *new_exec(int type, void *ex);
extern void pstatus_add_printer(PSTATUS *, PRINTER *);
extern void free_exec(EXEC *);
extern void free_alert(ALERT *);
extern void free_pwstatus(PWSTATUS *);
extern void free_fstatus(FSTATUS *);
extern void free_cstatus(CLSTATUS *);
extern void free_pstatus(PSTATUS *);
extern void free_rstatus(RSTATUS *);
extern CLSTATUS *search_cstatus ( char * );
extern FSTATUS *search_fptable(register char *);
extern FSTATUS *search_fstatus ( char * );
extern PSTATUS *search_pstatus ( char * );
extern PWSTATUS *search_pwstatus ( char * );
extern FSTATUS *form_in_question;
extern char *pwheel_in_question;
extern CLSTATUS **CStatus;
extern PSTATUS **PStatus;
extern FSTATUS **FStatus;
extern PWSTATUS **PWStatus;
extern EXEC **Exec_Table;
extern EXEC **Exec_Slow,
**Exec_Notify;
extern RSTATUS *Request_List;
extern RSTATUS *NewRequest;
extern int ET_SlowSize,
ET_NotifySize;
#if defined(DEBUG)
#define DB_ABORT 0x00000008
#define DB_SDB 0x00000020
#define DB_ALL 0xFFFFFFFF
extern unsigned long debug;
#endif
extern char *Local_System,
*SHELL;
extern int lock_fd;
extern uid_t Lp_Uid;
extern gid_t Lp_Gid;
extern int Starting,
OpenMax,
Sig_Alrm,
DoneChildren,
am_in_background,
Shutdown;
extern unsigned long chkprinter_result;
#if defined(MDL)
#include "mdl.h"
#endif
# define CLOSE_ON_EXEC(fd) (void) Fcntl(fd, F_SETFD, 1)