13e12c5d1SDavid du Colombier #include <sys/types.h> 23e12c5d1SDavid du Colombier #include <sys/limits.h> 33e12c5d1SDavid du Colombier #include <fcntl.h> 4*219b2ee8SDavid du Colombier #include <ureg.h> 53e12c5d1SDavid du Colombier 6*219b2ee8SDavid du Colombier typedef struct Ureg Ureg; 7*219b2ee8SDavid du Colombier 8*219b2ee8SDavid du Colombier /* mux buf for selecting (see _buf.c) */ 9*219b2ee8SDavid du Colombier enum { 10*219b2ee8SDavid du Colombier READMAX = 8192, /* read at most this much with _READ */ 11*219b2ee8SDavid du Colombier PERFDMAX = 2*READMAX, /* stop _READing an fd when it has this much */ 12*219b2ee8SDavid du Colombier INITBUFS = 4, /* allow enough room for this many PERFDMAX */ 13*219b2ee8SDavid du Colombier }; 14*219b2ee8SDavid du Colombier 15*219b2ee8SDavid du Colombier typedef struct Muxbuf { 16*219b2ee8SDavid du Colombier int n; /* # unprocessed chars in buf */ 17*219b2ee8SDavid du Colombier unsigned char* putnext; /* place for copy process to put next data */ 18*219b2ee8SDavid du Colombier unsigned char* getnext; /* place for parent process to get next data */ 19*219b2ee8SDavid du Colombier unsigned char fd; /* fd for which this is a buffer */ 20*219b2ee8SDavid du Colombier unsigned char eof; /* true if eof after current data exhausted */ 21*219b2ee8SDavid du Colombier unsigned char roomwait; /* true if copy process is waiting for room */ 22*219b2ee8SDavid du Colombier unsigned char datawait; /* true if parent process is waiting for data */ 23*219b2ee8SDavid du Colombier int copypid; /* pid of copyproc */ 24*219b2ee8SDavid du Colombier unsigned char data[PERFDMAX]; 25*219b2ee8SDavid du Colombier } Muxbuf; 26*219b2ee8SDavid du Colombier 27*219b2ee8SDavid 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; 31*219b2ee8SDavid du Colombier uid_t uid; 32*219b2ee8SDavid du Colombier gid_t gid; 333e12c5d1SDavid du Colombier char *name; 34*219b2ee8SDavid du Colombier /* 35*219b2ee8SDavid du Colombier * the following is used if flags&FD_BUFFERED 36*219b2ee8SDavid du Colombier */ 37*219b2ee8SDavid 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 44*219b2ee8SDavid du Colombier #define FD_BUFFEREDX 0x8 45*219b2ee8SDavid du Colombier #define FD_ISTTY 0x20 463e12c5d1SDavid du Colombier 47*219b2ee8SDavid du Colombier #define MAXSIG SIGUSR2 483e12c5d1SDavid du Colombier 49*219b2ee8SDavid du Colombier extern Fdinfo _fdinfo[]; 50*219b2ee8SDavid du Colombier 513e12c5d1SDavid du Colombier extern int _finishing; 523e12c5d1SDavid du Colombier extern int _sessleader; 53*219b2ee8SDavid 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); 58*219b2ee8SDavid du Colombier extern int _selbuf(int); 59*219b2ee8SDavid du Colombier extern void _closebuf(int); 60*219b2ee8SDavid du Colombier extern int _readbuf(int, void*, int, int); 61*219b2ee8SDavid 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 *); 65*219b2ee8SDavid 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 **); 68*219b2ee8SDavid du Colombier extern int _isatty(int); 69*219b2ee8SDavid du Colombier extern void _fdinit(char*, char*); 70*219b2ee8SDavid du Colombier 71*219b2ee8SDavid du Colombier 72