1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "sky.h"
5
6 #define JUKEFS "tcp!jukefs" /* dial string for jukebox; was il!jukefs */
7
8 struct
9 {
10 char name[9];
11 char offset;
12 } Hproto[] =
13 {
14 "ppo1", Pppo1,
15 "ppo2", Pppo2,
16 "ppo3", Pppo3,
17 "ppo4", Pppo4,
18 "ppo5", Pppo5,
19 "ppo6", Pppo6,
20
21 "amdx1", Pamdx1,
22 "amdx2", Pamdx2,
23 "amdx3", Pamdx3,
24 "amdx4", Pamdx4,
25 "amdx5", Pamdx5,
26 "amdx6", Pamdx6,
27 "amdx7", Pamdx7,
28 "amdx8", Pamdx8,
29 "amdx9", Pamdx9,
30 "amdx10", Pamdx10,
31 "amdx11", Pamdx11,
32 "amdx12", Pamdx12,
33 "amdx13", Pamdx13,
34 "amdx14", Pamdx14,
35 "amdx15", Pamdx15,
36 "amdx16", Pamdx16,
37 "amdx17", Pamdx17,
38 "amdx18", Pamdx18,
39 "amdx19", Pamdx19,
40 "amdx20", Pamdx20,
41
42 "amdy1", Pamdy1,
43 "amdy2", Pamdy2,
44 "amdy3", Pamdy3,
45 "amdy4", Pamdy4,
46 "amdy5", Pamdy5,
47 "amdy6", Pamdy6,
48 "amdy7", Pamdy7,
49 "amdy8", Pamdy8,
50 "amdy9", Pamdy9,
51 "amdy10", Pamdy10,
52 "amdy11", Pamdy11,
53 "amdy12", Pamdy12,
54 "amdy13", Pamdy13,
55 "amdy14", Pamdy14,
56 "amdy15", Pamdy15,
57 "amdy16", Pamdy16,
58 "amdy17", Pamdy17,
59 "amdy18", Pamdy18,
60 "amdy19", Pamdy19,
61 "amdy20", Pamdy20,
62
63 "pltscale", Ppltscale,
64 "xpixelsz", Pxpixelsz,
65 "ypixelsz", Pypixelsz,
66
67 "pltrah", Ppltrah,
68 "pltram", Ppltram,
69 "pltras", Ppltras,
70 "pltdecd", Ppltdecd,
71 "pltdecm", Ppltdecm,
72 "pltdecs", Ppltdecs,
73
74 };
75
76 Header*
getheader(char * rgn)77 getheader(char *rgn)
78 {
79 char rec[81], name[81], value[81];
80 char *p;
81 Biobuf *bin;
82 Header hd, *h;
83 int i, j, decsn, dss;
84
85 dss = 0;
86 sprint(rec, "/lib/sky/dssheaders/%s.hhh", rgn);
87 bin = Bopen(rec, OREAD);
88 if(bin == 0) {
89 dss = 102;
90 sprint(rec, "/n/juke/dss/dss.102/headers/%s.hhh", rgn);
91 bin = Bopen(rec, OREAD);
92 }
93 if(bin == 0) {
94 dss = 61;
95 sprint(rec, "/n/juke/dss/dss.061/headers/%s.hhh", rgn);
96 bin = Bopen(rec, OREAD);
97 }
98 if(bin == 0) {
99 fprint(2, "cannot open %s\n", rgn);
100 exits("file");
101 }
102 if(debug)
103 Bprint(&bout, "reading %s\n", rec);
104 if(dss)
105 Bprint(&bout, "warning: reading %s from jukebox\n", rec);
106
107 memset(&hd, 0, sizeof(hd));
108 j = 0;
109 decsn = 0;
110 for(;;) {
111 if(dss) {
112 if(Bread(bin, rec, 80) != 80)
113 break;
114 rec[80] = 0;
115 } else {
116 p = Brdline(bin, '\n');
117 if(p == 0)
118 break;
119 p[Blinelen(bin)-1] = 0;
120 strcpy(rec, p);
121 }
122
123 p = strchr(rec, '/');
124 if(p)
125 *p = 0;
126 p = strchr(rec, '=');
127 if(p == 0)
128 continue;
129 *p++ = 0;
130 if(getword(name, rec) == 0)
131 continue;
132 if(getword(value, p) == 0)
133 continue;
134 if(strcmp(name, "pltdecsn") == 0) {
135 if(strchr(value, '-'))
136 decsn = 1;
137 continue;
138 }
139 for(i=0; i<nelem(Hproto); i++) {
140 j++;
141 if(j >= nelem(Hproto))
142 j = 0;
143 if(strcmp(name, Hproto[j].name) == 0) {
144 hd.param[Hproto[j].offset] = atof(value);
145 break;
146 }
147 }
148 }
149 Bterm(bin);
150
151 hd.param[Ppltra] = RAD(hd.param[Ppltrah]*15 +
152 hd.param[Ppltram]/4 + hd.param[Ppltras]/240);
153 hd.param[Ppltdec] = RAD(hd.param[Ppltdecd] +
154 hd.param[Ppltdecm]/60 + hd.param[Ppltdecs]/3600);
155 if(decsn)
156 hd.param[Ppltdec] = -hd.param[Ppltdec];
157 hd.amdflag = 0;
158 for(i=Pamdx1; i<=Pamdx20; i++)
159 if(hd.param[i] != 0) {
160 hd.amdflag = 1;
161 break;
162 }
163 h = malloc(sizeof(*h));
164 *h = hd;
165 return h;
166 }
167
168 void
getplates(void)169 getplates(void)
170 {
171 char rec[81], *q;
172 Plate *p;
173 Biobuf *bin;
174 int c, i, dss;
175
176 dss = 0;
177 sprint(rec, "/lib/sky/dssheaders/lo_comp.lis");
178 bin = Bopen(rec, OREAD);
179 if(bin == 0) {
180 dss = 102;
181 sprint(rec, "%s/headers/lo_comp.lis", dssmount(dss));
182 bin = Bopen(rec, OREAD);
183 }
184 if(bin == 0) {
185 dss = 61;
186 sprint(rec, "%s/headers/lo_comp.lis", dssmount(dss));
187 bin = Bopen(rec, OREAD);
188 }
189 if(bin == 0) {
190 fprint(2, "can't open lo_comp.lis; try 9fs juke\n");
191 exits("open");
192 }
193 if(debug)
194 Bprint(&bout, "reading %s\n", rec);
195 if(dss)
196 Bprint(&bout, "warning: reading %s from jukebox\n", rec);
197 for(nplate=0;;) {
198 if(dss) {
199 if(Bread(bin, rec, 80) != 80)
200 break;
201 rec[80] = 0;
202 } else {
203 q = Brdline(bin, '\n');
204 if(q == 0)
205 break;
206 q[Blinelen(bin)-1] = 0;
207 strcpy(rec, q);
208 }
209 if(rec[0] == '#')
210 continue;
211 if(nplate < nelem(plate)) {
212 p = &plate[nplate];
213 memmove(p->rgn, rec+0, 5);
214 if(p->rgn[4] == ' ')
215 p->rgn[4] = 0;
216 for(i=0; c=p->rgn[i]; i++)
217 if(c >= 'A' && c <= 'Z')
218 p->rgn[i] += 'a'-'A';
219 p->ra = RAD(atof(rec+12)*15 +
220 atof(rec+15)/4 +
221 atof(rec+18)/240);
222 p->dec = RAD(atof(rec+26) +
223 atof(rec+29)/60 +
224 atof(rec+32)/3600);
225 if(rec[25] == '-')
226 p->dec = -p->dec;
227 p->disk = atoi(rec+53);
228 if(p->disk == 0)
229 continue;
230 }
231 nplate++;
232 }
233 Bterm(bin);
234
235 if(nplate >= nelem(plate))
236 fprint(2, "nplate too small %d %d\n", nelem(plate), nplate);
237 if(debug)
238 Bprint(&bout, "%d plates\n", nplate);
239 }
240
241 char*
dssmount(int dskno)242 dssmount(int dskno)
243 {
244 char dssname[100];
245 int s1, s2, count;
246 static int sdiskno = -1;
247
248 if(sdiskno == dskno)
249 goto out;
250 count = 0;
251
252 loop:
253 unmount(nil, "/n/njuke");
254 unmount(nil, "/n/dss");
255 sprint(dssname, "/n/njuke/juke/dss/dss.%.3d", dskno);
256
257 /*
258 * start nfs jukebox server
259 */
260 s1 = open("/srv/" JUKEFS, ORDWR);
261 if(s1 < 0) {
262 if(fork() == 0) {
263 execl("/bin/srv", "srv", "-q", JUKEFS, nil);
264 exits(0);
265 }
266 waitpid();
267 s1 = open("/srv/" JUKEFS, ORDWR);
268 if(s1 < 0) {
269 Bprint(&bout, "can't open /srv/%s: %r\n", JUKEFS);
270 goto out;
271 }
272 }
273
274 /*
275 * mount nfs jukebox server
276 */
277 if(mount(s1, -1, "/n/njuke", 0, "") < 0) {
278 close(s1);
279 Bprint(&bout, "\"mount /srv/%s /n/juke\" failed: %r\n", JUKEFS);
280 goto out;
281 }
282
283 /*
284 * run 9660 server
285 */
286 s2 = open("/srv/9660", ORDWR);
287 if(s2 < 0) {
288 if(fork() == 0) {
289 execl("/bin/9660srv", "9660srv", nil);
290 exits(0);
291 }
292 waitpid();
293 s2 = open("/srv/9660", ORDWR);
294 if(s2 < 0) {
295 Bprint(&bout, "can't open /srv/9660: %r\n");
296 goto out;
297 }
298 }
299
300 /*
301 * mount 9660 server
302 */
303 if(mount(s2, -1, "/n/dss", 0, dssname) < 0) {
304 close(s2);
305 if(count == 0) {
306 // do it again so /n/njuke is in 9660's namespace
307 remove("/srv/9660");
308 remove("/srv/" JUKEFS);
309 count = 1;
310 goto loop;
311 }
312 Bprint(&bout, "\"mount /srv/9660 /n/dss %s\" failed %r\n", dssname);
313 goto out;
314 }
315
316 // print("mount %s\n", dssname);
317 sdiskno = dskno;
318
319 out:
320 return "/n/dss";
321 }
322