home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume4 / relink < prev    next >
Text File  |  1989-02-03  |  8KB  |  252 lines

  1. Path: xanth!mcnc!gatech!bloom-beacon!husc6!m2c!necntc!ncoast!allbery
  2. From: ronald@ibmpcug.UUCP (Ronald Khoo)
  3. Newsgroups: comp.sources.misc
  4. Subject: v04i008: relink news cross postings
  5. Message-ID: <9988@ibmpcug.UUCP>
  6. Date: 27 Jul 88 21:39:13 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: ronald@ibmpcug.UUCP (Ronald Khoo)
  9. Organization: The IBM PC User Group, UK.
  10. Lines: 239
  11. Approved: allbery@ncoast.UUCP
  12.  
  13. Posting-number: Volume 4, Issue 8
  14. Submitted-by: "Ronald Khoo" <ronald@ibmpcug.UUCP>
  15. Archive-name: relink
  16.  
  17. [The copyright in this one was rather interesting; unfortunately, it would not
  18. have had the desired effect from a legal standpoint, so I have deleted it
  19. with the author's permission.  ++bsa]
  20.  
  21.     I'm not sure if any existing program does this, if so, tell me
  22. please! (Then I'll trash this program!)
  23.  
  24. [afio and gnu@hoptoad.UUCP's PD tar both are available in source, so you
  25. can compile them medium or large model and avoid overflowing the link tables.
  26. Fixing the real bug is preferable to repairing the damage it causes.  ++bsa]
  27.  
  28. Basically, after using cpio or tar to save and restore my /usr/spool/news,
  29. I wind up with multiple copies of cross postings, since my Xenix cpio/tar
  30. are 8086 small model binaries (courtesy of SCO :-( ) so this prog goes through
  31. the Xref: lines in the files and unlinks/relinks cross postings.  I think
  32. that its functionality should be in expire, but I can't find it, so..
  33. (I recently needed to reclaim some much needed filespace, hence this program !)
  34.  
  35. As noted in the README, I'm off on a LONG holiday, and can't be reached for
  36. a couple of months at least, hence this rather rushed posting (ie no .8 file)
  37.  
  38. Cheers.
  39. Ronald
  40.  
  41. ---- cut here ------ for those who haven't bothered to install unshar! ------
  42. #! /bin/sh
  43. # or should that be : use /bin/sh :-)
  44. # This is a shell archive, meaning:
  45. # 1. Remove everything above the #! /bin/sh line.
  46. # 2. Save the resulting text in a file.
  47. # 3. Execute the file with /bin/sh (not csh) to create the files:
  48. #    README
  49. #    relink.c
  50. # This archive created: Wed Jul 27 22:36:22 1988
  51. export PATH; PATH=/bin:$PATH
  52. if test -f 'README'
  53. then
  54.     echo shar: will not over-write existing file "'README'"
  55. else
  56. cat << \SHAR_EOF > 'README'
  57. Here is a small program to go through all your news files and rebuild
  58. links bewtween crosspostings which have died.  Why should this ever happen?
  59. Well.. on my system (Xenix System V 2.2) the 'tar' and 'cpio' programs
  60. supplied are SMALL MODEL 8086 binaries! (SCO say it's a lot easier to
  61. just maintain one set of binaries :-( ) Hence, when I tar off the news
  62. partition and put it back - a lot of the link information is lost (bigger :-( )
  63. and I wind up with megs of store used up duplicating crosspostings, so I wrote
  64. this program to restore them - I just freed a much needed couple of megs with
  65. it yesterday!  Maybe someone else can find a use for it, I don't know.
  66.  
  67. OPERATION
  68.     goes through every file which /usr/lib/news/active believes is there,
  69. looking for Xref: lines.  Check to see that the inode of current file ==
  70. xref'd files, if not, then unlinks xref'd file, and links current file to
  71. xref'd file.  IGNORES hostname in Xref: line. Does NOT build a history of
  72. what it did, so it goes through each Xref again when it comes to it next time.
  73. (sorry) - It doesn't need to be a quick program after all - I just run it
  74. after I do a massive restore of my news partition + expire -r -e lots.
  75.  
  76. OPTIONS
  77.     -a active        instead of /usr/lib/news/active
  78.     -s spool        instead of /usr/spool/news
  79.     -v            be verbose
  80.     -V            be VERY verbose
  81.     -r            just report, don't do anything
  82.     -R            be very verbose version of -r
  83.  
  84. RASH ASSUMPTIONS:
  85.     1) active file is up to date: I suppose expire -r would fix this?
  86.     2) all the /usr/spool/news directories are present
  87.     3) /usr/spool/news is on one filesystem - but if it isn't, you've
  88.        probably hacked news about quite a bit anyway... so this won't be
  89.        of any use to you in any case.
  90.  
  91. Disclaimer:  I have used this program without trashing my own news system,
  92.          but your mileage may vary.  DO NOT USE if you intend to sue
  93.          me  if anything goes wrong.  No warranties, express or implied,
  94.          etc, etc, etc....
  95.  
  96. I'm on holiday for a while, probably won't be back 'till October, so
  97. if you send any gripes to me, don't hold your breath....
  98.  
  99. Plausible mail addresses:
  100.  
  101.     ronald@ibmpcug.UUCP
  102.     ronald%ibmpcug.uucp@ukc.AC.UK
  103.     uunet!mcvax!ukc!pyrltd!slxsys!ibmpcug!ronald
  104.  
  105. in the middle of registering
  106.     ronald@ibmpcug.CO.UK
  107. but the registration procedure over here is REALLY convoluted (goes via 3
  108. universities 4 times!) so it won't work for a while :-(
  109. SHAR_EOF
  110. fi # end of overwriting check
  111. if test -f 'relink.c'
  112. then
  113.     echo shar: will not over-write existing file "'relink.c'"
  114. else
  115. cat << \SHAR_EOF > 'relink.c'
  116. #ifndef lint
  117. static char sccsid[] = "%W%    %E%    No, I don't have RCS :-(";
  118. #endif /* lint */
  119.  
  120. #include <stdio.h>
  121. #include <ctype.h>
  122.  
  123. #define ACTIVE            "/usr/lib/news/active"
  124. #define SPOOLDIR        "/usr/spool/news/"
  125.  
  126. #define MAXLEN            256
  127.  
  128. char *p_active            = ACTIVE;
  129. char *p_spooldir        = SPOOLDIR;
  130.  
  131. char fullpath[MAXLEN+1] = SPOOLDIR;
  132. char *path = fullpath + (sizeof SPOOLDIR - 1);
  133. char group[MAXLEN+1];
  134. char line[MAXLEN+1];
  135. char file[10];
  136.  
  137. FILE *active, *mesg;
  138. int Verbose = 0, verbose=0, report=0, Report=0;    /* Verbose is Very verbose */
  139.  
  140. main(argc, argv)
  141.     char **argv;
  142. {
  143.     int opt ; extern char *optarg;
  144.     int i, first, last;
  145.     register char *p;
  146.  
  147.     while ( (opt=getopt(argc, argv, "VvRra:s:")) != EOF) switch (opt) {
  148.     case 'a':
  149.         p_active = optarg; break;
  150.     case 's':
  151.         p_spooldir = optarg; break;
  152.     case 'R':
  153.         Report=1;
  154.     case 'r':
  155.         report=1; break;
  156.     case 'V':
  157.         Verbose=1;
  158.     case 'v':
  159.         verbose=1; break;
  160.     default:
  161.         exit(1);
  162.     }
  163.  
  164.     if (report) verbose = 1;
  165.     if (Report) Verbose = 1;
  166.  
  167.     if (chdir(p_spooldir)<0) {
  168.         perror(p_spooldir); exit(1);
  169.     }
  170.     if ((active = fopen(p_active, "r"))== 0) {
  171.         perror(p_active); exit(1);
  172.     }
  173.     
  174.     while (fgets(line, MAXLEN, active)) {
  175.         chdir(p_spooldir);
  176.         sscanf(line, "%s%d%d", group, &last, &first);
  177.         if (verbose) fputs(group, stdout);
  178.         for (p=group; *p ; p++)
  179.             if (*p == '.') *p = '/';
  180.         if (chdir(group) < 0) {
  181.             if (verbose) puts(": no directory");
  182.             continue;
  183.         }
  184.         if (verbose) putchar('\n');
  185.         if (last != 0) for (i=first; i<=last; i++) {
  186.             sprintf(file, "%d", i);
  187.             if (Verbose) fputs(file, stdout);
  188.             if ((mesg=fopen(file, "r"))==0) {
  189.                 if (Verbose)
  190.                     perror("");
  191.                 continue;
  192.             }
  193.             if (Verbose) putchar('\n');
  194.             dolink();
  195.             fclose(mesg);
  196.         }
  197.     }
  198. }
  199.  
  200. char *skipws(s) char *s; { while (*s && isspace(*s)) s++; return s; }
  201. char *skiptows(s) char *s; { while (*s && !isspace(*s)) s++; return s; }
  202.  
  203. #include <sys/types.h>
  204. #include <sys/stat.h>
  205. dolink()
  206. {
  207.     struct stat stbuf; int ino;
  208.     register char *p, *q;
  209.     while ((p=fgets(line, MAXLEN, mesg)) != 0) {
  210.         if (*line == 0) return;
  211.         for (p=line; *p && p < line+4; p++)
  212.             *p = tolower(*p);
  213.         if (strncmp(line, "xref:", 5)==0)
  214.             break;
  215.     }
  216.     if (p == 0) return;
  217.     fstat(fileno(mesg), &stbuf);
  218.     ino = stbuf.st_ino;
  219.     if (verbose) printf("%s: %s", file, line);
  220.     p = line + 5;        /* first char past Xref:    */
  221.     p = skipws(p);        /* skip to hostname        */
  222.     p = skiptows(p);    /* skip past hostname        */
  223.     while (*p) {        /* for each cross reference    */
  224.         p = skipws(p);    /* skip to cross reference    */
  225.         q = path;    /* setup pointer to full path    */
  226.         while (*p && !isspace(*p))
  227.             *q++ =  (*p == ':' || *p == '.')?p++,'/':*p++;
  228.         if (! *p) break;/* end of Xref: list        */
  229.         *q = '\0';
  230.         if (verbose) fputs(path, stdout);
  231.         stat(fullpath, &stbuf);
  232.         if (stbuf.st_ino == ino) {
  233.             if (verbose) puts(": Link OK");
  234.         } else if (report) {
  235.             puts(": Link broken");
  236.         } else {
  237.             if (verbose) puts(": Relinked");
  238.             unlink(fullpath);
  239.             link(file, fullpath);
  240.         }
  241.     }
  242. }
  243. SHAR_EOF
  244. fi # end of overwriting check
  245. #    End of shell archive
  246. exit 0
  247. -- 
  248. Ronald Khoo @ The IBM PC User Group, PO Box 830, London SE1 0DB, UK.
  249. Phone:    +44 -1- 620 2244            UKNet:    ronald@ibmpcug.uucp
  250. Path:    ...!ukc!pyrltd!slxsys!ibmpcug!ronald    Domain:    ronald%ibmpcug@ukc.ac.uk
  251. Disclaimer: When I persuade my boss to believe me, what I say will be official.
  252.