Annotation of 43BSDReno/contrib/isode-beta/quipu/dish/pipe.c, revision 1.1

1.1     ! root        1: /* pipe.c - */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/pipe.c,v 7.1 90/07/09 14:47:21 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/quipu/dish/RCS/pipe.c,v 7.1 90/07/09 14:47:21 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       pipe.c,v $
        !            12:  * Revision 7.1  90/07/09  14:47:21  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  89/11/23  22:20:17  mrose
        !            16:  * Release 6.0
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: #include <signal.h>
        !            32: #include <stdio.h>
        !            33: #include <errno.h>
        !            34: #include "general.h"
        !            35: 
        !            36: #ifdef SOCKETS
        !            37: #include "internet.h"
        !            38: #endif
        !            39: #include <sys/ioctl.h>
        !            40: #ifdef BSD42
        !            41: #include <sys/file.h>
        !            42: #endif
        !            43: #ifdef SYS5
        !            44: #include <fcntl.h>
        !            45: #endif
        !            46: #include <sys/stat.h>
        !            47: #include "tailor.h"
        !            48: 
        !            49: #ifdef SOCKETS
        !            50: int             sd, sd_current;
        !            51: #else
        !            52: char           retpipe[LINESIZE];
        !            53: int             fd, wfd;
        !            54: #endif
        !            55: 
        !            56: #ifndef MIN
        !            57: #define MIN(a,b) (( (b) < (a) ) ? (b) : (a) )
        !            58: #endif
        !            59: 
        !            60: int parent_pid;
        !            61: extern int     errno;          
        !            62: 
        !            63: init_pipe ()
        !            64: {
        !            65:        char parent [BUFSIZ];
        !            66:        char   *cp;
        !            67: 
        !            68: #ifdef SOCKETS
        !            69:        struct sockaddr_in      sin_buf;
        !            70:        struct sockaddr_in      *sin = &sin_buf;
        !            71: #else
        !            72: #endif
        !            73: 
        !            74:        if ((cp = getenv ("DISHPARENT")) == NULLCP) {
        !            75:                (void) sprintf (parent, "%d", getppid ());
        !            76:                (void) setenv ("DISHPARENT", cp = parent);
        !            77:        }
        !            78: 
        !            79: 
        !            80:        if (sscanf (cp, "%d", &parent_pid) != 1) {
        !            81:                (void) fprintf (stderr,"DISHPARENT malformed");
        !            82:                return (NOTOK);
        !            83:        }
        !            84: 
        !            85: #ifdef SOCKETS
        !            86:        if (get_dish_sock (sin) != 0)
        !            87:                return (NOTOK);
        !            88: 
        !            89:        if ((sd = start_tcp_server (sin, SOMAXCONN, 0, 0)) == NOTOK) {
        !            90:            perror ("start_tcp_server");
        !            91:            return NOTOK;
        !            92:         }
        !            93: #ifdef FIOCLEX
        !            94:        (void) ioctl (sd, FIOCLEX, NULLCP);
        !            95: #endif
        !            96: #else          
        !            97: 
        !            98:        if ((cp = getenv ("DISHPROC")) == NULL) {
        !            99:                (void) fprintf (stderr, "no DISHPROC in environment\n");
        !           100:                return (NOTOK);
        !           101:        }
        !           102: 
        !           103:        (void) strcpy (retpipe, cp);
        !           104:        (void) umask (0);
        !           105: 
        !           106:        if ((fd = open (retpipe, O_RDONLY)) < 0) {
        !           107:                (void) mknod (retpipe, S_IFIFO | 0600, 0);
        !           108:                if ((fd = open (retpipe, O_RDONLY)) < 0) {
        !           109:                        (void) fprintf (stderr, "ropen failed\n");
        !           110:                        (void) unlink (retpipe);
        !           111:                        return (NOTOK);
        !           112:                }
        !           113:        }
        !           114: 
        !           115:        if ((wfd = open (retpipe, O_WRONLY)) < 0) {
        !           116:                (void) fprintf (stderr, "wr open failed\n");
        !           117:                (void) unlink (retpipe);
        !           118:                (void) close (fd);
        !           119:                return (NOTOK);
        !           120:        }
        !           121: #endif
        !           122: 
        !           123: #ifdef SETSID
        !           124:        (void) setsid ();
        !           125: #endif
        !           126: #ifdef TIOCNOTTY
        !           127:        {
        !           128:            int     xsd;
        !           129: 
        !           130:            if ((xsd = open ("/dev/tty", O_RDWR)) != NOTOK) {
        !           131:                (void) ioctl (xsd, TIOCNOTTY, NULLCP);
        !           132:                (void) close (xsd);
        !           133:            }
        !           134:        }
        !           135: #else
        !           136: #ifdef SYS5
        !           137:        (void) setpgrp ();
        !           138:        (void) signal (SIGINT, SIG_IGN);
        !           139:        (void) signal (SIGQUIT, SIG_IGN);
        !           140: #endif
        !           141: #endif
        !           142:        return (OK);
        !           143: }
        !           144: 
        !           145: exit_pipe ()
        !           146: {
        !           147: #ifdef SOCKETS
        !           148:        (void) close_tcp_socket (sd);
        !           149: #else
        !           150:        (void) close (fd);
        !           151:        (void) close (wfd);
        !           152:        (void) unlink (retpipe);
        !           153: #endif
        !           154: }
        !           155: 
        !           156: read_pipe (buf,len)
        !           157: char * buf;
        !           158: int len;
        !           159: {
        !           160: #ifdef SOCKETS
        !           161:        struct sockaddr_in sock;
        !           162: 
        !           163:        while ((sd_current = join_tcp_client (sd, &sock)) == NOTOK) {
        !           164:                if (errno != EINTR) {
        !           165:                        perror("join_tcp_client");
        !           166:                        return (-1);
        !           167:                }
        !           168:        }
        !           169: #ifdef FIOCLEX
        !           170:        (void) ioctl (sd_current, FIOCLEX, NULLCP);
        !           171: #endif
        !           172: #endif
        !           173:        return (read_pipe_aux(buf,len));
        !           174: }
        !           175: 
        !           176: 
        !           177: read_pipe_aux (buf,len)
        !           178: char * buf;
        !           179: int len;
        !           180: {
        !           181:        int res;
        !           182: 
        !           183:        *buf = '\0';
        !           184: #ifdef SOCKETS
        !           185:        if((res = recv(sd_current, buf, len, 0)) == -1) {
        !           186:                perror ("recv");
        !           187:                (void) close (sd_current);
        !           188:                return (-1);
        !           189:        }
        !           190: #else
        !           191:        if ((res = read (fd, buf, len)) <= 0) {
        !           192:                perror ("read error");
        !           193:                reopen_ret ();
        !           194:                return (-1);
        !           195:        }
        !           196: #endif
        !           197: 
        !           198:        *(buf + res) = 0;
        !           199:        return (res);
        !           200: }
        !           201: 
        !           202: 
        !           203: 
        !           204: 
        !           205: #ifndef        SOCKETS
        !           206: send_pipe (buf)
        !           207: char * buf;
        !           208: {
        !           209:        send_pipe_aux (buf);
        !           210: 
        !           211:        (void) close (file);
        !           212:        reopen_ret ();
        !           213: }
        !           214: #endif
        !           215: 
        !           216: send_pipe_aux (buf)
        !           217: char * buf;
        !           218: {
        !           219: int res,i;
        !           220: 
        !           221:        i = strlen (buf);
        !           222: 
        !           223: #ifndef        SOCKETS
        !           224:        if ((file = open (inbuf, O_WRONLY)) <= 0) {
        !           225:                (void) fprintf (stderr, "error %s on %s\n",sys_errname (errno), inbuf);
        !           226:                reopen_ret ();
        !           227:                return;
        !           228:        }
        !           229: #endif
        !           230: 
        !           231:        while (i > 0) {
        !           232: #ifdef SOCKETS
        !           233:                if ( (res= send(sd_current, buf, i, 0)) == -1) {
        !           234:                        perror("send");
        !           235:                        (void) close (sd_current);
        !           236:                        return;
        !           237:                }
        !           238: #else
        !           239:                if ((res = write (file, buf, MIN (BUFSIZ,i))) == -1 ) {
        !           240:                        (void) fprintf (stderr,"result write error (2)\n");
        !           241:                        reopen_ret ();
        !           242:                        return;
        !           243:                }
        !           244: #endif
        !           245:                buf += res, i -= res;
        !           246:        }
        !           247: }
        !           248: 
        !           249: 
        !           250: #ifdef SOCKETS
        !           251: get_dish_sock (isock)
        !           252: struct sockaddr_in *isock;
        !           253: {
        !           254:        char * getenv ();
        !           255:        char * ptr;
        !           256:        char buffer [BUFSIZ];
        !           257:        int     portno;
        !           258:        char   *dp;
        !           259:        register struct hostent *hp;
        !           260: 
        !           261:        if ((ptr = getenv ("DISHPROC")) == NULLCP) {
        !           262: #ifdef notanymore
        !           263:                char   *cp,
        !           264: #endif
        !           265:                portno = (getppid () & 0xffff) | 0x8000;
        !           266: #ifdef notanymore
        !           267:                if ((hp = gethostbystring (cp = getlocalhost ())) == NULL) {
        !           268:                        (void) fprintf (stderr,"%s: unknown host", cp);
        !           269:                        return (-1);
        !           270:                }
        !           271:                (void) sprintf (buffer, "%s %d",
        !           272:                                inet_ntoa (*(struct in_addr *) hp -> h_addr),
        !           273:                                portno);
        !           274: #else
        !           275:                (void) sprintf (buffer, "127.0.0.1 %d", portno);
        !           276: #endif
        !           277:                (void) setenv ("DISHPROC", ptr = buffer);
        !           278:        }
        !           279: 
        !           280:        if ((dp = index (ptr, ' ')) == NULLCP || sscanf (dp + 1, "%d", &portno) != 1) {
        !           281:                (void) fprintf (stderr,"DISHPROC malformed");
        !           282:                return (-1);
        !           283:        }
        !           284:        *dp = NULL;
        !           285: 
        !           286:        if ((hp = gethostbystring (ptr)) == NULL) {
        !           287:                (void) fprintf (stderr,"%s: unknown host in DISHPROC", ptr);
        !           288:                return (-1);
        !           289:        }
        !           290:        *dp = ' ';
        !           291: 
        !           292:        bzero ((char *) isock, sizeof *isock);
        !           293:        isock -> sin_family = hp -> h_addrtype;
        !           294:        isock -> sin_port = htons ((u_short) portno);
        !           295:        inaddr_copy (hp, isock);
        !           296: 
        !           297:        return (0);
        !           298: 
        !           299: }
        !           300: 
        !           301: #else
        !           302: 
        !           303: reopen_ret ()
        !           304: {
        !           305:        (void) close (fd);
        !           306:        (void) close (wfd);
        !           307: 
        !           308:        if ((fd = open (retpipe, O_RDONLY)) < 0) {
        !           309:                if ( errno == EINTR ) {
        !           310:                        reopen_ret ();
        !           311:                        return;
        !           312:                }
        !           313:                (void) fprintf (stderr, "re-ropen failed\n");
        !           314:                (void) unlink (retpipe);
        !           315:                exit (-72);
        !           316:        }
        !           317:        if ((wfd = open (retpipe, O_WRONLY)) < 0) {
        !           318:                (void) fprintf (stderr, "re-wr open failed\n");
        !           319:                (void) unlink (retpipe);
        !           320:                (void) close (fd);
        !           321:                exit (-73);
        !           322:        }
        !           323: }
        !           324: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.