|
|
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.