1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/* $Id: xioinitialize.c,v 1.13 2005/08/18 19:55:36 gerhard Exp $ */
/* Copyright Gerhard Rieger 2001-2005 */
/* Published under the GNU General Public License V.2, see file COPYING */
/* this file contains the source for the initialize function */
#include "xiosysincludes.h"
#include "xioopen.h"
#include "xiolockfile.h"
static int xioinitialized;
xiofile_t *sock[XIO_MAXSOCK];
int (*xiohook_newchild)(pid_t); /* xio calls this function from a new child
process */
int xioinitialize(void) {
if (xioinitialized) return 0;
/* configure and .h's cannot guarantee this */
assert(sizeof(uint8_t)==1);
assert(sizeof(uint16_t)==2);
assert(sizeof(uint32_t)==4);
/* assertions regarding O_ flags - important for XIO_READABLE() etc. */
assert(O_RDONLY==0);
assert(O_WRONLY==1);
assert(O_RDWR==2);
assert(SHUT_RD==0);
assert(SHUT_WR==1);
assert(SHUT_RDWR==2);
/* some assertions about termios */
#if WITH_TERMIOS
#ifdef CRDLY
assert(3 << opt_crdly.arg3 == CRDLY);
#endif
#ifdef TABDLY
assert(3 << opt_tabdly.arg3 == TABDLY);
#endif
assert(3 << opt_csize.arg3 == CSIZE);
{
union {
struct termios termarg;
tcflag_t flags[4];
#if HAVE_TERMIOS_ISPEED
speed_t speeds[sizeof(struct termios)/sizeof(speed_t)];
#endif
} tdata;
tdata.termarg.c_iflag = 0x12345678;
tdata.termarg.c_oflag = 0x23456789;
tdata.termarg.c_cflag = 0x3456789a;
tdata.termarg.c_lflag = 0x456789ab;
assert(tdata.termarg.c_iflag == tdata.flags[0]);
assert(tdata.termarg.c_oflag == tdata.flags[1]);
assert(tdata.termarg.c_cflag == tdata.flags[2]);
assert(tdata.termarg.c_lflag == tdata.flags[3]);
#if HAVE_TERMIOS_ISPEED
tdata.termarg.c_ispeed = 0x56789abc;
tdata.termarg.c_ospeed = 0x6789abcd;
assert(tdata.termarg.c_ispeed == tdata.speeds[ISPEED_OFFSET]);
assert(tdata.termarg.c_ospeed == tdata.speeds[OSPEED_OFFSET]);
#endif
}
#endif
/* these dependencies required in applyopts() for OFUNC_FCNTL */
assert(F_GETFD == F_SETFD-1);
assert(F_GETFL == F_SETFL-1);
if (Atexit(xioexit) < 0) {
Error("atexit(xioexit) failed");
return -1;
}
xioinitialized = 1;
return 0;
}
/* well, this function is not for initialization, but I could not find a better
place for it
it is called in the child process after fork
it drops the locks of the xiofile's so only the parent owns them
*/
void xiodroplocks(void) {
int i;
for (i = 0; i < XIO_MAXSOCK; ++i) {
if (sock[i] != NULL && sock[i]->tag != XIO_TAG_INVALID) {
xiofiledroplock(sock[i]);
}
}
}
|