home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / gnu / g / bug / 2335 < prev    next >
Encoding:
Text File  |  1993-01-25  |  56.0 KB  |  2,212 lines

  1. Path: sparky!uunet!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!cis.ohio-state.edu!net1.ics.uci.edu!schmidt
  2. From: schmidt@net1.ics.uci.edu (Douglas C. Schmidt)
  3. Newsgroups: gnu.g++.bug
  4. Subject: internal compiler error
  5. Date: 25 Jan 1993 21:29:24 -0500
  6. Organization: GNUs Not Usenet
  7. Lines: 2199
  8. Sender: daemon@cis.ohio-state.edu
  9. Approved: bug-g++@prep.ai.mit.edu
  10. Distribution: gnu
  11. Message-ID: <9301251609.aa23582@Paris.ics.uci.edu>
  12.  
  13. Hi,
  14.  
  15.     The following file causes gcc 2.3.3 to fail on both Solaris
  16. 2.1 and Sun OS 4.1.2.
  17.  
  18.     Doug
  19.  
  20. ----------------------------------------
  21. % gcc -v x.C
  22. Reading specs from /opt/gnu/lib/gcc-lib/sparc-sun-solaris2/2.3.3/specs
  23. gcc version 2.3.3
  24.  /opt/gnu/lib/gcc-lib/sparc-sun-solaris2/2.3.3/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -Dsun -Dsparc -Dunix -D__svr4__ -D__sun__ -D__sparc__ -D__unix__ -D__svr4__ -D__sun -D__sparc -D__unix -D__svr4__ -Asystem(unix) -Acpu(sparc) -Amachine(sparc) x.C /i0/da/ud/schmidt/.trash/cca001nS.i
  25. GNU CPP version 2.3.3 (sparc)
  26.  /opt/gnu/lib/gcc-lib/sparc-sun-solaris2/2.3.3/cc1plus /i0/da/ud/schmidt/.trash/cca001nS.i -quiet -dumpbase x.cc -version -fdelayed-branch -fstrength-reduce -finline-functions -o /i0/da/ud/schmidt/.trash/cca001nS.s
  27. GNU C++ version 2.3.3 (sparc) compiled by GNU C version 2.3.3.
  28. x.C:0: warning: destructor `Local_IPC_SAP_Listener::~Local_IPC_SAP_Listener ()' non-virtual
  29. x.C:1913: warning: in inheritance relationship `Handle_L_Stream: Local_IPC_SAP_Listener'
  30. x.C:0: warning: destructor `Local_IPC_SAP_Dgram::~Local_IPC_SAP_Dgram ()' non-virtual
  31. x.C:1943: warning: in inheritance relationship `Handle_L_Dgram: Local_IPC_SAP_Dgram'
  32. x.C:0: warning: destructor `Local_IPC_SAP_CODgram::~Local_IPC_SAP_CODgram ()' non-virtual
  33. x.C:1968: warning: in inheritance relationship `Handle_L_CODgram: Local_IPC_SAP_CODgram'
  34. x.C:0: warning: destructor `Local_IPC_SAP_Listener::~Local_IPC_SAP_Listener ()' non-virtual
  35. x.C:1979: warning: in inheritance relationship `Handle_L_Pipe: Local_IPC_SAP_Listener'
  36. x.C:0: warning: destructor `IPC_SAP_Listener::~IPC_SAP_Listener ()' non-virtual
  37. x.C:2076: warning: in inheritance relationship `Handle_R_Stream: IPC_SAP_Listener'
  38. x.C:0: warning: destructor `IPC_SAP_Dgram::~IPC_SAP_Dgram ()' non-virtual
  39. x.C:2087: warning: in inheritance relationship `Handle_R_Dgram: IPC_SAP_Dgram'
  40. x.C:0: warning: destructor `IPC_SAP_Dgram::~IPC_SAP_Dgram ()' non-virtual
  41. x.C:2096: warning: in inheritance relationship `Handle_Broadcast: IPC_SAP_Dgram'
  42. x.C: In function `void  _GLOBAL_.I.local_stream ()':
  43. x.C:2161: Internal compiler error.
  44. x.C:2161: Please report this to `bug-g++@prep.ai.mit.edu'.
  45. ----------------------------------------
  46.  
  47. extern "C" {
  48. typedef struct  _physadr { int r[1]; } *physadr;
  49. typedef    struct    _label_t { int    val[2]; } label_t;
  50. typedef    unsigned char    lock_t;
  51. }
  52. extern "C" {
  53. typedef    unsigned char    uchar_t;
  54. typedef    unsigned short    ushort_t;
  55. typedef    unsigned int    uint_t;
  56. typedef    unsigned long    ulong_t;
  57. typedef    char *        caddr_t;
  58. typedef    long        daddr_t;
  59. typedef    long        off_t;
  60. typedef    short        cnt_t;
  61. typedef    ulong_t        paddr_t;
  62. typedef    uchar_t        use_t;
  63. typedef    short        sysid_t;
  64. typedef    short        index_t;
  65. typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
  66. typedef    union {
  67.     long    l[2];
  68.     double    d;
  69. } longlong_t;
  70. typedef    union {
  71.     unsigned long    l[2];
  72.     double        d;
  73. } u_longlong_t;
  74. typedef    longlong_t    offset_t;
  75. typedef    longlong_t    diskaddr_t;
  76. typedef union lloff {
  77.     offset_t    _f;
  78.     struct {
  79.         long _u;
  80.         off_t _l;
  81.     } _p;
  82. } lloff_t;
  83. typedef union lldaddr {
  84.     diskaddr_t    _f;
  85.     struct {
  86.         long _u;
  87.         daddr_t _l;
  88.     } _p;
  89. } lldaddr_t;
  90. typedef ulong_t k_fltset_t;
  91. typedef long        id_t;
  92. typedef ulong_t    major_t;
  93. typedef ulong_t    minor_t;
  94. typedef short    pri_t;
  95. typedef    ushort_t o_mode_t;
  96. typedef short    o_dev_t;
  97. typedef    ushort_t o_uid_t;
  98. typedef    o_uid_t    o_gid_t;
  99. typedef    short    o_nlink_t;
  100. typedef short    o_pid_t;
  101. typedef ushort_t o_ino_t;
  102. typedef    int    key_t;
  103. typedef    ulong_t    mode_t;
  104. typedef    long    uid_t;
  105. typedef    uid_t    gid_t;
  106. typedef    ulong_t nlink_t;
  107. typedef ulong_t    dev_t;
  108. typedef ulong_t    ino_t;
  109. typedef long    pid_t;
  110. typedef    uint_t    size_t;
  111. typedef int    ssize_t;
  112. typedef    long        time_t;
  113. typedef    long        clock_t;
  114. typedef    unsigned char    unchar;
  115. typedef    unsigned short    ushort;
  116. typedef    unsigned int    uint;
  117. typedef    unsigned long    ulong;
  118. typedef    long    hostid_t;
  119. typedef unsigned char    u_char;
  120. typedef unsigned short    u_short;
  121. typedef unsigned int    u_int;
  122. typedef unsigned long    u_long;
  123. typedef struct _quad { long val[2]; } quad;
  124. extern "C" {
  125. struct timeval {
  126.     long    tv_sec;
  127.     long    tv_usec;
  128. };
  129. struct timezone {
  130.     int    tz_minuteswest;
  131.     int    tz_dsttime;
  132. };
  133. }
  134. extern "C" {
  135. struct    itimerval {
  136.     struct    timeval it_interval;
  137.     struct    timeval it_value;
  138. };
  139. typedef struct    timestruc {
  140.     time_t         tv_sec;
  141.     long        tv_nsec;
  142. } timestruc_t;
  143. typedef    longlong_t    hrtime_t;
  144. int adjtime(struct timeval *, struct timeval *);
  145. int getitimer(int, struct itimerval *);
  146. int setitimer(int, struct itimerval *, struct itimerval *);
  147. extern "C" {
  148. struct    tm {
  149.     int    tm_sec;
  150.     int    tm_min;
  151.     int    tm_hour;
  152.     int    tm_mday;
  153.     int    tm_mon;
  154.     int    tm_year;
  155.     int    tm_wday;
  156.     int    tm_yday;
  157.     int    tm_isdst;
  158. };
  159. extern clock_t clock(void);
  160. extern double difftime(time_t, time_t);
  161. extern time_t mktime(struct tm *);
  162. extern time_t time(time_t *);
  163. extern char *asctime(const struct tm *);
  164. extern char *ctime (const time_t *);
  165. extern struct tm *gmtime(const time_t *);
  166. extern struct tm *localtime(const time_t *);
  167. extern size_t strftime(char *, size_t, const char *, const struct tm *);
  168. }
  169. }
  170. extern "C" {
  171. typedef    long    fd_mask;
  172. typedef    struct fd_set {
  173.     fd_mask    fds_bits[(((1024 )+(( (sizeof (fd_mask) * 8 )    )-1))/( (sizeof (fd_mask) * 8 )    )) ];
  174. } fd_set;
  175. extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
  176. }
  177. }
  178. extern "C" {
  179. struct  netconfig {
  180.     char        *nc_netid;
  181.     unsigned long    nc_semantics;
  182.     unsigned long    nc_flag;
  183.     char        *nc_protofmly;
  184.     char        *nc_proto;
  185.     char        *nc_device;
  186.     unsigned long    nc_nlookups;
  187.     char        **nc_lookups;
  188.     unsigned long    nc_unused[8];
  189. };
  190. typedef struct {
  191.     struct netconfig **nc_head;
  192.     struct netconfig **nc_curr;
  193. } NCONF_HANDLE;
  194. extern void        *setnetconfig(void);
  195. extern int        endnetconfig(void *);
  196. extern struct netconfig    *getnetconfig(void *);
  197. extern struct netconfig    *getnetconfigent(char *);
  198. extern void        freenetconfigent(struct netconfig *);
  199. extern void        *setnetpath(void);
  200. extern int        endnetpath(void *);
  201. extern struct netconfig *getnetpath(void *);
  202. }
  203. extern "C" {
  204. struct    linger {
  205.     int    l_onoff;
  206.     int    l_linger;
  207. };
  208. struct sockaddr {
  209.     u_short    sa_family;
  210.     char    sa_data[14];
  211. };
  212. struct sockproto {
  213.     u_short    sp_family;
  214.     u_short    sp_protocol;
  215. };
  216. struct msghdr {
  217.     caddr_t    msg_name;
  218.     int    msg_namelen;
  219.     struct    iovec *msg_iov;
  220.     int    msg_iovlen;
  221.     caddr_t    msg_accrights;
  222.     int    msg_accrightslen;
  223. };
  224. struct opthdr {
  225.     long    level;
  226.     long    name;
  227.     long    len;
  228. };
  229. struct optdefault {
  230.     int    optname;
  231.     char    *val;
  232.     int    len;
  233. };
  234. struct opproc {
  235.     int    level;
  236.     int    (*func)();
  237. };
  238. struct socksysreq {
  239.     int    args[7];
  240. };
  241. struct socknewproto {
  242.     int    family;
  243.     int    type;
  244.     int    proto;
  245.     dev_t    dev;
  246.     int    flags;
  247. };
  248. extern int accept(int, struct sockaddr *, int *);
  249. extern int bind(int, struct sockaddr *, int);
  250. extern int connect(int, struct sockaddr *, int);
  251. extern int getpeername(int, struct sockaddr *, int *);
  252. extern int getsockname(int, struct sockaddr *, int *);
  253. extern int getsockopt(int, int, int, char *, int *);
  254. extern int listen(int, int);
  255. extern int recv(int, char *, int, int);
  256. extern int recvfrom(int, char *, int, int, struct sockaddr *, int *);
  257. extern int send(int, const char *, int, int);
  258. extern int sendto(int, const char *, int, int, struct sockaddr *, int);
  259. extern int setsockopt(int, int, int, const char *, int);
  260. extern int socket(int, int, int);
  261. extern int recvmsg(int, struct msghdr *, int);
  262. extern int sendmsg(int, struct msghdr *, int);
  263. extern int shutdown(int, int);
  264. extern int socketpair(int, int, int, int *);
  265. }
  266. extern "C" {
  267. extern void    lock_set(lock_t *lp);
  268. extern int    lock_try(lock_t *lp);
  269. extern void    lock_clear(lock_t *lp);
  270. extern int    lock_set_spl(lock_t *lp, int pl);
  271. extern void    lock_clear_splx(lock_t *lp, int s);
  272. }
  273. extern "C" {
  274. typedef    struct dl {
  275.     long    dl_hop;
  276.     ulong_t    dl_lop;
  277. } dl_t;
  278. extern dl_t    ladd(dl_t, dl_t);
  279. extern dl_t    lsub(dl_t, dl_t);
  280. extern dl_t    lmul(dl_t, dl_t);
  281. extern dl_t    ldivide(dl_t, dl_t);
  282. extern dl_t    lshiftl(dl_t, int);
  283. extern dl_t    llog10(dl_t);
  284. extern dl_t    lexp10(dl_t);
  285. extern dl_t    lzero;
  286. extern dl_t    lone;
  287. extern dl_t    lten;
  288. }
  289. extern "C" {
  290. typedef struct lkinfo {
  291.     char    *lk_name;
  292.     int    lk_flags;
  293.     long    lk_pad[2];
  294. } lkinfo_t;
  295. typedef struct _lkstat_t {
  296.     lkinfo_t    *ls_infop;
  297.     ulong_t        ls_wrcnt;
  298.     ulong_t        ls_rdcnt;
  299.     ulong_t        ls_solordcnt;
  300.     ulong_t        ls_fail;
  301.     union {
  302.         dl_t lsu_time;
  303.         struct _lkstat_t *lsu_next;
  304.     } un;
  305.     dl_t        ls_wtime;
  306.     dl_t        ls_htime;
  307. } lkstat_t;
  308. typedef struct lkstat_sum {
  309.     lkstat_t    *sp;
  310.     struct lkstat_sum *next;
  311. } lkstat_sum_t;
  312. typedef struct lksblk {
  313.     struct lksblk *lsb_prev, *lsb_next;
  314.     int lsb_nfree;
  315.     lkstat_t *lsb_free;
  316.     lkstat_t lsb_bufs[91 ];
  317. } lksblk_t;
  318. extern lkstat_t *lkstat_alloc(lkinfo_t *, int);
  319. extern void    lkstat_free(lkstat_t *, int);
  320. extern void *    startup_alloc(size_t, void **);
  321. extern void    startup_free(void *, size_t, void **);
  322. }
  323. extern "C" {
  324. typedef enum syncobj
  325. {
  326.     SOBJ_NONE = 0,
  327.     SOBJ_MTX  = 1,
  328.     SOBJ_RDR  = 2,
  329.     SOBJ_WRT  = 3,
  330.     SOBJ_CV   = 4,
  331.     SOBJ_SEM  = 5
  332. } syncobj_t;
  333. typedef struct sleepq
  334. {
  335.     struct _kthread * sq_first;
  336. } sleepq_t;
  337. extern struct sleepq sleepq[];
  338. }
  339. extern "C" {
  340. }
  341. extern "C" {
  342. }
  343. extern "C" {
  344. typedef struct pirec
  345. {
  346.     struct pirec    *pi_forw;
  347.     struct pirec    *pi_back;
  348.     struct _kthread *pi_owner;
  349.     int        pi_epri_hi;
  350. } pirec_t;
  351. }
  352. extern "C" {
  353. typedef enum
  354. {
  355.     QOBJ_DEF = 0,
  356.     QOBJ_RDR = 0,
  357.     QOBJ_WRT = 1,
  358.     QOBJ_CV  = 0,
  359.     QOBJ_MTX = 0,
  360.     QOBJ_SEM = 0
  361. } qobj_t;
  362. typedef struct turnstile    turnstile_t;
  363. typedef ushort_t        turnstile_id_t;
  364. struct turnstile
  365. {
  366.     union tstile_un
  367.     {
  368.         turnstile_t    *ts_forw;
  369.         pirec_t        ts_prioinv;
  370.     } tsun;
  371.     turnstile_id_t    ts_id;
  372.     short        ts_pad;
  373.     int        ts_refcnt;
  374.     sleepq_t    ts_sleepq[2    ];
  375. };
  376. }
  377. extern "C" {
  378. typedef enum {
  379.     MUTEX_ADAPTIVE = 0,
  380.     MUTEX_SPIN,
  381.     MUTEX_ADAPTIVE_STAT,
  382.     MUTEX_SPIN_STAT,
  383.     MUTEX_DRIVER_NOSTAT = 4,
  384.     MUTEX_DRIVER_STAT = 5,
  385.     MUTEX_ADAPTIVE_DEF
  386. } kmutex_type_t;
  387. typedef union mutex {
  388.     struct generic_mutex {
  389.         char    _filler1[3];
  390.         lock_t    m_lock;
  391.         uchar_t    m_type;
  392.         char    _filler2[3];
  393.     } m_generic;
  394.     struct adaptive_mutex {
  395.         uint_t    m_owner : 24;
  396.         lock_t    m_lock;
  397.         uchar_t    m_type;
  398.         char    _filler;
  399.         turnstile_id_t    m_waiters;
  400.     } m_adaptive;
  401.     struct adaptive_mutex2 {
  402.         uint_t    m_owner_lock;
  403.         uchar_t    m_type;
  404.         char    _filler;
  405.         turnstile_id_t    m_waiters;
  406.     } m_adaptive2;
  407.     struct spin_mutex {
  408.         ushort_t m_oldspl;
  409.         lock_t    m_spinlock;
  410.         lock_t    m_dummylock;
  411.         uchar_t    m_type;
  412.         char    _filler;
  413.         ushort_t m_minspl;
  414.     } m_spin;
  415.     struct stat_mutex {
  416.         uint_t    m_stats_lock;
  417.         uchar_t    m_type;
  418.         uchar_t    _filler[3];
  419.     } m_stats;
  420. } kmutex_t;
  421. struct mutex_stats {
  422.     kmutex_t    m_real;
  423.     lkinfo_t    lkinfo;
  424.     lkstat_t    *lkstat;
  425.     char        name[18    ];
  426.     uchar_t        flag;
  427. };
  428. }
  429. extern "C" {
  430. extern int ncpus;
  431. typedef enum {
  432.     SEMA_DEFAULT,
  433.     SEMA_DRIVER
  434. } ksema_type_t;
  435. typedef struct _ksema {
  436.     unsigned char    type;
  437.     char        pad;
  438.     turnstile_id_t    waiters;
  439.     int        count;
  440. } ksema_t;
  441. typedef enum {
  442.     RW_SLEEP,
  443.     RW_SLEEP_STAT,
  444.     RW_DRIVER_NOSTAT = 2,
  445.     RW_DRIVER_STAT = 3,
  446.     RW_DEFAULT
  447. } krw_type_t;
  448. typedef enum {
  449.     RW_WRITER,
  450.     RW_READER
  451. } krw_t;
  452. typedef struct _krwlock {
  453.     unsigned char     type;
  454.     turnstile_id_t    waiters;
  455.     union {
  456.         struct rwlock_stats *sp;
  457.         struct {
  458.             short    writewanted;
  459.             short    holdcnt;
  460.         } rw;
  461.     } un;
  462.     struct _kthread *owner;
  463. } krwlock_t;
  464. struct rwlock_stats {
  465.     krwlock_t    real;
  466.     lkinfo_t    lkinfo;
  467.     lkstat_t    *lkstat;
  468.     char        name[18    +1];
  469.     char        flag;
  470. };
  471. typedef struct {
  472.     turnstile_id_t    waiters;
  473. } kcondvar_t;
  474. typedef    enum {
  475.     CV_DEFAULT,
  476.     CV_DRIVER
  477. } kcv_type_t;
  478. typedef struct lockinfo {
  479.     struct _kthread *owner;
  480.     int     pc;
  481.     int    sp;
  482.     int    id;
  483.     char    type;
  484.     int    hashbucket;
  485.     struct lockinfo *next;
  486. } lockinfo_t;
  487. extern int locktrace;
  488. }
  489. extern "C" {
  490. typedef struct file {
  491.     struct file    *f_next;
  492.     struct file    *f_prev;
  493.     ushort_t    f_flag;
  494.     cnt_t        f_count;
  495.     struct vnode    *f_vnode;
  496.     offset_t    f_offset;
  497.     struct cred    *f_cred;
  498.     caddr_t        f_audit_data;
  499.     kmutex_t    f_tlock;
  500.     kcondvar_t    f_done;
  501.     int        f_refcnt;
  502. } file_t;
  503. }
  504. extern "C" {
  505. }
  506. extern "C" {
  507. struct bsd_compat_ioctltab {
  508.     int    cmd;
  509.     int    flag;
  510.     unsigned int    size;
  511. };
  512. }
  513. extern "C" {
  514. }
  515. extern "C" {
  516. struct    stat {
  517.     dev_t    st_dev;
  518.     long    st_pad1[3];
  519.     ino_t    st_ino;
  520.     mode_t    st_mode;
  521.     nlink_t st_nlink;
  522.     uid_t     st_uid;
  523.     gid_t     st_gid;
  524.     dev_t    st_rdev;
  525.     long    st_pad2[2];
  526.     off_t    st_size;
  527.     long    st_pad3;
  528.     timestruc_t st_atim;
  529.     timestruc_t st_mtim;
  530.     timestruc_t st_ctim;
  531.     long    st_blksize;
  532.     long    st_blocks;
  533.     char    st_fstype[16        ];
  534.     long    st_pad4[8];
  535. };
  536. extern int fstat(int, struct stat *);
  537. extern int stat(const char *, struct stat *);
  538. extern int lstat(const char *, struct stat *);
  539. extern int mknod(const char *, mode_t, dev_t);
  540. extern int fchmod(int, mode_t);
  541. extern int chmod(const char *, mode_t);
  542. extern int mkdir(const char *, mode_t);
  543. extern int mkfifo(const char *, mode_t);
  544. extern mode_t umask(mode_t);
  545. }
  546. extern "C" {
  547. typedef struct iovec {
  548.     caddr_t    iov_base;
  549.     int    iov_len;
  550. } iovec_t;
  551. typedef enum uio_seg { UIO_USERSPACE, UIO_SYSSPACE, UIO_USERISPACE } uio_seg_t;
  552. typedef struct uio {
  553.     iovec_t    *uio_iov;
  554.     int    uio_iovcnt;
  555.     lloff_t    _uio_offset;
  556.     uio_seg_t uio_segflg;
  557.     short    uio_fmode;
  558.     lldaddr_t _uio_limit;
  559.     int    uio_resid;
  560. } uio_t;
  561. typedef enum uio_rw { UIO_READ, UIO_WRITE } uio_rw_t;
  562. extern ssize_t readv(int, struct iovec *, int);
  563. extern ssize_t writev(int, const struct iovec *, int);
  564. }
  565. extern "C" {
  566. extern caddr_t mmap(caddr_t, size_t, int, int, int, off_t);
  567. extern int munmap(caddr_t, size_t);
  568. extern int mprotect(caddr_t, size_t, int);
  569. extern int mincore(caddr_t, size_t, char *);
  570. extern int memcntl(caddr_t, size_t, int, caddr_t, int, int);
  571. extern int msync(caddr_t, size_t, int);
  572. extern int madvise(caddr_t, size_t, int);
  573. extern int mlock(caddr_t, size_t);
  574. extern int mlockall(int);
  575. extern int munlock(caddr_t, size_t);
  576. extern int munlockall(void);
  577. }
  578. extern "C" {
  579. struct    sockaddr_un {
  580.     short    sun_family;
  581.     char    sun_path[108];
  582. };
  583. }
  584. extern "C" {
  585. typedef unsigned long rlim_t;
  586. struct rlimit {
  587.     rlim_t    rlim_cur;
  588.     rlim_t    rlim_max;
  589. };
  590. extern int setrlimit(int, const struct rlimit *);
  591. extern int getrlimit(int, struct rlimit *);
  592. }
  593. extern "C" {
  594. struct ipc_perm {
  595.     uid_t    uid;
  596.     gid_t    gid;
  597.     uid_t    cuid;
  598.     gid_t    cgid;
  599.     mode_t    mode;
  600.     ulong    seq;
  601.     key_t    key;
  602.     long    pad[4];
  603. };
  604. key_t ftok(const char *, int);
  605. }
  606. extern "C" {
  607. struct semid_ds {
  608.     struct ipc_perm sem_perm;
  609.     struct sem    *sem_base;
  610.     ushort        sem_nsems;
  611.     time_t        sem_otime;
  612.     long        sem_pad1;
  613.     time_t        sem_ctime;
  614.     long        sem_pad2;
  615.     long        sem_pad3[4];
  616. };
  617. struct sem {
  618.     ushort    semval;
  619.     pid_t    sempid;
  620.     ushort    semncnt;
  621.     ushort    semzcnt;
  622.     ushort    semncnt_cv;
  623.     ushort    semzcnt_cv;
  624. };
  625. struct sem_undo {
  626.     struct sem_undo    *un_np;
  627.     short        un_cnt;
  628.     struct undo {
  629.         short    un_aoe;
  630.         ushort    un_num;
  631.         int    un_id;
  632.     }    un_ent[1];
  633. };
  634. struct    seminfo    {
  635.     int    semmap;
  636.     int    semmni;
  637.     int    semmns;
  638.     int    semmnu;
  639.     int    semmsl;
  640.     int    semopm;
  641.     int    semume;
  642.     int    semusz;
  643.     int    semvmx;
  644.     int    semaem;
  645. };
  646. struct sembuf {
  647.     ushort    sem_num;
  648.     short    sem_op;
  649.     short    sem_flg;
  650. };
  651. int semctl(int, int, int, ...);
  652. int semget(key_t, int, int);
  653. int semop(int, struct sembuf *, unsigned);
  654. }
  655. extern "C" {
  656. struct msqid_ds {
  657.     struct ipc_perm    msg_perm;
  658.     struct msg    *msg_first;
  659.     struct msg    *msg_last;
  660.     ulong        msg_cbytes;
  661.     ulong        msg_qnum;
  662.     ulong        msg_qbytes;
  663.     pid_t        msg_lspid;
  664.     pid_t        msg_lrpid;
  665.     time_t        msg_stime;
  666.     long        msg_pad1;
  667.     time_t        msg_rtime;
  668.     long        msg_pad2;
  669.     time_t        msg_ctime;
  670.     long        msg_pad3;
  671.     short        msg_cv;
  672.     short        msg_qnum_cv;
  673.     long        msg_pad4[3];
  674. };
  675. struct msg {
  676.     struct msg    *msg_next;
  677.     long        msg_type;
  678.     ushort        msg_ts;
  679.     short        msg_spot;
  680. };
  681. struct msgbuf {
  682.     long    mtype;
  683.     char    mtext[1];
  684. };
  685. struct msginfo {
  686.     int    msgmap;
  687.     int    msgmax;
  688.     int    msgmnb;
  689.     int    msgmni;
  690.     int    msgssz;
  691.     int    msgtql;
  692.     ushort    msgseg;
  693. };
  694. int msgctl(int, int, ...);
  695. int msgget(key_t, int);
  696. int msgrcv(int, void *, size_t, long, int);
  697. int msgsnd(int, const void *, size_t, int);
  698. }
  699. extern "C" {
  700. extern "C" {
  701. }
  702. typedef struct siginfo {
  703.     int    si_signo;
  704.     int     si_code;
  705.     int    si_errno;
  706.     union {
  707.         int    _pad[    ((128  / sizeof (int)) - 3) ];
  708.         struct {
  709.             pid_t    _pid;
  710.             union {
  711.                 struct {
  712.                     uid_t    _uid;
  713.                 } _kill;
  714.                 struct {
  715.                     clock_t _utime;
  716.                     int    _status;
  717.                     clock_t _stime;
  718.                 } _cld;
  719.             } _pdata;
  720.         } _proc;
  721.         struct {
  722.             caddr_t    _addr;
  723.             int    _trapno;
  724.         } _fault;
  725.         struct {
  726.             int    _fd;
  727.             long    _band;
  728.         } _file;
  729.         struct {
  730.             caddr_t    _faddr;
  731.             timestruc_t _tstamp;
  732.             short    _syscall;
  733.             char    _nsysarg;
  734.             char    _fault;
  735.             long    _sysarg[8];
  736.             long    _mstate[17];
  737.         } _prof;
  738.     } _data;
  739. } siginfo_t;
  740. typedef struct k_siginfo {
  741.     int    si_signo;
  742.     int     si_code;
  743.     int    si_errno;
  744.     union {
  745.         struct {
  746.             pid_t    _pid;
  747.             union {
  748.                 struct {
  749.                     uid_t    _uid;
  750.                 } _kill;
  751.                 struct {
  752.                     clock_t _utime;
  753.                     int    _status;
  754.                     clock_t _stime;
  755.                 } _cld;
  756.             } _pdata;
  757.         } _proc;
  758.         struct {
  759.             caddr_t    _addr;
  760.             int    _trapno;
  761.         } _fault;
  762.         struct {
  763.             int    _fd;
  764.             long    _band;
  765.         } _file;
  766.         struct {
  767.             caddr_t    _faddr;
  768.             timestruc_t _tstamp;
  769.             short    _syscall;
  770.             char    _nsysarg;
  771.             char    _fault;
  772.         } _prof;
  773.     } _data;
  774. } k_siginfo_t;
  775. typedef struct sigqueue {
  776.     struct sigqueue        *sq_next;
  777.     struct k_siginfo    sq_info;
  778. } sigqueue_t;
  779. }
  780. extern "C" {
  781. typedef enum idtype {
  782.     P_PID,
  783.     P_PPID,
  784.     P_PGID,
  785.     P_SID,
  786.     P_CID,
  787.     P_UID,
  788.     P_GID,
  789.     P_ALL,
  790.     P_LWPID
  791. } idtype_t;
  792. typedef enum idop {
  793.     POP_DIFF,
  794.     POP_AND,
  795.     POP_OR,
  796.     POP_XOR
  797. } idop_t;
  798. typedef struct procset {
  799.     idop_t        p_op;
  800.     idtype_t    p_lidtype;
  801.     id_t        p_lid;
  802.     idtype_t    p_ridtype;
  803.     id_t        p_rid;
  804. } procset_t;
  805. }
  806. extern "C" {
  807. extern pid_t wait(int *);
  808. extern pid_t waitpid(pid_t, int *, int);
  809. extern int waitid(idtype_t, id_t, siginfo_t *, int);
  810. }
  811. extern "C" {
  812. struct shmid_ds {
  813.     struct ipc_perm    shm_perm;
  814.     int        shm_segsz;
  815.     struct anon_map    *shm_amp;
  816.     ushort        shm_lkcnt;
  817.     pid_t        shm_lpid;
  818.     pid_t        shm_cpid;
  819.     ulong        shm_nattch;
  820.     ulong        shm_cnattch;
  821.     time_t        shm_atime;
  822.     long        shm_pad1;
  823.     time_t        shm_dtime;
  824.     long        shm_pad2;
  825.     time_t        shm_ctime;
  826.     long        shm_pad3;
  827.     long        shm_pad4[4];
  828. };
  829. struct    shminfo {
  830.     int    shmmax,
  831.         shmmin,
  832.         shmmni,
  833.         shmseg;
  834. };
  835. int shmctl(int, int, ...);
  836. int shmget(key_t, int, int);
  837. void *shmat(int, void *, int);
  838. int shmdt(void *);
  839. typedef struct segacct {
  840.     struct segacct    *sa_next;
  841.     caddr_t         sa_addr;
  842.     size_t         sa_len;
  843.     struct anon_map *sa_amp;
  844. } segacct_t;
  845. }
  846. extern "C" {
  847. struct ifnet {
  848.     char    *if_name;
  849.     short    if_unit;
  850.     short    if_mtu;
  851.     short    if_flags;
  852.     short    if_timer;
  853.     u_short    if_promisc;
  854.     int    if_metric;
  855.     struct    ifaddr *if_addrlist;
  856.     struct    ifqueue {
  857.         struct    mbuf *ifq_head;
  858.         struct    mbuf *ifq_tail;
  859.         int    ifq_len;
  860.         int    ifq_maxlen;
  861.         int    ifq_drops;
  862.     } if_snd;
  863.     int    (*if_init)();
  864.     int    (*if_output)();
  865.     int    (*if_ioctl)();
  866.     int    (*if_reset)();
  867.     int    (*if_watchdog)();
  868.     int    if_ipackets;
  869.     int    if_ierrors;
  870.     int    if_opackets;
  871.     int    if_oerrors;
  872.     int    if_collisions;
  873.     struct    ifnet *if_next;
  874.     struct    ifnet *if_upper;
  875.     struct    ifnet *if_lower;
  876.     int    (*if_input)();
  877.     int    (*if_ctlin)();
  878.     int    (*if_ctlout)();
  879.     struct map *if_memmap;
  880. };
  881. struct ifaddr {
  882.     struct    sockaddr ifa_addr;
  883.     union {
  884.         struct    sockaddr ifu_broadaddr;
  885.         struct    sockaddr ifu_dstaddr;
  886.     } ifa_ifu;
  887.     struct    ifnet *ifa_ifp;
  888.     struct    ifaddr *ifa_next;
  889. };
  890. struct    ifreq {
  891.     char    ifr_name[16 ];
  892.     union {
  893.         struct    sockaddr ifru_addr;
  894.         struct    sockaddr ifru_dstaddr;
  895.         char    ifru_oname[16 ];
  896.         struct    sockaddr ifru_broadaddr;
  897.         short    ifru_flags;
  898.         int    ifru_metric;
  899.         char    ifru_data[1];
  900.         char    ifru_enaddr[6];
  901.         struct ifr_dnld_reqs {
  902.             caddr_t    v_addr;
  903.             caddr_t    m_addr;
  904.             caddr_t    ex_addr;
  905.             u_int    size;
  906.         } ifru_dnld_req;
  907.         struct ifr_fddi_stats {
  908.             u_int    stat_size;
  909.             caddr_t    fddi_stats;
  910.         } ifru_fddi_stat;
  911.         struct ifr_netmapents {
  912.             u_int    map_ent_size,
  913.                 entry_number;
  914.             caddr_t    fddi_map_ent;
  915.         } ifru_netmapent;
  916.         struct ifr_fddi_gen_struct {
  917.             int    ifru_fddi_gioctl;
  918.             caddr_t ifru_fddi_gaddr;
  919.         } ifru_fddi_gstruct;
  920.     } ifr_ifru;
  921. };
  922. struct    ifconf {
  923.     int    ifc_len;
  924.     union {
  925.         caddr_t    ifcu_buf;
  926.         struct    ifreq *ifcu_req;
  927.     } ifc_ifcu;
  928. };
  929. }
  930. extern "C" {
  931. extern "C" {
  932. typedef struct cred {
  933.     ushort    cr_ref;
  934.     ushort    cr_ngroups;
  935.     uid_t    cr_uid;
  936.     gid_t    cr_gid;
  937.     uid_t    cr_ruid;
  938.     gid_t    cr_rgid;
  939.     uid_t    cr_suid;
  940.     gid_t    cr_sgid;
  941.     gid_t    cr_groups[1];
  942. } cred_t;
  943. }
  944. extern "C" {
  945. typedef enum vtype {
  946.     VNON    = 0,
  947.     VREG    = 1,
  948.     VDIR    = 2,
  949.     VBLK    = 3,
  950.     VCHR    = 4,
  951.     VLNK    = 5,
  952.     VFIFO    = 6,
  953.     VXNAM    = 7,
  954.     VBAD    = 8
  955. } vtype_t;
  956. typedef struct vnode {
  957.     kmutex_t    v_lock;
  958.     u_short        v_flag;
  959.     u_long        v_count;
  960.     struct vfs    *v_vfsmountedhere;
  961.     struct vnodeops    *v_op;
  962.     struct vfs    *v_vfsp;
  963.     struct stdata    *v_stream;
  964.     struct page    *v_pages;
  965.     enum vtype    v_type;
  966.     dev_t        v_rdev;
  967.     caddr_t        v_data;
  968.     struct filock    *v_filocks;
  969.     kcondvar_t    v_cv;
  970. } vnode_t;
  971. typedef struct vnodeops {
  972.     int    (*vop_open)();
  973.     int    (*vop_close)();
  974.     int    (*vop_read)();
  975.     int    (*vop_write)();
  976.     int    (*vop_ioctl)();
  977.     int    (*vop_setfl)();
  978.     int    (*vop_getattr)();
  979.     int    (*vop_setattr)();
  980.     int    (*vop_access)();
  981.     int    (*vop_lookup)();
  982.     int    (*vop_create)();
  983.     int    (*vop_remove)();
  984.     int    (*vop_link)();
  985.     int    (*vop_rename)();
  986.     int    (*vop_mkdir)();
  987.     int    (*vop_rmdir)();
  988.     int    (*vop_readdir)();
  989.     int    (*vop_symlink)();
  990.     int    (*vop_readlink)();
  991.     int    (*vop_fsync)();
  992.     void    (*vop_inactive)();
  993.     int    (*vop_fid)();
  994.     void    (*vop_rwlock)();
  995.     void    (*vop_rwunlock)();
  996.     int    (*vop_seek)();
  997.     int    (*vop_cmp)();
  998.     int    (*vop_frlock)();
  999.     int    (*vop_space)();
  1000.     int    (*vop_realvp)();
  1001.     int    (*vop_getpage)();
  1002.     int    (*vop_putpage)();
  1003.     int    (*vop_map)();
  1004.     int    (*vop_addmap)();
  1005.     int    (*vop_delmap)();
  1006.     int    (*vop_poll)();
  1007.     int    (*vop_dump)();
  1008.     int    (*vop_pathconf)();
  1009. } vnodeops_t;
  1010. extern    int setswappingon();
  1011. extern    int setswappingoff();
  1012. typedef struct vattr {
  1013.     long        va_mask;
  1014.     vtype_t        va_type;
  1015.     mode_t        va_mode;
  1016.     uid_t        va_uid;
  1017.     gid_t        va_gid;
  1018.     dev_t        va_fsid;
  1019.     ino_t        va_nodeid;
  1020.     nlink_t        va_nlink;
  1021.     u_long        va_size0;
  1022.     u_long        va_size;
  1023.     timestruc_t    va_atime;
  1024.     timestruc_t    va_mtime;
  1025.     timestruc_t    va_ctime;
  1026.     dev_t        va_rdev;
  1027.     u_long        va_blksize;
  1028.     u_long        va_nblocks;
  1029.     u_long        va_vcode;
  1030. } vattr_t;
  1031. enum rm        { RMFILE, RMDIRECTORY };
  1032. enum symfollow    { NO_FOLLOW, FOLLOW };
  1033. enum vcexcl    { NONEXCL, EXCL };
  1034. enum create    { CRCREAT, CRMKNOD, CRMKDIR, CRCORE };
  1035. typedef enum rm        rm_t;
  1036. typedef enum symfollow    symfollow_t;
  1037. typedef enum vcexcl    vcexcl_t;
  1038. typedef enum create    create_t;
  1039. extern int vn_open(char *, enum uio_seg, int, int, struct vnode **,
  1040.     enum create);
  1041. extern int vn_create(char *, enum uio_seg, struct vattr *, enum vcexcl, int,
  1042.     struct vnode **, enum create);
  1043. extern int vn_rdwr(enum uio_rw, struct vnode *, caddr_t, int, off_t,
  1044.     enum uio_seg, int, long, cred_t *, int *);
  1045. extern int vn_close(struct vnode *, int, int, int, struct cred *);
  1046. extern void vn_rele(struct vnode *);
  1047. extern int vn_link(char *, char *, enum uio_seg);
  1048. extern int vn_rename(char *, char *, int);
  1049. extern int vn_remove(char *, enum uio_seg, enum rm);
  1050. extern vnode_t *specvp(struct vnode *, dev_t, vtype_t, struct cred *);
  1051. extern vnode_t *makespecvp(dev_t, vtype_t);
  1052. }
  1053. extern "C" {
  1054. struct pollfd {
  1055.     int fd;
  1056.     short events;
  1057.     short revents;
  1058. };
  1059. struct pollhead {
  1060.     struct polldat    *ph_list;
  1061.     struct polldat    *ph_dummy;
  1062.     short        ph_events;
  1063. };
  1064. struct polldat {
  1065.     struct polldat *pd_next;
  1066.     struct polldat *pd_prev;
  1067.     struct polldat *pd_chain;
  1068.     short        pd_events;
  1069.     struct pollhead *pd_headp;
  1070.     void        (*pd_fn)();
  1071.     long        pd_arg;
  1072. };
  1073. int poll(struct pollfd *, unsigned long, int);
  1074. }
  1075. extern "C" {
  1076. }
  1077. extern "C" {
  1078. struct    queue {
  1079.     struct    qinit    *q_qinfo;
  1080.     struct    msgb    *q_first;
  1081.     struct    msgb    *q_last;
  1082.     struct    queue    *q_next;
  1083.     struct    queue    *q_link;
  1084.     void         *q_ptr;
  1085.     ulong        q_count;
  1086.     ulong        q_flag;
  1087.     long        q_minpsz;
  1088.     long        q_maxpsz;
  1089.     ulong        q_hiwat;
  1090.     ulong        q_lowat;
  1091.     struct qband    *q_bandp;
  1092.     kmutex_t    q_lock;
  1093.     struct stdata     *q_stream;
  1094.     struct    syncq    *q_syncq;
  1095.     long        q_pad2[2];
  1096.     unsigned char    q_nband;
  1097.     kcondvar_t    q_wait;
  1098.     kcondvar_t    q_sync;
  1099. };
  1100. typedef struct queue queue_t;
  1101. struct qband {
  1102.     struct qband    *qb_next;
  1103.     ulong        qb_count;
  1104.     struct msgb    *qb_first;
  1105.     struct msgb    *qb_last;
  1106.     ulong        qb_hiwat;
  1107.     ulong        qb_lowat;
  1108.     ulong        qb_flag;
  1109. };
  1110. typedef struct qband qband_t;
  1111. typedef enum qfields {
  1112.     QHIWAT    = 0,
  1113.     QLOWAT    = 1,
  1114.     QMAXPSZ    = 2,
  1115.     QMINPSZ    = 3,
  1116.     QCOUNT    = 4,
  1117.     QFIRST    = 5,
  1118.     QLAST    = 6,
  1119.     QFLAG    = 7,
  1120.     QBAD    = 8
  1121. } qfields_t;
  1122. struct module_info {
  1123.     ushort    mi_idnum;
  1124.     char     *mi_idname;
  1125.     long    mi_minpsz;
  1126.     long    mi_maxpsz;
  1127.     ulong    mi_hiwat;
  1128.     ulong     mi_lowat;
  1129. };
  1130. struct    qinit {
  1131.     int    (*qi_putp)();
  1132.     int    (*qi_srvp)();
  1133.     int    (*qi_qopen)();
  1134.     int    (*qi_qclose)();
  1135.     int    (*qi_qadmin)();
  1136.     struct module_info *qi_minfo;
  1137.     struct module_stat *qi_mstat;
  1138. };
  1139. struct streamtab {
  1140.     struct qinit *st_rdinit;
  1141.     struct qinit *st_wrinit;
  1142.     struct qinit *st_muxrinit;
  1143.     struct qinit *st_muxwinit;
  1144. };
  1145. struct linkblk {
  1146.     queue_t *l_qtop;
  1147.     queue_t *l_qbot;
  1148.     int    l_index;
  1149. };
  1150. struct free_rtn {
  1151.     void (*free_func)();
  1152.     char *free_arg;
  1153.     struct    free_rtn    *free_next;
  1154.     int free_unsafe;
  1155. };
  1156. struct datab {
  1157.     struct    free_rtn    *db_frtnp;
  1158.     unsigned char    *db_base;
  1159.     unsigned char    *db_lim;
  1160.     unsigned char    db_ref;
  1161.     unsigned char    db_type;
  1162.     unsigned char    db_refmin;
  1163.     unsigned int    db_size;
  1164.     char        filler[8];
  1165.     long        db_reserved;
  1166. };
  1167. struct    msgb {
  1168.     struct    msgb    *b_next;
  1169.     struct  msgb    *b_prev;
  1170.     struct    msgb    *b_cont;
  1171.     unsigned char    *b_rptr;
  1172.     unsigned char    *b_wptr;
  1173.     struct datab     *b_datap;
  1174.     unsigned char    b_band;
  1175.     unsigned short    b_flag;
  1176.     queue_t        *b_queue;
  1177. };
  1178. typedef struct msgb mblk_t;
  1179. typedef struct datab dblk_t;
  1180. typedef struct free_rtn frtn_t;
  1181. struct iocblk {
  1182.     int     ioc_cmd;
  1183.     cred_t    *ioc_cr;
  1184.     uint    ioc_id;
  1185.     uint    ioc_count;
  1186.     int    ioc_error;
  1187.     int    ioc_rval;
  1188.     long    ioc_filler[4];
  1189. };
  1190. struct copyreq {
  1191.     int    cq_cmd;
  1192.     cred_t    *cq_cr;
  1193.     uint    cq_id;
  1194.     caddr_t    cq_addr;
  1195.     uint    cq_size;
  1196.     int    cq_flag;
  1197.     mblk_t *cq_private;
  1198.     long    cq_filler[4];
  1199. };
  1200. struct copyresp {
  1201.     int    cp_cmd;
  1202.     cred_t    *cp_cr;
  1203.     uint    cp_id;
  1204.     caddr_t    cp_rval;
  1205.     uint    cp_pad1;
  1206.     int    cp_pad2;
  1207.     mblk_t *cp_private;
  1208.     long    cp_filler[4];
  1209. };
  1210. struct stroptions {
  1211.     ulong    so_flags;
  1212.     short    so_readopt;
  1213.     ushort    so_wroff;
  1214.     long    so_minpsz;
  1215.     long    so_maxpsz;
  1216.     ulong    so_hiwat;
  1217.     ulong    so_lowat;
  1218.     unsigned char so_band;
  1219. };
  1220. struct str_evmsg {
  1221.     long         sv_event;
  1222.     vnode_t        *sv_vp;
  1223.     long         sv_eid;
  1224.     long         sv_evpri;
  1225.     long         sv_flags;
  1226.     uid_t         sv_uid;
  1227.     pid_t         sv_pid;
  1228.     hostid_t     sv_hostid;
  1229.     long         sv_pad[4];
  1230. };
  1231. extern mblk_t *allocb(int, ...);
  1232. extern mblk_t *esballoc(unsigned char *, int, int, frtn_t *);
  1233. extern int testb(int, uint);
  1234. extern int bufcall(uint, int, void (*)(), long);
  1235. extern int esbbcall(int, void (*)(), long);
  1236. extern void freeb(struct msgb *);
  1237. extern void freemsg(mblk_t *);
  1238. extern mblk_t *dupb(mblk_t *);
  1239. extern mblk_t *dupmsg(mblk_t *);
  1240. extern mblk_t *copyb(mblk_t *);
  1241. extern mblk_t *copymsg(mblk_t *);
  1242. extern void linkb(mblk_t *, mblk_t *);
  1243. extern mblk_t *unlinkb(mblk_t *);
  1244. extern mblk_t *rmvb(mblk_t *, mblk_t *);
  1245. extern int pullupmsg(struct msgb *, int);
  1246. extern mblk_t *msgpullup(struct msgb *, int);
  1247. extern int adjmsg(struct msgb *, int);
  1248. extern int msgdsize(struct msgb *);
  1249. extern mblk_t *getq(queue_t *);
  1250. extern void rmvq(queue_t *, mblk_t *);
  1251. extern void flushq(queue_t *, int);
  1252. extern void flushband(queue_t *, unsigned char, int);
  1253. extern int canput(queue_t *);
  1254. extern int bcanput(queue_t *, unsigned char);
  1255. extern int canputnext(queue_t *);
  1256. extern int bcanputnext(queue_t *, unsigned char);
  1257. extern int putq(queue_t *, mblk_t *);
  1258. extern int putbq(queue_t *, mblk_t *);
  1259. extern int insq(queue_t *, mblk_t *, mblk_t *);
  1260. extern int putctl(queue_t *, int);
  1261. extern int putctl1(queue_t *, int, int);
  1262. extern int putnextctl(queue_t *, int);
  1263. extern int putnextctl1(queue_t *, int, int);
  1264. extern queue_t *backq(queue_t *);
  1265. extern void qreply(queue_t *, mblk_t *);
  1266. extern void qenable(queue_t *);
  1267. extern int qsize(queue_t *);
  1268. extern void noenable(queue_t *);
  1269. extern void enableok(queue_t *);
  1270. extern int strqset(queue_t *, qfields_t, unsigned char, long);
  1271. extern int strqget(queue_t *, qfields_t, unsigned char, long *);
  1272. extern void unbufcall(int);
  1273. extern void qprocson(queue_t *);
  1274. extern void qprocsoff(queue_t *);
  1275. extern void freezestr(queue_t *);
  1276. extern void unfreezestr(queue_t *);
  1277. extern int nstrpush;
  1278. }
  1279. extern "C" {
  1280. }
  1281. struct in_addr {
  1282.     union {
  1283.         struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b;
  1284.         struct { u_short s_w1, s_w2; } S_un_w;
  1285.         u_long S_addr;
  1286.     } S_un;
  1287. };
  1288. struct sockaddr_in {
  1289.     short    sin_family;
  1290.     u_short    sin_port;
  1291.     struct    in_addr sin_addr;
  1292.     char    sin_zero[8];
  1293. };
  1294. struct ip_mreq {
  1295.     struct in_addr    imr_multiaddr;
  1296.     struct in_addr    imr_interface;
  1297. };
  1298. }
  1299. extern "C" {
  1300. typedef long    fpos_t;
  1301. typedef struct
  1302. {
  1303.     int        _cnt;
  1304.     unsigned char    *_ptr;
  1305.     unsigned char    *_base;
  1306.     unsigned char    _flag;
  1307.     unsigned char    _file;
  1308. } FILE;
  1309. extern FILE        __iob[20    ];
  1310. extern FILE        *_lastbuf;
  1311. extern unsigned char    *_bufendtab[];
  1312. extern unsigned char     _sibuf[], _sobuf[];
  1313. extern int    remove(const char *);
  1314. extern int    rename(const char *, const char *);
  1315. extern FILE    *tmpfile(void);
  1316. extern char    *tmpnam(char *);
  1317. extern int    fclose(FILE *);
  1318. extern int    fflush(FILE *);
  1319. extern FILE    *fopen(const char *, const char *);
  1320. extern FILE    *freopen(const char *, const char *, FILE *);
  1321. extern void    setbuf(FILE *, char *);
  1322. extern int    setvbuf(FILE *, char *, int, size_t);
  1323. extern int    fprintf(FILE *, const char *, ...);
  1324. extern int    fscanf(FILE *, const char *, ...);
  1325. extern int    printf(const char *, ...);
  1326. extern int    scanf(const char *, ...);
  1327. extern int    sprintf(char *, const char *, ...);
  1328. extern int    sscanf(const char *, const char *, ...);
  1329. extern int    vfprintf(FILE *, const char *, void *);
  1330. extern int    vprintf(const char *, void *);
  1331. extern int    vsprintf(char *, const char *, void *);
  1332. extern int    fgetc(FILE *);
  1333. extern char    *fgets(char *, int, FILE *);
  1334. extern int    fputc(int, FILE *);
  1335. extern int    fputs(const char *, FILE *);
  1336. extern int    getc(FILE *);
  1337. extern int    getchar(void);
  1338. extern char    *gets(char *);
  1339. extern int    putc(int, FILE *);
  1340. extern int    putchar(int);
  1341. extern int    puts(const char *);
  1342. extern int    ungetc(int, FILE *);
  1343. extern size_t    fread(void *, size_t, size_t, FILE *);
  1344.     #pragma int_to_unsigned fread
  1345. extern size_t    fwrite(const void *, size_t, size_t, FILE *);
  1346.     #pragma int_to_unsigned fwrite
  1347. extern int    fgetpos(FILE *, fpos_t *);
  1348. extern int    fseek(FILE *, long, int);
  1349. extern int    fsetpos(FILE *, const fpos_t *);
  1350. extern long    ftell(FILE *);
  1351. extern void    rewind(FILE *);
  1352. extern void    clearerr(FILE *);
  1353. extern int    feof(FILE *);
  1354. extern int    ferror(FILE *);
  1355. extern void    perror(const char *);
  1356. extern int    __filbuf(FILE *);
  1357. extern int    __flsbuf(int, FILE *);
  1358. }
  1359. extern "C" {
  1360. typedef    void SIG_FUNC_TYP(int);
  1361. typedef    SIG_FUNC_TYP *SIG_TYP;
  1362. }
  1363. extern "C" {
  1364. typedef int    sig_atomic_t;
  1365. extern const char *_sys_siglist[];
  1366. extern const int _sys_nsig;
  1367. extern "C" SIG_TYP  signal (int, SIG_TYP );
  1368. extern int raise(int);
  1369. }
  1370. extern "C" {
  1371. extern void *memcpy(void *, const void *, size_t);
  1372. extern void *memmove(void *, const void *, size_t);
  1373. extern char *strcpy(char *, const char *);
  1374. extern char *strncpy(char *, const char *, size_t);
  1375. extern char *strcat(char *, const char *);
  1376. extern char *strncat(char *, const char *, size_t);
  1377. extern int memcmp(const void *, const void *, size_t);
  1378. extern int strcmp(const char *, const char *);
  1379. extern int strcoll(const char *, const char *);
  1380. extern int strncmp(const char *, const char *, size_t);
  1381. extern size_t strxfrm(char *, const char *, size_t);
  1382. extern void *memchr(const void *, int, size_t);
  1383. extern char *strchr(const char *, int);
  1384. extern size_t strcspn(const char *, const char *);
  1385.     #pragma int_to_unsigned strcspn
  1386. extern char *strpbrk(const char *, const char *);
  1387. extern char *strrchr(const char *, int);
  1388. extern size_t strspn(const char *, const char *);
  1389.     #pragma int_to_unsigned strspn
  1390. extern char *strstr(const char *, const char *);
  1391. extern char *strtok(char *, const char *);
  1392. extern void *memset(void *, int, size_t);
  1393. extern char *strerror(int);
  1394. extern char *strsignal(int);
  1395. extern size_t strlen(const char *);
  1396.     #pragma int_to_unsigned strlen
  1397. }
  1398. typedef int ptrdiff_t;
  1399. typedef __wchar_t wchar_t;
  1400. extern "C" {
  1401. extern void __eprintf (const char *, const char *, unsigned, const char *);
  1402. }
  1403. extern "C" {
  1404. extern void *memccpy(void *, const void *, int, size_t);
  1405. extern void *memchr(const void *, int, size_t);
  1406. extern void *memcpy(void *, const void *, size_t);
  1407. extern void *memset(void *, int, size_t);
  1408. extern int memcmp(const void *, const void *, size_t);
  1409. }
  1410. typedef void * __gnuc_va_list;
  1411. void va_end (__gnuc_va_list);
  1412. typedef __gnuc_va_list va_list;
  1413. extern "C" {
  1414. struct mallinfo  {
  1415.     int arena;
  1416.     int ordblks;
  1417.     int smblks;
  1418.     int hblks;
  1419.     int hblkhd;
  1420.     int usmblks;
  1421.     int fsmblks;
  1422.     int uordblks;
  1423.     int fordblks;
  1424.     int keepcost;
  1425. };
  1426. void *malloc(size_t);
  1427. void free(void *);
  1428. void *realloc(void *, size_t);
  1429. int mallopt(int, int);
  1430. struct mallinfo mallinfo(void);
  1431. void *calloc(size_t, size_t);
  1432. }
  1433. extern "C" {
  1434. extern int isalnum(int);
  1435. extern int isalpha(int);
  1436. extern int iscntrl(int);
  1437. extern int isdigit(int);
  1438. extern int isgraph(int);
  1439. extern int islower(int);
  1440. extern int isprint(int);
  1441. extern int ispunct(int);
  1442. extern int isspace(int);
  1443. extern int isupper(int);
  1444. extern int isxdigit(int);
  1445. extern int tolower(int);
  1446. extern int toupper(int);
  1447. extern unsigned char    __ctype[];
  1448. }
  1449. extern "C" {
  1450. typedef struct flock {
  1451.     short    l_type;
  1452.     short    l_whence;
  1453.     off_t    l_start;
  1454.     off_t    l_len;
  1455.     long    l_sysid;
  1456.     pid_t    l_pid;
  1457.     long    pad[4];
  1458. } flock_t;
  1459. }
  1460. extern "C" {
  1461. extern int fcntl(int, int, ...);
  1462. extern int open(const char *, int, ...);
  1463. extern int creat(const char *, mode_t);
  1464. }
  1465. extern "C" {
  1466. }
  1467. extern "C" {
  1468. extern int errno;
  1469. }
  1470. extern "C" {
  1471. struct passwd {
  1472.     char    *pw_name;
  1473.     char    *pw_passwd;
  1474.     uid_t    pw_uid;
  1475.     gid_t    pw_gid;
  1476.     char    *pw_age;
  1477.     char    *pw_comment;
  1478.     char    *pw_gecos;
  1479.     char    *pw_dir;
  1480.     char    *pw_shell;
  1481. };
  1482. struct comment {
  1483.     char    *c_dept;
  1484.     char    *c_name;
  1485.     char    *c_acct;
  1486.     char    *c_bin;
  1487. };
  1488. extern struct passwd *getpwent(void);
  1489. extern struct passwd *getpwuid(uid_t);
  1490. extern struct passwd *getpwnam(const char *);
  1491. extern void setpwent(void);
  1492. extern void endpwent(void);
  1493. extern struct passwd *fgetpwent(FILE *);
  1494. extern int putpwent(const struct passwd *, FILE *);
  1495. }
  1496. extern "C" {
  1497. }
  1498. typedef void (*SignalHandler)(...);
  1499. extern "C" {
  1500. extern int access(const char *, int);
  1501. extern int acct(const char *);
  1502. extern unsigned alarm(unsigned);
  1503. extern int brk(void *);
  1504. extern int chdir(const char *);
  1505. extern int chown(const char *, uid_t, gid_t);
  1506. extern int chroot(const char *);
  1507. extern int close(int);
  1508. extern char *ctermid(char *);
  1509. extern char *cuserid(char *);
  1510. extern int dup(int);
  1511. extern int dup2(int, int);
  1512. extern int execl(const char *, const char *, ...);
  1513. extern int execle(const char *, const char *, ...);
  1514. extern int execlp(const char *, const char *, ...);
  1515. extern int execv(const char *, char *const *);
  1516. extern int execve(const char *, char *const *, char *const *);
  1517. extern int execvp(const char *, char *const *);
  1518. extern void exit(int);
  1519. extern void _exit(int);
  1520. extern int fattach(int, const char *);
  1521. extern int fchdir(int);
  1522. extern int fchown(int, uid_t, gid_t);
  1523. extern int fchroot(int);
  1524. extern int fdetach(const char *);
  1525. extern pid_t fork(void);
  1526. extern long fpathconf(int, int);
  1527. extern int fsync(int);
  1528. extern int ftruncate(int, off_t);
  1529. extern char *getcwd(char *, size_t);
  1530. extern gid_t getegid(void);
  1531. extern uid_t geteuid(void);
  1532. extern gid_t getgid(void);
  1533. extern int getgroups(int, gid_t *);
  1534. extern char *getlogin(void);
  1535. extern pid_t getpgid(pid_t);
  1536. extern pid_t getpid(void);
  1537. extern pid_t getppid(void);
  1538. extern pid_t getpgrp(void);
  1539. char *gettxt(const char *, const char *);
  1540. extern pid_t getsid(pid_t);
  1541. extern uid_t getuid(void);
  1542. extern int ioctl(int, int, ...);
  1543. extern int isatty(int);
  1544. extern int link(const char *, const char *);
  1545. extern int lchown(const char *, uid_t, gid_t);
  1546. extern int lockf(int, int, long);
  1547. extern off_t lseek(int, off_t, int);
  1548. extern int mincore(caddr_t, size_t, char *);
  1549. extern int nice(int);
  1550. extern long pathconf(const char *, int);
  1551. extern int pause(void);
  1552. extern int pipe(int *);
  1553. extern void profil(unsigned short *, unsigned int, unsigned int, unsigned int);
  1554. extern int ptrace(int, pid_t, int, int);
  1555. extern ssize_t read(int, void *, unsigned);
  1556. extern int readlink(const char *, void *, int);
  1557. extern int rename(const char *, const char *);
  1558. extern int rmdir(const char *);
  1559. extern void *sbrk(int);
  1560. extern int setgid(gid_t);
  1561. extern int setegid(gid_t);
  1562. extern int setgroups(int, const gid_t *);
  1563. extern int setpgid(pid_t, pid_t);
  1564. extern pid_t setpgrp(void);
  1565. extern pid_t setsid(void);
  1566. extern int setuid(uid_t);
  1567. extern int seteuid(uid_t);
  1568. extern unsigned sleep(unsigned);
  1569. extern int stime(const time_t *);
  1570. extern int symlink(const char *, const char *);
  1571. extern void sync(void);
  1572. extern long sysconf(int);
  1573. extern pid_t tcgetpgrp(int);
  1574. extern int tcsetpgrp(int, pid_t);
  1575. extern int truncate(const char *, off_t);
  1576. extern char *ttyname(int);
  1577. extern int unlink(const char *);
  1578. extern pid_t vfork(void);
  1579. extern void vhangup(void);
  1580. extern ssize_t write(int, const void *, unsigned);
  1581. }
  1582. extern "C"
  1583. {
  1584. extern "C" {
  1585. extern unsigned long inet_addr(const char *);
  1586. extern char *inet_ntoa(struct in_addr);
  1587. extern struct in_addr inet_makeaddr(int, int);
  1588. extern unsigned long inet_network(const char *);
  1589. extern unsigned long inet_lnaof(struct in_addr);
  1590. extern unsigned long inet_netof(struct in_addr);
  1591. }
  1592. extern "C" {
  1593. struct    hostent {
  1594.     char    *h_name;
  1595.     char    **h_aliases;
  1596.     int    h_addrtype;
  1597.     int    h_length;
  1598.     char    **h_addr_list;
  1599. };
  1600. struct    netent {
  1601.     char        *n_name;
  1602.     char        **n_aliases;
  1603.     int        n_addrtype;
  1604.     unsigned long    n_net;
  1605. };
  1606. struct    servent {
  1607.     char    *s_name;
  1608.     char    **s_aliases;
  1609.     int    s_port;
  1610.     char    *s_proto;
  1611. };
  1612. struct    protoent {
  1613.     char    *p_name;
  1614.     char    **p_aliases;
  1615.     int    p_proto;
  1616. };
  1617. struct hostent    *gethostbyname(const char *);
  1618. struct hostent    *gethostbyaddr(const char *, int, int);
  1619. struct hostent    *gethostent(void);
  1620. struct netent    *getnetbyname(char *);
  1621. struct netent    *getnetbyaddr(long, int);
  1622. struct netent    *getnetent(void);
  1623. struct servent    *getservbyname(char *, char *);
  1624. struct servent    *getservbyport(int, char *);
  1625. struct servent    *getservent(void);
  1626. struct protoent    *getprotobyname(char *);
  1627. struct protoent    *getprotobynumber(int);
  1628. struct protoent    *getprotoent(void);
  1629. int sethostent(int);
  1630. int endhostent(void);
  1631. int setnetent(int);
  1632. int endnetent(void);
  1633. int setservent(int);
  1634. int endservent(void);
  1635. int setprotoent(int);
  1636. int endprotoent(void);
  1637. int rcmd(char **, unsigned short, char *, char *, char *, int *);
  1638. int rexec(char **, unsigned short, char *, char *, char *, int *);
  1639. int rresvport(int *);
  1640. int ruserok(char *, int, char *, char *);
  1641. extern  int h_errno;
  1642. }
  1643. }
  1644. class Time_Value
  1645. {
  1646. public:
  1647.   Time_Value (long sec = 0, long usec = 0);
  1648.   Time_Value (timeval &t);
  1649.   void set (timeval &t);
  1650.   long get_sec (void) const;
  1651.   void set_sec (long sec);
  1652.   long get_usec (void) const;
  1653.   void set_usec (long usec);
  1654.   operator timeval () const;
  1655.   friend Time_Value operator + (Time_Value tv1, Time_Value tv2);
  1656.   friend Time_Value operator - (Time_Value tv1, Time_Value tv2);
  1657.   friend int        operator < (Time_Value tv1, Time_Value tv2);
  1658.   friend int        operator > (Time_Value tv1, Time_Value tv2);
  1659.   friend int        operator <= (Time_Value tv1, Time_Value tv2);
  1660.   friend int        operator >= (Time_Value tv1, Time_Value tv2);
  1661.   friend int        operator == (Time_Value tv1, Time_Value tv2);
  1662.   friend int        operator != (Time_Value tv1, Time_Value tv2);
  1663. private:
  1664.   static void normalize_pos (Time_Value &num);
  1665.   static void normalize_neg (Time_Value &num);
  1666.   long tv_sec;
  1667.   long tv_usec;
  1668.   enum { ONE_SECOND = 1000000L };
  1669. };
  1670. class Event_Handler
  1671. {
  1672. protected:
  1673.   Event_Handler (void);
  1674. public:
  1675.   virtual ~Event_Handler (void);
  1676.   virtual int  get_fd (void) const = 0;
  1677.   virtual int  handle_close (void);
  1678.   virtual int  make_async (void);
  1679.   virtual int  handle_input (int);
  1680.   virtual int  handle_output (int);
  1681.   virtual int  handle_exception (int);
  1682.   virtual int  handle_sigio (int);
  1683.   virtual int  handle_timeout (const Time_Value &tv);
  1684. };
  1685. inline int  BIT_ENABLED (unsigned long word, int bit = 1) { return (word & bit) != 0; }
  1686. inline int  BIT_DISABLED (unsigned long word, int bit = 1) { return (word & bit) == 0; }
  1687. inline void SET_BIT (unsigned long &word, int bit) { word |= bit; }
  1688. inline void CLR_BIT (unsigned long &word, int bit) { word &= ~bit; }
  1689. class FD_Set
  1690. {
  1691. friend class FD_Set_Iter;
  1692. public:
  1693.   FD_Set (void);
  1694.   void zero (void);
  1695.   int  is_set (int) const;
  1696.   void set_bit (int);
  1697.   void clr_bit (int);
  1698.   int  num_set (void) const;
  1699.   int  max_set (void) const;
  1700.   int  pr_mask (void);
  1701.   void sync (int max =     20    );
  1702.   operator fd_set *();
  1703. private:
  1704.   int     size;
  1705.   int     max_fd;
  1706.   fd_set mask;
  1707.   enum
  1708.     {
  1709.       MAX_SIZE  =     20    ,
  1710.       WORD_SIZE = (sizeof (fd_mask) * 8            )    ,
  1711.       NUM_WORDS = (((    20    )+(( (sizeof (fd_mask) * 8            )    )-1))/( (sizeof (fd_mask) * 8            )    )) ,
  1712.       MSB_MASK    = ~(1 << ((sizeof (fd_mask) * 8            )     - 1))
  1713.     };
  1714.   int  count_bits (unsigned long n) const;
  1715.   void set_max (int max);
  1716.   static const char nbits[256];
  1717. };
  1718. class FD_Set_Iter
  1719. {
  1720. public:
  1721.   FD_Set_Iter (FD_Set &);
  1722.   int operator ()(void);
  1723.   void operator++ (void);
  1724. private:
  1725.   FD_Set  &fds;
  1726.   int      index;
  1727.   int      num;
  1728.   fd_mask val;
  1729. };
  1730. class Timer_Queue
  1731. {
  1732. public:
  1733.   static const Time_Value zero;
  1734. public:
  1735.   Timer_Queue (void);
  1736.   virtual ~Timer_Queue (void);
  1737.   int               is_empty (void) const;
  1738.   const Time_Value        &earliest_time (void) const;
  1739.   static const Time_Value ¤t_time (void);
  1740.   void schedule (const Event_Handler *, const Time_Value &, const Time_Value & = Timer_Queue::zero);
  1741.   void cancel (const Event_Handler *);
  1742.   void expire (const Time_Value &);
  1743. private:
  1744.   struct Timer
  1745.     {
  1746.       Timer (const Event_Handler *h, const Time_Value &t, const Time_Value &i, Timer *n);
  1747.       Event_Handler const *handler;
  1748.       Time_Value timer_value;
  1749.       Time_Value interval;
  1750.       Timer     *next;
  1751.     };
  1752.   Timer *head;
  1753. };
  1754. typedef int (Event_Handler::*PTMF) (int);
  1755. class Reactor
  1756. {
  1757. public:
  1758.   enum Reactor_Mask
  1759.   {
  1760.     READ_MASK   = 01,
  1761.     WRITE_MASK  = 02,
  1762.     EXCEPT_MASK = 04,
  1763.     SIGIO_MASK  = 010,
  1764.     RWE_MASK    = 01 | 02 | 04
  1765.   };
  1766.   virtual ~Reactor (void);
  1767.   virtual int         register_handler (const Event_Handler *, Reactor_Mask = READ_MASK);
  1768.   virtual int         register_handler (int fd, const Event_Handler *, Reactor_Mask = READ_MASK);
  1769.   virtual int         remove_handler (const Event_Handler *, Reactor_Mask = READ_MASK);
  1770.   virtual int         remove_handler (int fd, Reactor_Mask = READ_MASK);
  1771.   virtual int         set_ready (const Event_Handler *, Reactor_Mask = READ_MASK);
  1772.   virtual int         set_ready (int fd, Reactor_Mask = READ_MASK);
  1773.   virtual void         schedule_timer (const Event_Handler *, const Time_Value &delta, const Time_Value &interval = Timer_Queue::zero);
  1774.   virtual void         cancel_timer (const Event_Handler *);
  1775.   virtual void         handle_events (void);
  1776.   virtual int         handle_events (Time_Value &tv);
  1777. public:
  1778.   static int enable_signal_handler (int signum);
  1779.   static Reactor *open (int size =     20    , Reactor *new_Reactor = 0);
  1780.   static void close (Reactor *Reactor = 0);
  1781. protected:
  1782.   Reactor (int size =     20    );
  1783.   static void        handle_sigurg (void);
  1784.   static void         handle_sigio (void);
  1785.   static void         handle_sigpipe (void);
  1786.   virtual int         attach (const Event_Handler *, Reactor_Mask, int fd);
  1787.   virtual int         detach (Reactor_Mask, int fd);
  1788.   virtual int         handle_events (Time_Value *);
  1789.   virtual int         any_ready (void) const;
  1790.   virtual int         fill_in_ready (FD_Set &, FD_Set &, FD_Set &, FD_Set&);
  1791.   virtual int         wait_for (FD_Set &, FD_Set &, FD_Set &, Time_Value *);
  1792.   virtual Time_Value *calculate_timeout (Time_Value *) const;
  1793.   virtual void         notify_fds (int, FD_Set &, FD_Set &, FD_Set &, FD_Set &);
  1794.   virtual void         notify_fd (int, Reactor_Mask, FD_Set &, const Event_Handler *, PTMF);
  1795.   virtual int         handle_error (void);
  1796.   virtual int         check_connections (void);
  1797. protected:
  1798.   Event_Handler   const **readfd_table;
  1799.   Event_Handler   const **writefd_table;
  1800.   Event_Handler   const **exceptfd_table;
  1801.   Event_Handler   const **sigiofd_table;
  1802.   Timer_Queue  timer_queue;
  1803.   int           max_fd;
  1804.   int           max_size;
  1805.   FD_Set       readfd_mask;
  1806.   FD_Set       writefd_mask;
  1807.   FD_Set       exceptfd_mask;
  1808.   FD_Set       sigiofd_mask;
  1809.   FD_Set       readfd_mask_ready;
  1810.   FD_Set       writefd_mask_ready;
  1811.   FD_Set       exceptfd_mask_ready;
  1812.   FD_Set       sigiofd_mask_ready;
  1813. private:
  1814.   static Reactor *instance;
  1815.   int max (int i, int j, int k, int l);
  1816.   Reactor (const Reactor &);
  1817.   Reactor &operator = (const Reactor &);
  1818. };
  1819. class SAP_Addr
  1820. {
  1821. public:
  1822.   SAP_Addr (void);
  1823.   SAP_Addr (int type, int size);
  1824.   void set (int type, int size);
  1825.   int      get_size (void) const;
  1826.   void      set_size (int size);
  1827.   int      get_type (void) const;
  1828.   void      set_type (int type);
  1829.   virtual void *get_addr (void) const;
  1830.   virtual int operator == (const SAP_Addr &sap) const;
  1831.   virtual int operator != (const SAP_Addr &sap) const;
  1832. protected:
  1833.   int addr_type;
  1834.   int addr_size;
  1835. };
  1836. extern const SAP_Addr sap_any;
  1837. class SAP_UNIX_Addr : public SAP_Addr
  1838. {
  1839. public:
  1840.   SAP_UNIX_Addr (void);
  1841.   SAP_UNIX_Addr (const SAP_UNIX_Addr &sa);
  1842.   SAP_UNIX_Addr (const char rendezvous_point[]);
  1843.   virtual void *get_addr (void) const;
  1844.   virtual int  operator == (const SAP_Addr &SAP) const;
  1845.   virtual int  operator != (const SAP_Addr &SAP) const;
  1846.   const char *get_path_name (void) const;
  1847. private:
  1848.   sockaddr_un unix_addr;
  1849. };
  1850. class IPC_SAP
  1851. {
  1852. public:
  1853.   int  open (int type, int async, int protocol_family, int protocol = 0);
  1854.   int  close (void);
  1855.   int  set_option (int level, int option, void *optval, int optlen) const;
  1856.   int  get_option (int level, int option, void *optval, int &optlen) const;
  1857.   int  enable (int signum) const;
  1858.   int  disable (int signum) const;
  1859.   int get_host_info (SAP_Addr &) const;
  1860.   int  get_fd (void) const;
  1861.   void set_fd (int fd);
  1862. protected:
  1863.   IPC_SAP (void);
  1864.   IPC_SAP (int type, int async, int protocol_family, int protocol = 0);
  1865.   ~IPC_SAP (void);
  1866. private:
  1867.   int sok_fd;
  1868. };
  1869. class IPC_SAP_Connect : public IPC_SAP
  1870. {
  1871. public:
  1872.   int get_peer_info (SAP_Addr &) const;
  1873.   int send (const void *buf, int n, int flags = 0) const;
  1874.   int recv (void *buf, int n, int flags = 0) const;
  1875.   int send (const iovec iov[], int n) const;
  1876.   int recv (iovec iov[], int n) const;
  1877.   int send (int n, ...);
  1878.   int recv (int n, ...);
  1879. protected:
  1880.   IPC_SAP_Connect (void);
  1881.   IPC_SAP_Connect (int type, int async, int protocol_family, int protocol = 0);
  1882. };
  1883. class IPC_SAP_Stream : public IPC_SAP_Connect
  1884. {
  1885. friend class IPC_SAP_Listener;
  1886. public:
  1887.   IPC_SAP_Stream (void);
  1888.   IPC_SAP_Stream (const SAP_Addr &remote_sap, int async = 0, int protcol_family =         2         , int protocol = 0);
  1889.   int open (const SAP_Addr &remote_sap, int async = 0, int protcol_family =         2         , int protocol = 0);
  1890.   int  close_reader (void);
  1891.   int  close_writer (void);
  1892.   int  send_n (const void *buf, int n, int flags = 0) const;
  1893.   int  recv_n (void *buf, int n, int flags = 0) const;
  1894.   int  send_urg (void *ptr, int len = sizeof (char));
  1895.   int  recv_urg (void *ptr, int len = sizeof (char));
  1896. };
  1897. class IPC_SAP_Listener : public IPC_SAP
  1898. {
  1899. public:
  1900.   IPC_SAP_Listener (void);
  1901.   IPC_SAP_Listener (const SAP_Addr &remote_sap, int async = 0, int micro_sec_delay = -1, int protocol_family =         2         , int backlog = 5, int protocol = 0);
  1902.   int open (const SAP_Addr &remote_sap, int async = 0, int micro_sec_delay = -1, int protocol_family =         2         , int backlog = 5, int protocol = 0);
  1903.   int accept (IPC_SAP_Stream &new_ipc_sap, SAP_Addr *remote_addr = 0, int restart = 1) const;
  1904.   int operator () (IPC_SAP_Stream &new_ipc_sap, SAP_Addr *remote_addr = 0, int restart = 1) const;
  1905. protected:
  1906.   int micro_second_delay;
  1907. protected:
  1908.   int shared_open (const SAP_Addr &remote_sap, int backlog);
  1909.   int shared_accept (SAP_Addr *remote_addr, int restart) const;
  1910. };
  1911. class Local_IPC_SAP
  1912. {
  1913. public:
  1914.   int send_fd (const int fds) const;
  1915.   int recv_fd (int &fds) const;
  1916. protected:
  1917.   Local_IPC_SAP (void);
  1918.   Local_IPC_SAP (int fd);
  1919.   void set_fd (int fd);
  1920. private:
  1921.   int sok_fd;
  1922. };
  1923. class Local_IPC_SAP_Stream : public IPC_SAP_Stream, public Local_IPC_SAP
  1924. {
  1925. friend class Local_IPC_SAP_Listener;
  1926. public:
  1927.   Local_IPC_SAP_Stream (void);
  1928.   Local_IPC_SAP_Stream (const SAP_Addr &remote_sap, int async = 0, int protocol_family =         1         , int protocol = 0);
  1929.   int open (const SAP_Addr &remote_sap, int async = 0, int protcol_family =         1         , int protocol = 0);
  1930.   void set_fd (int fd);
  1931.   int send_msg (const iovec iov[], int n, int fd);
  1932.   int recv_msg (iovec iov[], int n, int &fd);
  1933. private:
  1934.   int  get_peer_info (SAP_Addr &) const;
  1935.   int  get_host_info (SAP_Addr &) const;
  1936. };
  1937. class Local_IPC_SAP_Listener : public IPC_SAP_Listener
  1938. {
  1939. public:
  1940.   Local_IPC_SAP_Listener (void);
  1941.   Local_IPC_SAP_Listener (const SAP_Addr &remote_sap, int async = 0, int micro_sec_delay = -1, int protocol_family =         1         , int backlog = 5, int protocol = 0);
  1942.   int  open (const SAP_Addr &remote_sap, int async = 0, int micro_sec_delay= -1, int protocol_family =         1         , int backlog = 5, int protocol = 0);
  1943.   int  accept (Local_IPC_SAP_Stream &new_ipc_sap, SAP_Addr * = 0, int restart = 1) const;
  1944.   int  operator () (Local_IPC_SAP_Stream &new_ipc_sap, SAP_Addr * = 0, int restart = 1) const;
  1945. };
  1946. class Handle_L_Stream : public Event_Handler, public Local_IPC_SAP_Listener
  1947. {
  1948. public:
  1949.   Handle_L_Stream (void);
  1950.   Handle_L_Stream (const SAP_UNIX_Addr &suas, int async = 0);
  1951.   int open (const SAP_UNIX_Addr &suas, int async = 0);
  1952.   virtual int get_fd (void) const;
  1953.   virtual int handle_input (int ready_fd);
  1954.   virtual int handle_sigio (int ready_fd);
  1955.   virtual int make_async (void);
  1956. private:
  1957.   static char *login_name;
  1958.   static Handle_L_Stream dummy;
  1959. };
  1960. class IPC_SAP_Dgram : public IPC_SAP
  1961. {
  1962. public:
  1963.   IPC_SAP_Dgram (void);
  1964.   IPC_SAP_Dgram (const SAP_Addr &local, int async = 0, int protocol_family =         2         , int protocol = 0);
  1965.   int open (const SAP_Addr &local, int async = 0, int protocol_family =         2         , int protocol = 0);
  1966.   int send (const void *buf, int n, const SAP_Addr &addr, int flags = 0) const;
  1967.   int send (const iovec iov[], int n, const SAP_Addr &addr, int flags = 0) const;
  1968.   int recv (void *buf, int n, SAP_Addr &addr, int flags = 0) const;
  1969.   int recv (iovec iov[], int n, SAP_Addr &addr, int flags = 0) const;
  1970. private:
  1971.   int shared_open (const SAP_Addr &local, int protocol_family);
  1972. };
  1973. class Local_IPC_SAP_Dgram : public IPC_SAP_Dgram, public Local_IPC_SAP
  1974. {
  1975. public:
  1976.   Local_IPC_SAP_Dgram (void);
  1977.   Local_IPC_SAP_Dgram (const SAP_Addr &local, int async = 0, int protocol_family =         1         , int protocol = 0);
  1978.   int open (const SAP_Addr &local, int async = 0, int protocol_family =         1         , int protocol = 0);
  1979. private:
  1980. };
  1981. class Handle_L_Dgram : public Event_Handler, public Local_IPC_SAP_Dgram
  1982. {
  1983. public:
  1984.   Handle_L_Dgram (void);
  1985.   Handle_L_Dgram (const SAP_UNIX_Addr &suad, int async = 0);
  1986.   int open (const SAP_UNIX_Addr &suad, int async = 0);
  1987.   virtual int get_fd (void) const;
  1988.   virtual int handle_input (int ready_fd);
  1989. };
  1990. class IPC_SAP_CODgram : public IPC_SAP_Connect
  1991. {
  1992. public:
  1993.   IPC_SAP_CODgram (void);
  1994.   IPC_SAP_CODgram (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family =         2         , int protocol = 0);
  1995.   int open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family =         2         , int protocol = 0);
  1996. private:
  1997.   int shared_open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap, int protocol_family);
  1998. };
  1999. class Local_IPC_SAP_CODgram : public IPC_SAP_CODgram, public Local_IPC_SAP
  2000. {
  2001. public:
  2002.   Local_IPC_SAP_CODgram (void);
  2003.   Local_IPC_SAP_CODgram (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family =         1         , int protocol = 0);
  2004.   int open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family =         1         , int protocol = 0);
  2005. };
  2006. class Handle_L_CODgram : public Event_Handler, public Local_IPC_SAP_CODgram
  2007. {
  2008. public:
  2009.   Handle_L_CODgram (void);
  2010.   Handle_L_CODgram (const SAP_UNIX_Addr &suad, int async = 0);
  2011.   int open (const SAP_UNIX_Addr &suad, int async = 0);
  2012.   virtual int get_fd (void) const;
  2013.   virtual int handle_input (int ready_fd);
  2014. };
  2015. class Handle_L_Pipe : public Event_Handler, public Local_IPC_SAP_Listener
  2016. {
  2017. public:
  2018.   Handle_L_Pipe (void);
  2019.   Handle_L_Pipe (const SAP_UNIX_Addr &suap, int async = 0);
  2020.   int open (const SAP_UNIX_Addr &suap, int async = 0);
  2021.   virtual int get_fd (void) const;
  2022.   virtual int handle_input (int ready_fd);
  2023.   virtual int handle_sigio (int ready_fd);
  2024.   virtual int make_async ();
  2025. };
  2026. class IPC_SAP_FIFO_Msg
  2027. {
  2028. public:
  2029.   IPC_SAP_FIFO_Msg (int length = 0, void *message = 0);
  2030.   long len;
  2031.   void *mesg;
  2032. };
  2033. class IPC_SAP_FIFO
  2034. {
  2035. public:
  2036.   IPC_SAP_FIFO (void);
  2037.   IPC_SAP_FIFO (const char *rendezvous, int flags, int perms);
  2038.   int open (const char *rendezvous, int flags, int perms);
  2039.   int close (void);
  2040.   int enable (int num) const;
  2041.   int disable (int num) const;
  2042.   void set_fd (int fd);
  2043.   int get_fd (void) const;
  2044. protected:
  2045.   int fifo_fd;
  2046. };
  2047. class IPC_SAP_FIFO_Send : public IPC_SAP_FIFO
  2048. {
  2049. public:
  2050.   IPC_SAP_FIFO_Send (void);
  2051.   IPC_SAP_FIFO_Send (const char *rendezvous, int flags = 1 , int perms = 0666);
  2052.   int open (const char *rendezvous, int flags = 1 , int perms = 0666);
  2053.   int send (void *buf, int len);
  2054. };
  2055. class IPC_SAP_FIFO_Send_Msg : public IPC_SAP_FIFO_Send
  2056. {
  2057. public:
  2058.   IPC_SAP_FIFO_Send_Msg (void);
  2059.   IPC_SAP_FIFO_Send_Msg (const char *rendezvous, int flags = 1 , int perms = 0666);
  2060.   int open (const char *rendezvous, int flags = 1 , int perms = 0666);
  2061.   int send (IPC_SAP_FIFO_Msg &msg);
  2062. };
  2063. class IPC_SAP_FIFO_Recv : public IPC_SAP_FIFO
  2064. {
  2065. public:
  2066.   IPC_SAP_FIFO_Recv (void);
  2067.   IPC_SAP_FIFO_Recv (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
  2068.   int open (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
  2069.   int recv (void *buf, int len);
  2070. };
  2071. class IPC_SAP_FIFO_Recv_Msg : public IPC_SAP_FIFO_Recv
  2072. {
  2073. public:
  2074.   IPC_SAP_FIFO_Recv_Msg (void);
  2075.   IPC_SAP_FIFO_Recv_Msg (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
  2076.   int open (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
  2077.   int recv (IPC_SAP_FIFO_Msg &msg);
  2078. };
  2079. class Handle_L_FIFO_Msg : public Event_Handler, public IPC_SAP_FIFO_Recv_Msg
  2080. {
  2081. public:
  2082.   Handle_L_FIFO_Msg (void);
  2083.   Handle_L_FIFO_Msg (char *rendezvous_fifo);
  2084.   int open (char *rendezvous_fifo);
  2085.   virtual int get_fd (void) const;
  2086.   virtual int handle_input (int ready_fd);
  2087.   virtual int make_async (void);
  2088.   virtual int handle_sigio (int ready_fd);
  2089. };
  2090. class SAP_INET_Addr : public SAP_Addr
  2091. {
  2092. public:
  2093.   SAP_INET_Addr (void);
  2094.   SAP_INET_Addr (const SAP_INET_Addr &);
  2095.   SAP_INET_Addr (unsigned short port_number, const char host_name[]);
  2096.   SAP_INET_Addr (unsigned short port_number, long ip_addr =     (u_long)0x00000000 );
  2097.   void set (unsigned short port_number, const char host_name[]);
  2098.   void set (unsigned short port_number, long ip_addr =     (u_long)0x00000000 );
  2099.   virtual void   *get_addr (void) const;
  2100.   virtual int    operator == (const SAP_Addr &SAP) const;
  2101.   virtual int    operator != (const SAP_Addr &SAP) const;
  2102.   const char     *get_host_name (void) const;
  2103.   const    char     *get_host_addr (void) const;
  2104.   unsigned long  get_ip_address (void) const;
  2105.   unsigned short get_port_number (void) const;
  2106. private:
  2107.   sockaddr_in inet_addr;
  2108. };
  2109. class Handle_R_Stream : public Event_Handler, public IPC_SAP_Listener
  2110. {
  2111. public:
  2112.   Handle_R_Stream (void);
  2113.   Handle_R_Stream (const SAP_INET_Addr &sia, int async = 0);
  2114.   virtual int get_fd (void) const;
  2115.   virtual int exception_raised (int ready_fd);
  2116.   virtual int handle_input (int ready_fd);
  2117.   virtual int handle_sigio(int ready_fd);
  2118. private:
  2119.   static Handle_R_Stream dummy;
  2120.   static char         *login_name;
  2121.   IPC_SAP_Stream     new_remote_stream;
  2122. };
  2123. class Handle_R_Dgram : public Event_Handler, public IPC_SAP_Dgram
  2124. {
  2125. public:
  2126.   Handle_R_Dgram (void);
  2127.   Handle_R_Dgram (const SAP_INET_Addr &r, int async = 0);
  2128.   int open (const SAP_INET_Addr &r, int async = 0);
  2129.   virtual int get_fd (void) const;
  2130.   virtual int handle_input (int ready_fd);
  2131.   virtual int handle_sigio(int ready_fd);
  2132.   virtual int make_async (void);
  2133. };
  2134. class Handle_Broadcast : public Event_Handler, public IPC_SAP_Dgram
  2135. {
  2136. public:
  2137.   Handle_Broadcast (void);
  2138.   Handle_Broadcast (const SAP_INET_Addr &r, int async = 0);
  2139.   int open (const SAP_INET_Addr &r, int async = 0);
  2140.   virtual int get_fd (void) const;
  2141.   virtual int handle_input (int ready_fd);
  2142. };
  2143. class Handle_Timeout : public Event_Handler
  2144. {
  2145. public:
  2146.   Handle_Timeout (void);
  2147.   int get_fd (void) const;
  2148.   int handle_timeout (const Time_Value &tv);
  2149. };
  2150. class IO_Handlers
  2151. {
  2152. public:
  2153.   enum IO_Handler_Type
  2154.   {
  2155.     LOCAL_STREAM = 1,
  2156.     LOCAL_DGRAM,
  2157.     LOCAL_CODGRAM,
  2158.     LOCAL_PIPE,
  2159.     LOCAL_FIFO,
  2160.     REMOTE_STREAM,
  2161.     REMOTE_DGRAM,
  2162.     BROADCAST,
  2163.   };
  2164.   IO_Handler_Type type;
  2165.   const Event_Handler *handler;
  2166. };
  2167. class Timer_Handlers
  2168. {
  2169. public:
  2170.   enum Timer_Handler_Type
  2171.   {
  2172.     TIMER_ZERO = 0,
  2173.     TIMER_ONE  = 1
  2174.   };
  2175.   Timer_Handlers (Timer_Handler_Type t, Event_Handler *h, Time_Value v1, Time_Value v2)
  2176.                  : type (t), handler (h), t1 (v1), t2 (v2) {}
  2177.   Timer_Handler_Type type;
  2178.   const Event_Handler *handler;
  2179.   Time_Value t1;
  2180.   Time_Value t2;
  2181. };
  2182. extern IO_Handlers IO_handlers[];
  2183. extern Timer_Handlers timer_handlers[];
  2184. Handle_L_Stream   local_stream;
  2185. Handle_L_Dgram    local_dgram;
  2186. Handle_L_CODgram  local_codgram;
  2187. Handle_L_Pipe      local_pipe;
  2188. Handle_L_FIFO_Msg local_fifo;
  2189. Handle_R_Stream   remote_stream;
  2190. Handle_R_Dgram    remote_dgram;
  2191. Handle_Broadcast  broadcast;
  2192. IO_Handlers IO_handlers[] =
  2193. {
  2194.   { IO_Handlers::LOCAL_STREAM,  &local_stream },
  2195.   { IO_Handlers::LOCAL_DGRAM,   &local_dgram },
  2196.   { IO_Handlers::LOCAL_CODGRAM, &local_codgram },
  2197.   { IO_Handlers::LOCAL_PIPE,    &local_pipe },
  2198.   { IO_Handlers::LOCAL_FIFO,    &local_fifo },
  2199.   { IO_Handlers::REMOTE_STREAM, &remote_stream },
  2200.   { IO_Handlers::REMOTE_DGRAM,  &remote_dgram },
  2201.   { IO_Handlers::BROADCAST,    &broadcast },
  2202.   { 0, 0 }
  2203. };
  2204. Handle_Timeout handle_timeout;
  2205. Timer_Handlers th1 (Timer_Handlers::TIMER_ONE, &handle_timeout, Timer_Queue::zero, Timer_Queue::zero);
  2206. Timer_Handlers th2 (Timer_Handlers::TIMER_ZERO, 0, Timer_Queue::zero, Timer_Queue::zero);
  2207. Timer_Handlers timer_handlers[2] =
  2208. {
  2209.   th1, th2
  2210. };
  2211.  
  2212.