13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <../boot/boot.h> 43e12c5d1SDavid du Colombier 5208510e1SDavid du Colombier /* 63e12c5d1SDavid du Colombier int 73e12c5d1SDavid du Colombier plumb(char *dir, char *dest, int *efd, char *here) 83e12c5d1SDavid du Colombier { 93e12c5d1SDavid du Colombier char buf[128]; 103e12c5d1SDavid du Colombier char name[128]; 113e12c5d1SDavid du Colombier int n; 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier sprint(name, "%s/clone", dir); 143e12c5d1SDavid du Colombier efd[0] = open(name, ORDWR); 153e12c5d1SDavid du Colombier if(efd[0] < 0) 163e12c5d1SDavid du Colombier return -1; 173e12c5d1SDavid du Colombier n = read(efd[0], buf, sizeof(buf)-1); 183e12c5d1SDavid du Colombier if(n < 0){ 193e12c5d1SDavid du Colombier close(efd[0]); 203e12c5d1SDavid du Colombier return -1; 213e12c5d1SDavid du Colombier } 223e12c5d1SDavid du Colombier buf[n] = 0; 233e12c5d1SDavid du Colombier sprint(name, "%s/%s/data", dir, buf); 243e12c5d1SDavid du Colombier if(here){ 253e12c5d1SDavid du Colombier sprint(buf, "announce %s", here); 263e12c5d1SDavid du Colombier if(sendmsg(efd[0], buf) < 0){ 273e12c5d1SDavid du Colombier close(efd[0]); 283e12c5d1SDavid du Colombier return -1; 293e12c5d1SDavid du Colombier } 303e12c5d1SDavid du Colombier } 313e12c5d1SDavid du Colombier sprint(buf, "connect %s", dest); 323e12c5d1SDavid du Colombier if(sendmsg(efd[0], buf) < 0){ 333e12c5d1SDavid du Colombier close(efd[0]); 343e12c5d1SDavid du Colombier return -1; 353e12c5d1SDavid du Colombier } 363e12c5d1SDavid du Colombier efd[1] = open(name, ORDWR); 373e12c5d1SDavid du Colombier if(efd[1] < 0){ 383e12c5d1SDavid du Colombier close(efd[0]); 393e12c5d1SDavid du Colombier return -1; 403e12c5d1SDavid du Colombier } 413e12c5d1SDavid du Colombier return efd[1]; 423e12c5d1SDavid du Colombier } 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier int 453e12c5d1SDavid du Colombier sendmsg(int fd, char *msg) 463e12c5d1SDavid du Colombier { 473e12c5d1SDavid du Colombier int n; 483e12c5d1SDavid du Colombier 493e12c5d1SDavid du Colombier n = strlen(msg); 503e12c5d1SDavid du Colombier if(write(fd, msg, n) != n) 513e12c5d1SDavid du Colombier return -1; 523e12c5d1SDavid du Colombier return 0; 533e12c5d1SDavid du Colombier } 54*8c055935SDavid du Colombier */ 553e12c5d1SDavid du Colombier 563e12c5d1SDavid du Colombier void 573e12c5d1SDavid du Colombier warning(char *s) 583e12c5d1SDavid du Colombier { 599a747e4fSDavid du Colombier char buf[ERRMAX]; 609a747e4fSDavid du Colombier 619a747e4fSDavid du Colombier buf[0] = '\0'; 629a747e4fSDavid du Colombier errstr(buf, sizeof buf); 639a747e4fSDavid du Colombier fprint(2, "boot: %s: %s\n", s, buf); 643e12c5d1SDavid du Colombier } 653e12c5d1SDavid du Colombier 663e12c5d1SDavid du Colombier void 673e12c5d1SDavid du Colombier fatal(char *s) 683e12c5d1SDavid du Colombier { 699a747e4fSDavid du Colombier char buf[ERRMAX]; 709a747e4fSDavid du Colombier 719a747e4fSDavid du Colombier buf[0] = '\0'; 729a747e4fSDavid du Colombier errstr(buf, sizeof buf); 739a747e4fSDavid du Colombier fprint(2, "boot: %s: %s\n", s, buf); 743e12c5d1SDavid du Colombier exits(0); 753e12c5d1SDavid du Colombier } 763e12c5d1SDavid du Colombier 773e12c5d1SDavid du Colombier int 783e12c5d1SDavid du Colombier readfile(char *name, char *buf, int len) 793e12c5d1SDavid du Colombier { 803e12c5d1SDavid du Colombier int f, n; 813e12c5d1SDavid du Colombier 823e12c5d1SDavid du Colombier buf[0] = 0; 833e12c5d1SDavid du Colombier f = open(name, OREAD); 843e12c5d1SDavid du Colombier if(f < 0) 853e12c5d1SDavid du Colombier return -1; 863e12c5d1SDavid du Colombier n = read(f, buf, len-1); 873e12c5d1SDavid du Colombier if(n >= 0) 883e12c5d1SDavid du Colombier buf[n] = 0; 893e12c5d1SDavid du Colombier close(f); 903e12c5d1SDavid du Colombier return 0; 913e12c5d1SDavid du Colombier } 923e12c5d1SDavid du Colombier 93219b2ee8SDavid du Colombier int 94219b2ee8SDavid du Colombier writefile(char *name, char *buf, int len) 95219b2ee8SDavid du Colombier { 96219b2ee8SDavid du Colombier int f, n; 97219b2ee8SDavid du Colombier 98219b2ee8SDavid du Colombier f = open(name, OWRITE); 99219b2ee8SDavid du Colombier if(f < 0) 100219b2ee8SDavid du Colombier return -1; 101219b2ee8SDavid du Colombier n = write(f, buf, len); 102219b2ee8SDavid du Colombier close(f); 103219b2ee8SDavid du Colombier return (n != len) ? -1 : 0; 104219b2ee8SDavid du Colombier } 105219b2ee8SDavid du Colombier 1063e12c5d1SDavid du Colombier void 1073e12c5d1SDavid du Colombier setenv(char *name, char *val) 1083e12c5d1SDavid du Colombier { 1093e12c5d1SDavid du Colombier int f; 1109a747e4fSDavid du Colombier char ename[64]; 1113e12c5d1SDavid du Colombier 1129a747e4fSDavid du Colombier snprint(ename, sizeof ename, "#e/%s", name); 1133e12c5d1SDavid du Colombier f = create(ename, 1, 0666); 11467031067SDavid du Colombier if(f < 0){ 11567031067SDavid du Colombier fprint(2, "create %s: %r\n", ename); 1163e12c5d1SDavid du Colombier return; 11767031067SDavid du Colombier } 1183e12c5d1SDavid du Colombier write(f, val, strlen(val)); 1193e12c5d1SDavid du Colombier close(f); 1203e12c5d1SDavid du Colombier } 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier void 1233e12c5d1SDavid du Colombier srvcreate(char *name, int fd) 1243e12c5d1SDavid du Colombier { 1253e12c5d1SDavid du Colombier char *srvname; 1263e12c5d1SDavid du Colombier int f; 1279a747e4fSDavid du Colombier char buf[64]; 1283e12c5d1SDavid du Colombier 1293e12c5d1SDavid du Colombier srvname = strrchr(name, '/'); 1303e12c5d1SDavid du Colombier if(srvname) 1313e12c5d1SDavid du Colombier srvname++; 1323e12c5d1SDavid du Colombier else 1333e12c5d1SDavid du Colombier srvname = name; 1343e12c5d1SDavid du Colombier 1359a747e4fSDavid du Colombier snprint(buf, sizeof buf, "#s/%s", srvname); 1363e12c5d1SDavid du Colombier f = create(buf, 1, 0666); 1373e12c5d1SDavid du Colombier if(f < 0) 1383e12c5d1SDavid du Colombier fatal(buf); 1393e12c5d1SDavid du Colombier sprint(buf, "%d", fd); 1403e12c5d1SDavid du Colombier if(write(f, buf, strlen(buf)) != strlen(buf)) 1413e12c5d1SDavid du Colombier fatal("write"); 1423e12c5d1SDavid du Colombier close(f); 1433e12c5d1SDavid du Colombier } 1443e12c5d1SDavid du Colombier 14567031067SDavid du Colombier void 146219b2ee8SDavid du Colombier catchint(void *a, char *note) 147219b2ee8SDavid du Colombier { 148219b2ee8SDavid du Colombier USED(a); 149219b2ee8SDavid du Colombier if(strcmp(note, "alarm") == 0) 15067031067SDavid du Colombier noted(NCONT); 15167031067SDavid du Colombier noted(NDFLT); 152219b2ee8SDavid du Colombier } 153219b2ee8SDavid du Colombier 1543e12c5d1SDavid du Colombier int 1557dd7cddfSDavid du Colombier outin(char *prompt, char *def, int len) 1563e12c5d1SDavid du Colombier { 1573e12c5d1SDavid du Colombier int n; 1583e12c5d1SDavid du Colombier char buf[256]; 1593e12c5d1SDavid du Colombier 16067031067SDavid du Colombier if(len >= sizeof buf) 16167031067SDavid du Colombier len = sizeof(buf)-1; 16267031067SDavid du Colombier 16367031067SDavid du Colombier if(cpuflag){ 16467031067SDavid du Colombier notify(catchint); 165219b2ee8SDavid du Colombier alarm(15*1000); 16667031067SDavid du Colombier } 167219b2ee8SDavid du Colombier print("%s[%s]: ", prompt, *def ? def : "no default"); 16867031067SDavid du Colombier memset(buf, 0, sizeof buf); 169219b2ee8SDavid du Colombier n = read(0, buf, len); 17067031067SDavid du Colombier if(cpuflag){ 171219b2ee8SDavid du Colombier alarm(0); 17267031067SDavid du Colombier notify(0); 17367031067SDavid du Colombier } 17467031067SDavid du Colombier 1753e12c5d1SDavid du Colombier if(n < 0) 176219b2ee8SDavid du Colombier return 1; 17767031067SDavid du Colombier if(n > 1){ 1783e12c5d1SDavid du Colombier buf[n-1] = 0; 1793e12c5d1SDavid du Colombier strcpy(def, buf); 1803e12c5d1SDavid du Colombier } 1813e12c5d1SDavid du Colombier return n; 1823e12c5d1SDavid du Colombier } 183