Annotation of 43BSDReno/contrib/mh/uip/vmhsbr.c, revision 1.1.1.1

1.1       root        1: /* vmhsbr.c - routines to help vmh along */
                      2: 
                      3: /* TODO (for vrsn 2):
                      4:        INI: include width of windows
                      5:  */
                      6: 
                      7: #include "../h/mh.h"
                      8: #include "../h/vmhsbr.h"
                      9: #include <stdio.h>
                     10: 
                     11: static int rclose();
                     12: 
                     13: /*  */
                     14: 
                     15: static char *types[] = {
                     16:     "OK",
                     17:     "INI", "ACK", "ERR", "CMD", "QRY", "TTY", "WIN", "DATA", "EOF", "FIN",
                     18:     "XXX", NULL
                     19: };
                     20: 
                     21: static FILE *fp = NULL;
                     22: 
                     23: static int PEERrfd = NOTOK;
                     24: static int PEERwfd = NOTOK;
                     25: 
                     26: 
                     27: extern int  errno;
                     28: extern int  sys_nerr;
                     29: extern char *sys_errlist[];
                     30: 
                     31: /*  */
                     32: 
                     33: rcinit(rfd, wfd)
                     34:        int rfd, wfd;
                     35: {
                     36:     char   *cp,
                     37:             buffer[BUFSIZ];
                     38: 
                     39:     PEERrfd = rfd;
                     40:     PEERwfd = wfd;
                     41: 
                     42:     if ((cp = getenv ("MHVDEBUG"))
                     43:            && *cp
                     44:            && (fp = fopen (sprintf (buffer, "%s.out", invo_name), "w"))) {
                     45:        (void) fseek (fp, 0L, 2);
                     46:        fprintf (fp, "%d: rcinit (%d, %d)\n", getpid (), rfd, wfd);
                     47:        (void) fflush (fp);
                     48:     }
                     49: 
                     50:     return OK;
                     51: }
                     52: 
                     53: 
                     54: rcdone()
                     55: {
                     56:     if (PEERrfd != NOTOK)
                     57:        (void) close (PEERrfd);
                     58:     if (PEERwfd != NOTOK)
                     59:        (void) close (PEERwfd);
                     60: 
                     61:     if (fp) {
                     62:        (void) fclose (fp);
                     63:        fp = NULL;
                     64:     }
                     65:     return OK;
                     66: }
                     67: 
                     68: /*  */
                     69: 
                     70: rc2rc(code, len, data, rc)
                     71:        char code;
                     72:        int len;
                     73:        char *data;
                     74:        struct record *rc;
                     75: {
                     76:     if (rc2peer (code, len, data) == NOTOK)
                     77:        return NOTOK;
                     78: 
                     79:     return peer2rc (rc);
                     80: }
                     81: 
                     82: 
                     83: str2rc(code, str, rc)
                     84:        char code;
                     85:        char *str;
                     86:        struct record *rc;
                     87: {
                     88:     return rc2rc (code, str ? strlen (str) : 0, str, rc);
                     89: }
                     90: 
                     91: /*  */
                     92: 
                     93: peer2rc(rc)
                     94:        register struct record *rc;
                     95: {
                     96:     if (rc -> rc_data)
                     97:        free (rc -> rc_data);
                     98: 
                     99:     if (read (PEERrfd, (char *) rc_head (rc), RHSIZE (rc)) != RHSIZE (rc))
                    100:        return rclose (rc, "read from peer lost(1)");
                    101:     if (rc -> rc_len) {
                    102:        if ((rc -> rc_data = malloc ((unsigned) rc -> rc_len)) == NULL)
                    103:            return rclose (rc, "malloc of %d lost", rc -> rc_len);
                    104:        if (read (PEERrfd, rc -> rc_data, rc -> rc_len) != rc -> rc_len)
                    105:            return rclose (rc, "read from peer lost(2)");
                    106:        rc -> rc_data[rc -> rc_len] = NULL;
                    107:     }
                    108:     else
                    109:        rc -> rc_data = NULL;
                    110: 
                    111:     if (fp) {
                    112:        (void) fseek (fp, 0L, 2);
                    113:        fprintf (fp, "%d: <--- %s %d: \"%*.*s\"\n", getpid (),
                    114:                types[rc -> rc_type], rc -> rc_len,
                    115:                rc -> rc_len, rc -> rc_len, rc -> rc_data);
                    116:        (void) fflush (fp);
                    117:     }
                    118: 
                    119:     return rc -> rc_type;
                    120: }
                    121: 
                    122: /*  */
                    123: 
                    124: rc2peer(code, len, data)
                    125:        char code;
                    126:        int len;
                    127:        char *data;
                    128: {
                    129:     struct record   rcs;
                    130:     register struct record *rc = &rcs;
                    131: 
                    132:     rc -> rc_type = code;
                    133:     rc -> rc_len = len;
                    134: 
                    135:     if (fp) {
                    136:        (void) fseek (fp, 0L, 2);
                    137:        fprintf (fp, "%d: ---> %s %d: \"%*.*s\"\n", getpid (),
                    138:                types[rc -> rc_type], rc -> rc_len,
                    139:                rc -> rc_len, rc -> rc_len, data);
                    140:        (void) fflush (fp);
                    141:     }
                    142: 
                    143:     if (write (PEERwfd, (char *) rc_head (rc), RHSIZE (rc)) != RHSIZE (rc))
                    144:        return rclose (rc, "write to peer lost(1)");
                    145: 
                    146:     if (rc -> rc_len)
                    147:        if (write (PEERwfd, data, rc -> rc_len) != rc -> rc_len)
                    148:            return rclose (rc, "write to peer lost(2)");
                    149: 
                    150:     return OK;
                    151: }
                    152: 
                    153: /*  */
                    154: 
                    155: str2peer(code, str)
                    156:        char code;
                    157:        char *str;
                    158: {
                    159:     return rc2peer (code, str ? strlen (str) : 0, str);
                    160: }
                    161: 
                    162: 
                    163: /* VARARGS2 */
                    164: 
                    165: fmt2peer(code, fmt, a, b, c, d, e, f)
                    166:        char code;
                    167:        char *fmt, *a, *b, *c, *d, *e, *f;
                    168: {
                    169:     return err2peer (code, NULLCP, fmt, a, b, c, d, e, f);
                    170: }
                    171: 
                    172: /*  */
                    173: 
                    174: /* VARARGS3 */
                    175: 
                    176: err2peer(code, what, fmt, a, b, c, d, e, f)
                    177:        char code;
                    178:        char *what, *fmt, *a, *b, *c, *d, *e, *f;
                    179: {
                    180:     int     eindex = errno;
                    181:     register char  *bp;
                    182:     char    buffer[BUFSIZ * 2];
                    183: 
                    184:     (void) sprintf (buffer, fmt, a, b, c, d, e, f);
                    185:     bp = buffer + strlen (buffer);
                    186:     if (what) {
                    187:        if (*what) {
                    188:            (void) sprintf (bp, " %s: ", what);
                    189:            bp += strlen (bp);
                    190:        }
                    191:        if (eindex > 0 && eindex < sys_nerr)
                    192:            (void) strcpy (bp, sys_errlist[eindex]);
                    193:        else
                    194:            (void) sprintf (bp, "Error %d", eindex);
                    195:        bp += strlen (bp);
                    196:     }
                    197: 
                    198:     return rc2peer (code, bp - buffer, buffer);
                    199: }
                    200: 
                    201: /*  */
                    202: 
                    203: /* VARARGS2 */
                    204: 
                    205: static int
                    206: rclose(rc, fmt, a, b, c, d, e, f)
                    207:        register struct record *rc;
                    208:        char *fmt, *a, *b, *c, *d, *e, *f;
                    209: {
                    210:     static char buffer[BUFSIZ * 2];
                    211: 
                    212:     (void) sprintf (buffer, fmt, a, b, c, d, e, f);
                    213: 
                    214:     rc -> rc_len = strlen (rc -> rc_data = getcpy (buffer));
                    215:     return (rc -> rc_type = RC_XXX);
                    216: }

unix.superglobalmegacorp.com

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