|
|
1.1 ! root 1: /* ftam-mgmt.c - interactive initiator FTAM -- file management */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-mgmt.c,v 7.0 89/11/23 21:54:23 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/ftam2/RCS/ftam-mgmt.c,v 7.0 89/11/23 21:54:23 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: ftam-mgmt.c,v $ ! 12: * Revision 7.0 89/11/23 21:54:23 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: #include <stdio.h> ! 29: #include "ftamuser.h" ! 30: ! 31: /* */ ! 32: ! 33: int f_mv (vec) ! 34: char **vec; ! 35: { ! 36: #ifdef BRIDGE ! 37: register char *src; ! 38: #else ! 39: int sglobbed; ! 40: register char *bp, ! 41: **gp, ! 42: **src; ! 43: char *freedst = NULL, ! 44: buffer[BUFSIZ]; ! 45: #endif ! 46: register char *dst; ! 47: ! 48: if (*++vec == NULL) { ! 49: #ifdef BRIDGE ! 50: return NOTOK; ! 51: #else ! 52: if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) ! 53: return OK; ! 54: dst = NULL; ! 55: #endif ! 56: } ! 57: #ifdef BRIDGE ! 58: src = *vec; ! 59: if (*++vec == NULL) ! 60: return NOTOK; ! 61: dst = *vec; ! 62: #else ! 63: else { ! 64: register char **ap; ! 65: ! 66: for (ap = vec; *ap; ap++) ! 67: continue; ! 68: if (--ap != vec) ! 69: dst = *ap, *ap = NULL; ! 70: else ! 71: dst = NULL; ! 72: } ! 73: #endif ! 74: #ifndef BRIDGE ! 75: if (!(src = xglob (vec, 1))) ! 76: return OK; ! 77: sglobbed = xglobbed; ! 78: ! 79: if (dst == NULL) { ! 80: if (getline ("destination: ", buffer) == NOTOK) { ! 81: blkfree (src); ! 82: return OK; ! 83: } ! 84: switch (str2vec (buffer, vec)) { ! 85: case 0: ! 86: switch (realstore) { ! 87: case RFS_UNIX: ! 88: dst = "."; ! 89: break; ! 90: ! 91: default: ! 92: advise (NULLCP, "need a destination"); ! 93: goto out; ! 94: } ! 95: break; ! 96: ! 97: case 1: ! 98: dst = *vec; ! 99: break; ! 100: ! 101: default: ! 102: advise (NULLCP, "too many destinations"); ! 103: goto out; ! 104: } ! 105: } ! 106: if (!(dst = freedst = xglob1val (dst, 1))) ! 107: goto out; ! 108: ! 109: if (src[1] == NULL) { ! 110: if (interrupted) ! 111: goto out; ! 112: ! 113: switch (realstore) { ! 114: case RFS_UNIX: ! 115: if (isdir (dst, NULLCP, 1) == NOTOK) ! 116: break; ! 117: #ifdef apollo ! 118: if (*dst == '/') ! 119: (void) sprintf (bp = buffer, "%s", dst); ! 120: else ! 121: #endif ! 122: (void) sprintf (bp = buffer, "%s/", dst); ! 123: bp += strlen (bp); ! 124: if (dst = rindex (*src, '/')) ! 125: dst++; ! 126: if (dst == NULL || *dst == NULL) ! 127: dst = *src; ! 128: (void) strcpy (bp, dst); ! 129: dst = buffer; ! 130: ! 131: switch (ask ("mv %s %s", *src, dst)) { ! 132: case NOTOK: ! 133: goto out; ! 134: ! 135: case OK: ! 136: default: ! 137: break; ! 138: ! 139: case DONE: ! 140: goto out; ! 141: } ! 142: break; ! 143: ! 144: default: ! 145: break; ! 146: } ! 147: ! 148: (void) mv (*src, dst, 0); ! 149: goto out; ! 150: } ! 151: ! 152: switch (realstore) { ! 153: case RFS_UNKNOWN: ! 154: advise (NULLCP, "%s", rs_unknown); ! 155: goto out; ! 156: ! 157: case RFS_UNIX: ! 158: #ifdef apollo ! 159: if (*dst == '/') ! 160: (void) sprintf (bp = buffer, "%s", dst); ! 161: else ! 162: #endif ! 163: (void) sprintf (bp = buffer, "%s/", dst); ! 164: bp += strlen (bp); ! 165: break; ! 166: ! 167: default: ! 168: advise (NULLCP, "%s", rs_support); ! 169: goto out; ! 170: } ! 171: ! 172: if (isdir (dst, NULLCP, 0) == NOTOK) ! 173: goto out; ! 174: ! 175: for (gp = src; *gp; gp++) { ! 176: switch (realstore) { ! 177: case RFS_UNIX: ! 178: if (dst = rindex (*gp, '/')) ! 179: dst++; ! 180: if (dst == NULL || *dst == NULL) ! 181: dst = *gp; ! 182: break; ! 183: ! 184: default: ! 185: dst = *gp; ! 186: } ! 187: (void) strcpy (bp, dst); ! 188: dst = str2file (buffer); ! 189: ! 190: if (sglobbed) { ! 191: if (query) ! 192: switch (ask ("mv %s %s", *gp, dst)) { ! 193: case NOTOK: ! 194: continue; ! 195: ! 196: case OK: ! 197: default: ! 198: break; ! 199: ! 200: case DONE: ! 201: goto out; ! 202: } ! 203: else ! 204: advise (NULLCP, "mv %s %s", *gp, dst); ! 205: } ! 206: ! 207: (void) mv (*gp, dst, 1); ! 208: ! 209: if (ftamfd == NOTOK) ! 210: break; ! 211: } ! 212: #else ! 213: return mv (src, dst, 0); ! 214: #endif ! 215: ! 216: #ifndef BRIDGE ! 217: out: ; ! 218: blkfree (src); ! 219: if (freedst) ! 220: free (freedst); ! 221: ! 222: return OK; ! 223: #endif ! 224: } ! 225: ! 226: /* */ ! 227: ! 228: static int mv (src, dst, multi) ! 229: char *src, ! 230: *dst; ! 231: int multi; ! 232: { ! 233: struct FTAMgroup ftgs; ! 234: register struct FTAMgroup *ftg = &ftgs; ! 235: struct FTAMindication ftis; ! 236: register struct FTAMindication *fti = &ftis; ! 237: ! 238: bzero ((char *) ftg, sizeof *ftg); ! 239: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 240: ftg -> ftg_threshold = 0; ! 241: ! 242: ftg -> ftg_flags |= FTG_SELECT; ! 243: { ! 244: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 245: register struct FTAMattributes *fa = &ftse -> ftse_attrs; ! 246: ! 247: fa -> fa_present = FA_FILENAME; ! 248: fa -> fa_nfile = 0; ! 249: fa -> fa_files[fa -> fa_nfile++] = src; ! 250: ! 251: ftse -> ftse_access = FA_PERM_CHNGATTR; ! 252: FCINIT (&ftse -> ftse_conctl); ! 253: } ! 254: ftg -> ftg_threshold++; ! 255: ! 256: ftg -> ftg_flags |= FTG_CHATTR; ! 257: { ! 258: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; ! 259: register struct FTAMattributes *fa = &ftca -> ftca_attrs; ! 260: ! 261: fa -> fa_present = FA_FILENAME; ! 262: fa -> fa_nfile = 0; ! 263: fa -> fa_files[fa -> fa_nfile++] = dst; ! 264: } ! 265: ftg -> ftg_threshold++; ! 266: ! 267: ftg -> ftg_flags |= FTG_DESELECT; ! 268: ftg -> ftg_threshold++; ! 269: ! 270: if (FManageRequest (ftamfd, ftg, fti) == NOTOK) { ! 271: ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST"); ! 272: return NOTOK; ! 273: } ! 274: ! 275: ftg = &fti -> fti_group; ! 276: ! 277: if (ftg -> ftg_flags & FTG_SELECT) { ! 278: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 279: ! 280: if (multi && ftse -> ftse_state != FSTATE_SUCCESS) ! 281: printf ("%s\n", src); ! 282: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, ! 283: ftse -> ftse_action); ! 284: if (ftse -> ftse_state != FSTATE_SUCCESS) ! 285: goto you_lose; ! 286: } ! 287: ! 288: if (ftg -> ftg_flags & FTG_CHATTR) { ! 289: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; ! 290: ! 291: ftam_diag (ftca -> ftca_diags, ftca -> ftca_ndiag, 1, ! 292: ftca -> ftca_action); ! 293: } ! 294: ! 295: if (ftg -> ftg_flags & FTG_DESELECT) { ! 296: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; ! 297: ! 298: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1, ! 299: ftde -> ftde_action); ! 300: ftam_chrg (&ftde -> ftde_charges); ! 301: } ! 302: ! 303: FTGFREE (ftg); ! 304: return OK; ! 305: ! 306: you_lose: ; ! 307: FTGFREE (ftg); ! 308: return NOTOK; ! 309: } ! 310: ! 311: /* */ ! 312: ! 313: int f_rm (vec) ! 314: char **vec; ! 315: { ! 316: #ifndef BRIDGE ! 317: int multi; ! 318: char buffer[BUFSIZ]; ! 319: #endif ! 320: ! 321: if (*++vec == NULL) { ! 322: #ifdef BRIDGE ! 323: return NOTOK; ! 324: #else ! 325: if (getline ("file: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) ! 326: return OK; ! 327: #endif ! 328: } ! 329: ! 330: #ifdef BRIDGE ! 331: return rm (*vec, 0); ! 332: #else ! 333: if (vec = xglob (vec, 1)) { ! 334: register char **gp; ! 335: ! 336: multi = vec[1] ? 1 : 0; ! 337: ! 338: for (gp = vec; *gp && !interrupted; gp++) { ! 339: if (xglobbed && query) ! 340: switch (ask ("rm %s", *gp)) { ! 341: case NOTOK: ! 342: continue; ! 343: ! 344: case OK: ! 345: default: ! 346: break; ! 347: ! 348: case DONE: ! 349: goto out; ! 350: } ! 351: ! 352: (void) rm (*gp, multi); ! 353: ! 354: if (ftamfd == NOTOK) ! 355: break; ! 356: } ! 357: ! 358: out: ; ! 359: blkfree (vec); ! 360: } ! 361: ! 362: return OK; ! 363: #endif ! 364: } ! 365: ! 366: /* */ ! 367: ! 368: static int rm (file, multi) ! 369: char *file; ! 370: int multi; ! 371: { ! 372: struct FTAMgroup ftgs; ! 373: register struct FTAMgroup *ftg = &ftgs; ! 374: struct FTAMindication ftis; ! 375: register struct FTAMindication *fti = &ftis; ! 376: ! 377: bzero ((char *) ftg, sizeof *ftg); ! 378: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 379: ftg -> ftg_threshold = 0; ! 380: ! 381: ftg -> ftg_flags |= FTG_SELECT; ! 382: { ! 383: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 384: register struct FTAMattributes *fa = &ftse -> ftse_attrs; ! 385: ! 386: fa -> fa_present = FA_FILENAME; ! 387: fa -> fa_nfile = 0; ! 388: fa -> fa_files[fa -> fa_nfile++] = file; ! 389: ! 390: ftse -> ftse_access = FA_PERM_DELETE; ! 391: FCINIT (&ftse -> ftse_conctl); ! 392: } ! 393: ftg -> ftg_threshold++; ! 394: ! 395: ftg -> ftg_flags |= FTG_DELETE; ! 396: ftg -> ftg_threshold++; ! 397: ! 398: if (FManageRequest (ftamfd, ftg, fti) == NOTOK) { ! 399: ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST"); ! 400: return NOTOK; ! 401: } ! 402: ! 403: ftg = &fti -> fti_group; ! 404: ! 405: if (ftg -> ftg_flags & FTG_SELECT) { ! 406: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 407: ! 408: if (multi && ftse -> ftse_state != FSTATE_SUCCESS) ! 409: printf ("%s\n", file); ! 410: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, ! 411: ftse -> ftse_action); ! 412: if (ftse -> ftse_state != FSTATE_SUCCESS) ! 413: goto you_lose; ! 414: } ! 415: ! 416: if (ftg -> ftg_flags & FTG_DELETE) { ! 417: register struct FTAMdelete *ftxe = &ftg -> ftg_delete; ! 418: ! 419: ftam_diag (ftxe -> ftxe_diags, ftxe -> ftxe_ndiag, 1, ! 420: ftxe -> ftxe_action); ! 421: ftam_chrg (&ftxe -> ftxe_charges); ! 422: } ! 423: ! 424: FTGFREE (ftg); ! 425: return OK; ! 426: ! 427: you_lose: ; ! 428: FTGFREE (ftg); ! 429: return NOTOK; ! 430: } ! 431: ! 432: /* */ ! 433: ! 434: #ifndef BRIDGE ! 435: int f_chgrp (vec) ! 436: char **vec; ! 437: { ! 438: int multi; ! 439: char group[8 + 1]; ! 440: char buffer[BUFSIZ]; ! 441: ! 442: if (!(attrs & FATTR_STORAGE)) { ! 443: advise (NULLCP, "no support for storage attributes"); ! 444: return OK; ! 445: } ! 446: ! 447: if (*++vec == NULL) { ! 448: if (getline ("group: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) ! 449: return OK; ! 450: } ! 451: ! 452: (void) strcpy (group, vec[0]); ! 453: ! 454: if (*++vec == NULL) { ! 455: if (getline ("file: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) ! 456: return OK; ! 457: } ! 458: ! 459: if (vec = xglob (vec, 1)) { ! 460: register char **gp; ! 461: ! 462: multi = vec[1] ? 1 : 0; ! 463: ! 464: for (gp = vec; *gp && !interrupted; gp++) { ! 465: if (xglobbed && query) ! 466: switch (ask ("chgrp %s %s", group, *gp)) { ! 467: case NOTOK: ! 468: continue; ! 469: ! 470: case OK: ! 471: default: ! 472: break; ! 473: ! 474: case DONE: ! 475: goto out; ! 476: } ! 477: ! 478: (void) chgrp (group, *gp, multi); ! 479: ! 480: if (ftamfd == NOTOK) ! 481: break; ! 482: } ! 483: ! 484: out: ; ! 485: blkfree (vec); ! 486: } ! 487: ! 488: return OK; ! 489: } ! 490: ! 491: /* */ ! 492: ! 493: static int chgrp (group, file, multi) ! 494: char *group, ! 495: *file; ! 496: int multi; ! 497: { ! 498: struct FTAMgroup ftgs; ! 499: register struct FTAMgroup *ftg = &ftgs; ! 500: struct FTAMindication ftis; ! 501: register struct FTAMindication *fti = &ftis; ! 502: ! 503: bzero ((char *) ftg, sizeof *ftg); ! 504: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 505: ftg -> ftg_threshold = 0; ! 506: ! 507: ftg -> ftg_flags |= FTG_SELECT; ! 508: { ! 509: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 510: register struct FTAMattributes *fa = &ftse -> ftse_attrs; ! 511: ! 512: fa -> fa_present = FA_FILENAME; ! 513: fa -> fa_nfile = 0; ! 514: fa -> fa_files[fa -> fa_nfile++] = file; ! 515: ! 516: ftse -> ftse_access = FA_PERM_CHNGATTR; ! 517: FCINIT (&ftse -> ftse_conctl); ! 518: } ! 519: ftg -> ftg_threshold++; ! 520: ! 521: ftg -> ftg_flags |= FTG_CHATTR; ! 522: { ! 523: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; ! 524: register struct FTAMattributes *fa = &ftca -> ftca_attrs; ! 525: ! 526: fa -> fa_present = FA_ACCOUNT; ! 527: fa -> fa_account = group; ! 528: } ! 529: ftg -> ftg_threshold++; ! 530: ! 531: ftg -> ftg_flags |= FTG_DESELECT; ! 532: ftg -> ftg_threshold++; ! 533: ! 534: if (FManageRequest (ftamfd, ftg, fti) == NOTOK) { ! 535: ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST"); ! 536: return NOTOK; ! 537: } ! 538: ! 539: ftg = &fti -> fti_group; ! 540: ! 541: if (ftg -> ftg_flags & FTG_SELECT) { ! 542: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 543: ! 544: if (multi && ftse -> ftse_state != FSTATE_SUCCESS) ! 545: printf ("%s\n", file); ! 546: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, ! 547: ftse -> ftse_action); ! 548: if (ftse -> ftse_state != FSTATE_SUCCESS) ! 549: goto you_lose; ! 550: } ! 551: ! 552: if (ftg -> ftg_flags & FTG_CHATTR) { ! 553: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; ! 554: ! 555: ftam_diag (ftca -> ftca_diags, ftca -> ftca_ndiag, 1, ! 556: ftca -> ftca_action); ! 557: } ! 558: ! 559: if (ftg -> ftg_flags & FTG_DESELECT) { ! 560: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; ! 561: ! 562: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1, ! 563: ftde -> ftde_action); ! 564: ftam_chrg (&ftde -> ftde_charges); ! 565: } ! 566: ! 567: FTGFREE (ftg); ! 568: return OK; ! 569: ! 570: you_lose: ; ! 571: FTGFREE (ftg); ! 572: return NOTOK; ! 573: } ! 574: #endif ! 575: ! 576: /* */ ! 577: ! 578: int f_mkdir (vec) ! 579: char **vec; ! 580: { ! 581: #ifndef BRIDGE ! 582: int multi; ! 583: register char *dir; ! 584: char buffer[BUFSIZ]; ! 585: #endif ! 586: ! 587: if (*++vec == NULL) { ! 588: #ifdef BRIDGE ! 589: return NOTOK; ! 590: #else ! 591: if (getline ("directory: ", buffer) == NOTOK ! 592: || str2vec (buffer, vec) < 1) ! 593: return OK; ! 594: ! 595: (void) makedir (str2file (*vec), 0); ! 596: #endif ! 597: } ! 598: #ifdef BRIDGE ! 599: return makedir (str2file (*vec)); ! 600: #else ! 601: else { ! 602: multi = vec[1] ? 1 : 0; ! 603: ! 604: while (dir = *vec++) ! 605: (void) makedir (str2file (dir), multi); ! 606: } ! 607: ! 608: return OK; ! 609: #endif ! 610: } ! 611: ! 612: /* */ ! 613: ! 614: static int makedir (dir, multi) ! 615: char *dir; ! 616: int multi; ! 617: { ! 618: struct FTAMgroup ftgs; ! 619: register struct FTAMgroup *ftg = &ftgs; ! 620: struct FTAMindication ftis; ! 621: register struct FTAMindication *fti = &ftis; ! 622: struct vfsmap *vf = &vfs[VFS_FDF]; ! 623: ! 624: if (vf -> vf_oid == NULLOID) { ! 625: advise (NULLCP, "no support for %ss", vf -> vf_text); ! 626: return NOTOK; ! 627: } ! 628: ! 629: bzero ((char *) ftg, sizeof *ftg); ! 630: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 631: ftg -> ftg_threshold = 0; ! 632: ! 633: ftg -> ftg_flags |= FTG_CREATE; ! 634: { ! 635: register struct FTAMcreate *ftce = &ftg -> ftg_create; ! 636: register struct FTAMattributes *fa = &ftce -> ftce_attrs; ! 637: ! 638: ftce -> ftce_override = FOVER_FAIL; ! 639: ! 640: fa -> fa_present = FA_FILENAME; ! 641: fa -> fa_nfile = 0; ! 642: fa -> fa_files[fa -> fa_nfile++] = dir; ! 643: ! 644: fa -> fa_present |= FA_ACTIONS; ! 645: fa -> fa_permitted = FA_PERM_READ | FA_PERM_READATTR | FA_PERM_CHNGATTR ! 646: | FA_PERM_DELETE | FA_PERM_TRAV; ! 647: ! 648: fa -> fa_present |= FA_CONTENTS; ! 649: fa -> fa_contents = vf -> vf_oid; ! 650: ! 651: ftce -> ftce_access = 0; ! 652: FCINIT (&ftce -> ftce_conctl); ! 653: } ! 654: ftg -> ftg_threshold++; ! 655: ! 656: ftg -> ftg_flags |= FTG_DESELECT; ! 657: ftg -> ftg_threshold++; ! 658: ! 659: if (FManageRequest (ftamfd, ftg, fti) == NOTOK) { ! 660: ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST"); ! 661: return NOTOK; ! 662: } ! 663: ! 664: ftg = &fti -> fti_group; ! 665: ! 666: if (ftg -> ftg_flags & FTG_CREATE) { ! 667: register struct FTAMcreate *ftce = &ftg -> ftg_create; ! 668: ! 669: if (multi && ftce -> ftce_state != FSTATE_SUCCESS) ! 670: printf ("%s\n", dir); ! 671: ftam_diag (ftce -> ftce_diags, ftce -> ftce_ndiag, 1, ! 672: ftce -> ftce_action); ! 673: if (ftce -> ftce_state != FSTATE_SUCCESS) ! 674: goto you_lose; ! 675: } ! 676: ! 677: if (ftg -> ftg_flags & FTG_DESELECT) { ! 678: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; ! 679: ! 680: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1, ! 681: ftde -> ftde_action); ! 682: ftam_chrg (&ftde -> ftde_charges); ! 683: } ! 684: ! 685: FTGFREE (ftg); ! 686: return OK; ! 687: ! 688: you_lose: ; ! 689: FTGFREE (ftg); ! 690: return NOTOK; ! 691: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.