Annotation of researchv10dc/ipc/libipc/ipcproto.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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