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

unix.superglobalmegacorp.com

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