2 |
- |
1 |
#include <sys/types.h>
|
|
|
2 |
#include <sys/limits.h>
|
|
|
3 |
#include <fcntl.h>
|
|
|
4 |
#include <ureg.h>
|
|
|
5 |
|
|
|
6 |
typedef struct Ureg Ureg;
|
|
|
7 |
|
|
|
8 |
/* mux buf for selecting (see _buf.c) */
|
|
|
9 |
enum {
|
|
|
10 |
READMAX = 8192, /* read at most this much with _READ */
|
|
|
11 |
PERFDMAX = 2*READMAX, /* stop _READing an fd when it has this much */
|
|
|
12 |
INITBUFS = 4, /* allow enough room for this many PERFDMAX */
|
|
|
13 |
};
|
|
|
14 |
|
|
|
15 |
typedef struct Muxbuf {
|
|
|
16 |
int n; /* # unprocessed chars in buf */
|
|
|
17 |
unsigned char* putnext; /* place for copy process to put next data */
|
|
|
18 |
unsigned char* getnext; /* place for parent process to get next data */
|
|
|
19 |
char fd; /* fd for which this is a buffer */
|
|
|
20 |
unsigned char eof; /* true if eof after current data exhausted */
|
|
|
21 |
unsigned char roomwait; /* true if copy process is waiting for room */
|
|
|
22 |
unsigned char datawait; /* true if parent process is waiting for data */
|
|
|
23 |
int copypid; /* pid of copyproc */
|
|
|
24 |
unsigned char data[PERFDMAX];
|
|
|
25 |
} Muxbuf;
|
|
|
26 |
|
|
|
27 |
/* be sure to change _fdinfo[] init in _fdinfo if you change this */
|
|
|
28 |
typedef struct Fdinfo{
|
|
|
29 |
unsigned long flags;
|
|
|
30 |
unsigned long oflags;
|
|
|
31 |
uid_t uid;
|
|
|
32 |
gid_t gid;
|
|
|
33 |
char *name;
|
|
|
34 |
/*
|
|
|
35 |
* the following is used if flags&FD_BUFFERED
|
|
|
36 |
*/
|
|
|
37 |
Muxbuf *buf; /* holds buffered data and state */
|
|
|
38 |
} Fdinfo;
|
|
|
39 |
|
|
|
40 |
/* #define FD_CLOEXEC 1 is in fcntl.h */
|
|
|
41 |
|
|
|
42 |
#define FD_ISOPEN 0x2
|
|
|
43 |
#define FD_BUFFERED 0x4
|
|
|
44 |
#define FD_BUFFEREDX 0x8
|
|
|
45 |
#define FD_ISTTY 0x20
|
|
|
46 |
|
|
|
47 |
#define MAXSIG SIGUSR2
|
|
|
48 |
|
|
|
49 |
extern Fdinfo _fdinfo[];
|
|
|
50 |
|
|
|
51 |
extern int _finishing;
|
|
|
52 |
extern int _sessleader;
|
|
|
53 |
extern void (*_sighdlr[])(int, char*, Ureg*);
|
|
|
54 |
extern char *_sigstring(int);
|
|
|
55 |
extern int _stringsig(char *);
|
|
|
56 |
extern long _psigblocked;
|
|
|
57 |
extern int _startbuf(int);
|
|
|
58 |
extern int _selbuf(int);
|
|
|
59 |
extern void _closebuf(int);
|
|
|
60 |
extern int _readbuf(int, void*, int, int);
|
|
|
61 |
extern void _detachbuf(void);
|
|
|
62 |
extern void _finish(int, char *);
|
|
|
63 |
extern char *_ultoa(char *, unsigned long);
|
|
|
64 |
extern int _notehandler(void *, char *);
|
|
|
65 |
extern void _notetramp(int, void (*)(int, char*, Ureg*), Ureg*);
|
|
|
66 |
extern void _syserrno(void);
|
|
|
67 |
extern int _getpw(int *, char **, char **);
|
|
|
68 |
extern int _isatty(int);
|
|
|
69 |
extern void _fdinit(char*, char*);
|
|
|
70 |
|
|
|
71 |
|
|
|
72 |
void checkbug(char *, int);
|