13e12c5d1SDavid du Colombier #include <sys/types.h> 23e12c5d1SDavid du Colombier #include <sys/limits.h> 33e12c5d1SDavid du Colombier #include <fcntl.h> 4219b2ee8SDavid du Colombier #include <ureg.h> 53e12c5d1SDavid du Colombier 6219b2ee8SDavid du Colombier typedef struct Ureg Ureg; 7219b2ee8SDavid du Colombier 8219b2ee8SDavid du Colombier /* mux buf for selecting (see _buf.c) */ 9219b2ee8SDavid du Colombier enum { 10219b2ee8SDavid du Colombier READMAX = 8192, /* read at most this much with _READ */ 11219b2ee8SDavid du Colombier PERFDMAX = 2*READMAX, /* stop _READing an fd when it has this much */ 12219b2ee8SDavid du Colombier INITBUFS = 4, /* allow enough room for this many PERFDMAX */ 13219b2ee8SDavid du Colombier }; 14219b2ee8SDavid du Colombier 15219b2ee8SDavid du Colombier typedef struct Muxbuf { 16219b2ee8SDavid du Colombier int n; /* # unprocessed chars in buf */ 17219b2ee8SDavid du Colombier unsigned char* putnext; /* place for copy process to put next data */ 18219b2ee8SDavid du Colombier unsigned char* getnext; /* place for parent process to get next data */ 19*e44fe4caSDavid du Colombier char fd; /* fd for which this is a buffer */ 20219b2ee8SDavid du Colombier unsigned char eof; /* true if eof after current data exhausted */ 21219b2ee8SDavid du Colombier unsigned char roomwait; /* true if copy process is waiting for room */ 22219b2ee8SDavid du Colombier unsigned char datawait; /* true if parent process is waiting for data */ 23219b2ee8SDavid du Colombier int copypid; /* pid of copyproc */ 24219b2ee8SDavid du Colombier unsigned char data[PERFDMAX]; 25219b2ee8SDavid du Colombier } Muxbuf; 26219b2ee8SDavid du Colombier 27219b2ee8SDavid du Colombier /* be sure to change _fdinfo[] init in _fdinfo if you change this */ 283e12c5d1SDavid du Colombier typedef struct Fdinfo{ 293e12c5d1SDavid du Colombier unsigned long flags; 303e12c5d1SDavid du Colombier unsigned long oflags; 31219b2ee8SDavid du Colombier uid_t uid; 32219b2ee8SDavid du Colombier gid_t gid; 333e12c5d1SDavid du Colombier char *name; 34219b2ee8SDavid du Colombier /* 35219b2ee8SDavid du Colombier * the following is used if flags&FD_BUFFERED 36219b2ee8SDavid du Colombier */ 37219b2ee8SDavid du Colombier Muxbuf *buf; /* holds buffered data and state */ 383e12c5d1SDavid du Colombier } Fdinfo; 393e12c5d1SDavid du Colombier 403e12c5d1SDavid du Colombier /* #define FD_CLOEXEC 1 is in fcntl.h */ 413e12c5d1SDavid du Colombier 423e12c5d1SDavid du Colombier #define FD_ISOPEN 0x2 433e12c5d1SDavid du Colombier #define FD_BUFFERED 0x4 44219b2ee8SDavid du Colombier #define FD_BUFFEREDX 0x8 45219b2ee8SDavid du Colombier #define FD_ISTTY 0x20 463e12c5d1SDavid du Colombier 47219b2ee8SDavid du Colombier #define MAXSIG SIGUSR2 483e12c5d1SDavid du Colombier 49219b2ee8SDavid du Colombier extern Fdinfo _fdinfo[]; 50219b2ee8SDavid du Colombier 513e12c5d1SDavid du Colombier extern int _finishing; 523e12c5d1SDavid du Colombier extern int _sessleader; 53219b2ee8SDavid du Colombier extern void (*_sighdlr[])(int, char*, Ureg*); 543e12c5d1SDavid du Colombier extern char *_sigstring(int); 553e12c5d1SDavid du Colombier extern int _stringsig(char *); 563e12c5d1SDavid du Colombier extern long _psigblocked; 573e12c5d1SDavid du Colombier extern int _startbuf(int); 58219b2ee8SDavid du Colombier extern int _selbuf(int); 59219b2ee8SDavid du Colombier extern void _closebuf(int); 60219b2ee8SDavid du Colombier extern int _readbuf(int, void*, int, int); 61219b2ee8SDavid du Colombier extern void _detachbuf(void); 623e12c5d1SDavid du Colombier extern void _finish(int, char *); 633e12c5d1SDavid du Colombier extern char *_ultoa(char *, unsigned long); 643e12c5d1SDavid du Colombier extern int _notehandler(void *, char *); 65219b2ee8SDavid du Colombier extern void _notetramp(int, void (*)(int, char*, Ureg*), Ureg*); 663e12c5d1SDavid du Colombier extern void _syserrno(void); 673e12c5d1SDavid du Colombier extern int _getpw(int *, char **, char **); 68219b2ee8SDavid du Colombier extern int _isatty(int); 69219b2ee8SDavid du Colombier extern void _fdinit(char*, char*); 70219b2ee8SDavid du Colombier 71219b2ee8SDavid du Colombier 72*e44fe4caSDavid du Colombier void checkbug(char *, int); 73