#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# Contents:  src/mb-daemon.c src/misc.c src/uptodate.c
# Wrapped by kent@sparky on Fri Feb  5 12:18:07 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:
echo '          "shar: End of archive 6 (of 15)."'
if test -f 'src/mb-daemon.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/mb-daemon.c'\"
else
  echo shar: Extracting \"'src/mb-daemon.c'\" \(24038 characters\)
  sed "s/^X//" >'src/mb-daemon.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*	    PROGRAMM  ix/Mbox						   */
X/*             DATEI  mb-daemon.c					   */
X/*        FUNKTIONEN  reflector(), scan(), mix(), main()		   */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)		   */
X/*  LETZTE AENDERUNG  16.09.1992					   */
X/***************************************************************************/
X
X#ifndef _ESTDIO
X#include <stdio.h>
X#else
X#include <estdio.h>
X#endif
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <time.h>
X#include <dirent.h>
X
X#include "mbox.h"
X
X
Xint FASTMODE;
X
X
Xint mb_gruppen;
Xint mb_new;
Xlong mb_bytes;
Xlong mb_new_bytes;
Xlong mb_artikel;
X
X#ifdef ADDRMODE
XFILE *ad;
X#endif
X
X/***************************************************************************/
X/*      FUNKTION  reflector()						   */
X/*  BESCHREIBUNG  Sendet eine persoenliche Mail an den Autor eines Arti-   */
X/*		  kels in einer bestimmten NG.	                           */
X/*			                                                   */
X/*		  VORSICHT: Wilde Reflectoren werden vom Netz getrennt !!! */
X/*     PARAMETER  arg  =  DUMMY (?)                                        */
X/*		  msg  =  Artikel                                          */
X/*     RUECKGABE  -1   =  Artikel nicht gefunden                           */
X/*                0    =  Ok					 	   */
X/***************************************************************************/
X
Xint FLAG;
X
Xint reflector(arg, msg)
Xunsigned char arg[];
Xunsigned char msg[];
X{
X  FILE *fp;
X  FILE *ff;
X
X  unsigned char s[255];
X  unsigned char tmp[STRING];
X
X  unsigned char receiver[STRING];
X
X  unsigned char path[255];
X  unsigned char reply_to[255];
X  unsigned char from[255];
X  unsigned char sender[255];
X  unsigned char subject[255];
X  unsigned char summary[255];
X  unsigned char keywords[255];
X  unsigned char newsgroups[255];
X  unsigned char followup_to[255];
X  unsigned char distribution[255];
X  unsigned char date[255];
X  unsigned char lines[255];
X  unsigned char message_id[255];
X  unsigned char organization[255];
X  unsigned char posted[255];
X  unsigned char article_id[255];
X  unsigned char nntp_post[255];
X  unsigned char references[255];
X
X  int id_err = 0;
X  int i;
X  int inlines;
X
X  int reply = 0;
X  int noreply = 0;
X  int dirlist = 0;
X  int logfile = 0;
X  int info = 0;
X  int minimal = 0;
X  long timer;
X
X  int ok = 0;
X
X  fp = fopen(msg, "r");
X  if (fp == NULL) return -1;
X
X  sprintf(tmp, "%s/%d", TMP, getpid());
X  ff = fopen(tmp, "w");
X  
X  i = 1;
X  inlines = -1;
X
X  while (fgets(s, 255, fp) != NULL) {
X	ok = 0;
X	if (strcomp("Path:", s) == 0) {
X		sprintf(path, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Reply-To:", s) == 0) {
X		sprintf(reply_to, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		reply--;
X		ok++;
X	}
X	if (strcomp("From:", s) == 0) {
X		sprintf(from, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Sender:", s) == 0) {
X		sprintf(sender, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Subject:", s) == 0) {
X		sprintf(subject, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Summary:", s) == 0) {
X		sprintf(summary, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Keywords:", s) == 0) {
X		sprintf(keywords, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Newsgroups:", s) == 0) {
X		sprintf(newsgroups, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Followup-To:", s) == 0) {
X		sprintf(followup_to, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Distribution:", s) == 0) {
X		sprintf(distribution, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Date:", s) == 0) {
X		sprintf(date, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Lines:", s) == 0) {
X		sprintf(lines, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Message-I", s) == 0) {
X		sprintf(message_id, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		/*
X		if (s[9] == 'D') id_err++;
X		*/
X		ok++;
X	}
X	if (strcomp("Organization:", s) == 0) {
X		sprintf(organization, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Posted:", s) == 0) {
X		sprintf(posted, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Article-I.D.:", s) == 0) {
X		sprintf(article_id, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("Nntp-Posting-Host:", s) == 0) {
X		sprintf(nntp_post, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X	if (strcomp("References:", s) == 0) {
X		sprintf(references, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
X		ok++;
X	}
X
X
X
X	if (strcomp("NO REPLY", s)        == 0 ||
X	    strcomp("NOT REPLY", s)       == 0 ||
X	    strcomp("KEIN REPLY", s)      == 0 ||
X	    strcomp("NO REPLIES", s)      == 0 ||
X	    strcomp("KEINE REPLIES", s)   == 0 ||
X	    strcomp("NO REPLYS", s)       == 0 ||
X	    strcomp("KEINE REPLYS", s)    == 0 ||
X	    strcomp("KEINE ANTWORTEN", s) == 0 ||
X	    strcomp("NICHT ANTWORTEN", s) == 0 ||
X	    strcomp("NO REFLECT", s)      == 0 ||
X	    strcomp("NOT REFLECT", s)     == 0 ||
X	    strcomp("NO ANSWER", s)       == 0 ||
X	    strcomp("NOT ANSWER", s)      == 0 ||
X	    strcomp("IGNORE", s)          == 0)
X		noreply++;
X
X	if (strcomp("PLEASE REPLY", s)    == 0 ||
X	    strcomp("BITTE REPLY", s)     == 0 ||
X	    strcomp("PLEASE REFLECT", s)  == 0 ||
X	    strcomp("BITTE REFLECT", s)   == 0 ||
X	    strcomp("BITTE ANTWORT", s)   == 0 ||
X	    strcomp("REPLY", s)           == 0 ||
X	    strcomp("REFLECT", s)         == 0 ||
X	    strcomp("ANTWORT", s)         == 0)
X		reply++;
X
X	if (strcomp("DIRLIST", s) == 0) dirlist++;
X
X	if (strcomp("LOGFILE", s) == 0) logfile++;
X
X	if (strcomp("INFO", s) == 0 ||
X	    strcomp("HELP", s) == 0)
X		info++;
X
X	if (strcomp("SHORT", s) == 0) minimal++;
X
X	if (ok == 0) {
X		/* Sprintf(s, "%02d Body >> %s <<\n\n", i, (unsigned char *) stripped(s)); */
X		inlines++;
X	}
X	i++;
X  }
X  fclose(fp);
X
X  strcpy(s, (unsigned char *) strcopy(organization, 19, 80));
X  if ((FLAG == 1) && (strcomp(ORGANIZATION, s) != 0)) return -1;
X
X  if (reply_to[0] != '\0') {
X	strcpy(receiver, (unsigned char *) strcopy(reply_to, 15, 80));
X  } else {
X	strcpy(receiver, (unsigned char *) strcopy(from, 11, 80));
X  }
X
X  i = 0;
X  while ((receiver[i] != '\0') && (receiver[i] != '(')) i++;
X  receiver[(i - 1)] = '\0';
X
X
X
X  time(&timer);
X
X  fprintf(ff, "From: reflector@%s (Reflecting Device)\n", UUCPID2); 
X  fprintf(ff, "Reply-To: postmaster@%s (Reflectors' Boss)\n", UUCPID2);
X  fprintf(ff, "Organization: %s\n", ORGANIZATION);
X  if(message_id[0] != '\0'){
X	fprintf(fp, "References: %s", message_id);
X  }
X  fprintf(ff, "To: %s\n", receiver);
X  fprintf(ff, "Subject: *Reflexion*\n");
X  fprintf(ff, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);	
X  fprintf(ff, "Message-Id: <%x.reflector@%s>\n", timer, UUCPID2);
X  fputs("\n", ff);
X
X
X
X  fp = fopen(REFLECT_LOG, "a");
X  if (fp == NULL) {
X	while (1) printf("%c", 7);
X  }
X  fprintf(fp, "%s - %s", (unsigned char *) mydate(1), from);
X  fprintf(fp, "         - %s", message_id);
X  fprintf(fp, "         - %s", subject);
X  if (dirlist != 0) {
X	fprintf(fp, "         - DIRLIST-Request\n");
X  }
X  if (logfile != 0) {
X	fprintf(fp, "         - LOGFILE-Request\n");
X  }
X  if (info != 0) {
X	fprintf(fp, "         - INFO-Request\n");
X  }
X  fprintf(fp, "         - Reflected to %s\n\n", receiver);
X  fclose(fp);
X
X
X  fprintf(ff, "%s\n\n", MVERSION);
X
X
X  if ((dirlist == 0) && (logfile == 0) && (info == 0) && (minimal == 0)) {
X	fprintf(ff, "That's what we received in NG \"%s\" ...\n\n", arg);
X
X	fputs(path, ff);
X	fputs(from, ff);
X	fputs(reply_to, ff);
X	fputs(sender, ff);
X	fputs(newsgroups, ff);
X	fputs(subject, ff);
X	fputs(article_id, ff);
X	fputs(posted, ff);
X	fputs(nntp_post, ff);
X	fputs(summary, ff);
X	fputs(keywords, ff);
X	fputs(followup_to, ff);
X	fputs(distribution, ff);
X	fputs(references, ff);
X	fputs(message_id, ff);
X	fputs(organization, ff);
X	fputs(date, ff);
X	fputs(lines, ff);
X
X
X	fputs("\n\nDiagnostics ...\n\n", ff);
X
X	ok = 0;
X
X	if (id_err != 0) {
X		fprintf(ff, "- \"Message-ID\" may cause trouble ... use \"Message-Id\".\n\n");
X		ok++;
X	}
X	if (reply_to[0] == '\0') {
X		fprintf(ff, "- No \"Reply-To\"-Path ... not a problem.\n\n");
X		ok++;
X	}
X	i = atoi((unsigned char *) strcopy(lines, 12, 80));
X	inlines--;
X	if (inlines != i) {
X		fprintf(ff, "- Your Header reports %d lines ... we counted %d.\n\n", i, inlines);
X		ok++;
X	}
X	if ((reply != 0) || (noreply != 0)) {
X		fprintf(ff, "- Found %d Reply-Requests and %d No-Replies.\n\n", reply, noreply);
X		ok++;
X	}
X
X	if (ok == 0) {
X		fprintf(ff, "- Everything seems to be correct!\n\n");
X	}
X  }
X
X	
X  if (dirlist != 0) {
X	fp = fopen(DIRLIST, "r");
X	if (fp != NULL) {
X		fputs("DIRLIST:\n\n", ff);
X		while (fgets(s, 250, fp) != NULL) fputs(s, ff);
X		fclose(fp);
X	} else {
X		fputs("Sorry, no DIRLIST-Entry found ...\n\n", ff);
X	}
X	printf("\n\n");
X  }
X  if (logfile != 0) {
X	fp = fopen(REFLECT_LOG, "r");
X	if (fp != NULL) {
X		fputs("LOGFILE:\n\n", ff);
X		while (fgets(s, 250, fp) != NULL) fputs(s, ff);
X		fclose(fp);
X	} else {
X		fputs("Sorry, no LOGFILE-Entry found ...\n\n", ff);
X	}
X	printf("\n\n");
X  }
X  if (info != 0) {
X	fputs("INFO (weitere Schluesselwoerter):\n\n", ff);
X	fputs("LOGFILE - Wenn der Reflektor nicht reflektiert, kann man sich\n", ff);
X	fputs("          das LOGFILE senden lassen, um zu ueberpruefen ob der\n", ff);
X	fputs("		         Artikel jemals erfasst worden ist.\n\n", ff);
X
X	fputs("DIRLIST - Eine Liste des lokalen MINIX-Archivs. Da der Reflektor\n", ff);
X	fputs("          (noch) kein PD-Server ist, kann man diese Liste nur zu\n", ff);
X	fputs("          Testzwecken anfordern.\n\n", ff);
X
X	fputs("SHORT   - Quittiert nur den Empfang des Artikels.\n\n", ff);
X  }
X  if (minimal != 0) {
X	fprintf(ff, "Received your article %s", message_id);
X  }
X  fclose(ff);
X
X  sprintf(s, "/bin/sh ./etc/rmail.sh %s %s", tmp, receiver);
X  system(s);
X
X  unlink(tmp);
X
X  return 0;
X}
X
X
X
X/***************************************************************************/
X/*      FUNKTION  pdsize()						   */
X/*  BESCHREIBUNG  Groesse eine PD-Datei ermitteln 			   */
X/*     PARAMETER  arg - Name des NG-Eintrags                               */
X/*     RUECKGABE  Groesse in kBytes                                        */
X/***************************************************************************/
X
Xint pdsize( arg )
Xunsigned char arg[];
X{
X  FILE *fp;
X  unsigned char s[STRING];
X  int ok = 0, i;
X  struct stat fstat;
X
X  fp = fopen( arg, "r" );
X  if(fp == NULL){
X	return (int) 0;
X  }
X  while((ok == 0) && (fgets(s, 80, fp) != NULL)){
X	if(strcomp("BINFILE", s) == 0) ok++;
X  }
X  fgets(s, 80, fp);
X  fclose(fp);
X
X  if(ok == 0) strcpy(s, (unsigned char *) arg);
X
X  if(stat((unsigned char *) stripped(s), &fstat) != NULL){
X	return (int) 0;
X  }
X  i = (int) (fstat.st_size / 1024);
X  if(i < 1) i = 1;
X  return (int) i;
X}
X
X
X
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  scan()						   */
X/*  BESCHREIBUNG  Filtert einen NEWS-Artikel, und erstellt einen Eintrag   */
X/*		  fuer das entsprechenden INDEX-Files der ix/Mbox.	   */
X/*     PARAMETER  arg  =  NG                                               */
X/*     RUECKGABE  Datum des aktuellsten Artikels                           */
X/***************************************************************************/
X
Xunsigned char *scan(arg)
Xunsigned char arg[];
X{
X  FILE *ff;
X  FILE *fp;
X  FILE *fl;
X  FILE *ft;
X  FILE *fg;
X
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char f[STRING];
X  unsigned char v[STRING];
X  unsigned char from[STRING];
X  unsigned char subj[STRING];
X  unsigned char date[STRING];
X  unsigned char line[STRING];
X  unsigned char orga[STRING];
X  unsigned char Ndir[STRING];
X  unsigned char Ldir[STRING];
X  unsigned char Tdir[STRING];
X  unsigned char ex[1024];
X  unsigned char et[355];
X
X  int dirarray[MAX_PER_NG];
X  int idp = 0, iii = 0;
X
X  DIR *dp;
X  struct dirent *actdir;
X
X
X  static unsigned char sdate[STRING];
X
X  unsigned char today[STRING];
X  unsigned char thatday[STRING];
X  unsigned char arti[STRING];
X
X  int i, j;
X  int ok = 0;
X  int a, b;
X  int BINFILE = 0;
X  int PDGROUP = 0;
X  int fsi = 0;
X  int seq = 0;
X  int OLDENTRY = 0;
X  int OLDn = 0;
X  int OLDo = 0;
X  int got_org = 0;
X
X  struct stat fstat;
X  struct tm *tp;
X
X  i = 0;
X  while (arg[i] != '\0') {
X	t[i] = arg[i];
X	if (t[i] == '.') t[i] = '/';
X	i++;
X  }
X  t[i] = '\0';
X
X  sprintf(Ndir, "%s/%s", NEWS, t);
X
X  if(length(arg) > 14){
X#ifndef _LONGNAMES
X	strcpy(s, (unsigned char *) shortname(arg));
X#else
X	strcpy(s, (unsigned char *) arg);
X#endif
X	sprintf(Ldir, "%s/%s", LIB, s);
X  } 
X  else{
X	sprintf(Ldir, "%s/%s", LIB, arg);
X  }
X  strcpy(Ldir, (unsigned char *) stripped(Ldir));
X
X  sprintf(Tdir, "%s/TD.%d", TMP, getpid());
X
X  if (FLAG == 0) printf("\n%s...\n", Ndir);
X
X  sprintf(f, "%s/%dA", TMP, getpid());
X
X
X  dp = opendir( Ndir );
X  if(dp == NULL){
X	printf("::No such directory!\n\n");
X	return "";
X  }
X  while((actdir = readdir(dp)) != NULL){
X	 dirarray[idp] = atoi(actdir->d_name);
X	 if(dirarray[idp] != 0) idp++;
X	 if(idp >= MAX_PER_NG){
X		nerror("mb-daemon.c", 506, "scan", "Verzeichnis zu gross > ", Ndir );		
X	 }
X  }
X  closedir(dp);
X
X  for(i = 0; i < idp; i++){
X	for(j = 0; j< idp; j++){
X		if(dirarray[i] > dirarray[j]){
X			a = dirarray[j];
X			dirarray[j] = dirarray[i];
X			dirarray[i] = a;
X		}
X        }
X  } 
X
X  if(idp == 0){
X	if (FLAG == 0) printf("::Directory is empty!\n\n");
X	ft = fopen(Ldir, "w");
X	fputs(" ", ft);
X	fclose(ft);
X	return "";
X  }
X
X  sprintf(sdate, "%s", ":-)");
X
X  sprintf(today, "%s", (unsigned char *) mydate(1));
X
X
X  ft = fopen(Ldir, "r");
X  if(ft == NULL){
X	ft = fopen(Ldir, "w");
X	fputs("\n\n0\n", ft);
X	fclose(ft);
X	ft = fopen(Ldir, "r");
X	OLDo = -2;
X  }
X  fgets(s, 81, ft);
X  fgets(s, 81, ft);
X  fgets(s, 81, ft);
X  OLDENTRY = atoi(s); 
X
X  mblock(Ldir);
X
X  ff = fopen(Tdir, "w");
X
X  seq = 0;
X
X  mb_gruppen++;
X
X
X  if(strcomp(PDNG, arg) == 0){
X	PDGROUP++;	
X	fprintf(ff, "%s\n", GBL08_MSG); 
X  }
X  else{
X	fprintf(ff, "%s\n", GBL05_MSG);
X  }
X  fputs("===============================================================================\n", ff);
X
X  while (iii < idp) {
X
X	if((dirarray[iii] < OLDENTRY) && (FASTMODE == 1)) goto YET_SCANNED;
X
X	OLDn++;
X
X	seq++;
X	BINFILE = 0;
X	fsi++;
X
X	sprintf(arti, "%s/%d", Ndir, dirarray[iii]);  
X	strcpy(t, (unsigned char *) arti); /* ??? */
X
X	if (FLAG == 0) printf("%s: ", t);
X
X	fp = fopen(t, "r");
X	if (fp != NULL) {
X
X		stat(t, &fstat);
X		tp = localtime(&fstat.st_mtime);
X
X		if(fstat.st_mode & S_IFDIR) goto OFF_HERE;
X
X		mb_bytes += (long) fstat.st_size;
X		sprintf(thatday, "%02.2d.%02.2d.%02.2d", tp->tm_mday, tp->tm_mon + TZS, tp->tm_year);
X		if(strcomp(thatday, today) == 0) mb_new_bytes += (long) fstat.st_size;
X
X		if (sdate[0] == ':') {
X			sprintf(sdate, "%4.4d%02.2d%02.2d",
X				1900 + tp->tm_year, tp->tm_mon + TZS, tp->tm_mday);
X			sprintf(s, "%02.2d:%02.2d",
X				tp->tm_hour, tp->tm_min);
X			LASTTIME = timeconv(s);
X			if (FLAG == 0) printf(" (%s) ", sdate);
X			if(strcomp(thatday, today) == 0) mb_new++;
X		}
X		if ((strcomp(arg, REFLECT_NG) == 0) || (strcomp(arg, "local.test") == 0)) {
X			if (strcomp(thatday, today) == 0) {
X				reflector(arg, t);
X			}
X		}
X		from[0] = '\0';
X		subj[0] = '\0';
X		date[0] = '\0';
X		line[0] = '\0';
X		orga[0] = '\0';
X
X		got_org = 0;
X		i = 0;
X
X		while((got_org == 0) && (i < 20)){
X			fgets(ex, 1024, fp);
X#ifdef ADDRMODE
X			if (strcomp("de.", arg) == 0) {
X				if (strcomp("Path:", ex) == 0) {
X					fprintf(ad, "%s\n", (unsigned char *) stripped(ex));
X				}
X			}
X#endif
X			ex[80] = '\0'; strcpy(s, ex);
X			if (strcomp("From:", s) == 0) {
X				strcpy(from, s);
X			}
X			if (strcomp("Reply-To:", s) == 0) {
X				strcpy(from, s);
X			}
X			if (strcomp("Subject:", s)      == 0) strcpy(subj, s);
X			if (strcomp("Date:", s)         == 0) strcpy(date, s);
X			if (strcomp("Lines:", s)        == 0) strcpy(line, s);
X			if (strcomp("BINFILE", s)       == 0) BINFILE++;
X			if (strcomp("Organization:", s) == 0) strcpy(orga, s);
X			if (strlen(s) < 3) got_org++;
X			i++;
X		}
X
X#ifdef ADDRMODE		
X		if (strcomp("de.", arg) == 0) {
X			fprintf(ad, "%s\n", (unsigned char *) stripped(from));
X			fprintf(ad, "%s\n", (unsigned char *) stripped(orga));
X		}
X#endif
X
X		if (FLAG == 0) printf("%s", subj);
X
X		if ((from[0] == 'F') || (from[0] == 'R')) {
X
X			sprintf(s, "%d        ", dirarray[iii]);
X			s[6] = '\0';
X			if (BINFILE != 0) s[5] = '*';
X
X			subj[79] = '\0';
X			strcpy(ex, (unsigned char *) strcopy(subj, 8, 79));
X			strcpy(et, (unsigned char *) stripped(ex));
X			strcpy(ex, et);
X			strcat(ex, "                           ");
X			ex[25] = '\0';
X			strcat(s, ex);
X			strcat(s, "   ");
X
X			
X			i = 5; /* 8 */
X			if (from[0] == 'R') i = 10;
X
X			from[79] = '\0';
X			strcpy(ex, (unsigned char *) strcopy(from, i, 80));
X			strcpy(et, (unsigned char *) stripped(ex));
X			strcpy(ex, et);
X
X			a = 0;
X			b = 0;
X			i = 0;
X			while (ex[i] != '\0') {
X				if (ex[i] == '(') a = i + 1;
X				if (ex[i] == ')') b = i - 1;
X				i++;
X			}
X			if (a < b) {
X				strcpy(et, (unsigned char *) strcopy(ex, a, b));
X				strcpy(ex, et);
X			}
X			strcat(ex, "                           ");
X			ex[19] = '\0';
X			strcat(s, ex);
X			strcat(s, "   ");
X
X
X			i = 0;
X			j = 0;
X			while (date[i] != '\0') {
X				if (j == 0) {
X					if ((date[i] >= '1') && (date[i] <= '9'))
X						j = i;
X				}
X				i++;
X			}
X
X			sprintf(ex, "%02.2d.%02.2d.%02.2d  %02.2d:%02.2d",
X			 tp->tm_mday, tp->tm_mon + TZS, tp->tm_year,
X				tp->tm_hour, tp->tm_min);
X			strcat(ex, "                         ");
X			ex[15] = '\0';
X			strcat(s, ex);
X			strcat(s, "  ");
X
X			strcpy(ex, (unsigned char *) strcopy(line, 7, 20));
X			strcpy(t, (unsigned char *) stripped(ex));
X			i = atoi(t);
X			sprintf(ex, "%-6.d", i);
X		
X			if(PDGROUP != 0){
X				i = pdsize(arti);
X				sprintf(ex, "%-6.d", i);
X				if(i == 0){
X					fg = fopen( CPRN, "a" );
X				        if(fg != NULL){
X						fprintf(fg, "\nMB-DAEMON -> %23.23s | %s\n", s, arti);
X						fclose(fg);
X					}
X				}
X			}
X
X			strcat(s, ex);
X			fputs(s, ff);
X			fputs("\n", ff);
X
X			mb_artikel++;
X
X			ok = 1;
X		} else {
X			if (FLAG == 0) printf("invalid header!\n");
X		}
X
X		OFF_HERE:
X
X		if (fp != 0) fclose(fp);
X	} else {
X		if (FLAG == 0) printf("can't open!\n");
X	}
X	iii++;
X  }
X
X  YET_SCANNED:
X
X  if(OLDn != 0) OLDn -= 1;
X
X  idp -= 2; /* ??? */
X
X  while(iii < idp){
X	if((OLDn != 0) || (FASTMODE == 0)){
X		fgets(s, 81, ft); 
X		fputs(s, ff);
X	}
X	if(FLAG == 0){
X		sprintf(t, "%s/%d", Ndir, dirarray[iii]);
X		stat(t, &fstat);
X		mb_bytes += (long) fstat.st_size;
X	}
X	mb_artikel++;
X	OLDo++;
X	iii++;
X  }
X
X  if((OLDn != 0) || (FASTMODE == 0)){
X	fgets(s, 81, ft);
X	if((FASTMODE == 1) && (OLDo > 0)) fputs(s, ff);
X	fclose(ff);
X	fclose(ft);
X	if(rename( Tdir, Ldir ) != 0){
X		ff = fopen( Tdir, "r");
X		ft = fopen( Ldir, "w");
X		while(fgets(s, 81, ff) != NULL){
X			fputs(s, ft);
X		}
X	}
X  }
X  if (ff != 0) fclose(ff);
X  if (ft != 0) fclose(ft);
X
X  unlink(f);
X  unlink(Tdir);
X
X
X  if (sdate[0] == ':') {
X	sprintf(sdate, "%s", "19700101");
X	LASTTIME = 0;
X  }
X
X#ifdef _SYS7
X  if ((seq > MAX_PER_NG) && (FLAG == 0) && (strcomp("local", arg) != 0)) {
X	sprintf(s, "%s -n %s -e %d", EXPIRE, arg, EXPIRED_DAYS);
X	printf("%s\n", s);
X	system(s);
X	sprintf(s, "%s %s EXP", MB_DAEMON, arg);
X	system(s);
X  }
X#endif
X  
X  mbunlock(Ldir);
X
X  if((FASTMODE == 1) && (FLAG == 0)){
X	OLDo += 2;
X	printf("\n==> %s %d. %s %d.\n\n", MBD01_MSG, OLDn, MBD02_MSG, OLDo);
X  }
X  
X  return (unsigned char *) sdate;
X}
X
X
X
X/***************************************************************************/
X/*      FUNKTION  mix()							   */
X/*  BESCHREIBUNG  Aktualisiert einzelnen Eintraege im AGROUPS-File.	   */
X/*     PARAMETER  s  =  NG                                                 */
X/*		  t  =  Neuer AGROUPS-Eintrag                              */
X/*     RUECKGABE  keine                                                    */
X/***************************************************************************/
X
Xvoid mix( s, t )
Xunsigned char s[], t[];
X{
X  FILE *ff, *fp;
X  unsigned char tmp[STRING];
X  unsigned char f[STRING];
X
X  sprintf(tmp, "%s/ff%d", TMP, getpid());
X
X
X  maybe_locked( AGROUPS, "r" );
X  fp = fopen( AGROUPS, "r" );
X  if(fp == NULL){
X	printf("%s ?", AGROUPS);
X	exit(-1);
X  }
X
X  ff = fopen( tmp, "w" );
X  if(ff == NULL){
X	printf("%s ?", tmp);
X	exit(-1);
X  }
X
X  while(fgets(f, 80, fp) != NULL){
X	if(strcomp(s, f) == 0){
X		fputs(t, ff);
X	}
X	else{
X		fputs(f, ff);
X	}
X  }
X  fclose(fp);
X  fclose(ff);
X
X  sprintf(f, "mv %s %s", tmp, AGROUPS);
X  system( f );
X}
X
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  main() (mb_daemon)					   */
X/*  BESCHREIBUNG  Scannt einen bzw. alle NEWS-Artikel, um die INDEX-Files  */
X/*		  der ix/Mbox zu aktualisieren.                            */
X/*     PARAMETER  argc  =  Anzahl der Parameter                            */
X/*		  argv  =  NG  = nur diese NG scannen 			   */
X/*			   ''  = alle NGs scannen     			   */
X/*     RUECKGABE  keine                                                    */
X/***************************************************************************/
X
Xmain(argc, argv)
Xint argc;
Xunsigned char *argv[];
X{
X  FILE *fp;
X  FILE *fa;
X  FILE *fc;
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char d[STRING];
X  unsigned char TMP_AGROUPS[STRING];
X
X  int a, b, i;
X
X  chdir(HOME);
X
X  setuid(0);
X  setgid(0);
X  umask(0000);
X
X  FLAG = 0;
X  FASTMODE = 1;
X
X  sprintf(TMP_AGROUPS, "%s/ACTIVE.%d", TMP, getpid() );
X
X  if(argc > 1){
X	FLAG++;
X  }
X  if(argc > 2){			/* MB-Daemon ruft MB-Daemon !!! */
X	FLAG++; 
X	FASTMODE = 0; 
X  }
X
X  if(strcomp("all", argv[1]) == 0) FLAG = 0;
X
X#if 0
X  if(argv[2][0] == '-'){	/* Index KOMPLETT neu bilden !!! */
X	FASTMODE = 0;
X  }
X#endif
X
X  if(FLAG == 0){
X	fa = fopen( TMP_AGROUPS, "w" );
X	if(fa == NULL){
X		printf("%s ???", TMP_AGROUPS);
X		exit( 0 );
X	}
X  }
X
X#ifdef ADDRMODE
X    ad = fopen( "/local/address/addresses", "a" );
X    if(ad == NULL){
X	printf("\n[local/address/addresses] ???\n");
X	exit( 0 );	
X    }
X#endif
X
X  mb_gruppen = 0;
X  mb_new = 0;
X  mb_bytes = 0L;
X  mb_new_bytes = 0L;
X  mb_artikel = 0L;
X
X
X  if (fp = fopen(NGROUPS, "r"))
X  while (fscanf(fp, "%s %d %d %s", s, &a, &b, t) > 0) {
X#ifdef _CNEWS
X	if(t[0] == '=')
X		continue;
X#endif
X	if(FLAG > 0){
X		if(strcomp(argv[1], s) == 0){
X			d[0] = '\0';
X#ifdef _SYS7
X			strcat(d, (unsigned char *) scan(s));
X#else
X			strcat(d, (unsigned char *) scan(&s));
X#endif
X			sprintf(t, "%s  %s  %ld\n", s, d, LASTTIME);
X			if(FLAG < 2) mix( s, t );
X		}
X	}
X	else{
X		d[0] = '\0';
X#ifdef _SYS7	
X		strcat(d, (unsigned char *) scan(s));
X#else	
X		strcat(d, (unsigned char *) scan(&s));
X#endif
X		fprintf(fa, "%s  %s  %ld\n", s, d, LASTTIME);
X	}
X  }
X  if(fp != 0) fclose(fp);
X
X  if(FLAG > 0){
X  }
X  else{
X     mb_bytes = (long)(mb_bytes / 1024);
X     mb_new_bytes = (long)(mb_new_bytes /1024);
X   
X     sprintf(d, "%s/%d.mbd", TMP, getpid());
X     fp = fopen( d, "w" );
X     fprintf(fp, "%s  %s    %6.d   %6.ld",
X                  mydate(1), mytime(1), mb_new, mb_new_bytes);
X     fprintf(fp, "%16.16s", " ");
X     fprintf(fp, "%6.d   %6.ld   %6.ld\n", mb_gruppen, mb_artikel, mb_bytes);
X
X     b = PRO_ENTRIES / 2; a = 0;
X
X     fc = fopen( MB_DLOG, "r" );
X     if(fc != 0){
X	while((fgets(s, STRING, fc) != 0) && (a < b)){
X		fputs(s, fp);
X		a++;
X	}
X	fclose(fc);
X     }
X     if(fp != 0) fclose(fp);
X
X     sprintf(s, "mv %s %s > /dev/null", d, MB_DLOG);
X     system(s);
X  } 
X
X  if((FASTMODE == 1) && (FLAG == 0)){
X	printf("%s %d %s %ld %s.\n", MBD03_MSG, mb_new, MBD04_MSG, 
X		mb_new_bytes, MBD05_MSG);
X	printf("%s %d %s %ld %s %ld %s.\n\n", 
X		MBD06_MSG, mb_gruppen, MBD07_MSG, mb_artikel, MBD08_MSG, 
X		mb_bytes, MBD09_MSG);
X  }
X
X
X#ifdef ADDRMODE
X  if(ad != 0) fclose(ad);
X#endif
X
X  if(FLAG == 0){
X	fflush(fa);
X	fclose(fa);
X	fp = fopen( TMP_AGROUPS, "r" );
X	if(fp == NULL){
X	}
X	fa = fopen( AGROUPS, "w" );
X	if(fa == NULL){
X	}
X	while(fgets(s, 80, fp) != 0){
X		fputs(s, fa);
X	}
X	fflush(fa);
X	fclose(fa);
X	fclose(fp);
X	unlink( TMP_AGROUPS );
X  }
X
X  return;
X}
X
X
END_OF_FILE
  if test 24038 -ne `wc -c <'src/mb-daemon.c'`; then
    echo shar: \"'src/mb-daemon.c'\" unpacked with wrong size!
  fi
  # end of 'src/mb-daemon.c'
fi
if test -f 'src/misc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/misc.c'\"
else
  echo shar: Extracting \"'src/misc.c'\" \(23300 characters\)
  sed "s/^X//" >'src/misc.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*	    PROGRAMM  ix/Mbox						   */
X/*             DATEI  misc.c						   */
X/*        FUNKTIONEN  scanner(), schreiben(), prf(), pruefe()		   */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)		   */
X/*  LETZTE AENDERUNG  26.09.1992					   */
X/***************************************************************************/
X
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <unistd.h>
X#include <fcntl.h>
X#include <stdio.h>
X#include <utmp.h>
X#include <time.h>
X
X
X#include "mbox.h"
X
X
Xextern unsigned char headinfo[STRING];
X
X
Xint lastpoint( name )
Xunsigned char name[];
X{
X  int a = 0, b = 0;
X
X  while(name[a] != '\0'){
X	if(name[a] == '.') b = a;
X	a++;
X  }
X  if(b == 0) return a;
X
X  return (int) b;
X}
X
X
X/***************************************************************************/
X/*      FUNKTION  scanner()   						   */
X/*  BESCHREIBUNG  Wechselt BRETTER. Bei "B +" bzw. "B -" wird die Aktual-  */
X/*		  litaet nicht beruecksichtigt. In den anderen Modi 	   */
X/*		  werden nur aktuelle Bretter angesprungen.                */
X/*     PARAMETER  mode  =  '> 255'  =  nicht nur aktuelle Bretter	   */
X/*		           '> 500'  =  zur nexten AREA			   */
X/*			   '+'      =  aufwaerts springen		   */
X/*			   '-'      =  abwaerts springen		   */
X/*     RUECKGABE  keine	                                                   */
X/***************************************************************************/
X
Xvoid scanner(mode)
Xint mode;
X{
X  FILE *fp;
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char f[STRING];
X  unsigned char prevg[STRING];
X  unsigned char prevf[STRING];
X  int ok = 0, a, b;
X  int line = 0, l = 0;
X  int locmod = 0;
X  int max = 0;
X  int widerange = 0;
X
X
X  if (mode >= 1000) {
X	widerange = 1000;
X	mode -= 1000;
X  }
X
X  if (mode >= 500) {
X	locmod = 500;
X	mode -= 500;
X  }
X
X  if (mode >= 255) {
X	locmod = 255;
X	mode -= 255;
X  }
X  KEIN_ZUGRIFF:
X
X  if (locmod == 255) {
X	maybe_locked(NGROUPS, "r");
X	fp = fopen(NGROUPS, "r");
X	if (fp == NULL) {
X		nerror("misc.c", 26, "scanner", "Datei-Lesefehler", NGROUPS);
X	}
X }
X  else {
X	maybe_locked(UGROUPS, "r");
X	fp = fopen(UGROUPS, "r");
X	if (fp == NULL) {
X		nerror("misc.c", 34, "scanner", "Datei-Lesefehler", UGROUPS);
X	}
X  }
X
X  f[0] = '\0';
X  ok = 0;
X  strcpy(prevg, "L.I.S.A.");
X
X  while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
X	l++;
X	if (strcomp(NG, s) == 0) {
X		ok = 1;
X	}
X	else {
X		strcpy(f, (unsigned char *) s);
X	
X		if(strcomp(prevg, s) != 0){
X			if(widerange == 0){
X		  		a = lastpoint( s );
X				strcpy(prevg, (unsigned char *) s);
X				strcpy(prevf, (unsigned char *) s);
X				prevg[a] = '\0';
X			}
X			else{
X				strcpy(prevg, (unsigned char *) s); prevg[3] = '\0';
X				strcpy(prevf, (unsigned char *) s);
X			}
X		}
X	}
X  }
X
X  if (locmod == 500) {
X	if (mode == '+') {
X		ok = 0;
X		
X		if(widerange == 0){
X			a = lastpoint( NG );
X			strcpy(prevg, (unsigned char *) NG);
X			prevg[a] = '\0';
X		}
X		else{
X			strcpy(prevg, (unsigned char *) NG);
X			prevg[3] = '\0';
X		}
X
X		while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
X			l++;
X			if (strcomp(prevg, s) != 0) {
X				ok = 1;
X				strcpy(f, (unsigned char *) s);
X			}
X		}
X		if(ok == 0) line = -1;
X	}
X	if (mode == '-') {
X		strcpy(f, (unsigned char *) prevf);
X	}
X  }
X  else{
X	  if (mode == '+') {
X		if (fscanf(fp, "%s %d %d %s", f, &a, &a, t) < 1) {
X			if (ok == 0) {
X				rewind(fp);
X				fscanf(fp, "%s %d %d %s", f, &a, &a, t);
X			}
X		  	else {
X				line = -1;
X			}
X		}
X	  }
X	  if (mode == '-') {
X		if (f[0] == '\0') {
X			rewind(fp);
X			while (fscanf(fp, "%s %d %d %s", f, &a, &a, t) > 0);
X		}
X	  }
X  }	
X  fclose(fp);
X
X  if (max > 20) line = -1;
X
X  if ((line == -1) || (f[0] == '\0')) {
X	strcpy(BRETT, (unsigned char *) "PM");
X	printf("\n");
X	sprintf(NG, "%s.PM", USER.name);
X	sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
X	return;
X  }
X  if (l == 0) {
X	ansi("md");
X	printf(" %s\n", MIS01_MSG);
X	ansi("me");
X	return;
X  }
X  if (chk_newsgrp(f) != 0) {
X	sprintf(NG, "%s", f);
X	max++;
X	goto KEIN_ZUGRIFF;
X  }
X  brett(f);
X}
X
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  schreiben()						   */
X/*  BESCHREIBUNG  Artikel fuer NEWS einlesen und verteilen. Die Distri-    */
X/*		  bution ist abhaengig von der NG und vom Userlevel.	   */
X/*     PARAMETER  arg = DUMMY (!)                                          */
X/*     RUECKGABE  keine	                                                   */
X/***************************************************************************/
X
Xvoid schreiben(arg)
Xunsigned char arg[];
X{
X  FILE *fp;
X  FILE *ff;
X  FILE *fl;
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char f[STRING];
X  unsigned char g[LSTRING];
X  unsigned char ex[255];
X  unsigned char cmdl[STRING];
X  unsigned char rep[STRING];
X  unsigned char subj[STRING];
X  unsigned char keyw[STRING];
X  unsigned char summ[STRING];
X  unsigned char from[STRING];
X  unsigned char msid[STRING];
X  unsigned char refs[STRING];
X  unsigned char tmp[STRING];
X  unsigned char ng[STRING];
X  unsigned char reply[STRING];
X  unsigned char group[STRING];
X  unsigned char newsgroups[STRING];
X  unsigned char distribution[STRING];
X  unsigned char followup[STRING];
X  unsigned char expires[STRING];
X  unsigned char ctrl[STRING];
X  unsigned char sender[STRING];
X  unsigned char approved[STRING];
X  unsigned char content[STRING];
X  unsigned char iam[STRING];
X  unsigned char username[STRING];
X
X  int i, a, b, ok;
X  int app;
X
X  unsigned char protokoll = 0;
X  unsigned char c;
X  unsigned char lf;
X
X  int BINFILE;
X
X  struct stat fst;
X
X  unsigned char pubdir[STRING];
X  long tdummy;
X  long tn, ts;
X
X  if (strcomp(BRETT, "PM") == 0) {
X	ansi("md");
X	printf(" <- \"%s.PM\" %s\n\n", USER.name, MIS02_MSG);
X	ansi("me");
X	return;
X  }
X  BINFILE = 0;
X
X
X  i = 0;				/* Vorname.Name */
X  strcpy(ng, USER.name);
X  while (ng[i] != '\0') {
X	if (ng[i] == ' ') ng[i] = '.';
X	i++;
X  }
X  strcpy(username, ng);
X
X  strcpy(group, NG);
X
X
X  umask(0000);
X
X  if (arg[0] == '\0') {
X
X	subj[0] = '\0';
X	keyw[0] = '\0';
X	from[0] = '\0';
X	msid[0] = '\0';
X	summ[0] = '\0';
X	refs[0] = '\0';
X
X	sprintf(rep, "%s/%dRep", TMP, getpid());
X
X	fp = fopen(rep, "r");
X	if (fp != NULL) {		/* REPLY */
X		while ((fgets(s, 80, fp) != NULL) && (strlen(s) > 2)) {
X			if (strcomp("Subject:", s)   == 0) {
X				strcat(subj, strcopy(s, 8, 79));
X				strcpy(subj,  (unsigned char *) stripped(subj));				
X			}
X			if (strcomp("From:", s)      == 0) {
X				from[0] = '\0';
X				strcat(from, strcopy(s, 6, 79));
X				strcpy(from,  (unsigned char *) stripped(from));
X			}
X			if (strcomp("Reply-To:", s)  == 0) {
X				from[0] = '\0';
X				strcat(from, strcopy(s, 10, 79));
X				strcpy(from,  (unsigned char *) stripped(from));
X			}
X			if (strcomp("Keywords:", s)  == 0) {
X				strcat(keyw, strcopy(s, 10, 79));
X				strcpy(keyw,  (unsigned char *) stripped(keyw));
X			}
X			if (strcomp("Summary:", s)   == 0) {
X				strcat(summ, strcopy(s, 9, 79));
X				strcpy(summ,  (unsigned char *) stripped(summ));
X			}
X			if (strcomp("Message-ID:", s) == 0) {
X				strcat(msid, strcopy(s, 11, 79));
X				strcpy(msid,  (unsigned char *) stripped(msid));
X			}
X			if (strcomp("Content-Type:", s) == 0) {
X				strcat(content, strcopy(s, 14, 79));
X				strcpy(content,  (unsigned char *) stripped(content));
X			}
X			if (strcomp("Article-I.D.:", s) == 0) {
X				strcat(msid, strcopy(s, 13, 79));
X				strcpy(msid,  (unsigned char *) stripped(msid));
X			}
X			if (strcomp("References:", s) == 0) {
X				strcat(refs, strcopy(s, 12, 79));
X				strcpy(refs,  (unsigned char *) stripped(refs));
X			} 
X			if (strcomp("Followup-To:", s) == 0) {
X				strcpy(group, strcopy(s, 13, 79));
X				strcpy(group, (unsigned char *) stripped(group));
X			}
X		}
X		
X		if(strcomp("Poster", group) == 0){
X			printf(" <- %s\n", MIS02aMSG);
X			return;
X		}
X
X
X		sprintf(t, "%s/A%d", TMP, getpid());
X		ff = fopen(t, "w");
X
X		a = 0;
X		b = 0;
X		i = 0;
X		while (from[i] != '\0') {
X			if (from[i] == '(') a = i + 1;
X			if (from[i] == ')') b = i - 1;
X			i++;
X		}
X		if (a < b) {
X			strcpy(s, (unsigned char *) strcopy(from, a, b));
X			strcpy(from, (unsigned char *) s);
X		}
X		sprintf(ex, "In article %s,\n            %s writes:\n\n", msid, from);
X		fputs(ex, ff);
X		while (fgets(s, 80, fp) != NULL) {
X			if(s[0] != '\n') fputs("> ", ff);
X			fputs((unsigned char *) iso_line(s), ff);
X		}
X		fclose(fp);
X		fclose(ff);
X
X		sprintf(cmdl, "%s %s", EDDY, t);
X		printf("\n\n");
X		system(cmdl);
X		if (strcomp("Re:", subj) != 0) {
X			sprintf(f, "Re: %s", stripped(subj));
X			strcpy(subj, (unsigned char *) f);
X		}
X		unlink(rep);
X	}
X	else {		/* Interactive MAIL */
X
X		printf("\n\n%c", CR);
X		ansi("mr");
X		printf("%s", MIS03_MSG);
X		ansi("me");
X		printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
X		ansi("mr");
X		printf("%s", MIS04_MSG);
X		ansi("me");
X		printf(" %s\n%c", NG, CR);
X		ansi("mr");
X		printf("%s", MIS05_MSG);
X		ansi("me");
X		printf(" ");
X		strcpy(subj, (unsigned char *) getline(57, -11, '.', ""));
X		printf("\n");
X		ansi("mr");
X		printf("%s", MIS06_MSG);
X		ansi("me");
X		printf(" ");
X		strcpy(keyw, (unsigned char *) getline(57, -11, '.', ""));
X		printf("\n");
X		ansi("mr");
X		printf("%s", MIS07_MSG);
X		ansi("me");
X		printf(" ");
X		strcpy(summ, (unsigned char *) getline(57, -11, '.', ""));
X
X		printf("\n\n");
X		ansi("mr");
X		printf("[%s] %s ? > ", NG, MIS08_MSG);
X		ansi("me");
X		printf("%c%c", MIS09_MSG, BS);
X
X		do {
X			c = getint();
X			if (c >= 97) c -= 32;
X			if (c == '?') {
X				clearline();
X				ansi("mr");
X				printf("%c%s > ", CR, MIS12_MSG);
X				ansi("me");
X			}
X			if (c == ENTER) c = MIS09_MSG;
X			if ((c != MIS09_MSG) && (c != MIS10_MSG) && (c != MIS11_MSG)) c = 0;
X		} while (c == 0);
X
X		printf("%c", c);
X
X		if (c == MIS11_MSG) {
X			printf("\n");
X			unlink(t);
X			return;
X		}
X		if (c == MIS10_MSG) {
X			printf("%c                                                                       ", CR);
X			ansi("mr");
X			printf("%c%s, ? > ", CR, MIS13_MSG);
X			ansi("me");
X
X			do {
X				protokoll = getint();
X				if (protokoll >= 97) protokoll -= 32;
X				if (protokoll == '?') {
X					clearline();
X					ansi("mr");
X					printf("%c%s > ", CR, MIS14_MSG);
X					ansi("me"); 
X				}
X				if ((protokoll != MIS15_MSG) && (protokoll != MIS15_MSG) &&
X				    (protokoll != MIS18_MSG) && (protokoll != MIS17_MSG ))
X					protokoll = 0;
X			} while (protokoll == 0);
X
X			printf("%c", protokoll);
X
X		}
X		sprintf(tmp, "%s/A%d", TMP, getpid());
X		sprintf(cmdl, "%s %s", EDDY, tmp);
X		sprintf(pubdir, "%s/dir%d", TMP, getpid());
X
X		if (c == MIS09_MSG) {
X			noctrlx();
X			system(cmdl);
X			ctrlx();
X			protokoll = '*';
X		}
X		else {	/* UPLOAD */
X
X			printf("\n\n");
X			ansi("md");
X			printf("%s", MIS19_MSG);
X			ansi("me");
X
X			switch (protokoll) {
X			    case MIS15_MSG:
X					fp = fopen(tmp, "w");
X					if (fp == NULL) {
X						nerror("misc.c", 310, "schreiben", "DSF", tmp);
X					}
X					c = 0;
X					lf = CR;
X					fputc(LF, fp);
X
X					while ((c != CTRL_X) && (c != CTRL_D)) {
X						c = getint();
X						if ((c == CR) && (lf == CR))
X							fputc(LF, fp);
X						if (c == CR) lf = CR;
X						if (c == LF) lf = LF;
X						if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
X							fputc(c, fp);
X						}
X					}
X					fclose(fp);
X					break;
X			    case MIS16_MSG:
X					printf("\n");
X					sprintf(s, "exec %s -bc TimeTravelAgency 2> /dev/null", RX);
X					break;
X			    case MIS17_MSG:
X					printf("\n");
X					sprintf(s, "exec %s -b 2> /dev/null", RB);
X					break;
X			    case MIS18_MSG:
X					printf("\n");
X					sprintf(s, "exec %s -b 2> /dev/null", RZ);
X					break;
X			}
X			if (protokoll != MIS15_MSG){
X				mkdir( pubdir, 0777 );
X				chdir( pubdir );
X
X				time(&ts);
X				system( s );
X				time(&tn); tn = tn - ts;
X				tn -= 10;  /* 10 = "Toleranz" */
X	
X				chdir( HOME );
X				sprintf(s, "mv %s/* %s", pubdir, tmp);
X				system( s );
X				sprintf(s, "rm -r %s", pubdir);
X				system( s );
X			}
X			sync();
X			stat(tmp, &fst);
X			if (fst.st_size < 3L) {
X				printf("\n\n%s\n", MIS20_MSG);
X				control(MIS21_MSG, 3);
X				unlink(tmp);
X				return;
X			}
X			if (prf(tmp) == 1) {
X				if (strcomp(PDNG, NG) == 0) {
X					USER.upratio += ((long) fst.st_size / 1024);
X				}
X				BINFILE++;
X				sprintf(s, MIS22_MSG);
X			}
X			else{
X				mkix(tmp);
X				sprintf(s, MIS23_MSG);
X			}
X			ansi( "md" );
X			printf("\n\n%ld %s %s %s.\n", fst.st_size, MIS24_MSG, s, MIS25_MSG);
X			ansi( "me" );
X			if(tn < 1) tn = 1L;
X			printf("%s %d cps (ca. %d bps).", MIS26_MSG,
X				(fst.st_size / tn), ((fst.st_size / tn) * 11));				
X		}
X	}
X
X	sprintf(iam, "%s <%s@%s>", USER.name, username, UUCPID);
X	sprintf(reply, "%s@%s (%s)", username, UUCPID, USER.name);
X	strcpy(newsgroups, group);
X	if (USER.level < WRITE_EX_LEV) {
X		strcpy(distribution, "local");
X	}
X	else {
X		/*
X		strcpy(ng, NG);
X		i = 0;
X		while ((ng[i] != '.') && (ng[i] != '\0')) i++;
X		ng[i] = '\0';
X		strcpy(distribution, ng);
X		*/
X		strcpy(distribution, "world");
X	}
X	if(refs[0] != '\0') strcat(refs, " ");
X	strcat(refs, msid);	
X	followup[0] = '\0';
X	sender[0] = '\0';
X	ctrl[0] = '\0';
X	expires[0] = '\0';
X	approved[0] = '\0';
X	app = 0;
X	content[0] = '\0';	
X
X#if defined(_MULTIMEDIA) && defined(_UMLAUT)
X	strcpy(content, (unsigned char *) "text/plain; charset=iso-8859-1");
X#endif
X
X	ONCE_MORE:
X
X	printf("\n\n");
X	ansi("mr");
X	if(BINFILE == 0){
X		printf("[%s] %s, ? > ", NG, MIS27_MSG);
X	}
X	else{
X		printf("[%s] %s, ? > ", NG, MIS28_MSG);
X	}
X	ansi("me");
X	printf("%c%c", MIS29_MSG, BS);
X
X	do {
X		c = getint();
X		if (c >= 97) c -= 32;
X		if (c == '?') {
X			clearline();
X			ansi("mr");
X			if(BINFILE == 0){
X				printf("%c%s > ", CR, MIS32_MSG);
X			}
X			else{
X				printf("%c%s > ", CR, MIS33_MSG);
X			}
X			ansi("me");
X		}
X		if (c == ENTER) c = MIS29_MSG;
X		if ((c != MIS29_MSG) && (c != MIS30_MSG) && (c != MIS31_MSG) && (c != MIS31aMSG)) c = 0;
X	} while (c == 0);
X
X	printf("%c", c);
X	if (c == MIS30_MSG) {
X		unlink(f);
X		unlink(s);
X		unlink(t);
X		unlink(tmp); /* ??? */
X		unlink(rep);
X		printf("\n");
X		return;
X	}
X	if ((c == MIS31_MSG) && (BINFILE == 0)) {
X		noctrlx();
X		system(cmdl);
X		ctrlx();
X		goto ONCE_MORE;
X	}
X	if (c == MIS31aMSG) { /* HEADER */
X		headline( MIS38aMSG );
X		printf("\n");
X		time(&tdummy);
X
X		ansi( "md" );
X		printf("From: ");
X		ansi( "me" );
X		if(USER.level > ADMIN_LEV){
X			strcpy(s, (unsigned char *) getline(80, -1001, 32, iam));
X			if(strcomp(s, iam) != 0) app++;			
X			if(s[0] != '\0') strcpy(iam, s);
X			printf("\n");
X		}
X		else printf("%s\n", iam);
X
X		ansi( "md" );
X		printf("Reply-To: ");
X		ansi( "me" );
X		if(USER.level > GUEST_LEV){
X			strcpy(reply, (unsigned char *) getline(80, -1001, 32, reply));
X			printf("\n");
X		}
X		else printf("%s\n", reply);
X
X		ansi( "md" );
X		printf("Sender: ");
X		ansi( "me" );
X		if(USER.level >= ADMIN_LEV){
X			strcpy(sender, (unsigned char *) getline(80, -1001, 32, sender));
X			printf("\n");
X		}
X		else printf("%s\n", sender);	
X		
X		ansi( "md" );
X		printf("Control: ");
X		ansi( "me" );
X		if(USER.level >= ADMIN_LEV){
X			strcpy(ctrl, (unsigned char *) getline(80, -1001, 32, ctrl));
X			printf("\n");
X		}
X		else printf("%s\n", ctrl);	
X		
X		ansi( "md" );
X		printf("Approved: ");
X		ansi( "me" );
X		if(app != 0) sprintf(approved, "%s <%s@%s>", USER.name, username, UUCPID);
X		if(USER.level >= EXE_LEV){
X			strcpy(approved, (unsigned char *) getline(80, -1001, 32, approved));
X			printf("\n");
X		}
X		else printf("%s\n", approved);	
X	
X		ansi( "md" );
X		printf("Newsgroups: ");
X		ansi( "me" );
X		if(USER.level >= WRITE_EX_LEV){
X			strcpy(newsgroups, (unsigned char *) getline(80, -1001, 32, newsgroups));
X			printf("\n");
X			i = 0;
X			while(newsgroups[i] != '\0'){
X				if(newsgroups[i] == ' '){
X					strcpy(s, (unsigned char *) newsgroups);
X					newsgroups[i] = '\0';
X					strcat(newsgroups, (unsigned char *) strcopy(s, (i+1), 80));
X					i--;
X				}
X				i++;
X			}			
X		}
X		else printf("%s\n", newsgroups);	
X		
X		ansi( "md" );
X		printf("Distribution: ");
X		ansi( "me" );
X		if(USER.level >= WRITE_INTERNAT){
X			strcpy(distribution, (unsigned char *) getline(80, -1001, 32, distribution));
X			printf("\n");
X		}
X		else printf("%s\n", distribution);	
X		
X		ansi( "md" );
X		printf("Followup-To: ");
X		ansi( "me" );
X		if(USER.level >= WRITE_EX_LEV){
X			strcpy(followup, (unsigned char *) getline(80, -1001, 32, followup));
X			printf("\n");
X		}
X		else printf("%s\n", followup);	
X		
X		ansi( "md" );
X		printf("Subject: ");
X		ansi( "me" );
X		strcpy(subj, (unsigned char *) getline(80, -1001, 32, subj));
X
X		ansi( "md" );
X		printf("\nKeywords: ");
X		ansi( "me" );
X		strcpy(keyw, (unsigned char *) getline(80, -1001, 32, keyw));
X			
X		ansi( "md" );
X		printf("\nSummary: ");
X		ansi( "me" );
X		strcpy(summ, (unsigned char *) getline(80, -1001, 32, summ));
X
X#ifdef _MULTIMEDIA
X
X		if(USER.level >= WRITE_INTERNAT){
X			if(content[0] == '\0')
X				strcpy(content, (unsigned char *) "text/plain; charset=us-ascii");
X			ansi( "md" ); 
X			printf("\nContent-Type: ");
X			ansi( "me" );
X			strcpy(content, (unsigned char *) getline(80, -1001, 32, content));
X		}
X#endif
X
X		ansi( "md" );
X		printf("\nX-News-Reader: ");
X		ansi( "me" );
X	        printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
X
X		ansi( "md" );
X		printf("References: ");
X		ansi( "me" );
X		printf("%s\n", refs);
X		
X		ansi( "md" );
X		printf("Message-ID: ");
X		ansi( "me" );
X		printf("<%x.%d@%s>\n", tdummy, USER.id, UUCPID);
X		
X		ansi( "md" );
X		printf("Expires: ");
X		ansi( "me" );
X		if(USER.level >= WRITE_INTERNAT){
X			strcpy(expires, (unsigned char *) getline(80, -1001, 32, expires));
X			printf("\n");
X		}
X		else printf("%s\n", expires);	
X
X		goto ONCE_MORE;		
X	}
X
X	ansi( "md" );
X	printf("\n\n%s\n", MIS34_MSG);
X	ansi( "me" );
X
X	sprintf(f, "%s/A%d", TMP, getpid());
X	sprintf(t, "%s/B%d", TMP, getpid());
X
X	fp = fopen(f, "r");
X	if (fp == NULL) {
X		printf("\n");
X		ansi("md");
X		printf("%s ...\n", MIS35_MSG);
X		ansi("me");
X		control(MIS36_MSG, 3);
X		unlink(rep);
X		return;
X	}
X
X	ff = fopen(t, "w");
X
X	time(&tdummy);
X
X	fprintf(ff, "From: %s\n", iam);
X	if(reply[0] != '\0')
X		fprintf(ff, "Reply-To: %s\n", reply);
X	if(sender[0] != '\0')
X		fprintf(ff, "Sender: %s\n", sender);
X	if(approved[0] != '\0')
X		fprintf(ff, "Approved: %s\n", approved);
X	if(newsgroups[0] != '\0')
X		fprintf(ff, "Newsgroups: %s\n", newsgroups);
X	if(distribution[0] != '\0')
X		fprintf(ff, "Distribution: %s\n", distribution);
X	if(ctrl[0] != '\0')
X		fprintf(ff, "Control: %s\n", ctrl);
X	if(followup[0] != '\0')
X		fprintf(ff, "Followup-To: %s\n", followup);
X	if(subj[0] != '\0')
X		fprintf(ff, "Subject: %s\n", subj);
X	if(keyw[0] != '\0')
X		fprintf(ff, "Keywords: %s\n", keyw);
X	if(summ[0] != '\0')
X		fprintf(ff, "Summary: %s\n", summ);
X	if(content[0] != '\0'){
X		fprintf(ff, "Content-Type: %s\n", content);
X#ifdef _UMLAUT
X		fprintf(ff, "Content-Transfer-Encoding: 8bit\n");
X#endif
X	}
X	fprintf(ff, "X-News-Reader: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
X	fprintf(ff, "Message-ID: <%x.%d@%s>\n", tdummy, USER.id, UUCPID);
X	if(expires[0] != '\0')
X		fprintf(ff, "Expires: %s\n", expires);
X	if(refs[0] != '\0')
X		fprintf(ff, "References: %s\n", refs);	
X	fputs("\n", ff);	
X	
X	if (BINFILE == 0) {
X		UMLAUT_MODUS = 1;
X		while (fgets(s, 80, fp) != 0) {
X			fputs((unsigned char *) iso_line(s), ff);
X		}
X	}
X	else {
X		time(&tdummy);
X		fputs("BINFILE\n", ff);
X		sprintf(s, "%s/PD.%d", BRETT, tdummy);
X		fputs(s, ff);
X		sprintf(f, "cp %s %s &", tmp, s);
X		system(f);
X		sprintf(s, "\n/public/pd/%s\n", subj);
X		fputs(s, ff);
X		fl = fopen( PDSCRIPT, "a" );
X		fprintf(fl, "mv %s/PD.%d /public/pd/%s\n", BRETT, tdummy, subj);
X		fclose(fl);
X	}
X	fclose(fp);
X	unlink(f);
X
X	unlink(rep);
X
X	if ((USER.level > WRITE_IN_LEV) && (BINFILE == 0)) {
X		sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
X		fp = fopen(s, "r");
X		if (fp != NULL) {
X			while (fgets(s, 80, fp) != 0) {
X				fputs((unsigned char *) iso_line(s), ff);
X			}
X			fclose(fp);
X		}
X	}
X	fclose(ff);
X
X	UMLAUT_MODUS = USER.schluessel[2];
X
X	sprintf(ex, "/bin/sh ./etc/inews.sh %s %s", NG, t);
X	system(ex);
X
X	unlink(t);
X
X	sprintf(s, "%s \"%s\" %s", MIS37_MSG, NG, MIS38_MSG);
X	control(s, 3);
X
X	
X	if(BINFILE != 0){
X		maybe_locked(NGROUPS, "r");
X		fp = fopen(NGROUPS, "r");
X		if (fp == NULL) {
X			nerror("misc.c", 895, "schreiben", "Datei-Lesefehler", NGROUPS);
X		}
X
X		ok = 0;
X
X	        while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &b, f) > 0)) {
X			if(strcomp(NG, s) == 0){
X				i = a;
X				ok = 1;
X			}
X	 	}
X		fclose(fp);
X
X		fl = fopen( PDSCRIPT, "a" );
X		fprintf(fl, "mined %s/%d\n", BRETT, i); 
X		fprintf(fl, "#%s   %s\n\n", NG, USER.name);
X		fclose(fl);
X	}
X
X	printf("%s", MIS39_MSG);
X
X#ifndef _SYS7
X	sleep(30);	/* Scheinbar laeuft INEWS bei SYSV im Hintergrund */
X#endif
X
X	sprintf(s, "%s %s", MB_DAEMON, group);
X	system(s);
X	unlink(tmp);
X	printf("\n");
X  }
X  else {
X	ansi("md");
X	printf(" %s\n\n", MIS40_MSG);
X	ansi("me");
X  }
X  umask(0007);
X
X  /*			  
X
X  Better not use the following! It's a not yet complete implemented
X  new feature - the beginning of a threated NEWSREADER...
X
X  sprintf(s, "%s/usr/%d/.dis", HOME, USER.id);
X  fp = fopen(s, "a");
X  fprintf(fp, "%-32.32s %-21.21s  %x.%d  %s\n", NG, subj, tdummy, USER.id, (unsigned char *) mydate( 0 )); 
X  fclose(fp);
X  */  
X
X}
X
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  prf()							   */
X/*  BESCHREIBUNG  Stellt fest, ob eine Datei (die per UPLOAD empfangen     */
X/*		  wurde) einen Text oder ein ausfuehrbares Programm ent-   */
X/*		  haelt.                                                   */
X/*     PARAMETER  arg  =  Dateiname                                        */
X/*     RUECKGABE  0    =  Text-Datei                                       */
X/*		  1    =  Ausfuehrbares Programm			   */
X/***************************************************************************/
X
Xint prf(arg)
Xunsigned char arg[];
X{
X  FILE *fp;
X  unsigned char ex[255];
X  int i, a;
X
X  fp = fopen(arg, "r");
X  if (fp == NULL) return -1;
X  while ((fgets(ex, 250, fp) != NULL) && (strlen(ex) < 30));
X  fclose(fp);
X
X  i = 0;
X  a = 0;
X  while (ex[i] != '\0') {
X	if ((ex[i] < 32) || (ex[i] > 127)) a++;
X	i++;
X  }
X  if (a > 3) return 1;		/* BINFILE */
X
X  return 0;			/* TEXTFILE */
X}
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  pruefe()	 					   */
X/*  BESCHREIBUNG  Stellt fest, ob eine Datei aus den News-Artikeln die     */
X/*		  Kennung "BINFILE" enthaelt. Faellt die Antwort positiv   */
X/*		  aus, wird die Routine "pd()" aufgerufen.		   */
X/*     PARAMETER  arg  =  Nummer des Artikels                              */
X/*     RUECKGABE  0    =  Text-Datei                                       */
X/*                1    =  BINFILE					   */
X/***************************************************************************/
X
Xint pruefe(arg)
Xunsigned char arg[];
X{
X  FILE *fp;
X  unsigned char ex[255];
X  unsigned char s[STRING];
X  unsigned char entry[STRING];
X  unsigned char keywds[STRING];
X
X  if ((arg[0] == '\0') || (arg[0] == '*')) return -1;
X
X  if (strcomp(BRETT, "PM") != 0) {
X	sprintf(entry, "%s/%s", BRETT, arg);
X  }
X  else {
X	sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, arg);
X  }
X
X  keywds[0] = '\0';
X
X  fp = fopen(entry, "r");
X  if (fp == NULL) return -1;
X
X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] > 32)){
X	if(strcomp("Keywords: ", ex) == 0){
X		ex[80] = '\0';
X		strcpy(keywds, strcopy(ex, 10, 80));
X	}
X  }
X
X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] < 32));
X
X  if (strcomp("BINFILE", ex) == 0) {
X	fgets(s, 80, fp);
X	fclose(fp);
X	pd(s, keywds);
X	return 1;
X  }
X  fclose(fp);
X
X  return 0;
X}
X
X
X
X
X
X
END_OF_FILE
  if test 23300 -ne `wc -c <'src/misc.c'`; then
    echo shar: \"'src/misc.c'\" unpacked with wrong size!
  fi
  # end of 'src/misc.c'
fi
if test -f 'src/uptodate.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/uptodate.c'\"
else
  echo shar: Extracting \"'src/uptodate.c'\" \(2961 characters\)
  sed "s/^X//" >'src/uptodate.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*          PROGRAMM  ix/Mbox                                              */
X/*             DATEI  update.c                                             */
X/*        FUNKTIONEN  uptodate()                                           */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)                 */
X/*  LETZTE AENDERUNG  16.03.1993                                           */
X/***************************************************************************/
X
X#include <stdio.h>
X
X#include "mbox.h"
X
X/*
X	WARNING! This part of the ix/MBox automagically generates an
X        update-request every month. This request is sent to "unnet!mbox"
X        in germany.
X
X        If there are any bugfixes, infosheets etc., you'll get them
X        via mailserver as an reply to the update-request.
X
X        The update-request includes some informations about your BBS:
X        name, uucp-address, sysops name, number of accounts&caller etc. ...
X
X        Maybe this data will be used to build reference-lists or will
X        be mentioned in infosheets.
X
X 
X        If you don't want|like that, please change the following
X        defines!!! 
X*/
X
X#define NO_UPDATE	0	/* 1 means: absolutly no update-requests */
X#define NO_DETAILS	0	/* 1 means: don't send any data	         */
X
X
X
Xuptodate()
X{
X
X#if !NO_UPDATE
X
X  FILE *fp;
X  
X  char s[STRING];
X  char t[STRING];
X  char d[STRING];
X
X  int accounts;
X  int calls;
X  int month;
X
X
X  if(USER.level < WRITE_EX_LEV) return;
X
X  strcpy(d, (unsigned char *) mydate( 1 ));
X  month = atoi(strcopy(d, 3, 4));
X  sprintf(s, "%s/etc/uptodate.%d", HOME, month);
X  fp = fopen(s, "r");
X  if(fp != NULL){
X	fclose(fp);
X	return;
X  }
X  fp = fopen(s, "w");
X  fprintf(fp, "Update requested: %s at %s", mydate( 1 ), mytime( 0 )); 
X  fclose(fp);
X
X  if(month == 1) month = 13;
X  month--;
X
X  sprintf(s, "%s/etc/uptodate.%d", HOME, month);
X  unlink( s );
X
X  sprintf(s, "%s/etc/users.seq", HOME);
X  fp = fopen(s, "r");
X  fgets(s, 80, fp);
X  fclose(fp);
X  accounts = atoi(s);
X
X  sprintf(s, "%s/etc/mbox.seq", HOME);
X  fp = fopen(s, "r");
X  fgets(s, 80, fp);
X  fclose(fp);
X  calls = atoi(s);
X
X  sprintf(s, "%s/usr/%d/.lastletter", HOME, USER.id);
X  fp = fopen(s, "w"); 
X  fprintf(fp, "This is %s %s, on <%s>!\n\n", VERSION, PATCHLEVEL, UUCPID1);
X
X#if !NO_DETAILS
X  fprintf(fp, "My sysop %s of %s\n", POSTMASTER, ORGANIZATION);
X  fprintf(fp, "wants update patches, infosheets and so on ...\n\n");
X  fprintf(fp, "Our systems' called \"%s\",\n", SYSTEM);
X  fprintf(fp, "and we joggle around with %d users (%d calls) at this moment.\n\n", accounts, calls);
X#endif /* NO_DETAILS */
X
X  fprintf(fp, "If you can't reach us, call <%s> or <%s> ...\n\n", UUCPID2, SMARTHOST);
X  fclose(fp);
X
X  sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
X  fp = fopen(s, "w");
X  fprintf(fp, "UPDATE-RQ <%s>", UUCPID1);
X  fclose(fp);
X
X  brief( "mbox@unnet.w.open.DE?" );
X
X#endif	/* NO_UPDATE */
X
X}
X
END_OF_FILE
  if test 2961 -ne `wc -c <'src/uptodate.c'`; then
    echo shar: \"'src/uptodate.c'\" unpacked with wrong size!
  fi
  # end of 'src/uptodate.c'
fi
echo shar: End of archive 6 \(of 15\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still must unpack the following archives:
    echo "        " ${MISSING}
fi
exit 0
exit 0 # Just in case...

