home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume24 / pucc-rmprog < prev    next >
Text File  |  1991-03-19  |  50KB  |  2,003 lines

  1. Subject:  v24i070:  Purdue tool to remove old programs
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 8bcb93fa e3f7cb70 6b4c2af0 c67b1078
  5.  
  6. Submitted-by: Kevin Braunsdorf <ksb@nostromo.cc.purdue.edu>
  7. Posting-number: Volume 24, Issue 70
  8. Archive-name: pucc-rmprog
  9.  
  10. Submitted-by: ksb@cc.purdue.edu (Kevin Braunsdorf)
  11. Archive-name: pucc-1d/part01
  12.  
  13. This tool, `rmprog' notifies users of impending system changes; in this
  14. case the removal of a product from a system directory.  After a grace
  15. period it uses install(1L) to de-install the product in question and
  16. reminds the admin that `this was done in your name'. :-)
  17.  
  18. The sister program `mvprog' is like rmprog, but it moves the program to
  19. a new name (or directory) rather than removing it completely.  This is
  20. used at PUCC to upgrade unsuported programs to supported and such.
  21.  
  22. #!/bin/sh
  23. # This is pucc-1d, a shell archive (produced by shar 3.49)
  24. # To extract the files from this archive, save it to a file, remove
  25. # everything above the "!/bin/sh" line above, and type "sh file_name".
  26. #
  27. # made 11/29/1990 16:01 UTC by ksb@cc.purdue.edu (Kevin Braunsdorf)
  28. # Source directory /ksb/c.s.u-2
  29. #
  30. # existing files will NOT be overwritten unless -c is specified
  31. #
  32. # This shar contains:
  33. # length  mode       name
  34. # ------ ---------- ------------------------------------------
  35. #   1088 -rw-r--r-- INSTALL.04
  36. #  11138 -r--r--r-- rmprog/rmprog.c
  37. #   3360 -r--r--r-- rmprog/util.c
  38. #   2404 -r--r--r-- rmprog/rmprog.8l
  39. #   2623 -rw-r--r-- rmprog/main.c
  40. #   2621 -r--r--r-- mvprog/mvprog.8l
  41. #   2237 -rw-r--r-- mvprog/main.c
  42. #   1809 -rw-r--r-- mvprog/Makefile.mkcmd
  43. #   1630 -rw-r--r-- rmprog/Makefile
  44. #   1716 -rw-r--r-- rmprog/Makefile.mkcmd
  45. #   1720 -rw-r--r-- mvprog/Makefile
  46. #   1139 -r--r--r-- rmprog/rmprog.m
  47. #   1127 -r--r--r-- mvprog/mvprog.m
  48. #    740 -rw-r--r-- rmprog/machine.h
  49. #    562 -r--r--r-- rmprog/README
  50. #    515 -r--r--r-- rmprog/util.h
  51. #    440 -r--r--r-- mvprog/README
  52. #    262 -r--r--r-- rmprog/rmprog.h
  53. #    167 -rw-r--r-- rmprog/main.h
  54. #    166 -rw-r--r-- mvprog/main.h
  55. #
  56. # ============= INSTALL.04 ==============
  57. if test -f 'INSTALL.04' -a X"$1" != X"-c"; then
  58.     echo 'x - skipping INSTALL.04 (File already exists)'
  59. else
  60. echo 'x - extracting INSTALL.04 (Text)'
  61. sed 's/^X//' << 'Purdue' > 'INSTALL.04' &&
  62. Contains:
  63. X    rmprog(8L)    - remove a product with notification
  64. X    mvprog(8L)    - move a product with notification
  65. X
  66. X
  67. Notes on depends:
  68. X    - libopt.a need not be installed, but it would make life easier
  69. X      if you want other PUCC tools.
  70. X
  71. X    - rmprog needs to be compiled with libopt.a
  72. X
  73. X    - mvprog needs to be compiled with libopt.a
  74. X
  75. X
  76. To install these tools:
  77. X
  78. 0\ read the manual pages, see if you want any of them
  79. X
  80. 1\ decide where to install all this stuff, change the destinations in
  81. X   the Makefiles {BIN,LIB,ETC,HEADER}
  82. X    vi */Makefile
  83. X    
  84. 2\ select a platform in rmprog/machine.h
  85. X    
  86. 3\ build rmprog, then mvprog
  87. X    (cd rmprog && make)
  88. X    (cd mvprog && make)
  89. X
  90. 4\ install the tools and files
  91. X    su
  92. X    (cd rmprog && make install)            #
  93. X    (cd mvprog && make install)            #
  94. X    exit                        # the root shell
  95. X
  96. 5\ install the manual pages, turnin/turnin.5l will need lots of site editing
  97. X   (don't install it if you have not edited it)
  98. X    mkcat -v rmprog/rmprog.8l mvprog/mvprog.8l
  99. X
  100. 6\ clean up the dirs
  101. X    (cd rmprog && make clean)
  102. X    (cd mvprog && make clean)
  103. X
  104. X
  105. kayessbee
  106. --
  107. Kevin Braunsdorf, ksb@cc.purdue.edu, pur-ee!ksb, purdue!ksb
  108. Purdue
  109. chmod 0644 INSTALL.04 ||
  110. echo 'restore of INSTALL.04 failed'
  111. Wc_c="`wc -c < 'INSTALL.04'`"
  112. test 1088 -eq "$Wc_c" ||
  113.     echo 'INSTALL.04: original size 1088, current size' "$Wc_c"
  114. fi
  115. # ============= rmprog/rmprog.c ==============
  116. if test ! -d 'rmprog'; then
  117.     echo 'x - creating directory rmprog'
  118.     mkdir 'rmprog'
  119. fi
  120. if test -f 'rmprog/rmprog.c' -a X"$1" != X"-c"; then
  121.     echo 'x - skipping rmprog/rmprog.c (File already exists)'
  122. else
  123. echo 'x - extracting rmprog/rmprog.c (Text)'
  124. sed 's/^X//' << 'Purdue' > 'rmprog/rmprog.c' &&
  125. /*
  126. X * rmprog -- use this when a command is going to be deleted.  It moves
  127. X *    the program to a subdirectory, replaces it with a program that
  128. X *    prints a message about it going away and then execs the real one,
  129. X *    and queues an at job to dink it eventually. 
  130. X *
  131. X * Matthew Bradburn, Purdue University Computing Center
  132. X */
  133. #if ! defined lint
  134. static char *rcsid =
  135. X    "$Id: rmprog.c,v 2.6 90/11/28 15:32:20 ksb Exp $";
  136. #endif
  137. #include <stdio.h>
  138. #include <signal.h>
  139. #include <errno.h>
  140. #include <sys/types.h>
  141. #include <sys/param.h>
  142. #include <sys/stat.h>
  143. #include <sys/time.h>
  144. #include <sys/dir.h>
  145. X
  146. extern char *getlogin(), *getenv();
  147. extern char *mktemp();
  148. extern char *ctime();
  149. X
  150. #define MVPROG        (!RMPROG)
  151. X
  152. #include "machine.h"
  153. #include "util.h"
  154. #include "rmprog.h"
  155. #include "main.h"
  156. X
  157. static char 
  158. X    *pcMail,        /* who to mail about the removal    */
  159. X    *pcWhen,        /* date it goes away            */
  160. X    acRProg[MAXPATHLEN+1],    /* C file to build and compile        */
  161. X    cmdbuf[2048],        /* for commands to system()        */
  162. X    acAtJob[MAXPATHLEN+MAXNAMLEN+2],
  163. X    acNewCmd[MAXPATHLEN+1024+1],    /* the new command name, starts with "."*/
  164. X    acPath[MAXPATHLEN+1024+1],    /* the absolute pathname to     pcCmd    */
  165. X    acTmpDir[] =        /* to hold temporary C work        */
  166. X        "/tmp/pgXXXXXXX";
  167. #if MVPROG
  168. static int            /* move programs to a dir, else a file    */
  169. X    fToDir;
  170. X
  171. /*
  172. X * check to be sure the pcTo for a long list is a directory        (ksb)
  173. X */
  174. CheckTo(iCnt)
  175. int iCnt;
  176. {
  177. X    struct stat stTo;
  178. X
  179. X    if (0 != stat(pcTo, &stTo)) {
  180. X        fToDir = 0;
  181. X    } else {
  182. X        fToDir = S_IFDIR == (stTo.st_mode&S_IFMT);
  183. X    }
  184. X    if (iCnt > 1 && !fToDir) {
  185. X        fprintf(stderr, "%s: destination must be a directory to move multiple files\n", progname);
  186. X        exit(2);
  187. X    }
  188. }
  189. #endif
  190. X
  191. /*
  192. X * build the C program to notify the user of the removal        (mjb)
  193. X */
  194. void
  195. mkgenc(fp, pcCmd)
  196. FILE *fp;
  197. char *pcCmd;
  198. {
  199. X    fprintf(fp, "#include <stdio.h>\n");
  200. X    fprintf(fp, "\n");
  201. X    fprintf(fp, "int\n");
  202. X    fprintf(fp, "main(argc, argv, envp)\n");
  203. X    fprintf(fp, "int argc;\n");
  204. X    fprintf(fp, "char **argv, **envp;\n");
  205. X    fprintf(fp, "{\n");
  206. X    fprintf(fp, "\tregister char cNl;\n");
  207. X    fprintf(fp, "\tregister FILE *o, *i;\n\n");
  208. X    fprintf(fp, "\tif (isatty(stdout) || NULL == (o = fopen(\"/dev/tty\", \"w\"))) {\n");
  209. X    fprintf(fp, "\t\to = stdout;\n\t}\n");
  210. X    fprintf(fp, "\tif (isatty(stdin) || NULL == (i = fopen(\"/dev/tty\", \"r\"))) {\n");
  211. X    fprintf(fp, "\t\ti = stdin;\n\t}\n");
  212. X    ttoc(pcCmd, fp, "\tfprintf(o, \"This program, ", ", will be ", TTOC_BLOCK|TTOC_PERCENT, 0);
  213. #if RMPROG
  214. X    ttoc(pcWhen, fp, "deleted ", ".\\n\");\n", TTOC_BLOCK|TTOC_PERCENT, 0);
  215. #else
  216. X    ttoc(acNewCmd, fp, "moved to ", "\\n\");\n", TTOC_BLOCK|TTOC_PERCENT, 0);
  217. X    ttoc(pcWhen, fp, "\tfprintf(o, \"on ", ".\\n\");\n", TTOC_BLOCK|TTOC_PERCENT, 0);
  218. #endif
  219. X    if ((char *)0 != pcWhy && '\000' != *pcWhy) {
  220. X        ttoc(pcWhy, fp, "\tfprintf(o, \"", "\\n\");\n", TTOC_BLOCK|TTOC_PERCENT, 0);
  221. X    }
  222. X    fprintf(fp, "\tfprintf(o, \"Send questions and comments concerning this deletion ");
  223. X    ttoc(pcWho, fp, "to ", "\\n\");\n", TTOC_BLOCK|TTOC_PERCENT, 0);
  224. X    fprintf(fp, "\tif (isatty(fileno(o)) && isatty(fileno(i))){\n");
  225. X    fprintf(fp, "\t\tfprintf(o, \"Press RETURN to continue\");\n");
  226. X    fprintf(fp, "\t\tfflush(o);\n");
  227. X    fprintf(fp, "\t\tcNl = getc(i);\n");
  228. X    fprintf(fp, "\t}\n");
  229. X    fprintf(fp, "\tif (stdout != o) {\n\t\t(void)fclose(o);\n\t}\n");
  230. X    fprintf(fp, "\tif (stdin != i) {\n\t\t(void)fclose(i);\n\t}\n");
  231. X    ttoc(acNewCmd, fp, "\t(void) execve(\"", "\", argv, envp);\n", TTOC_BLOCK, 0);
  232. X    ttoc(acNewCmd, fp, "\tperror(\"execve: ", "\");\n", TTOC_BLOCK, 0);
  233. X    fprintf(fp, "\texit(1);\n");
  234. X    fprintf(fp, "}\n");
  235. }
  236. X
  237. /* build an at(1) job to remove the program and notify the invoker    (ksb)
  238. X */
  239. void
  240. mkatjob(fp, pcCmd)
  241. FILE *fp;
  242. char *pcCmd;
  243. {
  244. #if RMPROG
  245. X    fprintf(fp, "%s -s \"%s: %s removed\" %s <<FRED\n", MAILX, progname, pcCmd, pcMail);
  246. X    fprintf(fp, "You started an at job to delete %s, here is the output:\n", pcCmd);
  247. X    fprintf(fp, "`install -Rv %s`\n", pcCmd);
  248. X    fprintf(fp, "`install -Rv %s`\n", acNewCmd);
  249. X    if ((char *)0 != pcMan) {
  250. X        fprintf(fp, "`mkcat -Dv %s`\n", pcMan);
  251. X    }
  252. X    fprintf(fp, "\nThis would be a good time to think about deleting the source etc.\n");
  253. X    fprintf(fp, "FRED\n");
  254. #else
  255. X    fprintf(fp, "%s -s \"%s: %s moved\" %s <<FRED\n", MAILX, progname, pcCmd, pcMail);
  256. X    fprintf(fp, "You started an at job to move %s to %s.\n", pcCmd, acNewCmd);
  257. X    fprintf(fp, "The notification script was removed today, here is the output:\n");
  258. X    fprintf(fp, "`install -Rv %s`\n", pcCmd);
  259. X    fprintf(fp, "\nThis would be a good time to think about change the manual page etc.\n");
  260. X    fprintf(fp, "FRED\n");
  261. #endif
  262. }
  263. X
  264. /*
  265. X * ProgGoin -- pcCmd is going away.
  266. X * ProgMoved -- pcCmd is moving to a new home
  267. X */
  268. #if MVPROG
  269. #define ProgGoin    ProgMoved
  270. #endif
  271. void
  272. ProgGoin(pcCmd)
  273. char *pcCmd;
  274. {
  275. X    register int iMode;        /* perms of replacment command    */
  276. X    auto struct stat statbuf;
  277. X    register FILE *fpAtJob, *fpGen;
  278. X    register char *pc;
  279. X    auto int iRet;
  280. X
  281. X    /*
  282. X     * make sure the command to be removed is a file 
  283. X     */
  284. X    if (-1 == stat(pcCmd, & statbuf)) {
  285. X        fprintf(stderr, "%s: stat: %s: %s\n", progname, pcCmd, strerror(errno));
  286. X        ++iErrs;
  287. X        return;
  288. X    }
  289. X    if (S_IFREG != (statbuf.st_mode&S_IFMT)) {
  290. X        fprintf(stderr, "%s: %s is not a regular file\n", progname, pcCmd);
  291. X        ++iErrs;
  292. X        return;
  293. X    }
  294. X    /* we don't have to be setuid, or anything... the target
  295. X     * program will handle that stuff.
  296. X     */
  297. X    iMode = statbuf.st_mode & 0775;
  298. X
  299. X    /*
  300. X     * we need an absolute pathname for the output message;
  301. X     * get it by appending the relative pathname to the current
  302. X     * working directory.
  303. X     */
  304. X    if ('/' != pcCmd[0]) {
  305. X        if (NULL == getwd(acPath)) {
  306. X            fprintf(stderr, "%s: %s\n", progname, acPath);
  307. X            ++iErrs;
  308. X            return;
  309. X        }
  310. X        (void)strcat(acPath, "/");
  311. X        (void)strcat(acPath, pcCmd);
  312. X        (void)CompPath(acPath);
  313. X        pcCmd = acPath;
  314. X    }
  315. X
  316. X    pc = strrchr(pcCmd, '/');
  317. X    ++pc;
  318. #if RMPROG
  319. X    (void)strcpy(acNewCmd, pcCmd);
  320. X    (void)strcpy(& acNewCmd[pc-pcCmd], ".");
  321. X    (void)strcat(acNewCmd, pc);
  322. #else
  323. X    if (fToDir) {
  324. X        (void)sprintf(acNewCmd, "%s/%s", pcTo, pc);
  325. X    } else {
  326. X        (void)strcpy(acNewCmd, pcTo);
  327. X    }
  328. #endif
  329. X    if (-1 != stat(acNewCmd, & statbuf)) {
  330. X        fprintf(stderr, "%s: %s exists, cannot install replacement\n", progname, acNewCmd);
  331. X        ++iErrs;
  332. X        return;
  333. X    }
  334. X
  335. X    /*
  336. X     * compile the replacement program
  337. X     */
  338. X    if (fVerbose) {
  339. X        printf("%s: cat - >%s <<\\!\n", progname, acRProg);
  340. X        mkgenc(stdout, pcCmd);
  341. X        printf("!\n");
  342. X    }
  343. X    if (fExec) {
  344. X        if ((FILE *)0 == (fpGen = fopen(acRProg, "w"))) {
  345. X            fprintf(stderr, "%s: fopen: %s: %s\n", progname, acRProg, strerror(errno));
  346. X            exit(1);
  347. X        }
  348. X        mkgenc(fpGen, pcCmd);
  349. X        (void)fclose(fpGen);
  350. X    }
  351. X    sprintf(cmdbuf, "${cc-cc} -O -o %s/a.out %s", acTmpDir, acRProg);
  352. X    if (fVerbose) {
  353. X        printf("%s: %s\n", progname, cmdbuf);
  354. X    }
  355. X    if (fExec && 0 != (iRet = system(cmdbuf))) {
  356. X        fprintf(stderr, "%s: cc: exit: %d\n", progname, iRet);
  357. X        exit(iRet);
  358. X    }
  359. X
  360. X    /*
  361. X     * move /bin/foo to /bin/.foo and put our new program in
  362. X     * it's place.
  363. X     */
  364. X    sprintf(cmdbuf, "mv %s %s", pcCmd, acNewCmd);
  365. X    if (fVerbose) {
  366. X        printf("%s: %s\n", progname, cmdbuf);
  367. X    }
  368. X    if (fExec && 0 != (iRet = system(cmdbuf))) {
  369. X        fprintf(stderr, "%s: mv: exit: %d\n", progname, iRet);
  370. X        exit(1);
  371. X    }
  372. X
  373. X    /*
  374. X     * install the new command
  375. X     * To use install(1L) here we have to defeat the checklist
  376. X     * that might be in place for this file (if it says the file
  377. X     * should be setuid or some such we would choke).
  378. X     */
  379. X    sprintf(cmdbuf, "cp %s/a.out %s", acTmpDir, pcCmd);
  380. X    if (fVerbose) {
  381. X        printf("%s: %s\n", progname, cmdbuf);
  382. X    }
  383. X    if (fExec && 0 != (iRet = system(cmdbuf))) {
  384. X        fprintf(stderr, "%s: cp: exit: %d\n", progname, iRet);
  385. X        exit(1);
  386. X    }
  387. X    sprintf(cmdbuf, "chmod %o %s", iMode, pcCmd);
  388. X    if (fVerbose) {
  389. X        printf("%s: %s\n", progname, cmdbuf);
  390. X    }
  391. X    if (fExec && 0 != (iRet = system(cmdbuf))) {
  392. X        fprintf(stderr, "%s: chmod: exit: %d\n", progname, iRet);
  393. X        exit(1);
  394. X    }
  395. X
  396. X    /* find the basename of the command to compute atjob name
  397. X     */
  398. X    if (NULL == (pc = strrchr(pcCmd, '/'))) {
  399. X         pc = pcCmd;
  400. X    } else {
  401. X        ++pc;
  402. X    }
  403. #if RMPROG
  404. X    sprintf(acAtJob, "%s/rm_%s", acTmpDir, pc);
  405. #else
  406. X    sprintf(acAtJob, "%s/mv_%s", acTmpDir, pc);
  407. #endif
  408. X
  409. X    /* create an at job to remove the program in iWhen days
  410. X     */
  411. X    if (fVerbose) {
  412. X        printf("%s: cat - >%s <<\\!\n", progname, acAtJob);
  413. X        mkatjob(stdout, pcCmd);
  414. X        printf("!\n");
  415. X    }
  416. X    if (fExec) {
  417. X        if (NULL == (fpAtJob = fopen(acAtJob, "w"))) {
  418. X            fprintf(stderr, "%s: fopen: %s: %s\n", acAtJob, strerror(errno));
  419. X            ++iErrs;
  420. X            return;
  421. X        }
  422. X        mkatjob(fpAtJob, pcCmd);
  423. X        (void)fclose(fpAtJob);
  424. X    }
  425. X
  426. X    /* now spool the at job to remove the program
  427. X     */
  428. #ifdef SYS_V
  429. X    sprintf(cmdbuf, "at now + %d day <%s 2>/dev/null", iWhen, acAtJob);
  430. #else
  431. #if defined(PUCC)
  432. X    sprintf(cmdbuf, "at -s -o %d.0.0 %s", iWhen, acAtJob);
  433. #else
  434. X                /* Month Day */ /* year == pcWhen+11,*/ 
  435. X    sprintf(cmdbuf, "at 700 %.3s %.2s %s", pcWhen+4, pcWhen+8, acAtJob);
  436. #endif
  437. #endif
  438. X    if (fVerbose) {
  439. X        printf("%s: %s\n", progname, cmdbuf);
  440. X    }
  441. X    if (fExec && 0 != (iRet = system(cmdbuf))) {
  442. X        fprintf(stderr, "%s: at: exit: %d\n", progname, iRet);
  443. X        exit(2);
  444. X    }
  445. }
  446. X
  447. static int iDidInit = 0;
  448. X
  449. /*
  450. X * clean up and exit
  451. X */
  452. Die()
  453. {
  454. X    auto char acDink[MAXPATHLEN+400];
  455. X
  456. X    if (iDidInit) {
  457. X        (void)sprintf(acDink, "rm -rf %s", acTmpDir);
  458. X        if (fVerbose) {
  459. X            printf("%s: %s\n", progname, acDink);
  460. X        }
  461. X        if (fExec && 0 != system(acDink)) {
  462. X            exit(1);
  463. X        }
  464. X    }
  465. X    exit(iErrs);
  466. }
  467. X
  468. /* exit with care, if the user panics us
  469. X */
  470. SIGRET_t
  471. intr_hndlr()
  472. {
  473. X    Die();
  474. }
  475. X
  476. /*
  477. X * some startup code to made life safer while we work            (mjb)
  478. X */
  479. Init()
  480. {
  481. X    auto struct timeval    tv;
  482. X    auto struct timezone    tz;
  483. X    register char *pc;
  484. X
  485. X    (void)signal(SIGINT, intr_hndlr);
  486. X
  487. X    /* find out who's doing this
  488. X     */
  489. X    if ((char *)0 == pcWho || '\000' == *pcWho) {
  490. X        pcWho = getlogin();
  491. X    }
  492. X    pcMail = getlogin();
  493. X    if ((char *)0 == pcMail || '\000' == *pcMail) {
  494. X        pcMail = getenv("USER");
  495. X    }
  496. X    if ((char *)0 == pcMail || '\000' == *pcMail) {
  497. X        pcMail = getenv("LOGNAME");
  498. X    }
  499. X    if ((char *)0 == pcMail || '\000' == *pcMail) {
  500. X        pcMail = DEFMAIL;
  501. X    }
  502. X
  503. X    /*
  504. X     * figure out a string that represents when the program in the 
  505. X     * path will be dinked by the at(1) job we're going to
  506. X     * submit.  We take the number of days the link will be around
  507. X     * and add it to today, and convert back to ascii.
  508. X     */
  509. X    if (-1 == gettimeofday(& tv, & tz)) {
  510. X        fprintf(stderr, "%s: gettimeofday: %s\n", progname, strerror(errno));
  511. X        exit(1);
  512. X    }
  513. X    /* add the number of days hence to count of seconds
  514. X     * copy the year down over the time and dink the trailing newline
  515. X     */
  516. X    tv.tv_sec += iWhen * 24 * 60 * 60;
  517. X    pcWhen = ctime(& tv.tv_sec);
  518. X    (void)strcpy(& pcWhen[11], & pcWhen[20]);
  519. X    if (NULL != (pc = strchr(pcWhen, '\n'))) {
  520. X        *pc = '\000';
  521. X    }
  522. X
  523. X    /*
  524. X     * make a temporary directory and put our substitute program
  525. X     * there (if it's already made, we assume the binary is there, too)
  526. X     * We know we've already made the directory if there are no X's left
  527. X     * in the tmpdir string (mktemp replaces them with digits).
  528. X     */
  529. X    if ((char *)0 == mktemp(acTmpDir)) {
  530. X        fprintf(stderr, "%s: mktemp failed\n", progname);
  531. X        exit(1);
  532. X    }
  533. X    if (fVerbose) {
  534. X        printf("%s: mkdir %s\n", progname, acTmpDir);
  535. X    }
  536. X    if (fExec && 0 != mkdir(acTmpDir, TDIRMODE)) {
  537. X        fprintf(stderr, "%s: mkdir: %s: %s\n", progname, acTmpDir, strerror(errno));
  538. X        exit(1);
  539. X    }
  540. X    iDidInit = 1;
  541. X
  542. X    sprintf(acRProg, "%s/%s", acTmpDir, GENC);
  543. }
  544. Purdue
  545. chmod 0444 rmprog/rmprog.c ||
  546. echo 'restore of rmprog/rmprog.c failed'
  547. Wc_c="`wc -c < 'rmprog/rmprog.c'`"
  548. test 11138 -eq "$Wc_c" ||
  549.     echo 'rmprog/rmprog.c: original size 11138, current size' "$Wc_c"
  550. fi
  551. # ============= rmprog/util.c ==============
  552. if test -f 'rmprog/util.c' -a X"$1" != X"-c"; then
  553.     echo 'x - skipping rmprog/util.c (File already exists)'
  554. else
  555. echo 'x - extracting rmprog/util.c (Text)'
  556. sed 's/^X//' << 'Purdue' > 'rmprog/util.c' &&
  557. #include <stdio.h>
  558. #include "util.h"
  559. X
  560. X
  561. X
  562. /*
  563. X * CompPath()
  564. X *    Compress a path by assuming the . and .. really point to    (ksb)
  565. X *    what they should (good undef BSD at least :-|), we also
  566. X *    assume the all things used as a directory all directories
  567. X *    (and exist)
  568. X *
  569. X * Remove extra `/', `./', `foo/..'  (in place)
  570. X * also replace a null path with `.'
  571. X */
  572. char *
  573. CompPath(pcFile)
  574. char *pcFile;        /* path to compress                */
  575. {
  576. X    register char *pcScan, *pcPut;
  577. X    register int bFirst;
  578. X
  579. X    pcScan = pcPut = pcFile;
  580. X    bFirst = 1;
  581. X    for (;;) { switch (*pcPut = *pcScan) {
  582. X    case '/':
  583. X        ++pcPut;
  584. X        do
  585. X            ++pcScan;
  586. X        while ('/' == *pcScan);
  587. X        bFirst = 1;
  588. X        continue;
  589. X    case '.':
  590. X        if (!bFirst) {
  591. X            ++pcPut, ++pcScan;
  592. X            continue;
  593. X        }
  594. X        if ('/' == pcScan[1] || '\000' == pcScan[1]) {
  595. X            do
  596. X                ++pcScan;
  597. X            while ('/' == *pcScan);
  598. X            continue;
  599. X        }
  600. X        /* do foo/.., but not /.. or just ..
  601. X         */
  602. X        if ('.' == pcScan[1] && pcPut != pcFile &&
  603. X            ('/' == pcScan[2] || '\000' == pcScan[2]) &&
  604. X            !('/' == pcFile[0] && pcPut == pcFile+1)) {
  605. X            --pcPut;
  606. X            do
  607. X                --pcPut;
  608. X            while ('/' != *pcPut && pcPut != pcFile);
  609. X            if ('/' == *pcPut)
  610. X                ++pcPut;
  611. X            pcScan += 2;
  612. X            while ('/' == *pcScan)
  613. X                ++pcScan;
  614. X            continue;
  615. X        }
  616. X    default:
  617. X        ++pcPut, ++pcScan;
  618. X        bFirst = 0;
  619. X        continue;
  620. X    case '\000':
  621. X        break;
  622. X    } break; }
  623. X
  624. X    /* clean up trailing / and empty path name
  625. X     */
  626. X    if (pcPut != pcFile) {
  627. X        while (--pcPut != pcFile && '/' == *pcPut)
  628. X            *pcPut = '\000';
  629. X    }
  630. X    if ('\000' == *pcFile) {
  631. X        pcFile[0] = '.';
  632. X        pcFile[1] = '\000';
  633. X    }
  634. X    return pcFile;
  635. }
  636. X
  637. X
  638. /*
  639. X * This routine converts text into C quoted strings            (ksb)
  640. X * It reads from a string and writes to a FILE *; producing code with
  641. X * the input C text between `pcpen` and `pclose`.
  642. X *
  643. X * The iOpts flag provides some options that are handy:
  644. X *    TTOC_NOP        do nothing special
  645. X *    TTOC_PERCENT        this is a printf format string, quote %'s
  646. X *    TTOC_NEWLINE        always break strings at newlines
  647. X *    TTOC_BLOCK        never break the string for newlines
  648. X *
  649. X * The iMax argument is the max lenght of an output string, pass 0 for
  650. X * unlimited
  651. X *
  652. X * pcpen and pclose are output whenever the a new string it started
  653. X * or a string is closed.
  654. X * example:    pcOpen = "\tfprintf(fp, \""
  655. X *        pcClose = "\");\n"
  656. X */
  657. void
  658. ttoc(pcIn, pFIOut, pcOpen, pcClose, iOpts, iMax)
  659. register FILE *pFIOut;
  660. char *pcIn, *pcOpen, *pcClose;
  661. register int iOpts, iMax;
  662. {
  663. X    extern int strlen();
  664. X    register int c;
  665. X    register int bQuote;
  666. X    register int iLen;
  667. X
  668. X    bQuote = iLen = 0;
  669. X
  670. X    if (iMax < 0) {
  671. X        iMax = 0;
  672. X    }
  673. X
  674. X    while ('\000' != (c = *pcIn++)) {
  675. X        if (! bQuote) {
  676. X            fputs(pcOpen, pFIOut);
  677. X            iLen = 0;
  678. X            bQuote = 1;
  679. X        }
  680. X
  681. X        switch (c) {
  682. X        case '\\':
  683. X        case '"':
  684. X            putc('\\', pFIOut);
  685. X            putc(c, pFIOut);
  686. X            iLen += 2;
  687. X            break;
  688. X        case '\t':
  689. X            fputs("\\t", pFIOut);
  690. X            iLen += 2;
  691. X            break;
  692. X        case '\n':
  693. X            fputs("\\n", pFIOut);
  694. X            if (0 != (TTOC_NEWLINE & iOpts) || (0 == (TTOC_BLOCK & iOpts) && iLen > (iMax >> 1))) {
  695. X                iLen = iMax + 2;
  696. X            } else {
  697. X                iLen += 2;
  698. X            }
  699. X            break;
  700. X        case '%':
  701. X            if (0 != (iOpts & TTOC_PERCENT)) {
  702. X                fputs("%%", pFIOut);
  703. X                iLen += 2;
  704. X                break;
  705. X            }
  706. X            /*FALLTHROUGH*/
  707. X        default:
  708. X            if (c < ' ' || c > '~') {
  709. X                fprintf(pFIOut, "\\%03o", c);
  710. X                iLen += 4;
  711. X                break;
  712. X            }
  713. X            putc(c, pFIOut);
  714. X            iLen += 1;
  715. X            break;
  716. X        }
  717. X
  718. X        if (0 != iMax && iLen > iMax) {
  719. X            fputs(pcClose, pFIOut);
  720. X            bQuote = 0;
  721. X        }
  722. X    }
  723. X    if (bQuote) {
  724. X        fputs(pcClose, pFIOut);
  725. X    }
  726. }
  727. Purdue
  728. chmod 0444 rmprog/util.c ||
  729. echo 'restore of rmprog/util.c failed'
  730. Wc_c="`wc -c < 'rmprog/util.c'`"
  731. test 3360 -eq "$Wc_c" ||
  732.     echo 'rmprog/util.c: original size 3360, current size' "$Wc_c"
  733. fi
  734. # ============= rmprog/rmprog.8l ==============
  735. if test -f 'rmprog/rmprog.8l' -a X"$1" != X"-c"; then
  736.     echo 'x - skipping rmprog/rmprog.8l (File already exists)'
  737. else
  738. echo 'x - extracting rmprog/rmprog.8l (Text)'
  739. sed 's/^X//' << 'Purdue' > 'rmprog/rmprog.8l' &&
  740. .\" man page for rmprog
  741. .\" $Compile: ${nroff-nroff} -man %f | ${PAGER-more}
  742. .\" Matthew Bradburn, Purdue University Computing Center
  743. .\" Copyright 1989 Purdue Research Foundation
  744. .\" $Id: rmprog.8l,v 2.0 90/11/28 15:39:50 ksb Exp $
  745. .TH RMPROG 8L PUCC
  746. .SH NAME
  747. rmprog \- inform users that a command is scheduled to go away
  748. .SH SYNOPSIS
  749. \fB/usr/local/etc/rmprog\fP [\fB\-hnvV\fP] [\fB\-t\fP \fIwhen\fP] [\fB\-u\fP \fIwho\fP] [\fB\-w\fP \fIwhy\fP] \fIfiles\fP
  750. .SH DESCRIPTION
  751. \fIRmprog\fP moves
  752. each \fIfile\fP to \fI.file\fR and puts in its place a program which
  753. prints a message about the command being scheduled for deletion,
  754. prompts the invoker to press
  755. .B return
  756. (if the command is invoked from a tty), then invokes \fI.file\fP.
  757. .PP
  758. \fIRmprog\fP also queues an \fIat\fP(1) job which will remove both \fIfile\fP
  759. and \fI.file\fP in \fIwhen\fP days (default 30).
  760. The \fIat\fP job also reminds the invoker to remove the program's source,
  761. manual pages, and \fIwhatis\fP(1) entry via \fImail\fP(1).
  762. .SH OPTIONS
  763. .TP
  764. .B \-h
  765. Print a short help message.
  766. .TP
  767. .B \-n
  768. Don't really do anything, just output detailed shell commands which
  769. mock the actions that would be taken.
  770. .TP
  771. .BI \-t when
  772. Arrange for the command to go away in \fIwhen\fP days, rather than the
  773. default 30.
  774. .TP
  775. .BI \-u who
  776. Print \fIwho\fP as the person to contact regarding the removal.
  777. .TP
  778. .B \-v
  779. Produce verbose output.
  780. .TP
  781. .B \-V
  782. Show which version of \fIrmprog\fP is running.
  783. .TP
  784. .BI \-w why
  785. Print \fIwhy\fP when the command is executed, in addition to the information
  786. that is normally printed.
  787. .SH EXAMPLES
  788. .TP
  789. # rmprog -w "Use /bin/bar instead" /bin/foo
  790. Might be used to cause \fI/bin/foo\fP to go away in a month,
  791. because it has been outdated by \fI/bin/bar\fP.
  792. .TP
  793. $ /bin/foo
  794. will then output:
  795. .sp
  796. .RS
  797. This program, /bin/foo, will be deleted <date inserted here>.
  798. .br
  799. Use /bin/bar instead.
  800. .br
  801. Send questions and comments concerning this deletion to \fIwho\fP.
  802. .RE
  803. .sp
  804. After printing this message, the new \fI/bin/foo\fP invokes
  805. the original command, now named \fI/bin/.foo\fP.
  806. .TP
  807. $ touch /tmp/junque && rmprog -nv /tmp/junque
  808. Use this command to see how \fIrmprog\fP works.
  809. .SH FILES
  810. .TP
  811. /tmp/pgXXXXXXX/* 
  812. temporary directory for compilation of replacement command
  813. .SH AUTHOR
  814. Matthew Bradburn, Purdue University Computing Center
  815. .br
  816. Kevin Braunsdorf, Purdue University Computing Center
  817. .SH SEE ALSO
  818. at(1), mail(1), whatis(1),
  819. mvprog(8L)
  820. Purdue
  821. chmod 0444 rmprog/rmprog.8l ||
  822. echo 'restore of rmprog/rmprog.8l failed'
  823. Wc_c="`wc -c < 'rmprog/rmprog.8l'`"
  824. test 2404 -eq "$Wc_c" ||
  825.     echo 'rmprog/rmprog.8l: original size 2404, current size' "$Wc_c"
  826. fi
  827. # ============= rmprog/main.c ==============
  828. if test -f 'rmprog/main.c' -a X"$1" != X"-c"; then
  829.     echo 'x - skipping rmprog/main.c (File already exists)'
  830. else
  831. echo 'x - extracting rmprog/main.c (Text)'
  832. sed 's/^X//' << 'Purdue' > 'rmprog/main.c' &&
  833. /*
  834. X * machine generated cmd line parser
  835. X * targets for mk
  836. X * $Compile: ${CC-cc} -I/usr/include/local %f -lopt
  837. X * $Depend: ${MAKETD-maketd} -a -d -I/usr/include/local %f
  838. X * $Lint: ${LINT-lint} -hnx -I/usr/include/local %f
  839. X */
  840. X
  841. #include <ctype.h>
  842. #include "getopt.h"
  843. #include <stdio.h>
  844. #include "rmprog.h"
  845. X
  846. char
  847. X    *progname = "$Id$",
  848. X    u_terse[] = " [-Vhnv] [-m manpage] [-t days] [-u who] [-w why] [files]",
  849. X    *u_help[] = {
  850. X        "V         output version information",
  851. X        "h         print this help message",
  852. X        "m manpage manual page to mkcat -D when program is removed",
  853. X        "n         trace execution but do nothing",
  854. X        "t days    days until command goes away",
  855. X        "u who     who to contact about removal",
  856. X        "v         be verbose",
  857. X        "w why     additional message to print",
  858. X        (char *)0
  859. X    },
  860. X    *pcMan = (char *)0;
  861. int
  862. X    iErrs = 0,
  863. X    fExec = 1,
  864. X    iWhen = 30;
  865. char
  866. X    *pcWho = "";
  867. int
  868. X    fVerbose = 0;
  869. char
  870. X    *pcWhy = "";
  871. X
  872. static char sbData[] = "%s: illegal data for %s option `%c\'\n";
  873. X
  874. static void
  875. chkint(opt, pch)
  876. int opt;
  877. char *pch;
  878. {
  879. X    register int c;
  880. X
  881. X    while (isspace(*pch))
  882. X        ++pch;
  883. X    c = *pch;
  884. X    if ('+' == c || '-' == c)
  885. X        ++pch;
  886. X    while (isdigit(*pch))
  887. X        ++pch;
  888. X    if ('\000' != *pch) {
  889. X        fprintf(stderr, sbData, progname, "integer", opt);
  890. X        exit(1);
  891. X    }
  892. }
  893. X
  894. /*
  895. X * parser
  896. X */
  897. int
  898. main(argc, argv)
  899. int argc;
  900. char **argv;
  901. {
  902. X    static char
  903. X        sbOpt[] = "Vhm:nt:u:vw:",
  904. X        *u_pch = (char *)0;
  905. X    static int
  906. X        u_loop = 0;
  907. X    register int curopt;
  908. X    extern int atoi();
  909. X    extern char *strrchr();
  910. X
  911. X    progname = strrchr(argv[0], '/');
  912. X    if ((char *)0 == progname)
  913. X        progname = argv[0];
  914. X    else
  915. X        ++progname;
  916. X    while (EOF != (curopt = getopt(argc, argv, sbOpt))) {
  917. X        switch (curopt) {
  918. X        case BADARG:
  919. X            fprintf(stderr, "%s: option %c needs a parameter\n", progname, optopt);
  920. X            exit(1);
  921. X        case BADCH:
  922. X            fprintf(stderr, "%s: usage%s\n", progname, u_terse);
  923. X            exit(1);
  924. X        case 'V':
  925. X            printf("%s: %s\n", progname, "$Id: rmprog.m,v 2.2 90/10/14 21:29:02 ksb Exp $");
  926. X            exit(0);
  927. X        case 'h':
  928. X            fprintf(stdout, "%s: usage%s\n", progname, u_terse);
  929. X            for (u_loop = 0; (char *)0 != (u_pch = u_help[u_loop]); ++u_loop) {
  930. X                fprintf(stdout, "%s\n", u_pch);
  931. X            }
  932. X            exit(0);
  933. X        case 'm':
  934. X            pcMan = optarg;
  935. X            continue;
  936. X        case 'n':
  937. X            fExec ^= 1;
  938. X            continue;
  939. X        case 't':
  940. X            chkint('t', optarg);
  941. X            iWhen = atoi(optarg);
  942. X            continue;
  943. X        case 'u':
  944. X            pcWho = optarg;
  945. X            continue;
  946. X        case 'v':
  947. X            fVerbose = ! 0;
  948. X            continue;
  949. X        case 'w':
  950. X            pcWhy = optarg;
  951. X            continue;
  952. X        }
  953. X        break;
  954. X    }
  955. X    Init();
  956. X
  957. X    curopt = 1;
  958. X    while (EOF != getarg(argc, argv)) {
  959. X        curopt = 0;
  960. X        ProgGoin(optarg);
  961. X    }
  962. X    if (curopt) {
  963. X        fprintf(stderr, "%s: usage%s\n", progname, u_terse);
  964. X    }
  965. X
  966. X    Die();
  967. X    exit(0);
  968. }
  969. Purdue
  970. chmod 0644 rmprog/main.c ||
  971. echo 'restore of rmprog/main.c failed'
  972. Wc_c="`wc -c < 'rmprog/main.c'`"
  973. test 2623 -eq "$Wc_c" ||
  974.     echo 'rmprog/main.c: original size 2623, current size' "$Wc_c"
  975. fi
  976. # ============= mvprog/mvprog.8l ==============
  977. if test ! -d 'mvprog'; then
  978.     echo 'x - creating directory mvprog'
  979.     mkdir 'mvprog'
  980. fi
  981. if test -f 'mvprog/mvprog.8l' -a X"$1" != X"-c"; then
  982.     echo 'x - skipping mvprog/mvprog.8l (File already exists)'
  983. else
  984. echo 'x - extracting mvprog/mvprog.8l (Text)'
  985. sed 's/^X//' << 'Purdue' > 'mvprog/mvprog.8l' &&
  986. .\" man page for mvprog
  987. .\" by Matthew Bradburn, Purdue University Computing Center
  988. .\" Copyright 1989, Purdue Research Foundation
  989. .\" $Compile: nroff -man %f | ${PAGER-more}
  990. .\" $Laser: ltroff -man %f
  991. .\" $Id: mvprog.8l,v 2.0 90/11/28 15:37:57 ksb Exp $
  992. .TH MVPROG 8L PUCC
  993. .SH NAME
  994. mvprog \- move a command and inform users
  995. .SH SYNOPSIS
  996. \fBmvprog\fP [\fB\-hnvV\fP] [\fB\-t\fP \fIwhen\fP] [\fB\-u\fP \fIwho\fP] [\fB\-w\fP \fIwhy\fP] \fIfiles to\fP
  997. .SH DESCRIPTION
  998. A system administrator should use \fImvprog\fP to move a command
  999. from one directory to another.  After moving \fIfiles\fP to \fIto\fP,
  1000. it creates a program which
  1001. it places in \fIfiles\fP that, when invoked, prints out a message about the new
  1002. location of the command and prompts the invoker to hit
  1003. .B return
  1004. (if the command is run from a tty).  Once return is pressed, this
  1005. command executes the command in the \fIto\fP location.
  1006. .PP
  1007. .I Mvprog
  1008. also queues an \fIat\fP(1) job which will remove the \fIfiles\fP command
  1009. in \fIwhen\fP (30, by default) days.
  1010. System administrators must change the documentation and the makefile
  1011. for the source, if necessary.  The \fIat\fP job sends mail to the invoker
  1012. as a reminder.
  1013. .SH OPTIONS
  1014. .TP
  1015. .B \-h
  1016. Print a short help message.
  1017. .TP
  1018. .B \-n
  1019. Don't really do anything.
  1020. .TP
  1021. .BI \-t when
  1022. Arrange for the link in the old directory to go away in
  1023. .I when
  1024. days rather than the default 30.
  1025. .TP
  1026. .BI \-u who
  1027. Print
  1028. .I who
  1029. as the source to conctact about details concerning the command move.
  1030. .TP
  1031. .B \-v
  1032. Produce verbose output.
  1033. .TP
  1034. .B \-V
  1035. Show which version of \fImvprog\fP is running.
  1036. .TP
  1037. .BI \-w why
  1038. Print the string \fIwhy\fP when the command is executed, in addition
  1039. to the information that is normally printed.
  1040. .SH EXAMPLE
  1041. .TP
  1042. # \fBmvprog\fP /bin/foo /usr/bin
  1043. Would move \fI/bin/foo\fP to \fI/usr/bin/foo\fP, afterward,
  1044. .TP
  1045. $ /bin/foo
  1046. .sp
  1047. will then print:
  1048. .RS
  1049. .sp
  1050. This program, /bin/foo, has moved to /usr/bin/foo.
  1051. .br
  1052. You will no longer be able to invoke it via this path after \fBdate\fP.
  1053. .br
  1054. Send questions and comments regarding this move to "\fBuser\fP".
  1055. .sp
  1056. .RE
  1057. After printing this message, the \fI/bin/foo\fP invokes the original command,
  1058. now in \fI/usr/bin/foo\fP.
  1059. .SH BUGS
  1060. The program put in the old location may fail to invoke the real program
  1061. if it is a shell script without a \*(lqloader card,\*(rq
  1062. even though a shell would be able to execute it directly.
  1063. .SH FILES
  1064. .TP
  1065. /tmp/pmXXXXXXX/*
  1066. temporary directory for compilation of the replacement command
  1067. .SH AUTHORS
  1068. Matthew Bradburn, Purdue University Computing Center
  1069. .br
  1070. Kevin Braunsdorf, Purdue University Computing Center
  1071. .SH SEE ALSO
  1072. at(1),  atq(1),  atrm(1),
  1073. rmprog(8L)
  1074. Purdue
  1075. chmod 0444 mvprog/mvprog.8l ||
  1076. echo 'restore of mvprog/mvprog.8l failed'
  1077. Wc_c="`wc -c < 'mvprog/mvprog.8l'`"
  1078. test 2621 -eq "$Wc_c" ||
  1079.     echo 'mvprog/mvprog.8l: original size 2621, current size' "$Wc_c"
  1080. fi
  1081. # ============= mvprog/main.c ==============
  1082. if test -f 'mvprog/main.c' -a X"$1" != X"-c"; then
  1083.     echo 'x - skipping mvprog/main.c (File already exists)'
  1084. else
  1085. echo 'x - extracting mvprog/main.c (Text)'
  1086. sed 's/^X//' << 'Purdue' > 'mvprog/main.c' &&
  1087. /*
  1088. X * machine generated cmd line parser
  1089. X */
  1090. X
  1091. #include "getopt.h"
  1092. #include <stdio.h>
  1093. #include "rmprog.h"
  1094. X
  1095. char
  1096. X    *progname = "$Id$",
  1097. X    u_terse[] = " [-Vhnv] [-t when] [-u who] [-w why] [files] to",
  1098. X    *u_help[] = {
  1099. X        "V      output version information",
  1100. X        "h      print this help message",
  1101. X        "n      trace execution but do nothing",
  1102. X        "t when number of days before files are deinstalled",
  1103. X        "u who  who to contact for more information",
  1104. X        "v      be verbose",
  1105. X        "w why  additional message",
  1106. X        "files  files to move",
  1107. X        "to     file (directory) to move file(s) to",
  1108. X        (char *)0
  1109. X    },
  1110. X    *pcTo = (char *)0;
  1111. int
  1112. X    iErrs = 0,
  1113. X    fExec = 1,
  1114. X    iWhen = DEFWHEN;
  1115. char
  1116. X    *pcWho = (char *)0;
  1117. int
  1118. X    fVerbose = 0;
  1119. char
  1120. X    *pcWhy = (char *)0;
  1121. X
  1122. /*
  1123. X * parser
  1124. X */
  1125. int
  1126. main(argc, argv)
  1127. int argc;
  1128. char **argv;
  1129. {
  1130. X    static char
  1131. X        sbOpt[] = "Vhnt:u:vw:",
  1132. X        *u_pch = (char *)0;
  1133. X    static int
  1134. X        u_loop = 0;
  1135. X    register int curopt;
  1136. X    extern int atoi();
  1137. X    extern char *strrchr();
  1138. X
  1139. X    progname = strrchr(argv[0], '/');
  1140. X    if ((char *)0 == progname)
  1141. X        progname = argv[0];
  1142. X    else
  1143. X        ++progname;
  1144. X    while (EOF != (curopt = getopt(argc, argv, sbOpt))) {
  1145. X        switch (curopt) {
  1146. X        case BADARG:
  1147. X            fprintf(stderr, "%s: option %c needs a parameter\n", progname, optopt);
  1148. X            exit(1);
  1149. X        case BADCH:
  1150. X            fprintf(stderr, "%s: usage%s\n", progname, u_terse);
  1151. X            exit(1);
  1152. X        case 'V':
  1153. X            printf("%s: %s\n", progname, "$Id: mvprog.m,v 2.0 90/10/15 11:51:12 ksb Exp $");
  1154. X            exit(0);
  1155. X        case 'h':
  1156. X            fprintf(stdout, "%s: usage%s\n", progname, u_terse);
  1157. X            for (u_loop = 0; (char *)0 != (u_pch = u_help[u_loop]); ++u_loop) {
  1158. X                fprintf(stdout, "%s\n", u_pch);
  1159. X            }
  1160. X            exit(0);
  1161. X        case 'n':
  1162. X            fExec = !1;
  1163. X            fVerbose = 1;
  1164. X            continue;
  1165. X        case 't':
  1166. X            iWhen = atoi(optarg);
  1167. X            continue;
  1168. X        case 'u':
  1169. X            pcWho = optarg;
  1170. X            continue;
  1171. X        case 'v':
  1172. X            fVerbose = ! 0;
  1173. X            continue;
  1174. X        case 'w':
  1175. X            pcWhy = optarg;
  1176. X            continue;
  1177. X        }
  1178. X        break;
  1179. X    }
  1180. X    Init();
  1181. X    if (argc - optind < 1) {
  1182. X        fprintf(stderr, "%s: not enough arguments for justified arguments\n", progname);
  1183. X        exit(1);
  1184. X    }
  1185. X    --argc;
  1186. X    pcTo = argv[argc];
  1187. X    argv[argc] = (char *)0;
  1188. X    if (optind == argc) {
  1189. X        fprintf(stderr, "%s: usage%s\n", progname, u_terse);
  1190. X        Die();
  1191. X    }
  1192. X
  1193. X    CheckTo(argc-optind);
  1194. X
  1195. X    while (EOF != getarg(argc, argv)) {
  1196. X        ProgMoved(optarg);
  1197. X    }
  1198. X    Die();
  1199. X    exit(iErrs);
  1200. }
  1201. Purdue
  1202. chmod 0644 mvprog/main.c ||
  1203. echo 'restore of mvprog/main.c failed'
  1204. Wc_c="`wc -c < 'mvprog/main.c'`"
  1205. test 2237 -eq "$Wc_c" ||
  1206.     echo 'mvprog/main.c: original size 2237, current size' "$Wc_c"
  1207. fi
  1208. # ============= mvprog/Makefile.mkcmd ==============
  1209. if test -f 'mvprog/Makefile.mkcmd' -a X"$1" != X"-c"; then
  1210.     echo 'x - skipping mvprog/Makefile.mkcmd (File already exists)'
  1211. else
  1212. echo 'x - extracting mvprog/Makefile.mkcmd (Text)'
  1213. sed 's/^X//' << 'Purdue' > 'mvprog/Makefile.mkcmd' &&
  1214. #    $Id: Makefile,v 2.3 90/11/29 08:28:56 ksb Exp $
  1215. #
  1216. #    Makefile for mvprog
  1217. #
  1218. X
  1219. PROG=    mvprog
  1220. BIN=    ${DESTDIR}/usr/local/etc
  1221. X
  1222. RMPROGD=../rmprog
  1223. X
  1224. L=../libopt
  1225. #L=/usr/include/local
  1226. I=/usr/include
  1227. S=/usr/include/sys
  1228. P=
  1229. X
  1230. INCLUDE= -I$L
  1231. DEBUG=    -O
  1232. CDEFS=  -DRMPROG=0
  1233. CFLAGS= ${DEBUG} ${CDEFS} ${INCLUDE}
  1234. X
  1235. HDR=    
  1236. SRC=    
  1237. LINKC=    rmprog.c util.c
  1238. LINKH=    rmprog.h machine.h util.h
  1239. LINK=    ${LINKH} ${LINKC}
  1240. GENC=    main.c ${LINKC}
  1241. GENH=    main.h ${LINKH}
  1242. DEP=    ${SRC} ${GENC}
  1243. GEN=    ${GENC} ${GENH}
  1244. OBJ=    main.o rmprog.o util.o
  1245. MAN=    mvprog.8l
  1246. OTHER=    README mvprog.m
  1247. SOURCE=    Makefile Makefile.plain ${HDR} ${SRC} ${MAN} ${OTHER}
  1248. X
  1249. all: ${PROG}
  1250. X
  1251. ${PROG}:$P ${OBJ}
  1252. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -lopt
  1253. X    ${CC} -o $@ ${CFLAGS} ${OBJ} ../libopt/libopt.a
  1254. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -L /usr/local/lib -lopt
  1255. X
  1256. main.h: main.c
  1257. X
  1258. main.c: mvprog.m
  1259. X    mkcmd std_help.m mvprog.m
  1260. X    -(cmp -s prog.c main.c || (cp prog.c main.c && echo main.c updated))
  1261. X    -(cmp -s prog.h main.h || (cp prog.h main.h && echo main.h updated))
  1262. X    rm -f prog.[ch]
  1263. X
  1264. ${LINK}:
  1265. X    ln -s ${RMPROGD}/$@ ./$@
  1266. X
  1267. swap: Makefile.plain ${GEN}
  1268. X    mv Makefile Makefile.mkcmd
  1269. X    mv Makefile.plain Makefile
  1270. X
  1271. clean: FRC
  1272. X    rm -f Makefile.bak ${PROG} ${GEN} *.o a.out core errs tags
  1273. X
  1274. depend: ${HDR} ${SRC} ${GEN} FRC
  1275. X    maketd ${CDEFS} ${INCLUDE} ${DEP}
  1276. X
  1277. install: all FRC
  1278. X    install -cs ${PROG} ${BIN}/${PROG}
  1279. X
  1280. mkcat: ${MAN} FRC
  1281. X    mkcat ${MAN}
  1282. X
  1283. lint: ${HDR} ${SRC} ${GEN} FRC
  1284. X    lint -h ${CDEFS} ${INCLUDE} ${DEP}
  1285. X
  1286. print: source FRC
  1287. X    lpr -J'${PROG} source' ${SOURCE}
  1288. X
  1289. source: ${SOURCE}
  1290. X
  1291. spotless: clean
  1292. X    rcsclean ${SOURCE}
  1293. X
  1294. tags: ${HDR} ${SRC} ${GEN}
  1295. X    ctags -t ${HDR} ${SRC} ${GEN}
  1296. X
  1297. ${SOURCE}:
  1298. X    co -q $@
  1299. X
  1300. FRC:
  1301. X
  1302. # DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
  1303. X
  1304. main.o: main.c rmprog.h
  1305. X
  1306. rmprog.o: machine.h main.h rmprog.c rmprog.h util.h
  1307. X
  1308. util.o: util.c util.h
  1309. X
  1310. # *** Do not add anything here - It will go away. ***
  1311. Purdue
  1312. chmod 0644 mvprog/Makefile.mkcmd ||
  1313. echo 'restore of mvprog/Makefile.mkcmd failed'
  1314. Wc_c="`wc -c < 'mvprog/Makefile.mkcmd'`"
  1315. test 1809 -eq "$Wc_c" ||
  1316.     echo 'mvprog/Makefile.mkcmd: original size 1809, current size' "$Wc_c"
  1317. fi
  1318. # ============= rmprog/Makefile ==============
  1319. if test -f 'rmprog/Makefile' -a X"$1" != X"-c"; then
  1320.     echo 'x - skipping rmprog/Makefile (File already exists)'
  1321. else
  1322. echo 'x - extracting rmprog/Makefile (Text)'
  1323. sed 's/^X//' << 'Purdue' > 'rmprog/Makefile' &&
  1324. #    $Id: Makefile.plain,v 2.6 90/11/29 08:24:42 ksb Exp $
  1325. #
  1326. #    Makefile for rmprog
  1327. #
  1328. X
  1329. PROG=    rmprog
  1330. BIN=    ${DESTDIR}/usr/local/etc
  1331. X
  1332. L=../libopt
  1333. #L=/usr/include/local
  1334. I=/usr/include
  1335. S=/usr/include/sys
  1336. P=
  1337. X
  1338. INCLUDE=-I$L
  1339. DEBUG=    -O
  1340. CDEFS=  -DRMPROG=1
  1341. CFLAGS= ${DEBUG} ${CDEFS} ${INCLUDE}
  1342. X
  1343. HDR=    main.h rmprog.h machine.h util.h
  1344. SRC=    main.c rmprog.c util.c
  1345. OBJ=    rmprog.o util.o main.o
  1346. GENH=    
  1347. GENC=    
  1348. GEN=    ${GENC} ${GENH}
  1349. DEP=    ${SRC} ${GENC}
  1350. MAN=    rmprog.8l
  1351. OTHER=    README rmprog.m
  1352. SOURCE=    Makefile Makefile.mkcmd ${HDR} ${SRC} ${MAN} ${OTHER}
  1353. X
  1354. all: ${PROG}
  1355. X
  1356. ${PROG}:$P ${OBJ}
  1357. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -lopt
  1358. X    ${CC} -o $@ ${CFLAGS} ${OBJ} ../libopt/libopt.a
  1359. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -L /usr/local/lib -lopt
  1360. X
  1361. swap: rmprog.m Makefile.mkcmd
  1362. X    mkcmd std_help.m std_targets.m rmprog.m
  1363. X    -(cmp -s prog.c main.c || echo main.c changed)
  1364. X    -(cmp -s prog.h main.h || echo main.h changed)
  1365. X    mv Makefile Makefile.plain
  1366. X    mv Makefile.mkcmd Makefile
  1367. X
  1368. clean: FRC
  1369. X    rm -f Makefile.bak ${PROG} ${GEN} prog.[ch] *.o a.out core errs tags
  1370. X
  1371. depend: ${HDR} ${SRC} ${GEN} FRC
  1372. X    maketd ${CDEFS} ${INCLUDE} ${DEP}
  1373. X
  1374. install: all FRC
  1375. X    install -cs ${PROG} ${BIN}/${PROG}
  1376. X
  1377. lint: ${HDR} ${SRC} ${GEN} FRC
  1378. X    lint -h ${CDEFS} ${INCLUDE} ${DEP}
  1379. X
  1380. mkcat: ${MAN}
  1381. X    mkcat ${MAN}
  1382. X
  1383. print: source FRC
  1384. X    lpr -J'${PROG} source' ${SOURCE}
  1385. X
  1386. source: ${SOURCE}
  1387. X
  1388. spotless: clean
  1389. X    rcsclean ${SOURCE}
  1390. X
  1391. tags: ${HDR} ${SRC} ${GEN}
  1392. X    ctags -t ${HDR} ${SRC} ${GEN}
  1393. X
  1394. ${SOURCE}:
  1395. X    co -q $@
  1396. X
  1397. FRC:
  1398. X
  1399. # DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
  1400. X
  1401. main.o: main.c rmprog.h
  1402. X
  1403. rmprog.o: machine.h main.h rmprog.c rmprog.h util.h
  1404. X
  1405. util.o: util.c util.h
  1406. X
  1407. # *** Do not add anything here - It will go away. ***
  1408. Purdue
  1409. chmod 0644 rmprog/Makefile ||
  1410. echo 'restore of rmprog/Makefile failed'
  1411. Wc_c="`wc -c < 'rmprog/Makefile'`"
  1412. test 1630 -eq "$Wc_c" ||
  1413.     echo 'rmprog/Makefile: original size 1630, current size' "$Wc_c"
  1414. fi
  1415. # ============= rmprog/Makefile.mkcmd ==============
  1416. if test -f 'rmprog/Makefile.mkcmd' -a X"$1" != X"-c"; then
  1417.     echo 'x - skipping rmprog/Makefile.mkcmd (File already exists)'
  1418. else
  1419. echo 'x - extracting rmprog/Makefile.mkcmd (Text)'
  1420. sed 's/^X//' << 'Purdue' > 'rmprog/Makefile.mkcmd' &&
  1421. #    $Id: Makefile,v 2.10 90/11/29 08:24:35 ksb Exp $
  1422. #
  1423. #    Makefile for rmprog
  1424. #
  1425. X
  1426. PROG=    rmprog
  1427. BIN=    ${DESTDIR}/usr/local/etc
  1428. X
  1429. L=../libopt
  1430. #L=/usr/include/local
  1431. I=/usr/include
  1432. S=/usr/include/sys
  1433. P=
  1434. X
  1435. INCLUDE=-I$L
  1436. DEBUG=    -O
  1437. CDEFS=  -DRMPROG=1
  1438. CFLAGS= ${DEBUG} ${CDEFS} ${INCLUDE}
  1439. X
  1440. HDR=    rmprog.h machine.h util.h
  1441. SRC=    rmprog.c util.c
  1442. OBJ=    rmprog.o util.o main.o
  1443. GENH=    main.h
  1444. GENC=    main.c
  1445. GEN=    ${GENC} ${GENH}
  1446. DEP=    ${SRC} ${GENC}
  1447. MAN=    rmprog.8l
  1448. OTHER=    README rmprog.m
  1449. SOURCE=    Makefile Makefile.plain ${HDR} ${SRC} ${MAN} ${OTHER}
  1450. X
  1451. all: ${PROG}
  1452. X
  1453. ${PROG}:$P ${OBJ}
  1454. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -lopt
  1455. X    ${CC} -o $@ ${CFLAGS} ${OBJ} ../libopt/libopt.a
  1456. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -L /usr/local/lib -lopt
  1457. X
  1458. main.h: main.c
  1459. X
  1460. main.c: rmprog.m
  1461. X    mkcmd std_help.m std_targets.m rmprog.m
  1462. X    -(cmp -s prog.c main.c || (cp prog.c main.c && echo main.c updated))
  1463. X    -(cmp -s prog.h main.h || (cp prog.h main.h && echo main.h updated))
  1464. X    rm -f prog.[ch]
  1465. X
  1466. swap: ${GEN} Makefile.plain
  1467. X    mv Makefile Makefile.mkcmd
  1468. X    mv Makefile.plain Makefile
  1469. X
  1470. clean: FRC
  1471. X    rm -f Makefile.bak ${PROG} ${GEN} prog.[ch] *.o a.out core errs tags
  1472. X
  1473. depend: ${HDR} ${SRC} ${GEN} FRC
  1474. X    maketd ${CDEFS} ${INCLUDE} ${DEP}
  1475. X
  1476. install: all FRC
  1477. X    install -cs ${PROG} ${BIN}/${PROG}
  1478. X
  1479. lint: ${HDR} ${SRC} ${GEN} FRC
  1480. X    lint -h ${CDEFS} ${INCLUDE} ${DEP}
  1481. X
  1482. mkcat: ${MAN}
  1483. X    mkcat ${MAN}
  1484. X
  1485. print: source FRC
  1486. X    lpr -J'${PROG} source' ${SOURCE}
  1487. X
  1488. source: ${SOURCE}
  1489. X
  1490. spotless: clean
  1491. X    rcsclean ${SOURCE}
  1492. X
  1493. tags: ${HDR} ${SRC} ${GEN}
  1494. X    ctags -t ${HDR} ${SRC} ${GEN}
  1495. X
  1496. ${SOURCE}:
  1497. X    co -q $@
  1498. X
  1499. FRC:
  1500. X
  1501. # DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
  1502. X
  1503. rmprog.o: machine.h main.h rmprog.c rmprog.h util.h
  1504. X
  1505. util.o: util.c util.h
  1506. X
  1507. main.o: main.c rmprog.h
  1508. X
  1509. # *** Do not add anything here - It will go away. ***
  1510. Purdue
  1511. chmod 0644 rmprog/Makefile.mkcmd ||
  1512. echo 'restore of rmprog/Makefile.mkcmd failed'
  1513. Wc_c="`wc -c < 'rmprog/Makefile.mkcmd'`"
  1514. test 1716 -eq "$Wc_c" ||
  1515.     echo 'rmprog/Makefile.mkcmd: original size 1716, current size' "$Wc_c"
  1516. fi
  1517. # ============= mvprog/Makefile ==============
  1518. if test -f 'mvprog/Makefile' -a X"$1" != X"-c"; then
  1519.     echo 'x - skipping mvprog/Makefile (File already exists)'
  1520. else
  1521. echo 'x - extracting mvprog/Makefile (Text)'
  1522. sed 's/^X//' << 'Purdue' > 'mvprog/Makefile' &&
  1523. #    $Id: Makefile.plain,v 2.3 90/11/29 08:29:02 ksb Exp $
  1524. #
  1525. #    Makefile for mvprog
  1526. #
  1527. X
  1528. PROG=    mvprog
  1529. BIN=    ${DESTDIR}/usr/local/etc
  1530. X
  1531. RMPROGD=../rmprog
  1532. X
  1533. L=../libopt
  1534. #L=/usr/include/local
  1535. I=/usr/include
  1536. S=/usr/include/sys
  1537. P=
  1538. X
  1539. INCLUDE= -I$L
  1540. DEBUG=    -O
  1541. CDEFS=  -DRMPROG=0
  1542. CFLAGS= ${DEBUG} ${CDEFS} ${INCLUDE}
  1543. X
  1544. HDR=    main.h 
  1545. SRC=    main.c 
  1546. LINKC=    rmprog.c util.c
  1547. LINKH=    rmprog.h machine.h util.h
  1548. LINK=    ${LINKH} ${LINKC}
  1549. GENC=    ${LINKC}
  1550. GENH=    ${LINKH}
  1551. DEP=    ${SRC} ${GENC}
  1552. GEN=    ${GENC} ${GENH}
  1553. OBJ=    main.o rmprog.o util.o
  1554. MAN=    mvprog.8l
  1555. OTHER=    README mvprog.m
  1556. SOURCE=    Makefile Makefile.mkcmd ${HDR} ${SRC} ${MAN} ${OTHER}
  1557. X
  1558. all: ${PROG}
  1559. X
  1560. ${PROG}:$P ${OBJ}
  1561. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -lopt
  1562. X    ${CC} -o $@ ${CFLAGS} ${OBJ} ../libopt/libopt.a
  1563. #    ${CC} -o $@ ${CFLAGS} ${OBJ} -L /usr/local/lib -lopt
  1564. X
  1565. ${LINK}:
  1566. X    ln -s ${RMPROGD}/$@ ./$@
  1567. X
  1568. swap: Makefile.mkcmd ${GEN}
  1569. X    mkcmd std_help.m mvprog.m
  1570. X    -(cmp -s prog.c main.c || echo main.c changed)
  1571. X    -(cmp -s prog.h main.h || echo main.h changed)
  1572. X    mv Makefile Makefile.plain
  1573. X    mv Makefile.mkcmd Makefile
  1574. X
  1575. clean: FRC
  1576. X    rm -f Makefile.bak ${PROG} ${GEN} *.o a.out core errs tags
  1577. X
  1578. depend: ${HDR} ${SRC} ${GEN} FRC
  1579. X    maketd ${CDEFS} ${INCLUDE} ${DEP}
  1580. X
  1581. install: all FRC
  1582. X    install -cs ${PROG} ${BIN}/${PROG}
  1583. X
  1584. mkcat: ${MAN} FRC
  1585. X    mkcat ${MAN}
  1586. X
  1587. lint: ${HDR} ${SRC} ${GEN} FRC
  1588. X    lint -h ${CDEFS} ${INCLUDE} ${DEP}
  1589. X
  1590. print: source FRC
  1591. X    lpr -J'${PROG} source' ${SOURCE}
  1592. X
  1593. source: ${SOURCE}
  1594. X
  1595. spotless: clean
  1596. X    rcsclean ${SOURCE}
  1597. X
  1598. tags: ${HDR} ${SRC} ${GEN}
  1599. X    ctags -t ${HDR} ${SRC} ${GEN}
  1600. X
  1601. ${SOURCE}:
  1602. X    co -q $@
  1603. X
  1604. FRC:
  1605. X
  1606. # DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
  1607. X
  1608. main.o: main.c rmprog.h
  1609. X
  1610. rmprog.o: machine.h main.h rmprog.c rmprog.h util.h
  1611. X
  1612. util.o: util.c util.h
  1613. X
  1614. # *** Do not add anything here - It will go away. ***
  1615. Purdue
  1616. chmod 0644 mvprog/Makefile ||
  1617. echo 'restore of mvprog/Makefile failed'
  1618. Wc_c="`wc -c < 'mvprog/Makefile'`"
  1619. test 1720 -eq "$Wc_c" ||
  1620.     echo 'mvprog/Makefile: original size 1720, current size' "$Wc_c"
  1621. fi
  1622. # ============= rmprog/rmprog.m ==============
  1623. if test -f 'rmprog/rmprog.m' -a X"$1" != X"-c"; then
  1624.     echo 'x - skipping rmprog/rmprog.m (File already exists)'
  1625. else
  1626. echo 'x - extracting rmprog/rmprog.m (Text)'
  1627. sed 's/^X//' << 'Purdue' > 'rmprog/rmprog.m' &&
  1628. # mkcmd source for "rmprog"
  1629. # $Compile: mkcmd std_help.m std_targets.m %f
  1630. # Matthew Bradburn, PUCC UNIX Group
  1631. # $Id: rmprog.m,v 2.2 90/10/14 21:29:02 ksb Exp $
  1632. X
  1633. from '"rmprog.h"'
  1634. X
  1635. integer variable "iErrs" {
  1636. X    init "0"
  1637. }
  1638. X
  1639. after {
  1640. X    update "Init();"
  1641. }
  1642. X
  1643. every {
  1644. X    named "files"
  1645. X    parameter "files"
  1646. X    update "ProgGoin(%a);"
  1647. }
  1648. zero {
  1649. X    update 'fprintf(stderr, "%%s: usage%%s\\n", %b, %t);'
  1650. }
  1651. exit {
  1652. X    update "Die();"
  1653. }
  1654. X
  1655. integer "t" {
  1656. X    named "iWhen"
  1657. X    initializer "30"
  1658. X    verify parameter "days"
  1659. X    help "days until command goes away"
  1660. }
  1661. char* "w" {
  1662. X    named "pcWhy"
  1663. X    initializer '""'
  1664. X    parameter "why"
  1665. X    help "additional message to print"
  1666. }
  1667. char* "u" {
  1668. X    named "pcWho"
  1669. X    initializer '""'
  1670. X    parameter "who"
  1671. X    help "who to contact about removal"
  1672. }
  1673. char* "m" {
  1674. X    named "pcMan"
  1675. X    parameter "manpage"
  1676. X    help "manual page to mkcat -D when program is removed"
  1677. }
  1678. boolean "v" {
  1679. X    named "fVerbose"
  1680. X    initializer "0"
  1681. X    help "be verbose"
  1682. }
  1683. toggle "n" {
  1684. X    named "fExec"
  1685. X    initializer "1"
  1686. X    help "trace execution but do nothing"
  1687. }
  1688. action 'V' {
  1689. X    update 'printf("%%s: %%s\\n", %b, "$Id: rmprog.m,v 2.2 90/10/14 21:29:02 ksb Exp $");'
  1690. X    aborts "exit(0);"
  1691. X    help "output version information"
  1692. }
  1693. Purdue
  1694. chmod 0444 rmprog/rmprog.m ||
  1695. echo 'restore of rmprog/rmprog.m failed'
  1696. Wc_c="`wc -c < 'rmprog/rmprog.m'`"
  1697. test 1139 -eq "$Wc_c" ||
  1698.     echo 'rmprog/rmprog.m: original size 1139, current size' "$Wc_c"
  1699. fi
  1700. # ============= mvprog/mvprog.m ==============
  1701. if test -f 'mvprog/mvprog.m' -a X"$1" != X"-c"; then
  1702.     echo 'x - skipping mvprog/mvprog.m (File already exists)'
  1703. else
  1704. echo 'x - extracting mvprog/mvprog.m (Text)'
  1705. sed 's/^X//' << 'Purdue' > 'mvprog/mvprog.m' &&
  1706. X
  1707. # cmd line option parser for mvprog (ksb)
  1708. from '"rmprog.h"'
  1709. X
  1710. integer variable "iErrs" {
  1711. X    init "0"
  1712. }
  1713. X
  1714. boolean 'n' {
  1715. X    named "fExec"
  1716. X    init "1"
  1717. X    update "%n = !%i;%rvn = 1;"
  1718. X    help "trace execution but do nothing"
  1719. }
  1720. X
  1721. boolean 'v' {
  1722. X    named "fVerbose"
  1723. X    help "be verbose"
  1724. }
  1725. X
  1726. from '"rmprog.h"'
  1727. integer 't' {
  1728. X    named "iWhen"
  1729. X    param "when"
  1730. X    init "DEFWHEN"
  1731. X    help "number of days before files are deinstalled"
  1732. }
  1733. X
  1734. char* 'u' {
  1735. X    named "pcWho"
  1736. X    init '(char *)0'
  1737. X    param "who"
  1738. X    help "who to contact for more information"
  1739. }
  1740. X
  1741. char* 'w' {
  1742. X    named "pcWhy"
  1743. X    init '(char *)0'
  1744. X    param "why"
  1745. X    help "additional message"
  1746. }
  1747. X
  1748. X
  1749. char* variable "pcTo" {
  1750. X    param "to"
  1751. X    help "file (directory) to move file(s) to"
  1752. }
  1753. X
  1754. right "pcTo" {
  1755. }
  1756. X
  1757. after {
  1758. X    update "Init();"
  1759. }
  1760. zero {
  1761. X    update 'fprintf(stderr, "%%s: usage%%s\\n", %b, %t);'
  1762. X    aborts "Die();"
  1763. }
  1764. list {
  1765. X    update 'CheckTo(argc-optind);'
  1766. }
  1767. every {
  1768. X    named "ProgMoved"
  1769. X    param "files"
  1770. X    help "files to move"
  1771. }
  1772. exit {
  1773. X    named "Die"
  1774. X    update "%n();"
  1775. X    aborts "exit(iErrs);"
  1776. }
  1777. action 'V' {
  1778. X    update 'printf("%%s: %%s\\n", %b, "$Id: mvprog.m,v 2.0 90/10/15 11:51:12 ksb Exp $");'
  1779. X    aborts "exit(0);"
  1780. X    help "output version information"
  1781. }
  1782. Purdue
  1783. chmod 0444 mvprog/mvprog.m ||
  1784. echo 'restore of mvprog/mvprog.m failed'
  1785. Wc_c="`wc -c < 'mvprog/mvprog.m'`"
  1786. test 1127 -eq "$Wc_c" ||
  1787.     echo 'mvprog/mvprog.m: original size 1127, current size' "$Wc_c"
  1788. fi
  1789. # ============= rmprog/machine.h ==============
  1790. if test -f 'rmprog/machine.h' -a X"$1" != X"-c"; then
  1791.     echo 'x - skipping rmprog/machine.h (File already exists)'
  1792. else
  1793. echo 'x - extracting rmprog/machine.h (Text)'
  1794. sed 's/^X//' << 'Purdue' > 'rmprog/machine.h' &&
  1795. /*
  1796. X * configuration for rmprog and mvprog
  1797. X */
  1798. /* #define bsd /**/
  1799. /* #define HPUX7 /**/
  1800. /* #define SYSV /**/
  1801. /* #defined sun /**/
  1802. X
  1803. #if ! defined BSD
  1804. #include <local/bsd.h>
  1805. #if !defined MAXNAMLEN
  1806. #define MAXNAMLEN 15
  1807. #endif
  1808. #endif
  1809. X
  1810. #if ! defined MAILX
  1811. #if defined HPUX7
  1812. #define MAILX    "/usr/bin/mailx"
  1813. #else
  1814. #define MAILX    "/usr/ucb/mail"
  1815. #endif
  1816. #endif
  1817. X
  1818. #if defined bsd
  1819. #include <strings.h>
  1820. #else
  1821. #include <string.h>
  1822. #endif
  1823. X
  1824. #if defined SYSV
  1825. extern char *getcwd();
  1826. #define getwd(Mpc)    getcwd(Mpc,MAXPATHLEN)
  1827. #else
  1828. extern char *getwd();
  1829. #endif
  1830. X
  1831. #if defined sun || defined HPUX7
  1832. typedef void SIGRET_t;
  1833. #else
  1834. typedef int SIGRET_t;
  1835. #endif
  1836. X
  1837. #define TDIRMODE    0750
  1838. X
  1839. extern char *sys_errlist[];
  1840. #define strerror(Me) (sys_errlist[Me])
  1841. extern int errno;
  1842. Purdue
  1843. chmod 0644 rmprog/machine.h ||
  1844. echo 'restore of rmprog/machine.h failed'
  1845. Wc_c="`wc -c < 'rmprog/machine.h'`"
  1846. test 740 -eq "$Wc_c" ||
  1847.     echo 'rmprog/machine.h: original size 740, current size' "$Wc_c"
  1848. fi
  1849. # ============= rmprog/README ==============
  1850. if test -f 'rmprog/README' -a X"$1" != X"-c"; then
  1851.     echo 'x - skipping rmprog/README (File already exists)'
  1852. else
  1853. echo 'x - extracting rmprog/README (Text)'
  1854. sed 's/^X//' << 'Purdue' > 'rmprog/README' &&
  1855. # $Id: README,v 2.0 90/11/29 08:25:00 ksb Exp $
  1856. X
  1857. This tool, `rmprog' notifies users of impending system changes; in this
  1858. case the removal of a product from a system directory.  After a grace
  1859. period it uses install(1L) to de-install the product in question and
  1860. reminds the admin that `this was done in your name'. :-)
  1861. X
  1862. The sister program `mvprog' is like rmprog, but it moves the program to
  1863. a new name (or directory) rather than removing it completely.  This is
  1864. used a PUCC to upgrade unsuported programs to supported and such.
  1865. X
  1866. Kevin Braunsdorf, PUCC UNIX Group
  1867. Purdue
  1868. chmod 0444 rmprog/README ||
  1869. echo 'restore of rmprog/README failed'
  1870. Wc_c="`wc -c < 'rmprog/README'`"
  1871. test 562 -eq "$Wc_c" ||
  1872.     echo 'rmprog/README: original size 562, current size' "$Wc_c"
  1873. fi
  1874. # ============= rmprog/util.h ==============
  1875. if test -f 'rmprog/util.h' -a X"$1" != X"-c"; then
  1876.     echo 'x - skipping rmprog/util.h (File already exists)'
  1877. else
  1878. echo 'x - extracting rmprog/util.h (Text)'
  1879. sed 's/^X//' << 'Purdue' > 'rmprog/util.h' &&
  1880. /*
  1881. X * convert a string of input chars into C code ascii string        (ksb)
  1882. X * input    m = "\n";
  1883. X * output     "m = \"\\n\";\n",
  1884. X */
  1885. #define TTOC_NOP    0x0000    /* do nothing special            */
  1886. #define TTOC_PERCENT    0x0001    /* this is a printf format string    */
  1887. #define TTOC_NEWLINE    0x0002    /* always break strings at newlines    */
  1888. #define TTOC_BLOCK    0x0004    /* never break the string for newlines    */
  1889. X
  1890. #if defined(__STDC__)
  1891. extern void ttoc(char *, FILE *, char *, char *, int, int);
  1892. #else
  1893. extern void ttoc();
  1894. #endif
  1895. X
  1896. extern char *CompPath();
  1897. Purdue
  1898. chmod 0444 rmprog/util.h ||
  1899. echo 'restore of rmprog/util.h failed'
  1900. Wc_c="`wc -c < 'rmprog/util.h'`"
  1901. test 515 -eq "$Wc_c" ||
  1902.     echo 'rmprog/util.h: original size 515, current size' "$Wc_c"
  1903. fi
  1904. # ============= mvprog/README ==============
  1905. if test -f 'mvprog/README' -a X"$1" != X"-c"; then
  1906.     echo 'x - skipping mvprog/README (File already exists)'
  1907. else
  1908. echo 'x - extracting mvprog/README (Text)'
  1909. sed 's/^X//' << 'Purdue' > 'mvprog/README' &&
  1910. # $Id: README,v 2.0 90/11/29 08:29:15 ksb Exp $
  1911. X
  1912. This tool, `mvprog', notifies users of impending system changes; this
  1913. one is used when a product moves from one system directory to another
  1914. (or to another name in the same directory).  After a grace period it
  1915. uses install(1L) to de-install the message front-end in question and
  1916. reminds the admin that `this was done in your name'. :-)
  1917. X
  1918. See also ../rmprog.
  1919. X
  1920. Kevin Braunsdorf, PUCC UNIX Group
  1921. Purdue
  1922. chmod 0444 mvprog/README ||
  1923. echo 'restore of mvprog/README failed'
  1924. Wc_c="`wc -c < 'mvprog/README'`"
  1925. test 440 -eq "$Wc_c" ||
  1926.     echo 'mvprog/README: original size 440, current size' "$Wc_c"
  1927. fi
  1928. # ============= rmprog/rmprog.h ==============
  1929. if test -f 'rmprog/rmprog.h' -a X"$1" != X"-c"; then
  1930.     echo 'x - skipping rmprog/rmprog.h (File already exists)'
  1931. else
  1932. echo 'x - extracting rmprog/rmprog.h (Text)'
  1933. sed 's/^X//' << 'Purdue' > 'rmprog/rmprog.h' &&
  1934. /*
  1935. X * include file for rmrog.c
  1936. X */
  1937. extern int iErrs;
  1938. extern void ProgGoin();
  1939. X
  1940. #if ! defined GENC
  1941. #define GENC    "subst.c"    /* C file to put in tmp dir */
  1942. #endif
  1943. X
  1944. #if ! defined DEFMAIL
  1945. #define DEFMAIL        "pucc"
  1946. #endif
  1947. X
  1948. #if ! defined DEFWHEN
  1949. #define DEFWHEN        30
  1950. #endif
  1951. Purdue
  1952. chmod 0444 rmprog/rmprog.h ||
  1953. echo 'restore of rmprog/rmprog.h failed'
  1954. Wc_c="`wc -c < 'rmprog/rmprog.h'`"
  1955. test 262 -eq "$Wc_c" ||
  1956.     echo 'rmprog/rmprog.h: original size 262, current size' "$Wc_c"
  1957. fi
  1958. # ============= rmprog/main.h ==============
  1959. if test -f 'rmprog/main.h' -a X"$1" != X"-c"; then
  1960.     echo 'x - skipping rmprog/main.h (File already exists)'
  1961. else
  1962. echo 'x - extracting rmprog/main.h (Text)'
  1963. sed 's/^X//' << 'Purdue' > 'rmprog/main.h' &&
  1964. /*
  1965. X * parse options
  1966. X */
  1967. X
  1968. extern char *progname, u_terse[], *u_help[];
  1969. extern int main();
  1970. extern int fExec, iWhen, fVerbose, iErrs;
  1971. extern char *pcMan, *pcWho, *pcWhy;
  1972. Purdue
  1973. chmod 0644 rmprog/main.h ||
  1974. echo 'restore of rmprog/main.h failed'
  1975. Wc_c="`wc -c < 'rmprog/main.h'`"
  1976. test 167 -eq "$Wc_c" ||
  1977.     echo 'rmprog/main.h: original size 167, current size' "$Wc_c"
  1978. fi
  1979. # ============= mvprog/main.h ==============
  1980. if test -f 'mvprog/main.h' -a X"$1" != X"-c"; then
  1981.     echo 'x - skipping mvprog/main.h (File already exists)'
  1982. else
  1983. echo 'x - extracting mvprog/main.h (Text)'
  1984. sed 's/^X//' << 'Purdue' > 'mvprog/main.h' &&
  1985. /*
  1986. X * parse options
  1987. X */
  1988. X
  1989. extern char *progname, u_terse[], *u_help[];
  1990. extern int main();
  1991. extern int fExec, iWhen, fVerbose, iErrs;
  1992. extern char *pcWho, *pcWhy, *pcTo;
  1993. Purdue
  1994. chmod 0644 mvprog/main.h ||
  1995. echo 'restore of mvprog/main.h failed'
  1996. Wc_c="`wc -c < 'mvprog/main.h'`"
  1997. test 166 -eq "$Wc_c" ||
  1998.     echo 'mvprog/main.h: original size 166, current size' "$Wc_c"
  1999. fi
  2000. exit 0
  2001.  
  2002. exit 0 # Just in case...
  2003.