Annotation of researchv9/ipc/src/libipc/ipcproto.c, revision 1.1.1.1

1.1       root        1: #include <sys/types.h>
                      2: #include <sys/ioctl.h>
                      3: #include <pwd.h>
                      4: #include <ipc.h>
                      5: #include "defs.h"
                      6: 
                      7: /* buffer definition */
                      8: #define BUFLEN 512
                      9: 
                     10: /* have to define this somewhere */
                     11: char *ipcname;
                     12: 
                     13: /*
                     14:  *  Recieve an fd
                     15:  */
                     16: _fd_read(onfd, pp)
                     17:        int onfd;
                     18:        struct passfd *pp;
                     19: {
                     20:        register int rv;
                     21: 
                     22:        while((rv=ioctl(onfd, FIORCVFD, pp))<0 && errno==EINTR)
                     23:                ;
                     24:        return rv;
                     25: }
                     26: 
                     27: /*
                     28:  *  Send an fd
                     29:  */
                     30: _fd_write(onfd, tofd)
                     31: {
                     32:        return ioctl(onfd, FIOSNDFD, &tofd);
                     33: }
                     34: 
                     35: /*
                     36:  *  Send the connection info.
                     37:  */
                     38: int
                     39: _info_write(fd, ip)
                     40:        int fd;
                     41:        ipcinfo *ip;
                     42: {
                     43:        char b[BUFLEN];
                     44:        int n;
                     45: 
                     46:        if (ip->name==NULL)
                     47:                ip->name = "";
                     48:        if (ip->param==NULL)
                     49:                ip->param = "";
                     50:        if (ip->machine==NULL)
                     51:                ip->machine = "";
                     52:        if (ip->user==NULL)
                     53:                ip->user = "";
                     54:        if (ip->myname==NULL)
                     55:                ip->myname = "";
                     56:        sprintf(b, "%s\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n", ip->myname, ip->name,
                     57:                ip->param, ip->machine, ip->user, ip->flags, ip->uid, ip->gid);
                     58:        n = strlen(b);
                     59:        if (write(fd, b, n)!=n)
                     60:                return ABORT(errno, "can't send request", NULLINFO);
                     61:        return 0;
                     62: }
                     63: 
                     64: /*
                     65:  *  Read the connection info.  If an error occurs, ip->reply and ip->conn are
                     66:  *  closed.
                     67:  */
                     68: int
                     69: _info_read(fd, ip)
                     70:        int fd;
                     71:        ipcinfo *ip;
                     72: {
                     73:        static char b[BUFLEN];
                     74:        char *f[8];
                     75:        int n;
                     76: 
                     77:        while((n=read(fd, b, sizeof(b)))<0 && errno==EINTR)
                     78:                ;
                     79:        if (n <= 0) 
                     80:                return ABORT(errno, "error reading request", ip);
                     81:        b[n] = '\0';
                     82:        setfields("\n");
                     83:        if (getfields(b, f, 8)!=8)
                     84:                return ABORT(EINVAL, "protocol botch", ip);
                     85:        ip->myname = f[0];
                     86:        ip->name = f[1];
                     87:        ip->param = f[2];
                     88:        ip->machine = f[3];
                     89:        ip->flags = atoi(f[5]);
                     90: 
                     91:        /* supply a system name */
                     92:        if (ip->uid!=ROOTUID || ip->machine[0]=='\0')
                     93:                ip->machine = "";
                     94: 
                     95:        /* supply a user name */
                     96:        if (ip->uid==ROOTUID && *(f[4])!='\0')
                     97:                ip->user = f[4];
                     98: 
                     99:        /* supply uid/gid cruft */
                    100:        if (ip->uid==ROOTUID && atoi(f[6])!=-1) {
                    101:                ip->uid = atoi(f[6]);
                    102:                ip->gid = atoi(f[7]);
                    103:        }
                    104:        return 0;
                    105: }
                    106: 
                    107: /*
                    108:  *  Send a reply to a connection request
                    109:  */
                    110: _reply_write(fd, no, str)
                    111:        int fd;
                    112:        int no;
                    113:        char *str;
                    114: {
                    115:        char b[BUFLEN];
                    116:        int n;
                    117: 
                    118:        if (str==NULL)
                    119:                str = "";
                    120:        sprintf(b, "%d\n%s\n", no, str);
                    121:        n = strlen(b);
                    122:        if (write(fd, b, n)!=n)
                    123:                return -1;
                    124:        return 0;
                    125: }
                    126: 
                    127: /*
                    128:  *  Get a reply to a connection request.
                    129:  */
                    130: int
                    131: _reply_read(fd)
                    132:        int fd;
                    133: {
                    134:        static char b[BUFLEN];
                    135:        char *f[2];
                    136:        char *ptr;
                    137:        int n;
                    138: 
                    139:        while((n=read(fd, b, sizeof(b)))<0 && errno==EINTR)
                    140:                ;
                    141:        if (n <= 0) 
                    142:                return ABORT(errno, "error reading request", NULLINFO);
                    143:        b[n] = '\0';
                    144:        setfields("\n");
                    145:        getfields(b, f, 2);
                    146:        errno = atoi(f[0]);
                    147:        if ((ptr=strchr(f[1], '\n'))!=NULL)
                    148:                *ptr = '\0';
                    149:        if (errno!=0)
                    150:                errstr = f[1];
                    151:        else
                    152:                ipcname = f[1];
                    153:        return 0;
                    154: }
                    155: 

unix.superglobalmegacorp.com

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