Annotation of 43BSDReno/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: 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.