1 #include <u.h> 2 #include <libc.h> 3 #include <../boot/boot.h> 4 5 /* 6 int 7 plumb(char *dir, char *dest, int *efd, char *here) 8 { 9 char buf[128]; 10 char name[128]; 11 int n; 12 13 sprint(name, "%s/clone", dir); 14 efd[0] = open(name, ORDWR); 15 if(efd[0] < 0) 16 return -1; 17 n = read(efd[0], buf, sizeof(buf)-1); 18 if(n < 0){ 19 close(efd[0]); 20 return -1; 21 } 22 buf[n] = 0; 23 sprint(name, "%s/%s/data", dir, buf); 24 if(here){ 25 sprint(buf, "announce %s", here); 26 if(sendmsg(efd[0], buf) < 0){ 27 close(efd[0]); 28 return -1; 29 } 30 } 31 sprint(buf, "connect %s", dest); 32 if(sendmsg(efd[0], buf) < 0){ 33 close(efd[0]); 34 return -1; 35 } 36 efd[1] = open(name, ORDWR); 37 if(efd[1] < 0){ 38 close(efd[0]); 39 return -1; 40 } 41 return efd[1]; 42 } 43 44 int 45 sendmsg(int fd, char *msg) 46 { 47 int n; 48 49 n = strlen(msg); 50 if(write(fd, msg, n) != n) 51 return -1; 52 return 0; 53 } 54 */ 55 56 void 57 warning(char *s) 58 { 59 char buf[ERRMAX]; 60 61 buf[0] = '\0'; 62 errstr(buf, sizeof buf); 63 fprint(2, "boot: %s: %s\n", s, buf); 64 } 65 66 void 67 fatal(char *s) 68 { 69 char *msg; 70 char buf[ERRMAX]; 71 72 buf[0] = '\0'; 73 errstr(buf, sizeof buf); 74 msg = smprint("%s: %s", s, buf); 75 fprint(2, "boot: %s\n", msg); 76 exits(msg); /* this will trigger a panic */ 77 } 78 79 int 80 readfile(char *name, char *buf, int len) 81 { 82 int f, n; 83 84 buf[0] = 0; 85 f = open(name, OREAD); 86 if(f < 0) 87 return -1; 88 n = read(f, buf, len-1); 89 if(n >= 0) 90 buf[n] = 0; 91 close(f); 92 return 0; 93 } 94 95 int 96 writefile(char *name, char *buf, int len) 97 { 98 int f, n; 99 100 f = open(name, OWRITE); 101 if(f < 0) 102 return -1; 103 n = write(f, buf, len); 104 close(f); 105 return (n != len) ? -1 : 0; 106 } 107 108 void 109 setenv(char *name, char *val) 110 { 111 int f; 112 char ename[64]; 113 114 snprint(ename, sizeof ename, "#e/%s", name); 115 f = create(ename, 1, 0666); 116 if(f < 0){ 117 fprint(2, "create %s: %r\n", ename); 118 return; 119 } 120 write(f, val, strlen(val)); 121 close(f); 122 } 123 124 void 125 srvcreate(char *name, int fd) 126 { 127 char *srvname; 128 int f; 129 char buf[64]; 130 131 srvname = strrchr(name, '/'); 132 if(srvname) 133 srvname++; 134 else 135 srvname = name; 136 137 snprint(buf, sizeof buf, "#s/%s", srvname); 138 f = create(buf, 1, 0666); 139 if(f < 0) 140 fatal(buf); 141 sprint(buf, "%d", fd); 142 if(write(f, buf, strlen(buf)) != strlen(buf)) 143 fatal("write"); 144 close(f); 145 } 146 147 void 148 catchint(void *a, char *note) 149 { 150 USED(a); 151 if(strcmp(note, "alarm") == 0) 152 noted(NCONT); 153 noted(NDFLT); 154 } 155 156 int 157 outin(char *prompt, char *def, int len) 158 { 159 int n; 160 char buf[256]; 161 162 if(len >= sizeof buf) 163 len = sizeof(buf)-1; 164 165 if(cpuflag){ 166 notify(catchint); 167 alarm(15*1000); 168 } 169 print("%s[%s]: ", prompt, *def ? def : "no default"); 170 memset(buf, 0, sizeof buf); 171 n = read(0, buf, len); 172 if(cpuflag){ 173 alarm(0); 174 notify(0); 175 } 176 177 if(n < 0) 178 return 1; 179 if(n > 1){ 180 buf[n-1] = 0; 181 strcpy(def, buf); 182 } 183 return n; 184 } 185