|
|
1.1 root 1: /* idist.c - remote distribution - initiator */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/idist/RCS/ops.c,v 7.1 90/07/01 21:04:17 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/idist/RCS/ops.c,v 7.1 90/07/01 21:04:17 mrose Exp $
9: *
10: * This file is entirely new, and handles the dispatching of the
11: * remote operations to the server. It tries hard to remove all hint
12: * of the ISODE parts and to hide the posy generated structures.
13: *
14: * Julian Onions <[email protected]>
15: * Nottingham University Computer Science.
16: *
17: *
18: * $Log: ops.c,v $
19: * Revision 7.1 90/07/01 21:04:17 mrose
20: * pepsy
21: *
22: * Revision 7.0 89/11/23 21:58:40 mrose
23: * Release 6.0
24: *
25: */
26:
27:
28: #include <stdio.h>
29: #include "Idist-ops.h" /* operation definitions */
30: #include "Idist-types.h" /* type definitions */
31: #include "defs.h"
32:
33: extern struct type_Idist_FileSpec *makefs ();
34: static void print_ia5list ();
35:
36: int basic_error ();
37: int null_result (), ia5_result (), query_result ();
38:
39: int result_value;
40:
41: int initdir (flag, dest)
42: int flag;
43: char *dest;
44: {
45: struct qbuf *qb;
46: struct type_Idist_InitDir *idp;
47:
48: qb = str2qb (dest, strlen(dest), 1);
49: idp = (struct type_Idist_InitDir *) malloc (sizeof *idp);
50: if (idp == (struct type_Idist_InitDir *)0)
51: adios ("memory", "out of");
52: if (flag) {
53: idp -> offset = type_Idist_InitDir_destdir;
54: idp -> un.destdir = qb;
55: }
56: else {
57: idp -> offset = type_Idist_InitDir_nodestdir;
58: idp -> un.nodestdir = qb;
59: }
60: return invoke (operation_Idist_init, (caddr_t)idp,
61: &_ZIdist_mod, _ZInitDirIdist,
62: null_result,
63: basic_error);
64: }
65:
66: int transfer (type, opts, mode, size, mtime, uname, group, name, lname)
67: unsigned short type, mode;
68: time_t mtime;
69: off_t size;
70: int opts;
71: char *uname, *group, *name, *lname;
72: {
73: struct type_Idist_FileSpec *fs;
74:
75: fs = makefs (type, opts, mode, size, mtime,
76: uname, group, name, lname);
77:
78: return invoke (operation_Idist_transfer, (caddr_t)fs,
79: &_ZIdist_mod, _ZFileSpecIdist,
80: ia5_result,
81: basic_error);
82: }
83:
84:
85: terminate (type, status)
86: int type;
87: int status;
88: {
89: struct type_Idist_TermStatus *ts;
90: struct type_Idist_FileType *makeftype ();
91:
92: if ((ts = (struct type_Idist_TermStatus *) malloc ( sizeof *ts)) == NULL)
93: adios ("memory", "out of");
94: ts -> filetype = makeftype ((unsigned short)type);
95: ts -> status = (status == OK) ? 1 : 0;
96: return invoke (operation_Idist_terminate, (caddr_t)ts,
97: &_ZIdist_mod, _ZTermStatusIdist,
98: null_result,
99: basic_error);
100: }
101:
102: tran_data (data, len)
103: char *data;
104: int len;
105: {
106: struct type_Idist_Data *dat;
107:
108: dat = str2qb (data, len, 1);
109:
110: return invoke (operation_Idist_data, (caddr_t)dat,
111: &_ZIdist_mod,_ZDataIdist,
112: null_result,
113: basic_error);
114: }
115:
116: int runspecial (cmd)
117: char *cmd;
118: {
119: struct type_UNIV_IA5String *ia5;
120:
121: ia5 = str2qb (cmd, strlen(cmd), 1);
122:
123: return invoke (operation_Idist_special, (caddr_t)ia5,
124: &_ZUNIV_mod, _ZIA5StringUNIV,
125: ia5_result,
126: basic_error);
127: }
128:
129: static time_t cmtime;
130: static off_t csize;
131: static unsigned short cmode;
132:
133: int rquery (file, mtime, size, mode)
134: char *file;
135: time_t *mtime;
136: off_t *size;
137: unsigned short *mode;
138: {
139: struct type_UNIV_IA5String *ia5;
140: int retval;
141:
142: ia5 = str2qb (file, strlen(file), 1);
143:
144: retval = invoke (operation_Idist_query, (caddr_t)ia5,
145: &_ZUNIV_mod, _ZIA5StringUNIV,
146: query_result,
147: basic_error);
148: if (retval == NOTOK)
149: return NOTOK;
150: if (result_value != OK)
151: return result_value;
152: else {
153: *mtime = cmtime;
154: *mode = cmode;
155: *size = csize;
156: return OK;
157: }
158: }
159:
160: /* ARGSUSED */
161: query_result (sd, id, error, qr, roi)
162: int sd, id, error;
163: struct type_Idist_QueryResult *qr;
164: struct RoSAPindication *roi;
165: {
166: long convtime ();
167:
168: result_value = OK;
169: if (qr -> offset == type_Idist_QueryResult_doesntExist) {
170: result_value = DONE;
171: return OK;
172: }
173: else {
174: cmode = 0;
175: switch (qr -> un.doesExist -> filetype -> parm) {
176: case int_Idist_FileType_directory:
177: cmode = S_IFDIR;
178: case int_Idist_FileType_symlink:
179: if (cmode == 0)
180: cmode = S_IFLNK;
181: case int_Idist_FileType_regular:
182: if (cmode == 0)
183: cmode = S_IFREG;
184: cmtime = convtime (qr -> un.doesExist -> filemtime);
185: csize = qr -> un.doesExist -> filesize;
186: break;
187:
188: default:
189: result_value = NOTOK;
190: return OK;
191: }
192: result_value = OK;
193: return OK;
194: }
195: }
196:
197: static int copts;
198: rmchk (opts)
199: int opts;
200: {
201: int listcdir_result ();
202:
203: copts = opts;
204: return invoke (operation_Idist_listcdir, (caddr_t)NULL,
205: (modtyp *) 0, -1,
206: listcdir_result,
207: basic_error);
208: }
209:
210: /* ARGSUSED */
211: int listcdir_result (sd, id, error, files, roi)
212: int sd, id, error;
213: struct type_Idist_FileList *files;
214: struct RoSAPindication *roi;
215: {
216: struct type_Idist_FileList *fl;
217: char buf[BUFSIZ];
218: char *name;
219: extern char target[];
220: struct stat stb;
221: extern char basename[];
222:
223: for (fl = files; fl; fl = fl -> next) {
224: name = qb2str (fl -> FileSpec -> filename);
225: (void) sprintf (buf, "%s/%s", target, name);
226: if (lstat (buf, &stb) < 0) {
227: if (copts & VERIFY)
228: printf ("need to remove: %s/%s\n",
229: target, name);
230: else
231: (void) deletefile (name,
232: fl -> FileSpec -> filetype -> parm);
233: }
234: free (name);
235: }
236: return OK;
237: }
238:
239: deletefile (str, mode)
240: char *str;
241: int mode;
242: {
243: struct type_UNIV_IA5String *ia5;
244: char buffer[BUFSIZ];
245:
246: switch (mode) {
247: case int_Idist_FileType_regular:
248: case int_Idist_FileType_hardlink:
249: mode = S_IFREG;
250: break;
251: case int_Idist_FileType_directory:
252: mode = S_IFDIR;
253: break;
254: case int_Idist_FileType_symlink:
255: mode = S_IFLNK;
256: break;
257: default:
258: mode = 0;
259: break;
260: }
261:
262: (void) sprintf (buffer, "%s/%s", target, str);
263: if ((copts & QUERYM) && !query ("Delete", mode, buffer))
264: return OK;
265:
266: ia5 = str2qb (str, strlen(str), 1);
267:
268: return invoke (operation_Idist_deletefile, (caddr_t) ia5,
269: &_ZUNIV_mod, _ZIA5StringUNIV,
270: ia5_result,
271: basic_error);
272: }
273:
274:
275: /* ARGSUSED */
276: static int basic_error (sd, id, error, parameter, roi)
277: int sd, id, error;
278: struct type_Idist_IA5List *parameter;
279: struct RoSAPindication *roi;
280: {
281: struct RyError *rye;
282:
283: if (error == RY_REJECT) {
284: advise (NULLCP, "%s", RoErrString ((int) parameter));
285: result_value = NOTOK;
286: return OK;
287: }
288:
289: if (rye = finderrbyerr (table_Idist_Errors, error))
290: advise (NULLCP, "%s", rye -> rye_name);
291: else
292: advise (NULLCP, "Error %d", error);
293:
294: if (parameter)
295: print_ia5list (parameter);
296:
297: result_value = NOTOK;
298: return OK;
299: }
300:
301: /* ARGSUSED */
302:
303: static null_result (sd, id, dummy, result, roi)
304: int sd,
305: id,
306: dummy;
307: caddr_t result;
308: struct RoSAPindication *roi;
309: {
310: result_value = OK;
311: return OK;
312: }
313:
314: /* ARGSUSED */
315: static int ia5_result (sd, id, parameter, result, roi)
316: int sd,
317: id,
318: parameter;
319: caddr_t result;
320: struct RoSAPindication *roi;
321: {
322: result_value = OK;
323: print_ia5list ((struct type_Idist_IA5List *)result);
324: return OK;
325: }
326:
327: static void print_ia5list (ia5)
328: register struct type_Idist_IA5List *ia5;
329: {
330: register struct qbuf *p,
331: *q;
332:
333: for (; ia5; ia5 = ia5 -> next) {
334: p = ia5 -> IA5String;
335: for (q = p -> qb_forw; q != p ; q = q -> qb_forw)
336: printf ("%*.*s", q -> qb_len, q -> qb_len, q -> qb_data);
337: printf ("\n");
338: }
339: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.