1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include "sky.h"
5219b2ee8SDavid du Colombier
6*8c41de82SDavid du Colombier #define JUKEFS "tcp!jukefs" /* dial string for jukebox; was il!jukefs */
7*8c41de82SDavid du Colombier
8219b2ee8SDavid du Colombier struct
9219b2ee8SDavid du Colombier {
10219b2ee8SDavid du Colombier char name[9];
11219b2ee8SDavid du Colombier char offset;
12219b2ee8SDavid du Colombier } Hproto[] =
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier "ppo1", Pppo1,
15219b2ee8SDavid du Colombier "ppo2", Pppo2,
16219b2ee8SDavid du Colombier "ppo3", Pppo3,
17219b2ee8SDavid du Colombier "ppo4", Pppo4,
18219b2ee8SDavid du Colombier "ppo5", Pppo5,
19219b2ee8SDavid du Colombier "ppo6", Pppo6,
20219b2ee8SDavid du Colombier
21219b2ee8SDavid du Colombier "amdx1", Pamdx1,
22219b2ee8SDavid du Colombier "amdx2", Pamdx2,
23219b2ee8SDavid du Colombier "amdx3", Pamdx3,
24219b2ee8SDavid du Colombier "amdx4", Pamdx4,
25219b2ee8SDavid du Colombier "amdx5", Pamdx5,
26219b2ee8SDavid du Colombier "amdx6", Pamdx6,
27219b2ee8SDavid du Colombier "amdx7", Pamdx7,
28219b2ee8SDavid du Colombier "amdx8", Pamdx8,
29219b2ee8SDavid du Colombier "amdx9", Pamdx9,
30219b2ee8SDavid du Colombier "amdx10", Pamdx10,
31219b2ee8SDavid du Colombier "amdx11", Pamdx11,
32219b2ee8SDavid du Colombier "amdx12", Pamdx12,
33219b2ee8SDavid du Colombier "amdx13", Pamdx13,
34219b2ee8SDavid du Colombier "amdx14", Pamdx14,
35219b2ee8SDavid du Colombier "amdx15", Pamdx15,
36219b2ee8SDavid du Colombier "amdx16", Pamdx16,
37219b2ee8SDavid du Colombier "amdx17", Pamdx17,
38219b2ee8SDavid du Colombier "amdx18", Pamdx18,
39219b2ee8SDavid du Colombier "amdx19", Pamdx19,
40219b2ee8SDavid du Colombier "amdx20", Pamdx20,
41219b2ee8SDavid du Colombier
42219b2ee8SDavid du Colombier "amdy1", Pamdy1,
43219b2ee8SDavid du Colombier "amdy2", Pamdy2,
44219b2ee8SDavid du Colombier "amdy3", Pamdy3,
45219b2ee8SDavid du Colombier "amdy4", Pamdy4,
46219b2ee8SDavid du Colombier "amdy5", Pamdy5,
47219b2ee8SDavid du Colombier "amdy6", Pamdy6,
48219b2ee8SDavid du Colombier "amdy7", Pamdy7,
49219b2ee8SDavid du Colombier "amdy8", Pamdy8,
50219b2ee8SDavid du Colombier "amdy9", Pamdy9,
51219b2ee8SDavid du Colombier "amdy10", Pamdy10,
52219b2ee8SDavid du Colombier "amdy11", Pamdy11,
53219b2ee8SDavid du Colombier "amdy12", Pamdy12,
54219b2ee8SDavid du Colombier "amdy13", Pamdy13,
55219b2ee8SDavid du Colombier "amdy14", Pamdy14,
56219b2ee8SDavid du Colombier "amdy15", Pamdy15,
57219b2ee8SDavid du Colombier "amdy16", Pamdy16,
58219b2ee8SDavid du Colombier "amdy17", Pamdy17,
59219b2ee8SDavid du Colombier "amdy18", Pamdy18,
60219b2ee8SDavid du Colombier "amdy19", Pamdy19,
61219b2ee8SDavid du Colombier "amdy20", Pamdy20,
62219b2ee8SDavid du Colombier
63219b2ee8SDavid du Colombier "pltscale", Ppltscale,
64219b2ee8SDavid du Colombier "xpixelsz", Pxpixelsz,
65219b2ee8SDavid du Colombier "ypixelsz", Pypixelsz,
66219b2ee8SDavid du Colombier
67219b2ee8SDavid du Colombier "pltrah", Ppltrah,
68219b2ee8SDavid du Colombier "pltram", Ppltram,
69219b2ee8SDavid du Colombier "pltras", Ppltras,
70219b2ee8SDavid du Colombier "pltdecd", Ppltdecd,
71219b2ee8SDavid du Colombier "pltdecm", Ppltdecm,
72219b2ee8SDavid du Colombier "pltdecs", Ppltdecs,
73219b2ee8SDavid du Colombier
74219b2ee8SDavid du Colombier };
75219b2ee8SDavid du Colombier
76219b2ee8SDavid du Colombier Header*
getheader(char * rgn)77219b2ee8SDavid du Colombier getheader(char *rgn)
78219b2ee8SDavid du Colombier {
79219b2ee8SDavid du Colombier char rec[81], name[81], value[81];
80219b2ee8SDavid du Colombier char *p;
81219b2ee8SDavid du Colombier Biobuf *bin;
82219b2ee8SDavid du Colombier Header hd, *h;
83219b2ee8SDavid du Colombier int i, j, decsn, dss;
84219b2ee8SDavid du Colombier
85219b2ee8SDavid du Colombier dss = 0;
86219b2ee8SDavid du Colombier sprint(rec, "/lib/sky/dssheaders/%s.hhh", rgn);
87219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
88219b2ee8SDavid du Colombier if(bin == 0) {
89219b2ee8SDavid du Colombier dss = 102;
907dd7cddfSDavid du Colombier sprint(rec, "/n/juke/dss/dss.102/headers/%s.hhh", rgn);
91219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
92219b2ee8SDavid du Colombier }
93219b2ee8SDavid du Colombier if(bin == 0) {
94219b2ee8SDavid du Colombier dss = 61;
957dd7cddfSDavid du Colombier sprint(rec, "/n/juke/dss/dss.061/headers/%s.hhh", rgn);
96219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
97219b2ee8SDavid du Colombier }
98219b2ee8SDavid du Colombier if(bin == 0) {
99219b2ee8SDavid du Colombier fprint(2, "cannot open %s\n", rgn);
100219b2ee8SDavid du Colombier exits("file");
101219b2ee8SDavid du Colombier }
102219b2ee8SDavid du Colombier if(debug)
10359cc4ca5SDavid du Colombier Bprint(&bout, "reading %s\n", rec);
104219b2ee8SDavid du Colombier if(dss)
10559cc4ca5SDavid du Colombier Bprint(&bout, "warning: reading %s from jukebox\n", rec);
106219b2ee8SDavid du Colombier
107219b2ee8SDavid du Colombier memset(&hd, 0, sizeof(hd));
108219b2ee8SDavid du Colombier j = 0;
109219b2ee8SDavid du Colombier decsn = 0;
110219b2ee8SDavid du Colombier for(;;) {
111219b2ee8SDavid du Colombier if(dss) {
112219b2ee8SDavid du Colombier if(Bread(bin, rec, 80) != 80)
113219b2ee8SDavid du Colombier break;
114219b2ee8SDavid du Colombier rec[80] = 0;
115219b2ee8SDavid du Colombier } else {
116219b2ee8SDavid du Colombier p = Brdline(bin, '\n');
117219b2ee8SDavid du Colombier if(p == 0)
118219b2ee8SDavid du Colombier break;
119219b2ee8SDavid du Colombier p[Blinelen(bin)-1] = 0;
120219b2ee8SDavid du Colombier strcpy(rec, p);
121219b2ee8SDavid du Colombier }
122219b2ee8SDavid du Colombier
123219b2ee8SDavid du Colombier p = strchr(rec, '/');
124219b2ee8SDavid du Colombier if(p)
125219b2ee8SDavid du Colombier *p = 0;
126219b2ee8SDavid du Colombier p = strchr(rec, '=');
127219b2ee8SDavid du Colombier if(p == 0)
128219b2ee8SDavid du Colombier continue;
129219b2ee8SDavid du Colombier *p++ = 0;
130219b2ee8SDavid du Colombier if(getword(name, rec) == 0)
131219b2ee8SDavid du Colombier continue;
132219b2ee8SDavid du Colombier if(getword(value, p) == 0)
133219b2ee8SDavid du Colombier continue;
134219b2ee8SDavid du Colombier if(strcmp(name, "pltdecsn") == 0) {
135219b2ee8SDavid du Colombier if(strchr(value, '-'))
136219b2ee8SDavid du Colombier decsn = 1;
137219b2ee8SDavid du Colombier continue;
138219b2ee8SDavid du Colombier }
139219b2ee8SDavid du Colombier for(i=0; i<nelem(Hproto); i++) {
140219b2ee8SDavid du Colombier j++;
141219b2ee8SDavid du Colombier if(j >= nelem(Hproto))
142219b2ee8SDavid du Colombier j = 0;
143219b2ee8SDavid du Colombier if(strcmp(name, Hproto[j].name) == 0) {
144219b2ee8SDavid du Colombier hd.param[Hproto[j].offset] = atof(value);
145219b2ee8SDavid du Colombier break;
146219b2ee8SDavid du Colombier }
147219b2ee8SDavid du Colombier }
148219b2ee8SDavid du Colombier }
149219b2ee8SDavid du Colombier Bterm(bin);
150219b2ee8SDavid du Colombier
151219b2ee8SDavid du Colombier hd.param[Ppltra] = RAD(hd.param[Ppltrah]*15 +
152219b2ee8SDavid du Colombier hd.param[Ppltram]/4 + hd.param[Ppltras]/240);
153219b2ee8SDavid du Colombier hd.param[Ppltdec] = RAD(hd.param[Ppltdecd] +
154219b2ee8SDavid du Colombier hd.param[Ppltdecm]/60 + hd.param[Ppltdecs]/3600);
155219b2ee8SDavid du Colombier if(decsn)
156219b2ee8SDavid du Colombier hd.param[Ppltdec] = -hd.param[Ppltdec];
157219b2ee8SDavid du Colombier hd.amdflag = 0;
158219b2ee8SDavid du Colombier for(i=Pamdx1; i<=Pamdx20; i++)
159219b2ee8SDavid du Colombier if(hd.param[i] != 0) {
160219b2ee8SDavid du Colombier hd.amdflag = 1;
161219b2ee8SDavid du Colombier break;
162219b2ee8SDavid du Colombier }
163219b2ee8SDavid du Colombier h = malloc(sizeof(*h));
164219b2ee8SDavid du Colombier *h = hd;
165219b2ee8SDavid du Colombier return h;
166219b2ee8SDavid du Colombier }
167219b2ee8SDavid du Colombier
168219b2ee8SDavid du Colombier void
getplates(void)169219b2ee8SDavid du Colombier getplates(void)
170219b2ee8SDavid du Colombier {
171219b2ee8SDavid du Colombier char rec[81], *q;
172219b2ee8SDavid du Colombier Plate *p;
173219b2ee8SDavid du Colombier Biobuf *bin;
174219b2ee8SDavid du Colombier int c, i, dss;
175219b2ee8SDavid du Colombier
176219b2ee8SDavid du Colombier dss = 0;
177219b2ee8SDavid du Colombier sprint(rec, "/lib/sky/dssheaders/lo_comp.lis");
178219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
179219b2ee8SDavid du Colombier if(bin == 0) {
180219b2ee8SDavid du Colombier dss = 102;
1817dd7cddfSDavid du Colombier sprint(rec, "%s/headers/lo_comp.lis", dssmount(dss));
182219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
183219b2ee8SDavid du Colombier }
184219b2ee8SDavid du Colombier if(bin == 0) {
185219b2ee8SDavid du Colombier dss = 61;
1867dd7cddfSDavid du Colombier sprint(rec, "%s/headers/lo_comp.lis", dssmount(dss));
187219b2ee8SDavid du Colombier bin = Bopen(rec, OREAD);
188219b2ee8SDavid du Colombier }
189219b2ee8SDavid du Colombier if(bin == 0) {
190219b2ee8SDavid du Colombier fprint(2, "can't open lo_comp.lis; try 9fs juke\n");
191219b2ee8SDavid du Colombier exits("open");
192219b2ee8SDavid du Colombier }
193219b2ee8SDavid du Colombier if(debug)
19459cc4ca5SDavid du Colombier Bprint(&bout, "reading %s\n", rec);
195219b2ee8SDavid du Colombier if(dss)
19659cc4ca5SDavid du Colombier Bprint(&bout, "warning: reading %s from jukebox\n", rec);
197219b2ee8SDavid du Colombier for(nplate=0;;) {
198219b2ee8SDavid du Colombier if(dss) {
199219b2ee8SDavid du Colombier if(Bread(bin, rec, 80) != 80)
200219b2ee8SDavid du Colombier break;
201219b2ee8SDavid du Colombier rec[80] = 0;
202219b2ee8SDavid du Colombier } else {
203219b2ee8SDavid du Colombier q = Brdline(bin, '\n');
204219b2ee8SDavid du Colombier if(q == 0)
205219b2ee8SDavid du Colombier break;
206219b2ee8SDavid du Colombier q[Blinelen(bin)-1] = 0;
207219b2ee8SDavid du Colombier strcpy(rec, q);
208219b2ee8SDavid du Colombier }
209219b2ee8SDavid du Colombier if(rec[0] == '#')
210219b2ee8SDavid du Colombier continue;
211219b2ee8SDavid du Colombier if(nplate < nelem(plate)) {
212219b2ee8SDavid du Colombier p = &plate[nplate];
213219b2ee8SDavid du Colombier memmove(p->rgn, rec+0, 5);
214219b2ee8SDavid du Colombier if(p->rgn[4] == ' ')
215219b2ee8SDavid du Colombier p->rgn[4] = 0;
216219b2ee8SDavid du Colombier for(i=0; c=p->rgn[i]; i++)
217219b2ee8SDavid du Colombier if(c >= 'A' && c <= 'Z')
218219b2ee8SDavid du Colombier p->rgn[i] += 'a'-'A';
219219b2ee8SDavid du Colombier p->ra = RAD(atof(rec+12)*15 +
220219b2ee8SDavid du Colombier atof(rec+15)/4 +
221219b2ee8SDavid du Colombier atof(rec+18)/240);
222219b2ee8SDavid du Colombier p->dec = RAD(atof(rec+26) +
223219b2ee8SDavid du Colombier atof(rec+29)/60 +
224219b2ee8SDavid du Colombier atof(rec+32)/3600);
225219b2ee8SDavid du Colombier if(rec[25] == '-')
226219b2ee8SDavid du Colombier p->dec = -p->dec;
227219b2ee8SDavid du Colombier p->disk = atoi(rec+53);
228219b2ee8SDavid du Colombier if(p->disk == 0)
229219b2ee8SDavid du Colombier continue;
230219b2ee8SDavid du Colombier }
231219b2ee8SDavid du Colombier nplate++;
232219b2ee8SDavid du Colombier }
233219b2ee8SDavid du Colombier Bterm(bin);
234219b2ee8SDavid du Colombier
235219b2ee8SDavid du Colombier if(nplate >= nelem(plate))
236219b2ee8SDavid du Colombier fprint(2, "nplate too small %d %d\n", nelem(plate), nplate);
237219b2ee8SDavid du Colombier if(debug)
23859cc4ca5SDavid du Colombier Bprint(&bout, "%d plates\n", nplate);
239219b2ee8SDavid du Colombier }
2407dd7cddfSDavid du Colombier
2417dd7cddfSDavid du Colombier char*
dssmount(int dskno)2427dd7cddfSDavid du Colombier dssmount(int dskno)
2437dd7cddfSDavid du Colombier {
2447dd7cddfSDavid du Colombier char dssname[100];
2457dd7cddfSDavid du Colombier int s1, s2, count;
2467dd7cddfSDavid du Colombier static int sdiskno = -1;
2477dd7cddfSDavid du Colombier
2487dd7cddfSDavid du Colombier if(sdiskno == dskno)
2497dd7cddfSDavid du Colombier goto out;
2507dd7cddfSDavid du Colombier count = 0;
2517dd7cddfSDavid du Colombier
2527dd7cddfSDavid du Colombier loop:
2537dd7cddfSDavid du Colombier unmount(nil, "/n/njuke");
2547dd7cddfSDavid du Colombier unmount(nil, "/n/dss");
2557dd7cddfSDavid du Colombier sprint(dssname, "/n/njuke/juke/dss/dss.%.3d", dskno);
2567dd7cddfSDavid du Colombier
2577dd7cddfSDavid du Colombier /*
2587dd7cddfSDavid du Colombier * start nfs jukebox server
2597dd7cddfSDavid du Colombier */
260*8c41de82SDavid du Colombier s1 = open("/srv/" JUKEFS, ORDWR);
2617dd7cddfSDavid du Colombier if(s1 < 0) {
2627dd7cddfSDavid du Colombier if(fork() == 0) {
263*8c41de82SDavid du Colombier execl("/bin/srv", "srv", "-q", JUKEFS, nil);
2647dd7cddfSDavid du Colombier exits(0);
2657dd7cddfSDavid du Colombier }
2669a747e4fSDavid du Colombier waitpid();
267*8c41de82SDavid du Colombier s1 = open("/srv/" JUKEFS, ORDWR);
2687dd7cddfSDavid du Colombier if(s1 < 0) {
269*8c41de82SDavid du Colombier Bprint(&bout, "can't open /srv/%s: %r\n", JUKEFS);
2707dd7cddfSDavid du Colombier goto out;
2717dd7cddfSDavid du Colombier }
2727dd7cddfSDavid du Colombier }
2737dd7cddfSDavid du Colombier
2747dd7cddfSDavid du Colombier /*
2757dd7cddfSDavid du Colombier * mount nfs jukebox server
2767dd7cddfSDavid du Colombier */
2779a747e4fSDavid du Colombier if(mount(s1, -1, "/n/njuke", 0, "") < 0) {
2787dd7cddfSDavid du Colombier close(s1);
279*8c41de82SDavid du Colombier Bprint(&bout, "\"mount /srv/%s /n/juke\" failed: %r\n", JUKEFS);
2807dd7cddfSDavid du Colombier goto out;
2817dd7cddfSDavid du Colombier }
2827dd7cddfSDavid du Colombier
2837dd7cddfSDavid du Colombier /*
2847dd7cddfSDavid du Colombier * run 9660 server
2857dd7cddfSDavid du Colombier */
2867dd7cddfSDavid du Colombier s2 = open("/srv/9660", ORDWR);
2877dd7cddfSDavid du Colombier if(s2 < 0) {
2887dd7cddfSDavid du Colombier if(fork() == 0) {
289f19e7b74SDavid du Colombier execl("/bin/9660srv", "9660srv", nil);
2907dd7cddfSDavid du Colombier exits(0);
2917dd7cddfSDavid du Colombier }
2929a747e4fSDavid du Colombier waitpid();
2937dd7cddfSDavid du Colombier s2 = open("/srv/9660", ORDWR);
2947dd7cddfSDavid du Colombier if(s2 < 0) {
29559cc4ca5SDavid du Colombier Bprint(&bout, "can't open /srv/9660: %r\n");
2967dd7cddfSDavid du Colombier goto out;
2977dd7cddfSDavid du Colombier }
2987dd7cddfSDavid du Colombier }
2997dd7cddfSDavid du Colombier
3007dd7cddfSDavid du Colombier /*
3017dd7cddfSDavid du Colombier * mount 9660 server
3027dd7cddfSDavid du Colombier */
3039a747e4fSDavid du Colombier if(mount(s2, -1, "/n/dss", 0, dssname) < 0) {
3047dd7cddfSDavid du Colombier close(s2);
3057dd7cddfSDavid du Colombier if(count == 0) {
3067dd7cddfSDavid du Colombier // do it again so /n/njuke is in 9660's namespace
3077dd7cddfSDavid du Colombier remove("/srv/9660");
308*8c41de82SDavid du Colombier remove("/srv/" JUKEFS);
3097dd7cddfSDavid du Colombier count = 1;
3107dd7cddfSDavid du Colombier goto loop;
3117dd7cddfSDavid du Colombier }
31259cc4ca5SDavid du Colombier Bprint(&bout, "\"mount /srv/9660 /n/dss %s\" failed %r\n", dssname);
3137dd7cddfSDavid du Colombier goto out;
3147dd7cddfSDavid du Colombier }
3157dd7cddfSDavid du Colombier
3167dd7cddfSDavid du Colombier // print("mount %s\n", dssname);
3177dd7cddfSDavid du Colombier sdiskno = dskno;
3187dd7cddfSDavid du Colombier
3197dd7cddfSDavid du Colombier out:
3207dd7cddfSDavid du Colombier return "/n/dss";
3217dd7cddfSDavid du Colombier }
322