home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume10 / newsbreak < prev    next >
Text File  |  1990-01-28  |  9KB  |  299 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v10i045: newsbreak.c; automate unpacking source and binary group postings
  3. from: grwalter@watfun.waterloo.edu (Fred Walter)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 10, Issue 45
  7. Submitted-by: grwalter@watfun.waterloo.edu (Fred Walter)
  8. Archive-name: newsbreak
  9.  
  10. Here is a program I've written to automate unpacking postings to
  11. comp.sources.misc, comp.sources.unix, comp.sources.amiga, comp.binaries.amiga
  12. and possibly other groups as well.
  13.  
  14. I typically use this by creating a subdirectory in /tmp, then copying all
  15. the articles from /usr/spool/news/comp/whatever to my directory in /tmp.
  16.  
  17. Then I execute
  18.  
  19. newsbreak >& .newsbreak.out &
  20.  
  21. in my subdirectory in /tmp. After a while, all the postings that match the
  22. accepted forms will be unpacked. I then look into the .newsbreak.out
  23. file to see if any problems occured when unpacking.
  24.  
  25.     fred
  26.  
  27. ------cut here and make my day--------------------------------
  28. #! /bin/sh
  29. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  30. # Contents:  newsbreak.c
  31. echo extracting 'newsbreak.c'
  32. if test -f 'newsbreak.c' -a -z "$1"; then echo Not overwriting 'newsbreak.c'; else
  33. sed 's/^X//' << \EOF > 'newsbreak.c'
  34. X/*
  35. X * newsbreak.c (version 1.06)
  36. X *
  37. X * by G. R. Walter (Fred) December 30, 1988
  38. X *
  39. X * Description:
  40. X *     Takes a series of files which are shar files (strips any
  41. X *     garbage at the start of the shar file) that have been posted to
  42. X *     comp.{sources|binaries}.* and feeds them through sh.
  43. X *     After they have been fed through sh the original files are
  44. X *     deleted. Then any uuencoded files are uudecoded, after which
  45. X *     the uuencoded files are also deleted.
  46. X *
  47. X * NOTES:
  48. X *     1) This program assumes that all necessary shar files are in the
  49. X *        current directory. It attempts to not delete stuff if it can't
  50. X *        handle it (like when not all the parts of a multi-part uuencoded
  51. X *        file are available).
  52. X *     2) When there are multiple parts to a uuencoded file, a maximum
  53. X *        of 99 parts are currently handled.
  54. X *
  55. X * HISTORY:
  56. X * 1.00 - original version
  57. X * 1.01 - small enhancements/bug fixes
  58. X * 1.02 - now handle .zu's with > 9 parts correctly
  59. X * 1.03 - now check for ":\tshar\:Shell Archiver" when checking if a file
  60. X *        is a shar archive
  61. X *      - now handles files ending in .uu#
  62. X * 1.04 - now check for ": run sh on this file to unbundle" when checking
  63. X *        if a file is a shar archive
  64. X * 1.05 - now check for "# This is a shell archive." when checking
  65. X *        if a file is a shar archive
  66. X *      - now prints out the version (and author name) when run
  67. X * 1.06 - now check for "Archive-name:" to see what directory the
  68. X *        resulting files should be put in. NOTE: any parts after
  69. X *        a "part*" section in the path are not mkdir'ed
  70. X *      - now handles files ending in .zuu#
  71. X *      - now handles files ending in .uu# properly
  72. X *      - now doesn't attempt to process files starting in "."
  73. X *      - now prints some useful info (so you know what it is doing)
  74. X *      - now check for "# After you unpack everything" when checking
  75. X *        if a file is a shar archive
  76. X *      - make sure I don't try to uudecode directories
  77. X */
  78. X
  79. X#include <stdio.h>
  80. X#include <ctype.h>
  81. X#include <sys/types.h>
  82. X#include <sys/dir.h>
  83. X#include <sys/file.h>
  84. X#include <sys/stat.h>
  85. X
  86. Xchar           *strcpy();
  87. Xchar           *getwd();
  88. X
  89. Xmain()
  90. X{
  91. X    DIR            *dirp;
  92. X    struct direct  *dp;
  93. X
  94. X    void            unshar();
  95. X    void            uudecode();
  96. X
  97. X    fprintf(stderr, "newsbreak 1.06 by G. R. Walter\n");
  98. X
  99. X    /* unshar everything */
  100. X    dirp = opendir(".");
  101. X    for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  102. X    unshar(dp->d_name);
  103. X    closedir(dirp);
  104. X
  105. X    /* uudecode everything */
  106. X    dirp = opendir(".");
  107. X    for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  108. X    uudecode(dp->d_name);
  109. X    closedir(dirp);
  110. X
  111. X    exit(0);
  112. X}
  113. X
  114. Xvoid
  115. Xunshar(name)
  116. X    char           *name;
  117. X{
  118. X    FILE           *fin;
  119. X    FILE           *fout;
  120. X    char            buf[200];
  121. X    char            dir[200];
  122. X    char            path[200];
  123. X    char            tmp_path[200];
  124. X    char           *p;
  125. X
  126. X    void            uudecode();
  127. X
  128. X    if (name[0] == '.')
  129. X    return;
  130. X
  131. X    fprintf(stderr, "Attempting to unshar %s\n", name);
  132. X    fin = fopen(name, "r");
  133. X    if (fin == NULL)        /* file doesn't exist !? */
  134. X    return;
  135. X
  136. X    strcpy(dir, ".");        /* initialize directory to use */
  137. X    for (;;) {
  138. X    if (fgets(buf, 200, fin) == NULL) {    /* not a shar file !? */
  139. X        fclose(fin);
  140. X        return;
  141. X    }
  142. X    if (strncmp(buf, "Archive-name:", 13) == 0) {    /* directory to use */
  143. X        if (sscanf(buf, "Archive-name: %s", path) > 0) {
  144. X        strcpy(dir, path);
  145. X        tmp_path[0] = '\0';
  146. X        fprintf(stderr, "Found Archive-name: %s\n", dir);
  147. X        for (p = dir; *p != NULL; p++)
  148. X            if (*p == '/') {
  149. X            *p = NULL;
  150. X            if (strncmp(p + 1, "part", 4) == 0)
  151. X                break;
  152. X            if (access(dir, F_OK) < 0)
  153. X                if (mkdir(dir, 0777) < 0)
  154. X                goto ABORT_ATTEMPT;
  155. X            strcpy(tmp_path, path);
  156. X            *p = '/';
  157. X            }
  158. X        if (access(dir, F_OK) < 0) {
  159. X            if (mkdir(dir, 0777) < 0) {
  160. X        ABORT_ATTEMPT:
  161. X            fprintf(stderr, "Couldn't mkdir %s\n", dir);
  162. X            fprintf(stderr, "Aborting this attempt\n");
  163. X            if (tmp_path[0] != '\0')
  164. X                (void) unlink(tmp_path);
  165. X            fclose(fin);
  166. X            return;
  167. X            }
  168. X        }
  169. X        }
  170. X    }
  171. X    if ((strncmp(buf, "#!/bin/sh", 9) == 0)
  172. X        || (strncmp(buf, "#! /bin/sh", 10) == 0)
  173. X        || (strncmp(buf, "# This is a shell archive.", 26) == 0)
  174. X        || (strncmp(buf, ":\tshar:\tShell Archiver", 22) == 0)
  175. X        || (strncmp(buf, ": run sh on this file to unbundle", 33) == 0)
  176. X        || (strncmp(buf, "# After you unpack everything", 29) == 0))
  177. X        break;
  178. X    }
  179. X
  180. X    sprintf(path, "%s/.unshar.temp.file", dir);
  181. X    fout = fopen(path, "w");
  182. X    while (fgets(buf, 200, fin) != NULL)
  183. X    fprintf(fout, "%s", buf);
  184. X    fclose(fout);
  185. X    fclose(fin);
  186. X
  187. X    sprintf(buf, "cd %s; sh .unshar.temp.file", dir);
  188. X    if (system(buf) == 0)
  189. X    (void) unlink(name);
  190. X
  191. X    (void) unlink(path);
  192. X}
  193. X
  194. Xvoid
  195. Xuudecode(name)
  196. X    char           *name;
  197. X{
  198. X    DIR            *dirp;
  199. X    struct direct  *dp;
  200. X    FILE           *file;
  201. X    char            buf[200];
  202. X    char            name_buf[200];
  203. X    char            path[200];
  204. X    char           *p;
  205. X    struct stat     stat_buf;
  206. X
  207. X    if (name[0] == '.')
  208. X    return;
  209. X
  210. X    if (stat(name, &stat_buf))
  211. X    return;
  212. X
  213. X    if ((stat_buf.st_mode & S_IFDIR)) {
  214. X    /* uudecode everything in this directory */
  215. X    if (!getwd(path))
  216. X        return;
  217. X    if (chdir(name))
  218. X        return;
  219. X    dirp = opendir(".");
  220. X    for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  221. X        uudecode(dp->d_name);
  222. X    closedir(dirp);
  223. X    (void) chdir(path);
  224. X    return;
  225. X    }
  226. X    /* check if the file still exists */
  227. X    file = fopen(name, "r");
  228. X    if (file == NULL)
  229. X    return;
  230. X    fclose(file);
  231. X
  232. X    /* if the file ends in ".uue" or ".uu" or ".zuu" just uudecode it */
  233. X    p = name + strlen(name) - 1;
  234. X    if ((*p == 'e') && (*(p - 1) == 'u')) {
  235. X    p -= 2;
  236. X    if ((*p == 'u') && (*(p - 1) == '.')) {
  237. X        sprintf(buf, "uudecode %s", name);
  238. X        if (system(buf) == 0)
  239. X        (void) unlink(name);
  240. X    }
  241. X    return;
  242. X    }
  243. X    if ((*p == 'u') && (*(p - 1) == 'u')) {
  244. X    p -= 2;
  245. X    if ((*p == '.') || ((*p == 'z') && (*(p - 1) == '.'))) {
  246. X        sprintf(buf, "uudecode %s", name);
  247. X        if (system(buf) == 0)
  248. X        (void) unlink(name);
  249. X    }
  250. X    return;
  251. X    }
  252. X    /* handle ".zuu#", ".zu#" and ".uu#" where # is a number */
  253. X    while (isdigit(*p))
  254. X    p--;
  255. X
  256. X    if ((*p == 'u') && ((*(p - 1) == 'z') || (*(p - 1) == 'u')) &&
  257. X    (*(p - 2) == '.')) {
  258. X
  259. X    if (*(p + 1) == '0') {
  260. X        *(p + 1) = '\0';
  261. X        sprintf(buf, "cat %s* | uudecode", name);
  262. X    } else {
  263. X        *(p + 1) = '\0';
  264. X
  265. X        sprintf(name_buf, "%s10", name);
  266. X        file = fopen(name_buf, "r");
  267. X        if (file == NULL) {
  268. X        sprintf(buf, "cat %s? | uudecode", name);
  269. X        } else {
  270. X        fclose(file);
  271. X        sprintf(buf, "cat %s? %s?? | uudecode", name, name);
  272. X        }
  273. X    }
  274. X
  275. X    if (system(buf) == 0) {
  276. X        sprintf(buf, "rm %s*", name);
  277. X        system(buf);
  278. X    }
  279. X    } else if ((*p == 'u') && (*(p - 1) == 'u') && (*(p - 2) == 'z') &&
  280. X           (*(p - 3) == '.')) {
  281. X    *(p + 1) = '\0';
  282. X
  283. X    sprintf(buf, "cat %s* | uudecode", name);
  284. X    if (system(buf) == 0) {
  285. X        sprintf(buf, "rm %s*", name);
  286. X        system(buf);
  287. X    }
  288. X    }
  289. X}
  290. EOF
  291. chars=`wc -c < 'newsbreak.c'`
  292. if test $chars !=     6939; then echo 'newsbreak.c' is $chars characters, should be     6939 characters!; fi
  293. fi
  294. exit 0
  295. grwalter@watmath.uwaterloo.ca                  (Canadian domain)
  296. grwalter@watmath.waterloo.edu                  (US Internet, including CSNET)
  297. grwalter@watmath.waterloo.cdn                  (CDNnet and some European nets)
  298. watmath!grwalter                               (UUCP)
  299.