|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <../boot/boot.h> ! 4: ! 5: int ! 6: plumb(char *dir, char *dest, int *efd, char *here) ! 7: { ! 8: char buf[128]; ! 9: char name[128]; ! 10: int n; ! 11: ! 12: sprint(name, "%s/clone", dir); ! 13: efd[0] = open(name, ORDWR); ! 14: if(efd[0] < 0) ! 15: return -1; ! 16: n = read(efd[0], buf, sizeof(buf)-1); ! 17: if(n < 0){ ! 18: close(efd[0]); ! 19: return -1; ! 20: } ! 21: buf[n] = 0; ! 22: sprint(name, "%s/%s/data", dir, buf); ! 23: if(here){ ! 24: sprint(buf, "announce %s", here); ! 25: if(sendmsg(efd[0], buf) < 0){ ! 26: close(efd[0]); ! 27: return -1; ! 28: } ! 29: } ! 30: sprint(buf, "connect %s", dest); ! 31: if(sendmsg(efd[0], buf) < 0){ ! 32: close(efd[0]); ! 33: return -1; ! 34: } ! 35: efd[1] = open(name, ORDWR); ! 36: if(efd[1] < 0){ ! 37: close(efd[0]); ! 38: return -1; ! 39: } ! 40: return efd[1]; ! 41: } ! 42: ! 43: int ! 44: sendmsg(int fd, char *msg) ! 45: { ! 46: int n; ! 47: ! 48: n = strlen(msg); ! 49: if(write(fd, msg, n) != n) ! 50: return -1; ! 51: return 0; ! 52: } ! 53: ! 54: void ! 55: warning(char *s) ! 56: { ! 57: char buf[ERRLEN]; ! 58: ! 59: errstr(buf); ! 60: fprint(2, "boot: %s: %s\n", s, buf); ! 61: } ! 62: ! 63: void ! 64: fatal(char *s) ! 65: { ! 66: char buf[ERRLEN]; ! 67: ! 68: errstr(buf); ! 69: fprint(2, "boot: %s: %s\n", s, buf); ! 70: exits(0); ! 71: } ! 72: ! 73: int ! 74: readfile(char *name, char *buf, int len) ! 75: { ! 76: int f, n; ! 77: ! 78: buf[0] = 0; ! 79: f = open(name, OREAD); ! 80: if(f < 0) ! 81: return -1; ! 82: n = read(f, buf, len-1); ! 83: if(n >= 0) ! 84: buf[n] = 0; ! 85: close(f); ! 86: return 0; ! 87: } ! 88: ! 89: int ! 90: writefile(char *name, char *buf, int len) ! 91: { ! 92: int f, n; ! 93: ! 94: f = open(name, OWRITE); ! 95: if(f < 0) ! 96: return -1; ! 97: n = write(f, buf, len); ! 98: close(f); ! 99: return (n != len) ? -1 : 0; ! 100: } ! 101: ! 102: void ! 103: setenv(char *name, char *val) ! 104: { ! 105: int f; ! 106: char ename[2*NAMELEN]; ! 107: ! 108: sprint(ename, "#e/%s", name); ! 109: f = create(ename, 1, 0666); ! 110: if(f < 0) ! 111: return; ! 112: write(f, val, strlen(val)); ! 113: close(f); ! 114: } ! 115: ! 116: void ! 117: srvcreate(char *name, int fd) ! 118: { ! 119: char *srvname; ! 120: int f; ! 121: char buf[2*NAMELEN]; ! 122: ! 123: srvname = strrchr(name, '/'); ! 124: if(srvname) ! 125: srvname++; ! 126: else ! 127: srvname = name; ! 128: ! 129: sprint(buf, "#s/%s", srvname); ! 130: f = create(buf, 1, 0666); ! 131: if(f < 0) ! 132: fatal(buf); ! 133: sprint(buf, "%d", fd); ! 134: if(write(f, buf, strlen(buf)) != strlen(buf)) ! 135: fatal("write"); ! 136: close(f); ! 137: } ! 138: ! 139: static int ! 140: catchint(void *a, char *note) ! 141: { ! 142: USED(a); ! 143: if(strcmp(note, "alarm") == 0) ! 144: return 1; ! 145: return 0; ! 146: } ! 147: ! 148: int ! 149: outin(int timeout, char *prompt, char *def, int len) ! 150: { ! 151: int n; ! 152: char buf[256]; ! 153: ! 154: if(timeout) { ! 155: atnotify(catchint, 1); ! 156: alarm(15*1000); ! 157: do{ ! 158: print("%s[%s]: ", prompt, *def ? def : "no default"); ! 159: n = read(0, buf, len); ! 160: alarm(15*1000); ! 161: }while(n == 0); ! 162: alarm(0); ! 163: atnotify(catchint, 0); ! 164: } ! 165: else { ! 166: do { ! 167: print("%s[%s]: ", prompt, *def ? def : "no default"); ! 168: n = read(0, buf, len); ! 169: }while(n == 0); ! 170: } ! 171: if(n < 0) ! 172: return 1; ! 173: if(n != 1){ ! 174: buf[n-1] = 0; ! 175: strcpy(def, buf); ! 176: } ! 177: return n; ! 178: } ! 179: ! 180: /* ! 181: * get second word of the terminal environment variable. If it ! 182: * ends in "boot", get rid of that part. ! 183: */ ! 184: void ! 185: getconffile(char *conffile, char *terminal) ! 186: { ! 187: char *p, *q; ! 188: char *s; ! 189: int n; ! 190: ! 191: s = conffile; ! 192: *conffile = 0; ! 193: p = terminal; ! 194: if((p = strchr(p, ' ')) == 0 || p[1] == ' ' || p[1] == 0) ! 195: return; ! 196: p++; ! 197: for(q = p; *q && *q != ' '; q++) ! 198: ; ! 199: while(p < q) ! 200: *conffile++ = *p++; ! 201: *conffile = 0; ! 202: ! 203: /* dump a trailing boot */ ! 204: n = strlen(s); ! 205: if(n > 4 && strcmp(s + n - 4, "boot") == 0) ! 206: *(s+n-4) = 0; ! 207: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.