13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <../boot/boot.h> 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier int 63e12c5d1SDavid du Colombier plumb(char *dir, char *dest, int *efd, char *here) 73e12c5d1SDavid du Colombier { 83e12c5d1SDavid du Colombier char buf[128]; 93e12c5d1SDavid du Colombier char name[128]; 103e12c5d1SDavid du Colombier int n; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier sprint(name, "%s/clone", dir); 133e12c5d1SDavid du Colombier efd[0] = open(name, ORDWR); 143e12c5d1SDavid du Colombier if(efd[0] < 0) 153e12c5d1SDavid du Colombier return -1; 163e12c5d1SDavid du Colombier n = read(efd[0], buf, sizeof(buf)-1); 173e12c5d1SDavid du Colombier if(n < 0){ 183e12c5d1SDavid du Colombier close(efd[0]); 193e12c5d1SDavid du Colombier return -1; 203e12c5d1SDavid du Colombier } 213e12c5d1SDavid du Colombier buf[n] = 0; 223e12c5d1SDavid du Colombier sprint(name, "%s/%s/data", dir, buf); 233e12c5d1SDavid du Colombier if(here){ 243e12c5d1SDavid du Colombier sprint(buf, "announce %s", here); 253e12c5d1SDavid du Colombier if(sendmsg(efd[0], buf) < 0){ 263e12c5d1SDavid du Colombier close(efd[0]); 273e12c5d1SDavid du Colombier return -1; 283e12c5d1SDavid du Colombier } 293e12c5d1SDavid du Colombier } 303e12c5d1SDavid du Colombier sprint(buf, "connect %s", dest); 313e12c5d1SDavid du Colombier if(sendmsg(efd[0], buf) < 0){ 323e12c5d1SDavid du Colombier close(efd[0]); 333e12c5d1SDavid du Colombier return -1; 343e12c5d1SDavid du Colombier } 353e12c5d1SDavid du Colombier efd[1] = open(name, ORDWR); 363e12c5d1SDavid du Colombier if(efd[1] < 0){ 373e12c5d1SDavid du Colombier close(efd[0]); 383e12c5d1SDavid du Colombier return -1; 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier return efd[1]; 413e12c5d1SDavid du Colombier } 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier int 443e12c5d1SDavid du Colombier sendmsg(int fd, char *msg) 453e12c5d1SDavid du Colombier { 463e12c5d1SDavid du Colombier int n; 473e12c5d1SDavid du Colombier 483e12c5d1SDavid du Colombier n = strlen(msg); 493e12c5d1SDavid du Colombier if(write(fd, msg, n) != n) 503e12c5d1SDavid du Colombier return -1; 513e12c5d1SDavid du Colombier return 0; 523e12c5d1SDavid du Colombier } 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier void 553e12c5d1SDavid du Colombier warning(char *s) 563e12c5d1SDavid du Colombier { 57*9a747e4fSDavid du Colombier char buf[ERRMAX]; 58*9a747e4fSDavid du Colombier 59*9a747e4fSDavid du Colombier buf[0] = '\0'; 60*9a747e4fSDavid du Colombier errstr(buf, sizeof buf); 61*9a747e4fSDavid du Colombier fprint(2, "boot: %s: %s\n", s, buf); 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier void 653e12c5d1SDavid du Colombier fatal(char *s) 663e12c5d1SDavid du Colombier { 67*9a747e4fSDavid du Colombier char buf[ERRMAX]; 68*9a747e4fSDavid du Colombier 69*9a747e4fSDavid du Colombier buf[0] = '\0'; 70*9a747e4fSDavid du Colombier errstr(buf, sizeof buf); 71*9a747e4fSDavid du Colombier fprint(2, "boot: %s: %s\n", s, buf); 723e12c5d1SDavid du Colombier exits(0); 733e12c5d1SDavid du Colombier } 743e12c5d1SDavid du Colombier 753e12c5d1SDavid du Colombier int 763e12c5d1SDavid du Colombier readfile(char *name, char *buf, int len) 773e12c5d1SDavid du Colombier { 783e12c5d1SDavid du Colombier int f, n; 793e12c5d1SDavid du Colombier 803e12c5d1SDavid du Colombier buf[0] = 0; 813e12c5d1SDavid du Colombier f = open(name, OREAD); 823e12c5d1SDavid du Colombier if(f < 0) 833e12c5d1SDavid du Colombier return -1; 843e12c5d1SDavid du Colombier n = read(f, buf, len-1); 853e12c5d1SDavid du Colombier if(n >= 0) 863e12c5d1SDavid du Colombier buf[n] = 0; 873e12c5d1SDavid du Colombier close(f); 883e12c5d1SDavid du Colombier return 0; 893e12c5d1SDavid du Colombier } 903e12c5d1SDavid du Colombier 91219b2ee8SDavid du Colombier int 92219b2ee8SDavid du Colombier writefile(char *name, char *buf, int len) 93219b2ee8SDavid du Colombier { 94219b2ee8SDavid du Colombier int f, n; 95219b2ee8SDavid du Colombier 96219b2ee8SDavid du Colombier f = open(name, OWRITE); 97219b2ee8SDavid du Colombier if(f < 0) 98219b2ee8SDavid du Colombier return -1; 99219b2ee8SDavid du Colombier n = write(f, buf, len); 100219b2ee8SDavid du Colombier close(f); 101219b2ee8SDavid du Colombier return (n != len) ? -1 : 0; 102219b2ee8SDavid du Colombier } 103219b2ee8SDavid du Colombier 1043e12c5d1SDavid du Colombier void 1053e12c5d1SDavid du Colombier setenv(char *name, char *val) 1063e12c5d1SDavid du Colombier { 1073e12c5d1SDavid du Colombier int f; 108*9a747e4fSDavid du Colombier char ename[64]; 1093e12c5d1SDavid du Colombier 110*9a747e4fSDavid du Colombier snprint(ename, sizeof ename, "#e/%s", name); 1113e12c5d1SDavid du Colombier f = create(ename, 1, 0666); 1123e12c5d1SDavid du Colombier if(f < 0) 1133e12c5d1SDavid du Colombier return; 1143e12c5d1SDavid du Colombier write(f, val, strlen(val)); 1153e12c5d1SDavid du Colombier close(f); 1163e12c5d1SDavid du Colombier } 1173e12c5d1SDavid du Colombier 1183e12c5d1SDavid du Colombier void 1193e12c5d1SDavid du Colombier srvcreate(char *name, int fd) 1203e12c5d1SDavid du Colombier { 1213e12c5d1SDavid du Colombier char *srvname; 1223e12c5d1SDavid du Colombier int f; 123*9a747e4fSDavid du Colombier char buf[64]; 1243e12c5d1SDavid du Colombier 1253e12c5d1SDavid du Colombier srvname = strrchr(name, '/'); 1263e12c5d1SDavid du Colombier if(srvname) 1273e12c5d1SDavid du Colombier srvname++; 1283e12c5d1SDavid du Colombier else 1293e12c5d1SDavid du Colombier srvname = name; 1303e12c5d1SDavid du Colombier 131*9a747e4fSDavid du Colombier snprint(buf, sizeof buf, "#s/%s", srvname); 1323e12c5d1SDavid du Colombier f = create(buf, 1, 0666); 1333e12c5d1SDavid du Colombier if(f < 0) 1343e12c5d1SDavid du Colombier fatal(buf); 1353e12c5d1SDavid du Colombier sprint(buf, "%d", fd); 1363e12c5d1SDavid du Colombier if(write(f, buf, strlen(buf)) != strlen(buf)) 1373e12c5d1SDavid du Colombier fatal("write"); 1383e12c5d1SDavid du Colombier close(f); 1393e12c5d1SDavid du Colombier } 1403e12c5d1SDavid du Colombier 141219b2ee8SDavid du Colombier static int 142219b2ee8SDavid du Colombier catchint(void *a, char *note) 143219b2ee8SDavid du Colombier { 144219b2ee8SDavid du Colombier USED(a); 145219b2ee8SDavid du Colombier if(strcmp(note, "alarm") == 0) 146219b2ee8SDavid du Colombier return 1; 147219b2ee8SDavid du Colombier return 0; 148219b2ee8SDavid du Colombier } 149219b2ee8SDavid du Colombier 1503e12c5d1SDavid du Colombier int 1517dd7cddfSDavid du Colombier outin(char *prompt, char *def, int len) 1523e12c5d1SDavid du Colombier { 1533e12c5d1SDavid du Colombier int n; 1543e12c5d1SDavid du Colombier char buf[256]; 1553e12c5d1SDavid du Colombier 156219b2ee8SDavid du Colombier atnotify(catchint, 1); 1577dd7cddfSDavid du Colombier if(cpuflag) 158219b2ee8SDavid du Colombier alarm(15*1000); 159219b2ee8SDavid du Colombier do{ 160219b2ee8SDavid du Colombier print("%s[%s]: ", prompt, *def ? def : "no default"); 161219b2ee8SDavid du Colombier n = read(0, buf, len); 1627dd7cddfSDavid du Colombier if(cpuflag) 163219b2ee8SDavid du Colombier alarm(15*1000); 164219b2ee8SDavid du Colombier }while(n==0); 1657dd7cddfSDavid du Colombier if(cpuflag) 166219b2ee8SDavid du Colombier alarm(0); 167219b2ee8SDavid du Colombier atnotify(catchint, 0); 1683e12c5d1SDavid du Colombier if(n < 0) 169219b2ee8SDavid du Colombier return 1; 1703e12c5d1SDavid du Colombier if(n != 1){ 1713e12c5d1SDavid du Colombier buf[n-1] = 0; 1723e12c5d1SDavid du Colombier strcpy(def, buf); 1733e12c5d1SDavid du Colombier } 1743e12c5d1SDavid du Colombier return n; 1753e12c5d1SDavid du Colombier } 176