Annotation of researchv10no/cmd/nupas/ipc/proxio.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * proxy - connect to the external Internet through a proxy machine.
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <sys/types.h>
                      7: #include <sys/param.h>
                      8: #include <string.h>
                      9: #include <sysexits.h>
                     10: 
                     11: #include "proxy.h"
                     12: 
                     13: char ipcname[100];
                     14: 
                     15: extern char *ipcpath();
                     16: extern int  ipcdebug;
                     17: 
                     18: int
                     19: proxy_connect(dest, param, prhost)
                     20: char *dest, *param, *prhost;
                     21: {
                     22:        int s;
                     23:        char *f[5], *reply, buf[PATHLEN];
                     24:        int i, ipcflag;
                     25: 
                     26:        if ((s = ipcopen(prhost, param)) < 0)
                     27:                return s;
                     28: 
                     29:        if (strcmp(param, "create") == 0) /* stub - not V10 parameter! */
                     30:                ipcflag = IPC_CREAT;
                     31:        else
                     32:                ipcflag = IPC_OPEN;
                     33: 
                     34:        strcpy(buf, dest);
                     35:        setfields("!");
                     36:        if (getfields(buf, f, 3) < 3) {
                     37:                strcpy(buf, "tcp!");
                     38:                strcat(buf, dest);
                     39:        }
                     40: 
                     41:        if ((send_ipcinfo(s, buf, ipcflag) != 0) ||
                     42:            (read_ipcreply(s, &reply)      != 0)) {
                     43:                ipcsyserr("proxy_connect");
                     44:                close(s);
                     45:                return -1;
                     46:        }
                     47: 
                     48:        /* *reply should hold "/cs/tcp!<ip address>!port#", which is
                     49:           address of the connection on proxy machine.  Save the conport. */
                     50:        strncpy(ipcname, reply, sizeof(ipcname));
                     51:        setfields("!");
                     52:        if (getfields(reply, f, 3) != 3) {
                     53:                ipcseterror(EX_PROTOCOL, "gateway protocol error 2",
                     54:                        "proxy_connect");
                     55:                close(s);
                     56:                return -1;
                     57:        }
                     58:        if (ipcdebug)
                     59:                fprintf(stderr, "reply = %s\n", ipcname);
                     60:        return s;
                     61: }
                     62: 
                     63: int
                     64: send_ipcinfo(fd, name, flag)
                     65:        int fd;
                     66:        char *name;
                     67:        int flag;
                     68: {
                     69:        char b[INFOLEN], *user, *getlogin();
                     70:        char hostname[256];
                     71:        int namelen = sizeof(hostname);
                     72:        int n;
                     73: 
                     74:        if (name==NULL)
                     75:                name = "";
                     76:        user = getlogin();
                     77:        if (user==NULL)
                     78:                user = "";
                     79:        gethostname(hostname, namelen); /* stub - this needs simulation in Sys V */
                     80:        sprintf(b, "\n%s\n\n%s\n%s\n%d\n-1\n-1\n", name, hostname, user, flag);
                     81:        n = strlen(b);
                     82:        if (ipcdebug)
                     83:                fprintf(stderr, "send_ipcinfo (%d): |%s||%s|%s|%d|-1|-1|\n",
                     84:                        n, name, hostname, user, flag);
                     85:        if (write(fd, b, n) != n) {
                     86:                ipcseterror(EX_PROTOCOL, "send_ipcinfo",
                     87:                        "sending to gateway machine");
                     88:                return -1;
                     89:        }
                     90:        return 0;
                     91: }
                     92: 
                     93: int
                     94: send_ipcreply(fd, code, answer)
                     95:        int fd;
                     96:        int code;
                     97:        char *answer;
                     98: {
                     99:        char b[PATHLEN];
                    100:        int n;
                    101: 
                    102:        if (answer==NULL)
                    103:                answer = "";
                    104:        sprintf(b, "%d\n%s\n", code, answer);
                    105:        n = strlen(b);
                    106:        if (ipcdebug)
                    107:                fprintf(stderr, "send_ipcreply (%d): %d|%s|\n",
                    108:                        n, code, answer);
                    109:        if (write(fd, b, n) != n) {
                    110:                ipcseterror(EX_PROTOCOL, "send_ipcreply",
                    111:                        "sending to gateway machine");
                    112:                return -1;
                    113:        }
                    114:        return 0;
                    115: }
                    116: 
                    117: int
                    118: read_ipcinfo(fd)
                    119:        int fd;
                    120: {
                    121:        static char b[INFOLEN];
                    122:        int n;
                    123: 
                    124:        n = read(fd, b, sizeof(b));
                    125:        if (n <= 0) {
                    126:                ipcseterror(EX_PROTOCOL, "read_ipcinfo",
                    127:                        "can't read from proxy gateway");
                    128:                return -1;
                    129:        }
                    130:        if (ipcdebug) {
                    131:                char buf[PATHLEN], *cp;
                    132:                strncpy(buf, b, n);
                    133:                buf[n] = '\0';
                    134:                for (cp = buf; *cp; cp++)
                    135:                        if (*cp == '\n')
                    136:                                *cp = '|';
                    137:                fprintf(stderr, "read_ipcinfo (%d): %s\n", n, buf);
                    138:        }
                    139:        /* could crack the fields if we wanted to */
                    140:        return 0;
                    141: }
                    142: 
                    143: int
                    144: read_ipcreply(fd, answer)
                    145:        int fd;
                    146:        char **answer;
                    147: {
                    148:        static char b[PATHLEN];
                    149:        char *f[2], *ptr;
                    150:        int c, n;
                    151: 
                    152:        *answer = "";
                    153:        n = read(fd, b, sizeof(b));
                    154:        if (n <= 0) {
                    155:                ipcseterror(EX_PROTOCOL, "read_ipcreply",
                    156:                        "can't read from proxy gateway");
                    157:                return -1;
                    158:        }
                    159:        b[n] = '\0';
                    160:        if (ipcdebug) {
                    161:                char buf[PATHLEN], *cp;
                    162:                strncpy(buf, b, n);
                    163:                buf[n] = '\0';
                    164:                for (cp = buf; *cp; cp++)
                    165:                        if (*cp == '\n')
                    166:                                *cp = '|';
                    167:                fprintf(stderr, "read_ipcreply (%d): %s\n", n, buf);
                    168:        }
                    169:        setfields("\n");
                    170:        if (getfields(b, f, 2) != 2) {
                    171:                ipcseterror(EX_PROTOCOL, "gateway protocol botch",
                    172:                        "can't read from proxy gateway");
                    173:                return -1;
                    174:        }
                    175:        if ((ptr=strchr(f[1], '\n'))!=NULL)
                    176:                *ptr = '\0';
                    177:        *answer = f[1];
                    178:        c = atoi(f[0]);
                    179:        if (c != 0) {
                    180:                ipcseterror(c, f[1], "gateway error");
                    181:                return -1;
                    182:        }
                    183:        return 0;
                    184: }

unix.superglobalmegacorp.com

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