FreeBSD/Linux Kernel Cross Reference
sys/boot/aux.c
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
45 int
46 sendmsg(int fd, char *msg)
47 {
48 int n;
49
50 n = strlen(msg);
51 if(write(fd, msg, n) != n)
52 return -1;
53 return 0;
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 buf[ERRMAX];
70
71 buf[0] = '\0';
72 errstr(buf, sizeof buf);
73 fprint(2, "boot: %s: %s\n", s, buf);
74 exits(0);
75 }
76
77 int
78 readfile(char *name, char *buf, int len)
79 {
80 int f, n;
81
82 buf[0] = 0;
83 f = open(name, OREAD);
84 if(f < 0)
85 return -1;
86 n = read(f, buf, len-1);
87 if(n >= 0)
88 buf[n] = 0;
89 close(f);
90 return 0;
91 }
92
93 int
94 writefile(char *name, char *buf, int len)
95 {
96 int f, n;
97
98 f = open(name, OWRITE);
99 if(f < 0)
100 return -1;
101 n = write(f, buf, len);
102 close(f);
103 return (n != len) ? -1 : 0;
104 }
105
106 void
107 setenv(char *name, char *val)
108 {
109 int f;
110 char ename[64];
111
112 snprint(ename, sizeof ename, "#e/%s", name);
113 f = create(ename, 1, 0666);
114 if(f < 0){
115 fprint(2, "create %s: %r\n", ename);
116 return;
117 }
118 write(f, val, strlen(val));
119 close(f);
120 }
121
122 void
123 srvcreate(char *name, int fd)
124 {
125 char *srvname;
126 int f;
127 char buf[64];
128
129 srvname = strrchr(name, '/');
130 if(srvname)
131 srvname++;
132 else
133 srvname = name;
134
135 snprint(buf, sizeof buf, "#s/%s", srvname);
136 f = create(buf, 1, 0666);
137 if(f < 0)
138 fatal(buf);
139 sprint(buf, "%d", fd);
140 if(write(f, buf, strlen(buf)) != strlen(buf))
141 fatal("write");
142 close(f);
143 }
144
145 void
146 catchint(void *a, char *note)
147 {
148 USED(a);
149 if(strcmp(note, "alarm") == 0)
150 noted(NCONT);
151 noted(NDFLT);
152 }
153
154 int
155 outin(char *prompt, char *def, int len)
156 {
157 int n;
158 char buf[256];
159
160 if(len >= sizeof buf)
161 len = sizeof(buf)-1;
162
163 if(cpuflag){
164 notify(catchint);
165 alarm(15*1000);
166 }
167 print("%s[%s]: ", prompt, *def ? def : "no default");
168 memset(buf, 0, sizeof buf);
169 n = read(0, buf, len);
170 if(cpuflag){
171 alarm(0);
172 notify(0);
173 }
174
175 if(n < 0)
176 return 1;
177 if(n > 1){
178 buf[n-1] = 0;
179 strcpy(def, buf);
180 }
181 return n;
182 }
Cache object: d92f044348e07fb215d532f30794b374
|