home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / news_split / part01 next >
Encoding:
Internet Message Format  |  1991-02-24  |  11.4 KB

  1. From: fmc@cnam.cnam.fr (Frederic Chauveau)
  2. Newsgroups: comp.sources.misc
  3. Subject: v17i015:  news_split - News to Archive, Part01/01
  4. Message-ID: <1991Feb24.042943.20256@sparky.IMD.Sterling.COM>
  5. Date: 24 Feb 91 04:29:43 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: 64df4062 a555f716 486bcbb3 a7a170cc
  8.  
  9. Submitted-by: Frederic Chauveau <fmc@cnam.cnam.fr>
  10. Posting-number: Volume 17, Issue 15
  11. Archive-name: news_split/part01
  12. Supersedes: news_split1.6: Volume 17, Issue 1
  13.  
  14. This brings news_split to patch level 2. 
  15. As the shar file is only 18k, I am submitting it full.
  16.  
  17. [fmc]
  18.  
  19. ---- Cut Here and unpack ----
  20. #!/bin/sh
  21. # This is news_split, a shell archive (shar 3.32)
  22. # made 02/22/1991 15:23 UTC by fmc@cnam.cnam.fr
  23. # Source directory /users/labinf/fmc/tools/news_split
  24. #
  25. # existing files will NOT be overwritten
  26. #
  27. # This shar contains:
  28. # length  mode       name
  29. # ------ ---------- ------------------------------------------
  30. #   8228 -rw-r--r-- news_split.c
  31. #    130 -rw-r--r-- patchlevel.h
  32. #    660 -rw-r--r-- Makefile
  33. #   3402 -rw-r--r-- README
  34. #   2256 -rw-r--r-- INSTALL
  35. #
  36. if touch 2>&1 | fgrep 'amc' > /dev/null
  37.  then TOUCH=touch
  38.  else TOUCH=true
  39. fi
  40. # ============= news_split.c ==============
  41. if test X"$1" != X"-c" -a -f 'news_split.c'; then
  42.     echo "File already exists: skipping 'news_split.c'"
  43. else
  44. echo "x - extracting news_split.c (Text)"
  45. sed 's/^X//' << 'SHAR_EOF' > news_split.c &&
  46. X
  47. X/*
  48. X * news_split        [fmc] 21/02/91        Version 1.8
  49. X *            Browse a given NewsGroup (usualy comp.sources.???
  50. X *            and try to update/maintain a directory for the
  51. X *            sources found in it. 
  52. X *            I use it to maintain the ~ftp/pub/comp.sources.???
  53. X *            from the equivalent News directories.
  54. X *
  55. X *            Usage: news_split [-sn#a] [-l logdir] group ... group
  56. X *                or news_split [-sn#a] [-l logdir] -f groupfile
  57. X *
  58. X *            In the second case, groupfile is a file containing 
  59. X *            each group to be processed, one per line.
  60. X *
  61. X *    CopyLeft and CopyWrong Frederic Chauveau [fmc@cnam.cnam.fr]
  62. X */
  63. X
  64. X#include <stdio.h>
  65. X#ifdef NOUNISTD
  66. X#include <sys/file.h>
  67. X#else
  68. X#include <unistd.h>
  69. X#endif
  70. X#include <ctype.h>
  71. X#include <errno.h>
  72. X#include <sys/types.h>
  73. X#include <sys/dir.h>
  74. X#include "patchlevel.h"
  75. X
  76. X#ifndef NEWS_SPOOL
  77. X#define NEWS_SPOOL "/usr/spool/news"
  78. X#endif /* no NEWS_SPOOL */
  79. X
  80. X#ifndef FTP_DIR
  81. X#define FTP_DIR "/local/ftp/pub"
  82. X#endif /* no FTP_DIR */
  83. X
  84. X#ifndef LOGFILE
  85. X#define LOGFILE "%s/Index.ns"
  86. X#endif /* no LOGFILE */
  87. X
  88. X#ifndef LOGDIR
  89. X#define LOGDIR FTP_DIR
  90. X#endif
  91. X
  92. XFILE *logfile;
  93. Xchar *logdir = LOGDIR;
  94. X
  95. Xchar logname[BUFSIZ];
  96. Xchar Supercede_P = 1;
  97. Xchar force_number = 0;
  98. X
  99. X#ifndef DIRENT
  100. X#define DIRENT struct direct
  101. X#endif
  102. X
  103. X#ifdef NOSCANDIR
  104. X
  105. Xint scandir(DirName,NameList,Select,Sort)
  106. Xchar *DirName;
  107. XDIRENT *(*NameList[]);
  108. Xint (*Select)(), (*Sort)(); {
  109. X  int c = 0;
  110. X  DIRENT **tab, *entry;
  111. X  DIR *dirp;
  112. X
  113. X  dirp = opendir(DirName);
  114. X  while (entry = readdir(dirp))
  115. X    c += (Select ? (*Select)(entry) : 1);
  116. X  tab = (DIRENT **) malloc(c * sizeof(DIRENT *));
  117. X  rewinddir(dirp); c = 0;
  118. X  while (entry = readdir(dirp))
  119. X    if (!Select || (*Select)(entry))
  120. X      tab[c++] = entry;
  121. X  if (Sort)
  122. X    qsort(tab,c,sizeof(DIRENT *),Sort);
  123. X  *NameList = tab;
  124. X  return c;
  125. X}
  126. X
  127. X#endif /* NOSCANDIR */  
  128. X
  129. XDirSelect(dp)
  130. XDIRENT *dp; {
  131. X  return isdigit(dp->d_name[0]);
  132. X}
  133. X
  134. Xvoid CreateDirAndFile(dirname,infile)
  135. Xchar *dirname;
  136. XFILE *infile; {
  137. X  FILE *outfile;
  138. X  char *p = dirname;
  139. X  char buf[BUFSIZ];
  140. X
  141. X  while (p = (char *) strchr(p+1,'/'))
  142. X    {
  143. X      *p = '\0';
  144. X      if (mkdir(dirname,0766) && (errno != EEXIST))
  145. X    {
  146. X      FILE *foo = stderr;
  147. X      *stderr = *logfile;
  148. X      perror(dirname);
  149. X      *stderr = *foo;
  150. X      perror(dirname);
  151. X      return;
  152. X    }
  153. X      *p = '/';
  154. X    }
  155. X  if (!infile)
  156. X    return;
  157. X#ifdef COMPRESS
  158. X  strcat(dirname,".Z");
  159. X#endif
  160. X  if (access(dirname,F_OK) != -1)
  161. X    {
  162. X      fprintf(stderr,"  Warning: %s %s\n",
  163. X          (Supercede_P ? "Superceding" : "Not Superceding"),dirname);
  164. X      fprintf(logfile,"  Warning: %s %s\n",
  165. X          (Supercede_P ? "Superceding" : "Not Superceding"),dirname);
  166. X      if (!Supercede_P)
  167. X    return;
  168. X    }
  169. X#ifdef COMPRESS
  170. X  sprintf(buf,"%s > %s",COMPRESS,dirname); /* .Z already tacked at the end */
  171. X  outfile = popen(buf,"w");
  172. X#else    
  173. X  outfile = fopen(dirname,"w");
  174. X#endif
  175. X  if (!outfile)
  176. X    {
  177. X      FILE *foo = stderr;
  178. X      *stderr = *logfile;
  179. X      perror(dirname);
  180. X      *stderr = *foo;
  181. X      perror(dirname);
  182. X    }
  183. X  else
  184. X    {
  185. X      rewind(infile);
  186. X      while (fgets(buf,BUFSIZ,infile))
  187. X    fputs(buf,outfile);
  188. X#ifdef COMPRESS
  189. X      pclose(outfile);
  190. X#else
  191. X      fclose(outfile);
  192. X#endif
  193. X    }
  194. X}  
  195. X
  196. Xvoid SaveIt(pnumb,aname,subj,anumb,infile,group)
  197. Xchar *pnumb, *aname, *group, *subj, *anumb;
  198. XFILE *infile; {
  199. X  int vol, iss;
  200. X  char dirname[BUFSIZ];
  201. X
  202. X  pnumb[strlen(pnumb)-1] = '\0';
  203. X  if (force_number)
  204. X    {
  205. X      fprintf(logfile,"Art #%s: %s",anumb,subj);
  206. X      sprintf(dirname,"%s/%s/%s",FTP_DIR,group,anumb);
  207. X      CreateDirAndFile(dirname,infile);
  208. X      return;
  209. X    }      
  210. X  if (sscanf(pnumb,"Posting-number: Volume %d, Info%*[^0-9] %d",&vol,&iss) != 2)
  211. X    {
  212. X      if (sscanf(pnumb,"Posting-number: Volume %d %*[^0-9] %d",&vol,&iss) != 2)
  213. X    {
  214. X      fprintf(stderr," Couldn't get volume for article [%s]\n",anumb);
  215. X      fprintf(logfile," Couldn't get volume for article [%s]\n",anumb);
  216. X      sprintf(dirname,"%s/%s/%s",FTP_DIR,group,anumb);
  217. X      CreateDirAndFile(dirname,infile);
  218. X    }
  219. X    }
  220. X  else
  221. X      sprintf(aname,"Archive-name: Info%d\n",iss);
  222. X  if (!aname[0])
  223. X    {
  224. X      sprintf(dirname,"%s/%s/%s",FTP_DIR,group,subj);
  225. X      CreateDirAndFile(dirname,infile);
  226. X    }
  227. X  else
  228. X    {
  229. X      aname += 14; aname[strlen(aname)-1] = '\0';
  230. X      sprintf(dirname,"%s/%s/volume%d/%s",FTP_DIR,group,vol,aname);
  231. X      fprintf(logfile,"Volume %3d, Issue %3d :\t\t%s\n",vol,iss,aname);
  232. X      CreateDirAndFile(dirname,infile);
  233. X    }
  234. X}
  235. X
  236. Xvoid ProcArticle(art,group)
  237. Xchar *art, *group; {
  238. X  FILE *inp;
  239. X  char buf[BUFSIZ], postnum[BUFSIZ], archnam[BUFSIZ];
  240. X  char subject[BUFSIZ];
  241. X  int i = 0;
  242. X
  243. X  if (!(inp = fopen(art,"r")))
  244. X    {
  245. X      perror(art);
  246. X      return;
  247. X    }
  248. X  *postnum = *archnam = *subject = '\0';
  249. X  while (fgets(buf,BUFSIZ,inp))
  250. X    {
  251. X      if ((*postnum && *archnam && *subject) ||
  252. X      (*buf == '#') || (i > 30))
  253. X    {
  254. X      SaveIt(postnum,archnam,subject,art,inp,group);
  255. X      break;
  256. X    }
  257. X      if (!strncmp("Subject:",buf,8)) 
  258. X    {
  259. X      if (force_number)
  260. X        strcpy(subject,buf+8);
  261. X      else
  262. X        sscanf(buf,"Subject: %[^ :]",subject);
  263. X    }
  264. X      else if (!strncmp("Posting-number",buf,14))
  265. X    strcpy(postnum,buf);
  266. X      else if (!strncmp("Archive-name",buf,12))
  267. X    strcpy(archnam,buf);
  268. X      i++;
  269. X    }
  270. X  fclose(inp);
  271. X}
  272. X
  273. XGroupToDir(group,dirname)
  274. Xchar *group, *dirname; {
  275. X  char *p;
  276. X  strcpy(dirname,group);
  277. X  
  278. X  for (p = (char *) strchr(dirname,'.'); p; p = (char *) strchr(p,'.'))
  279. X    *p++ = '/';
  280. X}
  281. X
  282. Xvoid ProcGroup(group,first,last)
  283. Xint *first, *last;
  284. Xchar *group; {
  285. X  register int i, art_num, max, nf = *first, nl = *last;
  286. X  char dirname[BUFSIZ];
  287. X  DIRENT **namelist;
  288. X
  289. X  chdir(NEWS_SPOOL);
  290. X  GroupToDir(group,dirname);
  291. X  chdir(dirname);
  292. X  max = scandir(".",&namelist,DirSelect,NULL);
  293. X  if (max == -1)
  294. X    {
  295. X      perror(dirname);
  296. X      fprintf(stderr,"Cannot scan %s/%s\n",NEWS_SPOOL,group);
  297. X      return;
  298. X    }
  299. X  for (i = 0; i < max; i++)
  300. X    {
  301. X      art_num = atoi(namelist[i]->d_name);
  302. X      if (art_num < *first)
  303. X    ProcArticle(namelist[i]->d_name,group);
  304. X      else if (art_num > *last)
  305. X    ProcArticle(namelist[i]->d_name,group);
  306. X      if (art_num && art_num < nf)
  307. X    nf = art_num;
  308. X      if (art_num && art_num > nl)
  309. X    nl = art_num;
  310. X    }
  311. X  *first = nf;
  312. X  *last = nl;
  313. X}
  314. X
  315. XFILE *OpenLog(group_name)
  316. Xchar *group_name; {
  317. X  char tmp[BUFSIZ], ln[BUFSIZ];
  318. X  FILE *logfile;
  319. X
  320. X  sprintf(tmp,LOGFILE,group_name);
  321. X  sprintf(ln,"%s/%s",logdir,tmp);
  322. X  CreateDirAndFile(ln,NULL);
  323. X  if (!(logfile = fopen(ln,"w")))
  324. X    {
  325. X      perror(ln);
  326. X      logfile = stderr;
  327. X    }
  328. X  return logfile;
  329. X}
  330. X
  331. Xvoid ProcName(group_name, backtodir)
  332. Xchar *group_name, *backtodir; {
  333. X  FILE *tmp;
  334. X  int first, last;
  335. X  long now;
  336. X
  337. X  now = time((long *) 0);
  338. X  logfile = OpenLog(group_name);
  339. X  tmp = fopen(group_name,"r");
  340. X  if (!tmp)
  341. X    {
  342. X      first = 9999;
  343. X      last = 0;
  344. X    }
  345. X  else
  346. X    {
  347. X      fscanf(tmp,"%d %d",&first,&last);
  348. X      fclose(tmp);
  349. X    }
  350. X  fprintf(logfile," -- Processing group %s (%d %d) at %s",group_name,first,
  351. X      last,ctime(&now));
  352. X  fprintf(stderr,"Processing group %s (%d %d)\n",group_name,first,last);
  353. X  ProcGroup(group_name,&first,&last);
  354. X  chdir(backtodir);
  355. X  tmp = fopen(group_name,"w");
  356. X  fprintf(tmp,"%d %d\n",first,last);
  357. X  fclose(tmp);
  358. X  if (logfile != stderr)
  359. X    fclose(logfile);
  360. X  fprintf(stderr,"Processed  group %s (%d %d)\n",group_name,first,last);
  361. X}
  362. X
  363. X
  364. Xvoid Usage(s,pn)
  365. Xchar *s, *pn; {
  366. X  fprintf(stderr,"Unknown option %s\n",s);
  367. X  fprintf(stderr,"Usage: %s [-sn] [-l logdir] [-f group_file | group1 .. groupn]\n",pn);
  368. X  exit(1);
  369. X}
  370. X
  371. Xmain(argc,argv)
  372. Xchar **argv; {
  373. X  FILE *from_file = NULL;
  374. X  char cwd[BUFSIZ], *pname = *argv;
  375. X  
  376. X  getcwd(cwd,BUFSIZ);
  377. X  while (++argv, --argc)
  378. X    {
  379. X      if (**argv == '-')
  380. X    {
  381. X      switch (argv[0][1])
  382. X        {
  383. X        case 's' : case 'S' : Supercede_P = 1; break;
  384. X        case 'n' : case 'N' : Supercede_P = 0; break;
  385. X        case 'l' : case 'L' : logdir = argv[1]; argv++; argc--; break;
  386. X        case '#' : force_number = 1; break;
  387. X        case 'a' : force_number = 0; break;
  388. X        case 'f' : case 'F' : 
  389. X          from_file = fopen(argv[1],"r"); 
  390. X          if (!from_file)
  391. X        {
  392. X          perror(argv[1]);
  393. X          argv++; argc--; 
  394. X        }
  395. X          break;
  396. X        default: Usage(*argv,pname);
  397. X        }
  398. X      continue;
  399. X    }
  400. X      if (from_file)
  401. X    {
  402. X      char gname[BUFSIZ];
  403. X
  404. X      while (fgets(gname,BUFSIZ,from_file))
  405. X        {
  406. X          gname[strlen(gname)-1] = '\0';
  407. X          ProcName(gname,cwd);
  408. X        }
  409. X      fclose(from_file);
  410. X      from_file = NULL;
  411. X    }
  412. X      else 
  413. X    ProcName(*argv,cwd);
  414. X    }
  415. X}
  416. X
  417. X      
  418. SHAR_EOF
  419. $TOUCH -am 0222162391 news_split.c &&
  420. chmod 0644 news_split.c ||
  421. echo "restore of news_split.c failed"
  422. set `wc -c news_split.c`;Wc_c=$1
  423. if test "$Wc_c" != "8228"; then
  424.     echo original size 8228, current size $Wc_c
  425. fi
  426. fi
  427. # ============= patchlevel.h ==============
  428. if test X"$1" != X"-c" -a -f 'patchlevel.h'; then
  429.     echo "File already exists: skipping 'patchlevel.h'"
  430. else
  431. echo "x - extracting patchlevel.h (Text)"
  432. sed 's/^X//' << 'SHAR_EOF' > patchlevel.h &&
  433. X/*
  434. X * patchlevel.hfor news_split.
  435. X * First patch updates from v1.6 to v1.7
  436. X * there was NO PATCHLEVEL 1
  437. X */
  438. X
  439. X#define PATCHLEVEL 2
  440. SHAR_EOF
  441. $TOUCH -am 0222111391 patchlevel.h &&
  442. chmod 0644 patchlevel.h ||
  443. echo "restore of patchlevel.h failed"
  444. set `wc -c patchlevel.h`;Wc_c=$1
  445. if test "$Wc_c" != "130"; then
  446.     echo original size 130, current size $Wc_c
  447. fi
  448. fi
  449. # ============= Makefile ==============
  450. if test X"$1" != X"-c" -a -f 'Makefile'; then
  451.     echo "File already exists: skipping 'Makefile'"
  452. else
  453. echo "x - extracting Makefile (Text)"
  454. sed 's/^X//' << 'SHAR_EOF' > Makefile &&
  455. XALLFILES = news_split.c patchlevel.h Makefile README INSTALL
  456. X
  457. X# for system with no scandir function add -DNOSCANDIR to CFLAGS
  458. X# for system with no <unistd.h> file, add -dNOUNISTD  to CFLAGS
  459. X# if you want to save in compressed format add
  460. X#     -DCOMPRESS=\"compress\" to CFLAGS
  461. X
  462. XCFLAGS = -O -DCOMPRESS=\"compress\i
  463.  
  464. exit 0 # Just in case...
  465. -- 
  466. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  467. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  468. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  469. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  470.