Thread View: gnu.g++.bug
1 messages
1 total messages
Started by Douglas C. Schmidt
Tue, 26 Jan 1993 02:29
internal compiler error
Author: Douglas C. Schmidt
Date: Tue, 26 Jan 1993 02:29
Date: Tue, 26 Jan 1993 02:29
2198 lines
59539 bytes
59539 bytes
Hi,
The following file causes gcc 2.3.3 to fail on both Solaris
2.1 and Sun OS 4.1.2.
Doug
----------------------------------------
% gcc -v x.C
Reading specs from /opt/gnu/lib/gcc-lib/sparc-sun-solaris2/2.3.3/specs
gcc version 2.3.3
/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
GNU CPP version 2.3.3 (sparc)
/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
GNU C++ version 2.3.3 (sparc) compiled by GNU C version 2.3.3.
x.C:0: warning: destructor `Local_IPC_SAP_Listener::~Local_IPC_SAP_Listener ()' non-virtual
x.C:1913: warning: in inheritance relationship `Handle_L_Stream: Local_IPC_SAP_Listener'
x.C:0: warning: destructor `Local_IPC_SAP_Dgram::~Local_IPC_SAP_Dgram ()' non-virtual
x.C:1943: warning: in inheritance relationship `Handle_L_Dgram: Local_IPC_SAP_Dgram'
x.C:0: warning: destructor `Local_IPC_SAP_CODgram::~Local_IPC_SAP_CODgram ()' non-virtual
x.C:1968: warning: in inheritance relationship `Handle_L_CODgram: Local_IPC_SAP_CODgram'
x.C:0: warning: destructor `Local_IPC_SAP_Listener::~Local_IPC_SAP_Listener ()' non-virtual
x.C:1979: warning: in inheritance relationship `Handle_L_Pipe: Local_IPC_SAP_Listener'
x.C:0: warning: destructor `IPC_SAP_Listener::~IPC_SAP_Listener ()' non-virtual
x.C:2076: warning: in inheritance relationship `Handle_R_Stream: IPC_SAP_Listener'
x.C:0: warning: destructor `IPC_SAP_Dgram::~IPC_SAP_Dgram ()' non-virtual
x.C:2087: warning: in inheritance relationship `Handle_R_Dgram: IPC_SAP_Dgram'
x.C:0: warning: destructor `IPC_SAP_Dgram::~IPC_SAP_Dgram ()' non-virtual
x.C:2096: warning: in inheritance relationship `Handle_Broadcast: IPC_SAP_Dgram'
x.C: In function `void _GLOBAL_.I.local_stream ()':
x.C:2161: Internal compiler error.
x.C:2161: Please report this to `bug-g++@prep.ai.mit.edu'.
----------------------------------------
extern "C" {
typedef struct _physadr { int r[1]; } *physadr;
typedef struct _label_t { int val[2]; } label_t;
typedef unsigned char lock_t;
}
extern "C" {
typedef unsigned char uchar_t;
typedef unsigned short ushort_t;
typedef unsigned int uint_t;
typedef unsigned long ulong_t;
typedef char * caddr_t;
typedef long daddr_t;
typedef long off_t;
typedef short cnt_t;
typedef ulong_t paddr_t;
typedef uchar_t use_t;
typedef short sysid_t;
typedef short index_t;
typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
typedef union {
long l[2];
double d;
} longlong_t;
typedef union {
unsigned long l[2];
double d;
} u_longlong_t;
typedef longlong_t offset_t;
typedef longlong_t diskaddr_t;
typedef union lloff {
offset_t _f;
struct {
long _u;
off_t _l;
} _p;
} lloff_t;
typedef union lldaddr {
diskaddr_t _f;
struct {
long _u;
daddr_t _l;
} _p;
} lldaddr_t;
typedef ulong_t k_fltset_t;
typedef long id_t;
typedef ulong_t major_t;
typedef ulong_t minor_t;
typedef short pri_t;
typedef ushort_t o_mode_t;
typedef short o_dev_t;
typedef ushort_t o_uid_t;
typedef o_uid_t o_gid_t;
typedef short o_nlink_t;
typedef short o_pid_t;
typedef ushort_t o_ino_t;
typedef int key_t;
typedef ulong_t mode_t;
typedef long uid_t;
typedef uid_t gid_t;
typedef ulong_t nlink_t;
typedef ulong_t dev_t;
typedef ulong_t ino_t;
typedef long pid_t;
typedef uint_t size_t;
typedef int ssize_t;
typedef long time_t;
typedef long clock_t;
typedef unsigned char unchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef long hostid_t;
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef struct _quad { long val[2]; } quad;
extern "C" {
struct timeval {
long tv_sec;
long tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
}
extern "C" {
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
typedef struct timestruc {
time_t tv_sec;
long tv_nsec;
} timestruc_t;
typedef longlong_t hrtime_t;
int adjtime(struct timeval *, struct timeval *);
int getitimer(int, struct itimerval *);
int setitimer(int, struct itimerval *, struct itimerval *);
extern "C" {
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
extern clock_t clock(void);
extern double difftime(time_t, time_t);
extern time_t mktime(struct tm *);
extern time_t time(time_t *);
extern char *asctime(const struct tm *);
extern char *ctime (const time_t *);
extern struct tm *gmtime(const time_t *);
extern struct tm *localtime(const time_t *);
extern size_t strftime(char *, size_t, const char *, const struct tm *);
}
}
extern "C" {
typedef long fd_mask;
typedef struct fd_set {
fd_mask fds_bits[(((1024 )+(( (sizeof (fd_mask) * 8 ) )-1))/( (sizeof (fd_mask) * 8 ) )) ];
} fd_set;
extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
}
}
extern "C" {
struct netconfig {
char *nc_netid;
unsigned long nc_semantics;
unsigned long nc_flag;
char *nc_protofmly;
char *nc_proto;
char *nc_device;
unsigned long nc_nlookups;
char **nc_lookups;
unsigned long nc_unused[8];
};
typedef struct {
struct netconfig **nc_head;
struct netconfig **nc_curr;
} NCONF_HANDLE;
extern void *setnetconfig(void);
extern int endnetconfig(void *);
extern struct netconfig *getnetconfig(void *);
extern struct netconfig *getnetconfigent(char *);
extern void freenetconfigent(struct netconfig *);
extern void *setnetpath(void);
extern int endnetpath(void *);
extern struct netconfig *getnetpath(void *);
}
extern "C" {
struct linger {
int l_onoff;
int l_linger;
};
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
struct sockproto {
u_short sp_family;
u_short sp_protocol;
};
struct msghdr {
caddr_t msg_name;
int msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
caddr_t msg_accrights;
int msg_accrightslen;
};
struct opthdr {
long level;
long name;
long len;
};
struct optdefault {
int optname;
char *val;
int len;
};
struct opproc {
int level;
int (*func)();
};
struct socksysreq {
int args[7];
};
struct socknewproto {
int family;
int type;
int proto;
dev_t dev;
int flags;
};
extern int accept(int, struct sockaddr *, int *);
extern int bind(int, struct sockaddr *, int);
extern int connect(int, struct sockaddr *, int);
extern int getpeername(int, struct sockaddr *, int *);
extern int getsockname(int, struct sockaddr *, int *);
extern int getsockopt(int, int, int, char *, int *);
extern int listen(int, int);
extern int recv(int, char *, int, int);
extern int recvfrom(int, char *, int, int, struct sockaddr *, int *);
extern int send(int, const char *, int, int);
extern int sendto(int, const char *, int, int, struct sockaddr *, int);
extern int setsockopt(int, int, int, const char *, int);
extern int socket(int, int, int);
extern int recvmsg(int, struct msghdr *, int);
extern int sendmsg(int, struct msghdr *, int);
extern int shutdown(int, int);
extern int socketpair(int, int, int, int *);
}
extern "C" {
extern void lock_set(lock_t *lp);
extern int lock_try(lock_t *lp);
extern void lock_clear(lock_t *lp);
extern int lock_set_spl(lock_t *lp, int pl);
extern void lock_clear_splx(lock_t *lp, int s);
}
extern "C" {
typedef struct dl {
long dl_hop;
ulong_t dl_lop;
} dl_t;
extern dl_t ladd(dl_t, dl_t);
extern dl_t lsub(dl_t, dl_t);
extern dl_t lmul(dl_t, dl_t);
extern dl_t ldivide(dl_t, dl_t);
extern dl_t lshiftl(dl_t, int);
extern dl_t llog10(dl_t);
extern dl_t lexp10(dl_t);
extern dl_t lzero;
extern dl_t lone;
extern dl_t lten;
}
extern "C" {
typedef struct lkinfo {
char *lk_name;
int lk_flags;
long lk_pad[2];
} lkinfo_t;
typedef struct _lkstat_t {
lkinfo_t *ls_infop;
ulong_t ls_wrcnt;
ulong_t ls_rdcnt;
ulong_t ls_solordcnt;
ulong_t ls_fail;
union {
dl_t lsu_time;
struct _lkstat_t *lsu_next;
} un;
dl_t ls_wtime;
dl_t ls_htime;
} lkstat_t;
typedef struct lkstat_sum {
lkstat_t *sp;
struct lkstat_sum *next;
} lkstat_sum_t;
typedef struct lksblk {
struct lksblk *lsb_prev, *lsb_next;
int lsb_nfree;
lkstat_t *lsb_free;
lkstat_t lsb_bufs[91 ];
} lksblk_t;
extern lkstat_t *lkstat_alloc(lkinfo_t *, int);
extern void lkstat_free(lkstat_t *, int);
extern void * startup_alloc(size_t, void **);
extern void startup_free(void *, size_t, void **);
}
extern "C" {
typedef enum syncobj
{
SOBJ_NONE = 0,
SOBJ_MTX = 1,
SOBJ_RDR = 2,
SOBJ_WRT = 3,
SOBJ_CV = 4,
SOBJ_SEM = 5
} syncobj_t;
typedef struct sleepq
{
struct _kthread * sq_first;
} sleepq_t;
extern struct sleepq sleepq[];
}
extern "C" {
}
extern "C" {
}
extern "C" {
typedef struct pirec
{
struct pirec *pi_forw;
struct pirec *pi_back;
struct _kthread *pi_owner;
int pi_epri_hi;
} pirec_t;
}
extern "C" {
typedef enum
{
QOBJ_DEF = 0,
QOBJ_RDR = 0,
QOBJ_WRT = 1,
QOBJ_CV = 0,
QOBJ_MTX = 0,
QOBJ_SEM = 0
} qobj_t;
typedef struct turnstile turnstile_t;
typedef ushort_t turnstile_id_t;
struct turnstile
{
union tstile_un
{
turnstile_t *ts_forw;
pirec_t ts_prioinv;
} tsun;
turnstile_id_t ts_id;
short ts_pad;
int ts_refcnt;
sleepq_t ts_sleepq[2 ];
};
}
extern "C" {
typedef enum {
MUTEX_ADAPTIVE = 0,
MUTEX_SPIN,
MUTEX_ADAPTIVE_STAT,
MUTEX_SPIN_STAT,
MUTEX_DRIVER_NOSTAT = 4,
MUTEX_DRIVER_STAT = 5,
MUTEX_ADAPTIVE_DEF
} kmutex_type_t;
typedef union mutex {
struct generic_mutex {
char _filler1[3];
lock_t m_lock;
uchar_t m_type;
char _filler2[3];
} m_generic;
struct adaptive_mutex {
uint_t m_owner : 24;
lock_t m_lock;
uchar_t m_type;
char _filler;
turnstile_id_t m_waiters;
} m_adaptive;
struct adaptive_mutex2 {
uint_t m_owner_lock;
uchar_t m_type;
char _filler;
turnstile_id_t m_waiters;
} m_adaptive2;
struct spin_mutex {
ushort_t m_oldspl;
lock_t m_spinlock;
lock_t m_dummylock;
uchar_t m_type;
char _filler;
ushort_t m_minspl;
} m_spin;
struct stat_mutex {
uint_t m_stats_lock;
uchar_t m_type;
uchar_t _filler[3];
} m_stats;
} kmutex_t;
struct mutex_stats {
kmutex_t m_real;
lkinfo_t lkinfo;
lkstat_t *lkstat;
char name[18 ];
uchar_t flag;
};
}
extern "C" {
extern int ncpus;
typedef enum {
SEMA_DEFAULT,
SEMA_DRIVER
} ksema_type_t;
typedef struct _ksema {
unsigned char type;
char pad;
turnstile_id_t waiters;
int count;
} ksema_t;
typedef enum {
RW_SLEEP,
RW_SLEEP_STAT,
RW_DRIVER_NOSTAT = 2,
RW_DRIVER_STAT = 3,
RW_DEFAULT
} krw_type_t;
typedef enum {
RW_WRITER,
RW_READER
} krw_t;
typedef struct _krwlock {
unsigned char type;
turnstile_id_t waiters;
union {
struct rwlock_stats *sp;
struct {
short writewanted;
short holdcnt;
} rw;
} un;
struct _kthread *owner;
} krwlock_t;
struct rwlock_stats {
krwlock_t real;
lkinfo_t lkinfo;
lkstat_t *lkstat;
char name[18 +1];
char flag;
};
typedef struct {
turnstile_id_t waiters;
} kcondvar_t;
typedef enum {
CV_DEFAULT,
CV_DRIVER
} kcv_type_t;
typedef struct lockinfo {
struct _kthread *owner;
int pc;
int sp;
int id;
char type;
int hashbucket;
struct lockinfo *next;
} lockinfo_t;
extern int locktrace;
}
extern "C" {
typedef struct file {
struct file *f_next;
struct file *f_prev;
ushort_t f_flag;
cnt_t f_count;
struct vnode *f_vnode;
offset_t f_offset;
struct cred *f_cred;
caddr_t f_audit_data;
kmutex_t f_tlock;
kcondvar_t f_done;
int f_refcnt;
} file_t;
}
extern "C" {
}
extern "C" {
struct bsd_compat_ioctltab {
int cmd;
int flag;
unsigned int size;
};
}
extern "C" {
}
extern "C" {
struct stat {
dev_t st_dev;
long st_pad1[3];
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
long st_pad2[2];
off_t st_size;
long st_pad3;
timestruc_t st_atim;
timestruc_t st_mtim;
timestruc_t st_ctim;
long st_blksize;
long st_blocks;
char st_fstype[16 ];
long st_pad4[8];
};
extern int fstat(int, struct stat *);
extern int stat(const char *, struct stat *);
extern int lstat(const char *, struct stat *);
extern int mknod(const char *, mode_t, dev_t);
extern int fchmod(int, mode_t);
extern int chmod(const char *, mode_t);
extern int mkdir(const char *, mode_t);
extern int mkfifo(const char *, mode_t);
extern mode_t umask(mode_t);
}
extern "C" {
typedef struct iovec {
caddr_t iov_base;
int iov_len;
} iovec_t;
typedef enum uio_seg { UIO_USERSPACE, UIO_SYSSPACE, UIO_USERISPACE } uio_seg_t;
typedef struct uio {
iovec_t *uio_iov;
int uio_iovcnt;
lloff_t _uio_offset;
uio_seg_t uio_segflg;
short uio_fmode;
lldaddr_t _uio_limit;
int uio_resid;
} uio_t;
typedef enum uio_rw { UIO_READ, UIO_WRITE } uio_rw_t;
extern ssize_t readv(int, struct iovec *, int);
extern ssize_t writev(int, const struct iovec *, int);
}
extern "C" {
extern caddr_t mmap(caddr_t, size_t, int, int, int, off_t);
extern int munmap(caddr_t, size_t);
extern int mprotect(caddr_t, size_t, int);
extern int mincore(caddr_t, size_t, char *);
extern int memcntl(caddr_t, size_t, int, caddr_t, int, int);
extern int msync(caddr_t, size_t, int);
extern int madvise(caddr_t, size_t, int);
extern int mlock(caddr_t, size_t);
extern int mlockall(int);
extern int munlock(caddr_t, size_t);
extern int munlockall(void);
}
extern "C" {
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
}
extern "C" {
typedef unsigned long rlim_t;
struct rlimit {
rlim_t rlim_cur;
rlim_t rlim_max;
};
extern int setrlimit(int, const struct rlimit *);
extern int getrlimit(int, struct rlimit *);
}
extern "C" {
struct ipc_perm {
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
ulong seq;
key_t key;
long pad[4];
};
key_t ftok(const char *, int);
}
extern "C" {
struct semid_ds {
struct ipc_perm sem_perm;
struct sem *sem_base;
ushort sem_nsems;
time_t sem_otime;
long sem_pad1;
time_t sem_ctime;
long sem_pad2;
long sem_pad3[4];
};
struct sem {
ushort semval;
pid_t sempid;
ushort semncnt;
ushort semzcnt;
ushort semncnt_cv;
ushort semzcnt_cv;
};
struct sem_undo {
struct sem_undo *un_np;
short un_cnt;
struct undo {
short un_aoe;
ushort un_num;
int un_id;
} un_ent[1];
};
struct seminfo {
int semmap;
int semmni;
int semmns;
int semmnu;
int semmsl;
int semopm;
int semume;
int semusz;
int semvmx;
int semaem;
};
struct sembuf {
ushort sem_num;
short sem_op;
short sem_flg;
};
int semctl(int, int, int, ...);
int semget(key_t, int, int);
int semop(int, struct sembuf *, unsigned);
}
extern "C" {
struct msqid_ds {
struct ipc_perm msg_perm;
struct msg *msg_first;
struct msg *msg_last;
ulong msg_cbytes;
ulong msg_qnum;
ulong msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
long msg_pad1;
time_t msg_rtime;
long msg_pad2;
time_t msg_ctime;
long msg_pad3;
short msg_cv;
short msg_qnum_cv;
long msg_pad4[3];
};
struct msg {
struct msg *msg_next;
long msg_type;
ushort msg_ts;
short msg_spot;
};
struct msgbuf {
long mtype;
char mtext[1];
};
struct msginfo {
int msgmap;
int msgmax;
int msgmnb;
int msgmni;
int msgssz;
int msgtql;
ushort msgseg;
};
int msgctl(int, int, ...);
int msgget(key_t, int);
int msgrcv(int, void *, size_t, long, int);
int msgsnd(int, const void *, size_t, int);
}
extern "C" {
extern "C" {
}
typedef struct siginfo {
int si_signo;
int si_code;
int si_errno;
union {
int _pad[ ((128 / sizeof (int)) - 3) ];
struct {
pid_t _pid;
union {
struct {
uid_t _uid;
} _kill;
struct {
clock_t _utime;
int _status;
clock_t _stime;
} _cld;
} _pdata;
} _proc;
struct {
caddr_t _addr;
int _trapno;
} _fault;
struct {
int _fd;
long _band;
} _file;
struct {
caddr_t _faddr;
timestruc_t _tstamp;
short _syscall;
char _nsysarg;
char _fault;
long _sysarg[8];
long _mstate[17];
} _prof;
} _data;
} siginfo_t;
typedef struct k_siginfo {
int si_signo;
int si_code;
int si_errno;
union {
struct {
pid_t _pid;
union {
struct {
uid_t _uid;
} _kill;
struct {
clock_t _utime;
int _status;
clock_t _stime;
} _cld;
} _pdata;
} _proc;
struct {
caddr_t _addr;
int _trapno;
} _fault;
struct {
int _fd;
long _band;
} _file;
struct {
caddr_t _faddr;
timestruc_t _tstamp;
short _syscall;
char _nsysarg;
char _fault;
} _prof;
} _data;
} k_siginfo_t;
typedef struct sigqueue {
struct sigqueue *sq_next;
struct k_siginfo sq_info;
} sigqueue_t;
}
extern "C" {
typedef enum idtype {
P_PID,
P_PPID,
P_PGID,
P_SID,
P_CID,
P_UID,
P_GID,
P_ALL,
P_LWPID
} idtype_t;
typedef enum idop {
POP_DIFF,
POP_AND,
POP_OR,
POP_XOR
} idop_t;
typedef struct procset {
idop_t p_op;
idtype_t p_lidtype;
id_t p_lid;
idtype_t p_ridtype;
id_t p_rid;
} procset_t;
}
extern "C" {
extern pid_t wait(int *);
extern pid_t waitpid(pid_t, int *, int);
extern int waitid(idtype_t, id_t, siginfo_t *, int);
}
extern "C" {
struct shmid_ds {
struct ipc_perm shm_perm;
int shm_segsz;
struct anon_map *shm_amp;
ushort shm_lkcnt;
pid_t shm_lpid;
pid_t shm_cpid;
ulong shm_nattch;
ulong shm_cnattch;
time_t shm_atime;
long shm_pad1;
time_t shm_dtime;
long shm_pad2;
time_t shm_ctime;
long shm_pad3;
long shm_pad4[4];
};
struct shminfo {
int shmmax,
shmmin,
shmmni,
shmseg;
};
int shmctl(int, int, ...);
int shmget(key_t, int, int);
void *shmat(int, void *, int);
int shmdt(void *);
typedef struct segacct {
struct segacct *sa_next;
caddr_t sa_addr;
size_t sa_len;
struct anon_map *sa_amp;
} segacct_t;
}
extern "C" {
struct ifnet {
char *if_name;
short if_unit;
short if_mtu;
short if_flags;
short if_timer;
u_short if_promisc;
int if_metric;
struct ifaddr *if_addrlist;
struct ifqueue {
struct mbuf *ifq_head;
struct mbuf *ifq_tail;
int ifq_len;
int ifq_maxlen;
int ifq_drops;
} if_snd;
int (*if_init)();
int (*if_output)();
int (*if_ioctl)();
int (*if_reset)();
int (*if_watchdog)();
int if_ipackets;
int if_ierrors;
int if_opackets;
int if_oerrors;
int if_collisions;
struct ifnet *if_next;
struct ifnet *if_upper;
struct ifnet *if_lower;
int (*if_input)();
int (*if_ctlin)();
int (*if_ctlout)();
struct map *if_memmap;
};
struct ifaddr {
struct sockaddr ifa_addr;
union {
struct sockaddr ifu_broadaddr;
struct sockaddr ifu_dstaddr;
} ifa_ifu;
struct ifnet *ifa_ifp;
struct ifaddr *ifa_next;
};
struct ifreq {
char ifr_name[16 ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
char ifru_oname[16 ];
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
char ifru_data[1];
char ifru_enaddr[6];
struct ifr_dnld_reqs {
caddr_t v_addr;
caddr_t m_addr;
caddr_t ex_addr;
u_int size;
} ifru_dnld_req;
struct ifr_fddi_stats {
u_int stat_size;
caddr_t fddi_stats;
} ifru_fddi_stat;
struct ifr_netmapents {
u_int map_ent_size,
entry_number;
caddr_t fddi_map_ent;
} ifru_netmapent;
struct ifr_fddi_gen_struct {
int ifru_fddi_gioctl;
caddr_t ifru_fddi_gaddr;
} ifru_fddi_gstruct;
} ifr_ifru;
};
struct ifconf {
int ifc_len;
union {
caddr_t ifcu_buf;
struct ifreq *ifcu_req;
} ifc_ifcu;
};
}
extern "C" {
extern "C" {
typedef struct cred {
ushort cr_ref;
ushort cr_ngroups;
uid_t cr_uid;
gid_t cr_gid;
uid_t cr_ruid;
gid_t cr_rgid;
uid_t cr_suid;
gid_t cr_sgid;
gid_t cr_groups[1];
} cred_t;
}
extern "C" {
typedef enum vtype {
VNON = 0,
VREG = 1,
VDIR = 2,
VBLK = 3,
VCHR = 4,
VLNK = 5,
VFIFO = 6,
VXNAM = 7,
VBAD = 8
} vtype_t;
typedef struct vnode {
kmutex_t v_lock;
u_short v_flag;
u_long v_count;
struct vfs *v_vfsmountedhere;
struct vnodeops *v_op;
struct vfs *v_vfsp;
struct stdata *v_stream;
struct page *v_pages;
enum vtype v_type;
dev_t v_rdev;
caddr_t v_data;
struct filock *v_filocks;
kcondvar_t v_cv;
} vnode_t;
typedef struct vnodeops {
int (*vop_open)();
int (*vop_close)();
int (*vop_read)();
int (*vop_write)();
int (*vop_ioctl)();
int (*vop_setfl)();
int (*vop_getattr)();
int (*vop_setattr)();
int (*vop_access)();
int (*vop_lookup)();
int (*vop_create)();
int (*vop_remove)();
int (*vop_link)();
int (*vop_rename)();
int (*vop_mkdir)();
int (*vop_rmdir)();
int (*vop_readdir)();
int (*vop_symlink)();
int (*vop_readlink)();
int (*vop_fsync)();
void (*vop_inactive)();
int (*vop_fid)();
void (*vop_rwlock)();
void (*vop_rwunlock)();
int (*vop_seek)();
int (*vop_cmp)();
int (*vop_frlock)();
int (*vop_space)();
int (*vop_realvp)();
int (*vop_getpage)();
int (*vop_putpage)();
int (*vop_map)();
int (*vop_addmap)();
int (*vop_delmap)();
int (*vop_poll)();
int (*vop_dump)();
int (*vop_pathconf)();
} vnodeops_t;
extern int setswappingon();
extern int setswappingoff();
typedef struct vattr {
long va_mask;
vtype_t va_type;
mode_t va_mode;
uid_t va_uid;
gid_t va_gid;
dev_t va_fsid;
ino_t va_nodeid;
nlink_t va_nlink;
u_long va_size0;
u_long va_size;
timestruc_t va_atime;
timestruc_t va_mtime;
timestruc_t va_ctime;
dev_t va_rdev;
u_long va_blksize;
u_long va_nblocks;
u_long va_vcode;
} vattr_t;
enum rm { RMFILE, RMDIRECTORY };
enum symfollow { NO_FOLLOW, FOLLOW };
enum vcexcl { NONEXCL, EXCL };
enum create { CRCREAT, CRMKNOD, CRMKDIR, CRCORE };
typedef enum rm rm_t;
typedef enum symfollow symfollow_t;
typedef enum vcexcl vcexcl_t;
typedef enum create create_t;
extern int vn_open(char *, enum uio_seg, int, int, struct vnode **,
enum create);
extern int vn_create(char *, enum uio_seg, struct vattr *, enum vcexcl, int,
struct vnode **, enum create);
extern int vn_rdwr(enum uio_rw, struct vnode *, caddr_t, int, off_t,
enum uio_seg, int, long, cred_t *, int *);
extern int vn_close(struct vnode *, int, int, int, struct cred *);
extern void vn_rele(struct vnode *);
extern int vn_link(char *, char *, enum uio_seg);
extern int vn_rename(char *, char *, int);
extern int vn_remove(char *, enum uio_seg, enum rm);
extern vnode_t *specvp(struct vnode *, dev_t, vtype_t, struct cred *);
extern vnode_t *makespecvp(dev_t, vtype_t);
}
extern "C" {
struct pollfd {
int fd;
short events;
short revents;
};
struct pollhead {
struct polldat *ph_list;
struct polldat *ph_dummy;
short ph_events;
};
struct polldat {
struct polldat *pd_next;
struct polldat *pd_prev;
struct polldat *pd_chain;
short pd_events;
struct pollhead *pd_headp;
void (*pd_fn)();
long pd_arg;
};
int poll(struct pollfd *, unsigned long, int);
}
extern "C" {
}
extern "C" {
struct queue {
struct qinit *q_qinfo;
struct msgb *q_first;
struct msgb *q_last;
struct queue *q_next;
struct queue *q_link;
void *q_ptr;
ulong q_count;
ulong q_flag;
long q_minpsz;
long q_maxpsz;
ulong q_hiwat;
ulong q_lowat;
struct qband *q_bandp;
kmutex_t q_lock;
struct stdata *q_stream;
struct syncq *q_syncq;
long q_pad2[2];
unsigned char q_nband;
kcondvar_t q_wait;
kcondvar_t q_sync;
};
typedef struct queue queue_t;
struct qband {
struct qband *qb_next;
ulong qb_count;
struct msgb *qb_first;
struct msgb *qb_last;
ulong qb_hiwat;
ulong qb_lowat;
ulong qb_flag;
};
typedef struct qband qband_t;
typedef enum qfields {
QHIWAT = 0,
QLOWAT = 1,
QMAXPSZ = 2,
QMINPSZ = 3,
QCOUNT = 4,
QFIRST = 5,
QLAST = 6,
QFLAG = 7,
QBAD = 8
} qfields_t;
struct module_info {
ushort mi_idnum;
char *mi_idname;
long mi_minpsz;
long mi_maxpsz;
ulong mi_hiwat;
ulong mi_lowat;
};
struct qinit {
int (*qi_putp)();
int (*qi_srvp)();
int (*qi_qopen)();
int (*qi_qclose)();
int (*qi_qadmin)();
struct module_info *qi_minfo;
struct module_stat *qi_mstat;
};
struct streamtab {
struct qinit *st_rdinit;
struct qinit *st_wrinit;
struct qinit *st_muxrinit;
struct qinit *st_muxwinit;
};
struct linkblk {
queue_t *l_qtop;
queue_t *l_qbot;
int l_index;
};
struct free_rtn {
void (*free_func)();
char *free_arg;
struct free_rtn *free_next;
int free_unsafe;
};
struct datab {
struct free_rtn *db_frtnp;
unsigned char *db_base;
unsigned char *db_lim;
unsigned char db_ref;
unsigned char db_type;
unsigned char db_refmin;
unsigned int db_size;
char filler[8];
long db_reserved;
};
struct msgb {
struct msgb *b_next;
struct msgb *b_prev;
struct msgb *b_cont;
unsigned char *b_rptr;
unsigned char *b_wptr;
struct datab *b_datap;
unsigned char b_band;
unsigned short b_flag;
queue_t *b_queue;
};
typedef struct msgb mblk_t;
typedef struct datab dblk_t;
typedef struct free_rtn frtn_t;
struct iocblk {
int ioc_cmd;
cred_t *ioc_cr;
uint ioc_id;
uint ioc_count;
int ioc_error;
int ioc_rval;
long ioc_filler[4];
};
struct copyreq {
int cq_cmd;
cred_t *cq_cr;
uint cq_id;
caddr_t cq_addr;
uint cq_size;
int cq_flag;
mblk_t *cq_private;
long cq_filler[4];
};
struct copyresp {
int cp_cmd;
cred_t *cp_cr;
uint cp_id;
caddr_t cp_rval;
uint cp_pad1;
int cp_pad2;
mblk_t *cp_private;
long cp_filler[4];
};
struct stroptions {
ulong so_flags;
short so_readopt;
ushort so_wroff;
long so_minpsz;
long so_maxpsz;
ulong so_hiwat;
ulong so_lowat;
unsigned char so_band;
};
struct str_evmsg {
long sv_event;
vnode_t *sv_vp;
long sv_eid;
long sv_evpri;
long sv_flags;
uid_t sv_uid;
pid_t sv_pid;
hostid_t sv_hostid;
long sv_pad[4];
};
extern mblk_t *allocb(int, ...);
extern mblk_t *esballoc(unsigned char *, int, int, frtn_t *);
extern int testb(int, uint);
extern int bufcall(uint, int, void (*)(), long);
extern int esbbcall(int, void (*)(), long);
extern void freeb(struct msgb *);
extern void freemsg(mblk_t *);
extern mblk_t *dupb(mblk_t *);
extern mblk_t *dupmsg(mblk_t *);
extern mblk_t *copyb(mblk_t *);
extern mblk_t *copymsg(mblk_t *);
extern void linkb(mblk_t *, mblk_t *);
extern mblk_t *unlinkb(mblk_t *);
extern mblk_t *rmvb(mblk_t *, mblk_t *);
extern int pullupmsg(struct msgb *, int);
extern mblk_t *msgpullup(struct msgb *, int);
extern int adjmsg(struct msgb *, int);
extern int msgdsize(struct msgb *);
extern mblk_t *getq(queue_t *);
extern void rmvq(queue_t *, mblk_t *);
extern void flushq(queue_t *, int);
extern void flushband(queue_t *, unsigned char, int);
extern int canput(queue_t *);
extern int bcanput(queue_t *, unsigned char);
extern int canputnext(queue_t *);
extern int bcanputnext(queue_t *, unsigned char);
extern int putq(queue_t *, mblk_t *);
extern int putbq(queue_t *, mblk_t *);
extern int insq(queue_t *, mblk_t *, mblk_t *);
extern int putctl(queue_t *, int);
extern int putctl1(queue_t *, int, int);
extern int putnextctl(queue_t *, int);
extern int putnextctl1(queue_t *, int, int);
extern queue_t *backq(queue_t *);
extern void qreply(queue_t *, mblk_t *);
extern void qenable(queue_t *);
extern int qsize(queue_t *);
extern void noenable(queue_t *);
extern void enableok(queue_t *);
extern int strqset(queue_t *, qfields_t, unsigned char, long);
extern int strqget(queue_t *, qfields_t, unsigned char, long *);
extern void unbufcall(int);
extern void qprocson(queue_t *);
extern void qprocsoff(queue_t *);
extern void freezestr(queue_t *);
extern void unfreezestr(queue_t *);
extern int nstrpush;
}
extern "C" {
}
struct in_addr {
union {
struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b;
struct { u_short s_w1, s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct ip_mreq {
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
}
extern "C" {
typedef long fpos_t;
typedef struct
{
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
unsigned char _flag;
unsigned char _file;
} FILE;
extern FILE __iob[20 ];
extern FILE *_lastbuf;
extern unsigned char *_bufendtab[];
extern unsigned char _sibuf[], _sobuf[];
extern int remove(const char *);
extern int rename(const char *, const char *);
extern FILE *tmpfile(void);
extern char *tmpnam(char *);
extern int fclose(FILE *);
extern int fflush(FILE *);
extern FILE *fopen(const char *, const char *);
extern FILE *freopen(const char *, const char *, FILE *);
extern void setbuf(FILE *, char *);
extern int setvbuf(FILE *, char *, int, size_t);
extern int fprintf(FILE *, const char *, ...);
extern int fscanf(FILE *, const char *, ...);
extern int printf(const char *, ...);
extern int scanf(const char *, ...);
extern int sprintf(char *, const char *, ...);
extern int sscanf(const char *, const char *, ...);
extern int vfprintf(FILE *, const char *, void *);
extern int vprintf(const char *, void *);
extern int vsprintf(char *, const char *, void *);
extern int fgetc(FILE *);
extern char *fgets(char *, int, FILE *);
extern int fputc(int, FILE *);
extern int fputs(const char *, FILE *);
extern int getc(FILE *);
extern int getchar(void);
extern char *gets(char *);
extern int putc(int, FILE *);
extern int putchar(int);
extern int puts(const char *);
extern int ungetc(int, FILE *);
extern size_t fread(void *, size_t, size_t, FILE *);
#pragma int_to_unsigned fread
extern size_t fwrite(const void *, size_t, size_t, FILE *);
#pragma int_to_unsigned fwrite
extern int fgetpos(FILE *, fpos_t *);
extern int fseek(FILE *, long, int);
extern int fsetpos(FILE *, const fpos_t *);
extern long ftell(FILE *);
extern void rewind(FILE *);
extern void clearerr(FILE *);
extern int feof(FILE *);
extern int ferror(FILE *);
extern void perror(const char *);
extern int __filbuf(FILE *);
extern int __flsbuf(int, FILE *);
}
extern "C" {
typedef void SIG_FUNC_TYP(int);
typedef SIG_FUNC_TYP *SIG_TYP;
}
extern "C" {
typedef int sig_atomic_t;
extern const char *_sys_siglist[];
extern const int _sys_nsig;
extern "C" SIG_TYP signal (int, SIG_TYP );
extern int raise(int);
}
extern "C" {
extern void *memcpy(void *, const void *, size_t);
extern void *memmove(void *, const void *, size_t);
extern char *strcpy(char *, const char *);
extern char *strncpy(char *, const char *, size_t);
extern char *strcat(char *, const char *);
extern char *strncat(char *, const char *, size_t);
extern int memcmp(const void *, const void *, size_t);
extern int strcmp(const char *, const char *);
extern int strcoll(const char *, const char *);
extern int strncmp(const char *, const char *, size_t);
extern size_t strxfrm(char *, const char *, size_t);
extern void *memchr(const void *, int, size_t);
extern char *strchr(const char *, int);
extern size_t strcspn(const char *, const char *);
#pragma int_to_unsigned strcspn
extern char *strpbrk(const char *, const char *);
extern char *strrchr(const char *, int);
extern size_t strspn(const char *, const char *);
#pragma int_to_unsigned strspn
extern char *strstr(const char *, const char *);
extern char *strtok(char *, const char *);
extern void *memset(void *, int, size_t);
extern char *strerror(int);
extern char *strsignal(int);
extern size_t strlen(const char *);
#pragma int_to_unsigned strlen
}
typedef int ptrdiff_t;
typedef __wchar_t wchar_t;
extern "C" {
extern void __eprintf (const char *, const char *, unsigned, const char *);
}
extern "C" {
extern void *memccpy(void *, const void *, int, size_t);
extern void *memchr(const void *, int, size_t);
extern void *memcpy(void *, const void *, size_t);
extern void *memset(void *, int, size_t);
extern int memcmp(const void *, const void *, size_t);
}
typedef void * __gnuc_va_list;
void va_end (__gnuc_va_list);
typedef __gnuc_va_list va_list;
extern "C" {
struct mallinfo {
int arena;
int ordblks;
int smblks;
int hblks;
int hblkhd;
int usmblks;
int fsmblks;
int uordblks;
int fordblks;
int keepcost;
};
void *malloc(size_t);
void free(void *);
void *realloc(void *, size_t);
int mallopt(int, int);
struct mallinfo mallinfo(void);
void *calloc(size_t, size_t);
}
extern "C" {
extern int isalnum(int);
extern int isalpha(int);
extern int iscntrl(int);
extern int isdigit(int);
extern int isgraph(int);
extern int islower(int);
extern int isprint(int);
extern int ispunct(int);
extern int isspace(int);
extern int isupper(int);
extern int isxdigit(int);
extern int tolower(int);
extern int toupper(int);
extern unsigned char __ctype[];
}
extern "C" {
typedef struct flock {
short l_type;
short l_whence;
off_t l_start;
off_t l_len;
long l_sysid;
pid_t l_pid;
long pad[4];
} flock_t;
}
extern "C" {
extern int fcntl(int, int, ...);
extern int open(const char *, int, ...);
extern int creat(const char *, mode_t);
}
extern "C" {
}
extern "C" {
extern int errno;
}
extern "C" {
struct passwd {
char *pw_name;
char *pw_passwd;
uid_t pw_uid;
gid_t pw_gid;
char *pw_age;
char *pw_comment;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
struct comment {
char *c_dept;
char *c_name;
char *c_acct;
char *c_bin;
};
extern struct passwd *getpwent(void);
extern struct passwd *getpwuid(uid_t);
extern struct passwd *getpwnam(const char *);
extern void setpwent(void);
extern void endpwent(void);
extern struct passwd *fgetpwent(FILE *);
extern int putpwent(const struct passwd *, FILE *);
}
extern "C" {
}
typedef void (*SignalHandler)(...);
extern "C" {
extern int access(const char *, int);
extern int acct(const char *);
extern unsigned alarm(unsigned);
extern int brk(void *);
extern int chdir(const char *);
extern int chown(const char *, uid_t, gid_t);
extern int chroot(const char *);
extern int close(int);
extern char *ctermid(char *);
extern char *cuserid(char *);
extern int dup(int);
extern int dup2(int, int);
extern int execl(const char *, const char *, ...);
extern int execle(const char *, const char *, ...);
extern int execlp(const char *, const char *, ...);
extern int execv(const char *, char *const *);
extern int execve(const char *, char *const *, char *const *);
extern int execvp(const char *, char *const *);
extern void exit(int);
extern void _exit(int);
extern int fattach(int, const char *);
extern int fchdir(int);
extern int fchown(int, uid_t, gid_t);
extern int fchroot(int);
extern int fdetach(const char *);
extern pid_t fork(void);
extern long fpathconf(int, int);
extern int fsync(int);
extern int ftruncate(int, off_t);
extern char *getcwd(char *, size_t);
extern gid_t getegid(void);
extern uid_t geteuid(void);
extern gid_t getgid(void);
extern int getgroups(int, gid_t *);
extern char *getlogin(void);
extern pid_t getpgid(pid_t);
extern pid_t getpid(void);
extern pid_t getppid(void);
extern pid_t getpgrp(void);
char *gettxt(const char *, const char *);
extern pid_t getsid(pid_t);
extern uid_t getuid(void);
extern int ioctl(int, int, ...);
extern int isatty(int);
extern int link(const char *, const char *);
extern int lchown(const char *, uid_t, gid_t);
extern int lockf(int, int, long);
extern off_t lseek(int, off_t, int);
extern int mincore(caddr_t, size_t, char *);
extern int nice(int);
extern long pathconf(const char *, int);
extern int pause(void);
extern int pipe(int *);
extern void profil(unsigned short *, unsigned int, unsigned int, unsigned int);
extern int ptrace(int, pid_t, int, int);
extern ssize_t read(int, void *, unsigned);
extern int readlink(const char *, void *, int);
extern int rename(const char *, const char *);
extern int rmdir(const char *);
extern void *sbrk(int);
extern int setgid(gid_t);
extern int setegid(gid_t);
extern int setgroups(int, const gid_t *);
extern int setpgid(pid_t, pid_t);
extern pid_t setpgrp(void);
extern pid_t setsid(void);
extern int setuid(uid_t);
extern int seteuid(uid_t);
extern unsigned sleep(unsigned);
extern int stime(const time_t *);
extern int symlink(const char *, const char *);
extern void sync(void);
extern long sysconf(int);
extern pid_t tcgetpgrp(int);
extern int tcsetpgrp(int, pid_t);
extern int truncate(const char *, off_t);
extern char *ttyname(int);
extern int unlink(const char *);
extern pid_t vfork(void);
extern void vhangup(void);
extern ssize_t write(int, const void *, unsigned);
}
extern "C"
{
extern "C" {
extern unsigned long inet_addr(const char *);
extern char *inet_ntoa(struct in_addr);
extern struct in_addr inet_makeaddr(int, int);
extern unsigned long inet_network(const char *);
extern unsigned long inet_lnaof(struct in_addr);
extern unsigned long inet_netof(struct in_addr);
}
extern "C" {
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
struct netent {
char *n_name;
char **n_aliases;
int n_addrtype;
unsigned long n_net;
};
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
struct protoent {
char *p_name;
char **p_aliases;
int p_proto;
};
struct hostent *gethostbyname(const char *);
struct hostent *gethostbyaddr(const char *, int, int);
struct hostent *gethostent(void);
struct netent *getnetbyname(char *);
struct netent *getnetbyaddr(long, int);
struct netent *getnetent(void);
struct servent *getservbyname(char *, char *);
struct servent *getservbyport(int, char *);
struct servent *getservent(void);
struct protoent *getprotobyname(char *);
struct protoent *getprotobynumber(int);
struct protoent *getprotoent(void);
int sethostent(int);
int endhostent(void);
int setnetent(int);
int endnetent(void);
int setservent(int);
int endservent(void);
int setprotoent(int);
int endprotoent(void);
int rcmd(char **, unsigned short, char *, char *, char *, int *);
int rexec(char **, unsigned short, char *, char *, char *, int *);
int rresvport(int *);
int ruserok(char *, int, char *, char *);
extern int h_errno;
}
}
class Time_Value
{
public:
Time_Value (long sec = 0, long usec = 0);
Time_Value (timeval &t);
void set (timeval &t);
long get_sec (void) const;
void set_sec (long sec);
long get_usec (void) const;
void set_usec (long usec);
operator timeval () const;
friend Time_Value operator + (Time_Value tv1, Time_Value tv2);
friend Time_Value operator - (Time_Value tv1, Time_Value tv2);
friend int operator < (Time_Value tv1, Time_Value tv2);
friend int operator > (Time_Value tv1, Time_Value tv2);
friend int operator <= (Time_Value tv1, Time_Value tv2);
friend int operator >= (Time_Value tv1, Time_Value tv2);
friend int operator == (Time_Value tv1, Time_Value tv2);
friend int operator != (Time_Value tv1, Time_Value tv2);
private:
static void normalize_pos (Time_Value &num);
static void normalize_neg (Time_Value &num);
long tv_sec;
long tv_usec;
enum { ONE_SECOND = 1000000L };
};
class Event_Handler
{
protected:
Event_Handler (void);
public:
virtual ~Event_Handler (void);
virtual int get_fd (void) const = 0;
virtual int handle_close (void);
virtual int make_async (void);
virtual int handle_input (int);
virtual int handle_output (int);
virtual int handle_exception (int);
virtual int handle_sigio (int);
virtual int handle_timeout (const Time_Value &tv);
};
inline int BIT_ENABLED (unsigned long word, int bit = 1) { return (word & bit) != 0; }
inline int BIT_DISABLED (unsigned long word, int bit = 1) { return (word & bit) == 0; }
inline void SET_BIT (unsigned long &word, int bit) { word |= bit; }
inline void CLR_BIT (unsigned long &word, int bit) { word &= ~bit; }
class FD_Set
{
friend class FD_Set_Iter;
public:
FD_Set (void);
void zero (void);
int is_set (int) const;
void set_bit (int);
void clr_bit (int);
int num_set (void) const;
int max_set (void) const;
int pr_mask (void);
void sync (int max = 20 );
operator fd_set *();
private:
int size;
int max_fd;
fd_set mask;
enum
{
MAX_SIZE = 20 ,
WORD_SIZE = (sizeof (fd_mask) * 8 ) ,
NUM_WORDS = ((( 20 )+(( (sizeof (fd_mask) * 8 ) )-1))/( (sizeof (fd_mask) * 8 ) )) ,
MSB_MASK = ~(1 << ((sizeof (fd_mask) * 8 ) - 1))
};
int count_bits (unsigned long n) const;
void set_max (int max);
static const char nbits[256];
};
class FD_Set_Iter
{
public:
FD_Set_Iter (FD_Set &);
int operator ()(void);
void operator++ (void);
private:
FD_Set &fds;
int index;
int num;
fd_mask val;
};
class Timer_Queue
{
public:
static const Time_Value zero;
public:
Timer_Queue (void);
virtual ~Timer_Queue (void);
int is_empty (void) const;
const Time_Value &earliest_time (void) const;
static const Time_Value ¤t_time (void);
void schedule (const Event_Handler *, const Time_Value &, const Time_Value & = Timer_Queue::zero);
void cancel (const Event_Handler *);
void expire (const Time_Value &);
private:
struct Timer
{
Timer (const Event_Handler *h, const Time_Value &t, const Time_Value &i, Timer *n);
Event_Handler const *handler;
Time_Value timer_value;
Time_Value interval;
Timer *next;
};
Timer *head;
};
typedef int (Event_Handler::*PTMF) (int);
class Reactor
{
public:
enum Reactor_Mask
{
READ_MASK = 01,
WRITE_MASK = 02,
EXCEPT_MASK = 04,
SIGIO_MASK = 010,
RWE_MASK = 01 | 02 | 04
};
virtual ~Reactor (void);
virtual int register_handler (const Event_Handler *, Reactor_Mask = READ_MASK);
virtual int register_handler (int fd, const Event_Handler *, Reactor_Mask = READ_MASK);
virtual int remove_handler (const Event_Handler *, Reactor_Mask = READ_MASK);
virtual int remove_handler (int fd, Reactor_Mask = READ_MASK);
virtual int set_ready (const Event_Handler *, Reactor_Mask = READ_MASK);
virtual int set_ready (int fd, Reactor_Mask = READ_MASK);
virtual void schedule_timer (const Event_Handler *, const Time_Value &delta, const Time_Value &interval = Timer_Queue::zero);
virtual void cancel_timer (const Event_Handler *);
virtual void handle_events (void);
virtual int handle_events (Time_Value &tv);
public:
static int enable_signal_handler (int signum);
static Reactor *open (int size = 20 , Reactor *new_Reactor = 0);
static void close (Reactor *Reactor = 0);
protected:
Reactor (int size = 20 );
static void handle_sigurg (void);
static void handle_sigio (void);
static void handle_sigpipe (void);
virtual int attach (const Event_Handler *, Reactor_Mask, int fd);
virtual int detach (Reactor_Mask, int fd);
virtual int handle_events (Time_Value *);
virtual int any_ready (void) const;
virtual int fill_in_ready (FD_Set &, FD_Set &, FD_Set &, FD_Set&);
virtual int wait_for (FD_Set &, FD_Set &, FD_Set &, Time_Value *);
virtual Time_Value *calculate_timeout (Time_Value *) const;
virtual void notify_fds (int, FD_Set &, FD_Set &, FD_Set &, FD_Set &);
virtual void notify_fd (int, Reactor_Mask, FD_Set &, const Event_Handler *, PTMF);
virtual int handle_error (void);
virtual int check_connections (void);
protected:
Event_Handler const **readfd_table;
Event_Handler const **writefd_table;
Event_Handler const **exceptfd_table;
Event_Handler const **sigiofd_table;
Timer_Queue timer_queue;
int max_fd;
int max_size;
FD_Set readfd_mask;
FD_Set writefd_mask;
FD_Set exceptfd_mask;
FD_Set sigiofd_mask;
FD_Set readfd_mask_ready;
FD_Set writefd_mask_ready;
FD_Set exceptfd_mask_ready;
FD_Set sigiofd_mask_ready;
private:
static Reactor *instance;
int max (int i, int j, int k, int l);
Reactor (const Reactor &);
Reactor &operator = (const Reactor &);
};
class SAP_Addr
{
public:
SAP_Addr (void);
SAP_Addr (int type, int size);
void set (int type, int size);
int get_size (void) const;
void set_size (int size);
int get_type (void) const;
void set_type (int type);
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &sap) const;
virtual int operator != (const SAP_Addr &sap) const;
protected:
int addr_type;
int addr_size;
};
extern const SAP_Addr sap_any;
class SAP_UNIX_Addr : public SAP_Addr
{
public:
SAP_UNIX_Addr (void);
SAP_UNIX_Addr (const SAP_UNIX_Addr &sa);
SAP_UNIX_Addr (const char rendezvous_point[]);
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &SAP) const;
virtual int operator != (const SAP_Addr &SAP) const;
const char *get_path_name (void) const;
private:
sockaddr_un unix_addr;
};
class IPC_SAP
{
public:
int open (int type, int async, int protocol_family, int protocol = 0);
int close (void);
int set_option (int level, int option, void *optval, int optlen) const;
int get_option (int level, int option, void *optval, int &optlen) const;
int enable (int signum) const;
int disable (int signum) const;
int get_host_info (SAP_Addr &) const;
int get_fd (void) const;
void set_fd (int fd);
protected:
IPC_SAP (void);
IPC_SAP (int type, int async, int protocol_family, int protocol = 0);
~IPC_SAP (void);
private:
int sok_fd;
};
class IPC_SAP_Connect : public IPC_SAP
{
public:
int get_peer_info (SAP_Addr &) const;
int send (const void *buf, int n, int flags = 0) const;
int recv (void *buf, int n, int flags = 0) const;
int send (const iovec iov[], int n) const;
int recv (iovec iov[], int n) const;
int send (int n, ...);
int recv (int n, ...);
protected:
IPC_SAP_Connect (void);
IPC_SAP_Connect (int type, int async, int protocol_family, int protocol = 0);
};
class IPC_SAP_Stream : public IPC_SAP_Connect
{
friend class IPC_SAP_Listener;
public:
IPC_SAP_Stream (void);
IPC_SAP_Stream (const SAP_Addr &remote_sap, int async = 0, int protcol_family = 2 , int protocol = 0);
int open (const SAP_Addr &remote_sap, int async = 0, int protcol_family = 2 , int protocol = 0);
int close_reader (void);
int close_writer (void);
int send_n (const void *buf, int n, int flags = 0) const;
int recv_n (void *buf, int n, int flags = 0) const;
int send_urg (void *ptr, int len = sizeof (char));
int recv_urg (void *ptr, int len = sizeof (char));
};
class IPC_SAP_Listener : public IPC_SAP
{
public:
IPC_SAP_Listener (void);
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);
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);
int accept (IPC_SAP_Stream &new_ipc_sap, SAP_Addr *remote_addr = 0, int restart = 1) const;
int operator () (IPC_SAP_Stream &new_ipc_sap, SAP_Addr *remote_addr = 0, int restart = 1) const;
protected:
int micro_second_delay;
protected:
int shared_open (const SAP_Addr &remote_sap, int backlog);
int shared_accept (SAP_Addr *remote_addr, int restart) const;
};
class Local_IPC_SAP
{
public:
int send_fd (const int fds) const;
int recv_fd (int &fds) const;
protected:
Local_IPC_SAP (void);
Local_IPC_SAP (int fd);
void set_fd (int fd);
private:
int sok_fd;
};
class Local_IPC_SAP_Stream : public IPC_SAP_Stream, public Local_IPC_SAP
{
friend class Local_IPC_SAP_Listener;
public:
Local_IPC_SAP_Stream (void);
Local_IPC_SAP_Stream (const SAP_Addr &remote_sap, int async = 0, int protocol_family = 1 , int protocol = 0);
int open (const SAP_Addr &remote_sap, int async = 0, int protcol_family = 1 , int protocol = 0);
void set_fd (int fd);
int send_msg (const iovec iov[], int n, int fd);
int recv_msg (iovec iov[], int n, int &fd);
private:
int get_peer_info (SAP_Addr &) const;
int get_host_info (SAP_Addr &) const;
};
class Local_IPC_SAP_Listener : public IPC_SAP_Listener
{
public:
Local_IPC_SAP_Listener (void);
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);
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);
int accept (Local_IPC_SAP_Stream &new_ipc_sap, SAP_Addr * = 0, int restart = 1) const;
int operator () (Local_IPC_SAP_Stream &new_ipc_sap, SAP_Addr * = 0, int restart = 1) const;
};
class Handle_L_Stream : public Event_Handler, public Local_IPC_SAP_Listener
{
public:
Handle_L_Stream (void);
Handle_L_Stream (const SAP_UNIX_Addr &suas, int async = 0);
int open (const SAP_UNIX_Addr &suas, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
virtual int handle_sigio (int ready_fd);
virtual int make_async (void);
private:
static char *login_name;
static Handle_L_Stream dummy;
};
class IPC_SAP_Dgram : public IPC_SAP
{
public:
IPC_SAP_Dgram (void);
IPC_SAP_Dgram (const SAP_Addr &local, int async = 0, int protocol_family = 2 , int protocol = 0);
int open (const SAP_Addr &local, int async = 0, int protocol_family = 2 , int protocol = 0);
int send (const void *buf, int n, const SAP_Addr &addr, int flags = 0) const;
int send (const iovec iov[], int n, const SAP_Addr &addr, int flags = 0) const;
int recv (void *buf, int n, SAP_Addr &addr, int flags = 0) const;
int recv (iovec iov[], int n, SAP_Addr &addr, int flags = 0) const;
private:
int shared_open (const SAP_Addr &local, int protocol_family);
};
class Local_IPC_SAP_Dgram : public IPC_SAP_Dgram, public Local_IPC_SAP
{
public:
Local_IPC_SAP_Dgram (void);
Local_IPC_SAP_Dgram (const SAP_Addr &local, int async = 0, int protocol_family = 1 , int protocol = 0);
int open (const SAP_Addr &local, int async = 0, int protocol_family = 1 , int protocol = 0);
private:
};
class Handle_L_Dgram : public Event_Handler, public Local_IPC_SAP_Dgram
{
public:
Handle_L_Dgram (void);
Handle_L_Dgram (const SAP_UNIX_Addr &suad, int async = 0);
int open (const SAP_UNIX_Addr &suad, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
};
class IPC_SAP_CODgram : public IPC_SAP_Connect
{
public:
IPC_SAP_CODgram (void);
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);
int open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family = 2 , int protocol = 0);
private:
int shared_open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap, int protocol_family);
};
class Local_IPC_SAP_CODgram : public IPC_SAP_CODgram, public Local_IPC_SAP
{
public:
Local_IPC_SAP_CODgram (void);
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);
int open (const SAP_Addr &remote_sap, const SAP_Addr &local_sap = sap_any, int async = 0, int protocol_family = 1 , int protocol = 0);
};
class Handle_L_CODgram : public Event_Handler, public Local_IPC_SAP_CODgram
{
public:
Handle_L_CODgram (void);
Handle_L_CODgram (const SAP_UNIX_Addr &suad, int async = 0);
int open (const SAP_UNIX_Addr &suad, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
};
class Handle_L_Pipe : public Event_Handler, public Local_IPC_SAP_Listener
{
public:
Handle_L_Pipe (void);
Handle_L_Pipe (const SAP_UNIX_Addr &suap, int async = 0);
int open (const SAP_UNIX_Addr &suap, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
virtual int handle_sigio (int ready_fd);
virtual int make_async ();
};
class IPC_SAP_FIFO_Msg
{
public:
IPC_SAP_FIFO_Msg (int length = 0, void *message = 0);
long len;
void *mesg;
};
class IPC_SAP_FIFO
{
public:
IPC_SAP_FIFO (void);
IPC_SAP_FIFO (const char *rendezvous, int flags, int perms);
int open (const char *rendezvous, int flags, int perms);
int close (void);
int enable (int num) const;
int disable (int num) const;
void set_fd (int fd);
int get_fd (void) const;
protected:
int fifo_fd;
};
class IPC_SAP_FIFO_Send : public IPC_SAP_FIFO
{
public:
IPC_SAP_FIFO_Send (void);
IPC_SAP_FIFO_Send (const char *rendezvous, int flags = 1 , int perms = 0666);
int open (const char *rendezvous, int flags = 1 , int perms = 0666);
int send (void *buf, int len);
};
class IPC_SAP_FIFO_Send_Msg : public IPC_SAP_FIFO_Send
{
public:
IPC_SAP_FIFO_Send_Msg (void);
IPC_SAP_FIFO_Send_Msg (const char *rendezvous, int flags = 1 , int perms = 0666);
int open (const char *rendezvous, int flags = 1 , int perms = 0666);
int send (IPC_SAP_FIFO_Msg &msg);
};
class IPC_SAP_FIFO_Recv : public IPC_SAP_FIFO
{
public:
IPC_SAP_FIFO_Recv (void);
IPC_SAP_FIFO_Recv (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
int open (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
int recv (void *buf, int len);
};
class IPC_SAP_FIFO_Recv_Msg : public IPC_SAP_FIFO_Recv
{
public:
IPC_SAP_FIFO_Recv_Msg (void);
IPC_SAP_FIFO_Recv_Msg (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
int open (const char *rendezvous, int flags = 0 , int perms = 0666, int persistent = 1);
int recv (IPC_SAP_FIFO_Msg &msg);
};
class Handle_L_FIFO_Msg : public Event_Handler, public IPC_SAP_FIFO_Recv_Msg
{
public:
Handle_L_FIFO_Msg (void);
Handle_L_FIFO_Msg (char *rendezvous_fifo);
int open (char *rendezvous_fifo);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
virtual int make_async (void);
virtual int handle_sigio (int ready_fd);
};
class SAP_INET_Addr : public SAP_Addr
{
public:
SAP_INET_Addr (void);
SAP_INET_Addr (const SAP_INET_Addr &);
SAP_INET_Addr (unsigned short port_number, const char host_name[]);
SAP_INET_Addr (unsigned short port_number, long ip_addr = (u_long)0x00000000 );
void set (unsigned short port_number, const char host_name[]);
void set (unsigned short port_number, long ip_addr = (u_long)0x00000000 );
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &SAP) const;
virtual int operator != (const SAP_Addr &SAP) const;
const char *get_host_name (void) const;
const char *get_host_addr (void) const;
unsigned long get_ip_address (void) const;
unsigned short get_port_number (void) const;
private:
sockaddr_in inet_addr;
};
class Handle_R_Stream : public Event_Handler, public IPC_SAP_Listener
{
public:
Handle_R_Stream (void);
Handle_R_Stream (const SAP_INET_Addr &sia, int async = 0);
virtual int get_fd (void) const;
virtual int exception_raised (int ready_fd);
virtual int handle_input (int ready_fd);
virtual int handle_sigio(int ready_fd);
private:
static Handle_R_Stream dummy;
static char *login_name;
IPC_SAP_Stream new_remote_stream;
};
class Handle_R_Dgram : public Event_Handler, public IPC_SAP_Dgram
{
public:
Handle_R_Dgram (void);
Handle_R_Dgram (const SAP_INET_Addr &r, int async = 0);
int open (const SAP_INET_Addr &r, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
virtual int handle_sigio(int ready_fd);
virtual int make_async (void);
};
class Handle_Broadcast : public Event_Handler, public IPC_SAP_Dgram
{
public:
Handle_Broadcast (void);
Handle_Broadcast (const SAP_INET_Addr &r, int async = 0);
int open (const SAP_INET_Addr &r, int async = 0);
virtual int get_fd (void) const;
virtual int handle_input (int ready_fd);
};
class Handle_Timeout : public Event_Handler
{
public:
Handle_Timeout (void);
int get_fd (void) const;
int handle_timeout (const Time_Value &tv);
};
class IO_Handlers
{
public:
enum IO_Handler_Type
{
LOCAL_STREAM = 1,
LOCAL_DGRAM,
LOCAL_CODGRAM,
LOCAL_PIPE,
LOCAL_FIFO,
REMOTE_STREAM,
REMOTE_DGRAM,
BROADCAST,
};
IO_Handler_Type type;
const Event_Handler *handler;
};
class Timer_Handlers
{
public:
enum Timer_Handler_Type
{
TIMER_ZERO = 0,
TIMER_ONE = 1
};
Timer_Handlers (Timer_Handler_Type t, Event_Handler *h, Time_Value v1, Time_Value v2)
: type (t), handler (h), t1 (v1), t2 (v2) {}
Timer_Handler_Type type;
const Event_Handler *handler;
Time_Value t1;
Time_Value t2;
};
extern IO_Handlers IO_handlers[];
extern Timer_Handlers timer_handlers[];
Handle_L_Stream local_stream;
Handle_L_Dgram local_dgram;
Handle_L_CODgram local_codgram;
Handle_L_Pipe local_pipe;
Handle_L_FIFO_Msg local_fifo;
Handle_R_Stream remote_stream;
Handle_R_Dgram remote_dgram;
Handle_Broadcast broadcast;
IO_Handlers IO_handlers[] =
{
{ IO_Handlers::LOCAL_STREAM, &local_stream },
{ IO_Handlers::LOCAL_DGRAM, &local_dgram },
{ IO_Handlers::LOCAL_CODGRAM, &local_codgram },
{ IO_Handlers::LOCAL_PIPE, &local_pipe },
{ IO_Handlers::LOCAL_FIFO, &local_fifo },
{ IO_Handlers::REMOTE_STREAM, &remote_stream },
{ IO_Handlers::REMOTE_DGRAM, &remote_dgram },
{ IO_Handlers::BROADCAST, &broadcast },
{ 0, 0 }
};
Handle_Timeout handle_timeout;
Timer_Handlers th1 (Timer_Handlers::TIMER_ONE, &handle_timeout, Timer_Queue::zero, Timer_Queue::zero);
Timer_Handlers th2 (Timer_Handlers::TIMER_ZERO, 0, Timer_Queue::zero, Timer_Queue::zero);
Timer_Handlers timer_handlers[2] =
{
th1, th2
};
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads