Annotation of researchv10no/cmd/vsw/system10.c, revision 1.1.1.1

1.1       root        1: #include       <libc.h>
                      2: #include       <fio.h>
                      3: #include       <ctype.h>
                      4: #include       <sysent.h>
                      5: #include       <string.h>
                      6: #include       "crossbar.h"
                      7: 
                      8: int rread(int fd, char *buf, int n);
                      9: 
                     10: System10::System10(char *dkname, int n, int depth) : (dkname, n, depth)
                     11: {
                     12: }
                     13: 
                     14: void
                     15: System10::startup()
                     16: {
                     17:        int i, n;
                     18:        char buf[256];
                     19:        extern int opendk(char *);
                     20: 
                     21:        fd = opendk(dial);
                     22:        for(i = 0; i < 3; i++){
                     23:                write(fd, "@\r", 2);
                     24:                read(fd, buf, 3);
                     25:                if((n = read(fd, buf, sizeof buf)) != 3){
                     26:                        fprint(2, "read %d, wanted %d: %s: ", n, 3, buf);
                     27:                        perror("read");
                     28:                        exit(1);
                     29:                }
                     30:                if(strncmp(buf, "@\r", 2) == 0)
                     31:                        break;
                     32:        }
                     33: }
                     34: 
                     35: int
                     36: System10::connect(int input, Crossbar *c, int output, int nw)
                     37: {
                     38:        char buf[256];
                     39:        int n;
                     40: 
                     41:        if(fd < 0)
                     42:                startup();
                     43:        if(c != this){
                     44:                if(nextc->connect(nextl, c, output, nw) == 0)
                     45:                        return(0);
                     46:                output = froml;
                     47:        }
                     48:        nw /= nwires;
                     49:        while(nw-- > 0){
                     50:                fprint(fd, "%d%d\r", output, input);
                     51:                n = read(fd, buf, 7);
                     52:                if(n != 7){
                     53:                        fprint(2, "%s.con %d->%d failed; %d!=7\n", name(), input, output, n);
                     54:                        return(0);
                     55:                }
                     56:                input++, output++;
                     57:        }
                     58:        return(1);
                     59: }
                     60: 
                     61: void
                     62: System10::config()
                     63: {
                     64:        int i, n;
                     65:        char buf[256], *s;
                     66: 
                     67:        imap = new int[nouts];
                     68:        write(fd, "?\r", 2);
                     69:        read(fd, buf, 3);
                     70:        if((n = rread(fd, buf, 31)) < 0){
                     71:                perror("read2");
                     72:                exit(1);
                     73:        }
                     74:        if(n != 31){
                     75:                fprint(2, "erk! read expected 31, got %d '%s'\n", n, buf);
                     76:                exit(1);
                     77:        }
                     78:        for(i = 0, s = buf; i < 10; i++){
                     79:                if(!isdigit(*s)){
                     80:                        fprint(2, "erk: output must be digit '%s'\n", s);
                     81:                        exit(1);
                     82:                }
                     83:                if(!isdigit(s[1])){
                     84:                        fprint(2, "erk: input must be digit '%s'\n", s+1);
                     85:                        exit(1);
                     86:                }
                     87:                imap[*s-'0'] = s[1]-'0';
                     88: if(0)Fprint(1, "%c<-%c ", s[0], s[1]);
                     89:                s += 3;
                     90:        }
                     91: if(0)Fprint(1, "\n"), Fflush(1);
                     92: }
                     93: 
                     94: int
                     95: rread(int fd, char *buf, int n)
                     96: {
                     97:        int k, m = 0;
                     98: 
                     99:        while(m != n){
                    100: buf[m]=0;fprint(2, "read %d of %d '%s'\n", m, n, buf);
                    101:                k = read(fd, &buf[m], n-m);
                    102:                if(k < 0)
                    103:                        return(k);
                    104:                if(k == 0)
                    105:                        break;
                    106:                m += k;
                    107:        }
                    108:        return(m);
                    109: }

unix.superglobalmegacorp.com

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