#! /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/loop.c src/mail.c src/makro.c wendy/fast
# Wrapped by kent@sparky on Fri Feb  5 12:18:09 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 7 (of 15)."'
if test -f 'src/loop.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/loop.c'\"
else
  echo shar: Extracting \"'src/loop.c'\" \(22323 characters\)
  sed "s/^X//" >'src/loop.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*	    PROGRAMM  ix/Mbox						   */
X/*             DATEI  loop.c						   */
X/*        FUNKTIONEN  sigcatch(), cut_bef(), cut_arg(), rates(), loop()	   */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)		   */
X/*  LETZTE AENDERUNG  18.12.1992					   */
X/***************************************************************************/
X   
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/wait.h>
X#include <time.h>
X#include <setjmp.h>
X#include <signal.h>
X#include <sys/stat.h>
X
X#include "mbox.h"
X
Xextern time_t time_start, time_now;
X
Xjmp_buf jmpenv;
X
X/***************************************************************************/
X/*      FUNKTION  sigcatch()						   */
X/*  BESCHREIBUNG  Wird aufgerufen, wenn eines der abgefangen Signale	   */
X/*		  eintrifft. Je nach Signal wird entweder ein CTRL-X       */
X/*		  simuliert, oder das Programm ordnungsgemaesst beendet.   */
X/*     PARAMETER  sig  =  Nummer des ausloesenden Signals                  */
X/*     RUECKGABE  keine                                                    */
X/***************************************************************************/
X
Xvoid sigcatch(sig)
Xint sig;
X{
X  unsigned char tmp[80];  
X
X  signal(SIGINT,   SIG_IGN);
X  signal(SIGQUIT,  SIG_IGN);
X  signal(SIGHUP,   SIG_IGN);
X  signal(SIGABRT,  SIG_IGN);
X  signal(SIGTERM,  SIG_IGN);
X
X  chdir( HOME );
X 
X  switch (sig) {
X	case SIGINT:
X	case SIGQUIT:
X		sprintf(tmp, "%s/I.%d", TMP, getpid());
X		unlink(tmp);
X		sprintf(tmp, "%s/show%d", TMP, getpid());
X		unlink(tmp);
X		mbunlock( UDBASE );
X		printf("\n");
X		ansi("mr");
X		printf("%s", LOP01_MSG);
X		ansi("me");
X		printf("\n\n");
X		longjmp(jmpenv, 1);
X		break;
X      case SIGHUP:
X      case SIGABRT:
X      case SIGTERM:
X		printf("\n\n");
X		ansi("mr");
X		printf("%s", LOP02_MSG);
X		ansi("me");
X		printf("");
X		logout();
X		exit(-1);
X		break;
X  }
X}
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  cut_bef()						   */
X/*  BESCHREIBUNG  Filtert den Befehl aus der Eingabe eines Users.          */
X/*     PARAMETER  Eingabezeile                                             */
X/*     RUECKGABE  Der isolierte Befehl                                     */
X/***************************************************************************/
X
Xunsigned char *cut_bef(s)
Xunsigned char s[];
X{
X  static unsigned char bef[STRING];
X  int i = 0;
X
X  while (s[i] > 32) {
X	bef[i] = s[i];
X	i++;
X  }
X  bef[i] = '\0';
X  return (unsigned char *) bef;
X}
X
X
X
X/***************************************************************************/
X/*      FUNKTION  cut_arg()						   */
X/*  BESCHREIBUNG  Filtert das Argument aus der Eingabe des Users.          */
X/*     PARAMETER  Eingabezeile 	                                           */
X/*     RUECKGABE  Das isolierte Argument                                   */
X/***************************************************************************/
X
Xunsigned char *cut_arg(s)
Xunsigned char s[];
X{
X  static unsigned char arg[STRING];
X  int i = 0, a = 0;
X
X  while (s[i] > 32) i++;
X  if (s[i] == '\0') return (unsigned char *) "";
X
X  while (s[i] == 32) i++;
X
X  while (s[i] != '\0') {
X	arg[a] = s[i];
X	i++;
X	a++;
X  }
X  arg[a] = '\0';
X
X  while((arg[(a-1)] < 33) && (a > 1)){
X	a--;
X	arg[a] = '\0';
X  }
X
X  return (unsigned char *) arg;
X}
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  rates()						   */
X/*  BESCHREIBUNG  Ermittelt die Telefongebuehren des laufenden Anrufs und  */
X/*		  bereitet sie als PROMPT auf.                             */
X/*     PARAMETER  keine	                                                   */
X/*     RUECKGABE  PROMPT-Zeile fuer Gebuehren                              */
X/***************************************************************************/
X
Xunsigned char *rates()
X{
X  static unsigned char s[STRING];
X  unsigned char t[STRING];
X  int nz, rz, wz;
X  int dif;
X  int n1, n2, r1, r2, w1, w2;
X  struct tm *timeptr;
X
X  time(&time_now);
X  dif = time_now - time_start;
X
X  n1 = dif / NZNT;
X  n1++;
X  n1 *= TARIF;
X  n2 = dif / NZBT;
X  n2++;
X  n2 *= TARIF;
X  r1 = dif / RZNT;
X  r1++;
X  r1 *= TARIF;
X  r2 = dif / RZBT;
X  r2++;
X  r2 *= TARIF;
X  w1 = dif / WZNT;
X  w1++;
X  w1 *= TARIF;
X  w2 = dif / WZBT;
X  w2++;
X  w2 *= TARIF;
X
X  timeptr = localtime(&time_now);
X  sprintf(t, "%s", asctime(timeptr));
X
X  if ((t[0] == 'S') || (timeptr->tm_hour > 18) || (timeptr->tm_hour < 8)) {
X	sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
X	 dif, fix(n2), flt(n2), fix(r2), flt(r2), fix(w2), flt(w2));
X  }
X  else {
X	sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
X	 dif, fix(n1), flt(n1), fix(r1), flt(r1), fix(w1), flt(w1));
X  }
X
X  return (unsigned char *) s;
X}
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  loop.c						   */
X/*  BESCHREIBUNG  Die Eingaben des Users werden entgegengenommen und die   */
X/*		  entsprechenden Routinen aufgerufen und ausgefuehrt.      */
X/*     PARAMETER  keine	                                                   */
X/*     RUECKGABE  keine                                                    */
X/***************************************************************************/
X
Xvoid loop()
X{
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char l[LONGSTRING];
X  unsigned char befehl[STRING];
X  unsigned char argument[STRING];
X  unsigned char prompt[STRING];
X
X  unsigned char prev_befehl[10][STRING];
X  int wasok;
X
X  int c;
X
X  unsigned char bef_buff[(STRING * 2)];
X  int bef_rec;
X
X  int ende = 0, ok, dummy, i;
X  int pp;
X  int to_del;
X  int fpid;
X
X  struct stat fst;
X
X
X  sprintf(prev_befehl[1], "%s ", BEF[BB1].befehl);
X  sprintf(prev_befehl[2], "%s ", BEF[BB2].befehl); 
X  sprintf(prev_befehl[3], "%s ", BEF[BB3].befehl);
X  sprintf(prev_befehl[4], "%s ", BEF[BB4].befehl);
X  sprintf(prev_befehl[5], "%s ", BEF[BB5].befehl);
X  sprintf(prev_befehl[6], "%s ", BEF[BB6].befehl);
X  sprintf(prev_befehl[7], "%s ", BEF[BB7].befehl);
X  sprintf(prev_befehl[8], "%s ", BEF[BB8].befehl);
X  sprintf(prev_befehl[9], "%s ", BEF[BB9].befehl);
X
X  wasok = 1;
X
X  bef_buff[0] = '\0';
X
X  DISKUSSION = 0;
X
X  do {
X
X	if(setjmp(jmpenv) == 1){
X		bef_buff[0] = '\0';
X	}
X
X	FASTER:
X	
X	signal(SIGINT,  sigcatch);
X	signal(SIGQUIT, sigcatch);
X
X	signal(SIGHUP,  sigcatch);
X	signal(SIGABRT, sigcatch);
X	signal(SIGTERM, sigcatch);
X
X	sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
X	stat(s, &fst);
X	if(fst.st_size > IDX_SIZE){
X		printf("%c\n\n%s\n", BELL, LOP03_MSG); 
X	}
X        IDX_SIZE = (long) fst.st_size;
X
X	if(bef_buff[0] != '\0'){
X		sprintf(s, "%s", bef_buff);		
X		IS_BUFFERED = 1;
X		bef_rec++;
X		goto BUFFERING;
X	}
X        else 
X		IS_BUFFERED = 0;
X
X
X	bef_rec = 0;
X
X	ansi("md");
X	prompt[0] = '\0';
X
X	switch (USER.prompt) {
X	    case 1:
X			strcat(prompt, (unsigned char *) mytime(0));
X			break;
X	    case 2:	
X			strcat(prompt, NG);
X			break;
X	    case 3:	
X			strcat(prompt, (unsigned char *) rates());
X			break;
X	}
X	printf("\n[%s] %s > ", prompt, LOP06_MSG);
X	ansi("me");
X	if (USER.bell == 1) printf("%c", BELL);
X
X	befehl[0] = '\0';
X
X#ifdef _CORELEFT
X	if(coreleft() < _CORELEFT){
X		sprintf(s, "%d", _CORELEFT);
X		nerror( "loop.c", 288, "loop", "Speicherplatz kleiner ", s );
X	}
X#endif
X
X
X	do {
X		strcpy(s, (unsigned char *) getline(60, 11001, 32, befehl));
X		to_del = length(befehl);
X
X		if (s[0] == 48) {
X			headline( LOP05_MSG );
X			printf("\n");
X			for (i = 9; i > 0; i--) {
X				printf(" %d: %s\n", i, prev_befehl[i]);
X			}
X			goto FASTER;
X		}
X		if ((s[0] > 48) && (s[0] < 58)) {
X			sprintf(befehl, "%s", prev_befehl[(s[0] - 48)]);
X			printf("%c", CR);
X			if (ansi("ce") == 1) {
X				printf("                                                               ");
X			}
X			ansi("md");
X			printf("%c[%s] %s > ", CR, prompt, LOP06_MSG);
X			ansi("me");
X		}
X	} while ((s[0] > 47) && (s[0] < 58));
X
X	
X        if(makro_definition(s) != 0) goto FASTER;
X
X
X	BUFFERING:
X
X	if((bef_rec > MAKRO_MAX_REK) && (USER.level < (ADMIN_LEV+1))){
X		bef_buff[0] = '\0';
X		goto FASTER;
X	}
X
X        
X	strcpy(t, (unsigned char *) makro(s));
X	strcpy(s, t); 
X        
X	while ((s[0] == 32) || (s[0] == '.')) {
X		sprintf(befehl, "%s", (unsigned char *) strcopy(s, 1, length(s)));
X		sprintf(s, "%s", befehl);
X	}
X
X	i = 0; ok = 0;
X	while((ok == 0) && (s[i] != '\0')){
X		if(s[i] == ','){ 
X			strcpy(bef_buff, (unsigned char *) strcopy(s, (i+1), length(s)));
X			s[i] = '\0';
X			ok++;
X		}			
X		i++;
X	}
X	if(ok == 0) bef_buff[0] = '\0';
X	
X	strcpy(befehl, (unsigned char *) cut_bef(s));
X	strcpy(argument, (unsigned char *) cut_arg(s));
X	strcpy(s, (unsigned char *) upcased(befehl));
X	strcpy(befehl, s);
X
X	sprintf(s, "%s %s", befehl, argument);
X
X	if (wasok == 1) {
X		ok = 0;
X		for (i = 9; i > 0; i--) {
X			if ((strcomp(s, prev_befehl[i]) == 0) && (strcomp(prev_befehl[i], s) == 0))
X				ok++;
X		}
X		if ((ok == 0) && (befehl[0] > 32)) {
X			for (i = 9; i > 1; i--) {
X				sprintf(prev_befehl[i], "%s", prev_befehl[(i - 1)]);
X			}
X			sprintf(prev_befehl[1], "%s %s", befehl, argument);
X		}
X	}
X	else {
X		sprintf(prev_befehl[1], "%s %s", befehl, argument);
X	}
X
X	sprintf(s, "[%s] %s %s", LOP04_MSG, befehl, argument);
X	control(s, 3);
X
X	sprintf(s, "%s %s", befehl, argument);
X	whodo(s);
X
X
X	wasok = 0;
X
X	if (befehl[0] == '"') {
X		ansi("md");
X		/*
X		printf(" <- Nein, so daemlich kann kein User sein !\n");
X		*/
X		printf(" %s\n", LOP07_MSG);
X		ansi("me");
X		goto FASTER;
X	}
X	if (befehl[0] == '\0') goto FASTER;
X
X
X	if(argument[0] == '?') {
X		strcpy(argument, befehl);
X		strcpy(befehl, BEF[BB7].befehl);
X 	}
X
X/*  ?  */
X
X	if (befehl[0] == '?') {
X		if (argument[0] != '*') {
X			sprintf(s, " %s %d) ", LOP08_MSG, USER.level);
X		} else {
X			sprintf(s, " %s ", LOP09_MSG, USER.level);
X		}
X		headline(s);
X		printf("\n");
X		bef("?", argument);
X		goto FASTER;
X	}
X
X/* <BREAK> */
X
X	if (strcomp(befehl, "<BREAK>") == 0) {
X		printf("!@#?");
X		ansi("md");
X		printf(" %s", LOP10_MSG);
X		ansi("me");
X		printf("\n");
X		goto FASTER;
X	}
X	wasok = 1;
X
X
X	switch (bef(befehl, argument)) {
X
X	    case 275:		/* RELOGIN */
X
X		logout();
X		intro();
X		break;
X
X
X	    case 240:		/* MINIX */
X
X		if (argument[0] == '\0') {
X			ansi("md");
X			printf(" %s\n", LOP11_MSG);
X			ansi("me");
X		}
X		else {
X			printf("\n\n");
X			sprintf(s, "exec %s %s %d %d", RSH, argument, OLDUID, OLDGID);
X			system(s);
X		}
X		break;
X
X
X	    case 110:
X	    case 120:		/* + -  */
X
X		scanner(befehl[0]);
X		break;
X
X
X	    case 190:		/* HILFE */
X
X		printf("\n\n");
X		if (argument[0] < 33)
X			help("=");
X		else {
X			if(argument[0] == '*'){	
X				help("*");
X			}
X			else{
X				strcpy(s, "#");
X				strcat(s, upcased(argument));
X				if (help(s) < 1) {
X					ansi("md");
X					printf("%s \"%s\" %s\n", LOP12_MSG, argument, LOP13_MSG);
X					ansi("me");
X				}
X			}
X		}
X		break;
X
X
X	    case 150:		/* BRETT */
X
X		if(strcomp("**", argument) == NULL) strcpy(argument, "^");
X		brett(argument);
X		break;
X
X
X	    case 130:		/* ANRUFER */
X
X		if(argument[0] == '#'){
X			statistik();
X			break;
X		}
X
X		if(argument[0] == '%'){
X			headline( LOP34_MSG );
X			printf("%s\n", LOP35_MSG);
X			printf("===============================================================================\n");
X			printf("%s ..", LOP29_MSG);
X	
X			switch( (fpid = fork()) ){
X				case -1 :
X					break;
X				case  0 : 
X					while(1){
X						printf(".");
X						sleep(2);
X					}	
X					break;
X			}
X			sprintf(t, "%s/%d.srt", TMP, getpid());
X			sprintf(l, SECONDCUT, CALLS, t);
X			system(l); 			
X			kill( fpid, SIGKILL );
X			(void) wait( &fpid );
X			printf("%c", CR);
X			show(t, 9999, USER.more + 100);
X			unlink(t);
X			break;
X		}
X
X		headline( LOP14_MSG );
X		printf("%s\n", LOP15_MSG);
X		printf("===============================================================================\n");
X
X		if (argument[0] != '*') {
X			show(CALLS, 19, USER.more);
X		}
X		else {
X			show(CALLS, 9999, USER.more + 100);
X		}
X		break;
X
X
X	    case 200:		/* INHALT */
X
X		inhalt2(argument, 'I');
X		break;
X
X
X	    case 210:		/* LESEN */
X
X		dummy = (pruefe(argument));
X		if (dummy == 0) lesen(argument);
X		if (dummy == -1) lesen2(argument, 'L');
X		break;
X
X
X
X	    case 230:		/* SCHREIBEN */
X
X		if (USER.level < WRITE_IN_LEV) {
X			ansi("md");
X			printf(" %s\n", LOP16_MSG);
X			ansi("me");
X		}
X		else
X			schreiben(argument);
X		break;
X
X
X	    case 220:		/* LOESCHEN */
X
X		dummy = (pruefe(argument));
X		if (dummy == 0) loeschen(argument);
X		if (dummy == -1) loeschen2(argument, 'D');
X		break;
X
X
X	    case 160:		/* BRIEF */
X
X		if (USER.level < WRITE_IN_LEV) {
X			ansi("md");
X			printf(" %s\n", LOP16_MSG);
X			ansi("me");
X		}
X		else
X			if((brief(argument) == 0) && (strcomp(GUEST, USER.name) != 0)){
X				sprintf(s, "%s?", USER.name);
X				brief(s);
X				sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
X				stat(s, &fst);
X			        IDX_SIZE = (int) fst.st_size;
X			}
X			else bef_buff[0] = '\0';
X		break;
X
X
X	    case 170:		/* CHAT */
X
X		sprintf(s, "exec %s %s \"%s\" %d %d", RSH, CHAT, USER.nick, OLDUID, OLDGID);
X		system(s);
X		break;
X
X
X	    case 250:		/* PM */
X
X		strcpy(BRETT, "PM");
X		printf("\n");
X		sprintf(NG, "%s.PM", USER.name);
X		sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
X		break;
X
X
X	    case 260:		/* POSTFACH */
X
X		postfach("*");
X		break;
X
X
X	    case 300:		/* USER */
X
X		userliste(argument);
X		break;
X
X
X	    case 140:		/* ANSAGE */
X
X		ansage();
X		break;
X
X
X	    case 310:		/* UNTERSCHRIFT */
X
X		unterschrift();
X		break;
X
X
X	    case 320:		/* VERSION */
X
X		printf("\n\n");
X		ansi("md");
X		printf("Version: ");
X		ansi("me");
X		printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
X
X		if(argument[0] == '#'){
X			ansi("md");
X			printf("\nMein spezieller Dank gilt folgenden Mitarbeitern, Beta-Testern und Ratgebern: \n\n");
X			ansi("me");
X			
X			printf("andreas@xenox.ruhr.de       - fuer den \"NewsFeed\" und seine Geduld\n");
X			printf("                              bei unseren \"Sonderwuenschen\"\n\n");
X
X			printf("az@unnet.w.open.de          - fuer seinen Einsatz beim \"Einrichten\"\n");
X			printf("                              der Mailbox und der PD-Portierung\n\n");
X
X			printf("joergg@unnet.ruhr.sub.org   - fuer seine Ideen, Tips, konstruktive\n");
X			printf("                              Kritik und gruendliche Tests\n\n");		
X
X			printf("klausr@skylink.ruhr.sub.org - fuer viele Vorschlaege, und vor allem\n");			
X			printf("                              fuer seine praesizen Fehlerbeschreibungen\n\n");			
X
X			printf("stefans@coduck.ruhr.sub.org - fuer seine Hilfe bei der Installation\n");
X			printf("                              der 386er Patches und der PD-Beschaffung\n\n");
X
X			printf("walterb@weller.ruhr.sub.org - fuer seine Unterstuetzung bei der Portierung auf\n");
X			printf("                              UNIX SVR3 und bei der Installation\n\n");
X
X			printf("hergo@ivcmd.boerde.de       - fuer seine Hilfe bei der Bildung einer Referenz-\n");
X			printf("                              Version zur Verwendung von CDIFFs\n\n");
X			
X		}
X		
X		if(argument[0] == '*'){
X			ansi("md");
X			printf("\n%s ", LOP17_MSG);
X			ansi("me");
X#ifdef _SYS7
X			printf("-D_SYS7 ");
X#endif
X#ifdef _MBOX
X			printf("-D_MBOX ");
X#endif
X#ifdef _MINIX
X			printf("-D_MINIX ");
X#endif
X#ifdef _ESTDIO
X			printf("-D_ESTDIO ");
X#endif
X#ifdef _CORELEFT
X			printf("-D_CORELEFT ");
X#endif
X#ifdef _DATESTAMP
X			printf("-D_DATESTAMP ");
X#endif
X#ifdef _BAUDRATE
X			printf("-D_BAUDRATE ");
X#endif
X#ifdef _MULTIMEDIA
X			printf("-D_MULTIMEDIA ");
X#endif
X#ifdef _METAMAIL
X			printf("-D_METAMAIL ");
X#endif
X#ifdef _UMLAUT
X			printf("-D_UMLAUT ");
X#endif
X
X			printf("\n");
X		}
X
X		break;
X
X
X	    case 270:		/* PORTINFO */
X
X		port( argument );
X		break;
X
X
X	    case 280:		/* SETUP */
X
X		sprintf(s, "%s", NG);
X		sprintf(t, "%s", BRETT);
X		setup();
X		if (strcomp("PM", t) != 0) brett(s);
X		break;
X
X
X	    case 125:		/* ADMIN */
X
X		sprintf(s, "%s", NG);
X		sprintf(t, "%s", BRETT);
X		admin();
X		if (strcomp("PM", t) != 0) brett(s);
X		break;
X
X
X	    case 205:		/* ID */
X
X		if(strcomp("-c", argument) == 0){ /* Memory fault - core dumped */
X			printf("\n\nDebug-Modus: ");
X			fclose(0);   
X			break;
X		}
X
X		if(strcomp("*", argument) == 0){
X			BAUDRATE = baudrate( MAX_BPS );
X			printf("\n\n>>> Baudrate %d\n", BAUDRATE);
X			break;
X		}
X
X		if(strcomp("#", argument) == 0){
X			printf("\n\n>>> Coreleft %d\n", coreleft());
X			break;
X		}
X
X		printf("\n\n>>> %s (UID %d|%d|%d) (GID %d|%d|%d)\n", MYNAME,
X		       getuid(), geteuid(), OLDUID,
X		       getgid(), getegid(), OLDGID);
X		break;
X
X
X	    case 215:		/* LEVEL */
X
X		show_level();
X		break;
X
X
X	    case 290:		/* STATUS */
X
X		status();
X		break;
X
X
X	    case 330: 		/* MAKRO */
X
X		set_makros();
X		break;
X
X
X	    case 340:		/* WEITERLEITEN */
X
X		weiterleiten( argument );
X		break;
X
X
X	    case 350:           /* SLEEP */
X
X		dummy = atoi( argument );
X		if(dummy < 1) dummy = 1;
X		printf("\n");
X		ansi( "mr" );
X		printf(" %s ... ", LOP29_MSG);
X		ansi( "me" );	
X		sleep( dummy );
X		break;		
X
X
X	    case 360:		/* KEYPRESSED */
X
X		printf("\n");
X		ansi("mr");
X		printf(" Taste ! ");
X		ansi("me");
X		dummy = getint();
X		if((dummy == CTRL_X) || (dummy == 'x') || (dummy == 'q')){
X			bef_buff[0] = '\0';
X			printf("\n");
X		}
X		break;
X
X
X	    case 370:		/* DATUM */
X		
X		ansi("md");
X		printf("\n\n%s ", LOP18_MSG);
X		ansi("me"); 
X		printf("%s, ", (unsigned char *) mydate( 2 ));
X		printf("%s\n",  (unsigned char *) mydate( 0 ));
X		break;
X	
X
X	    case 380:		/* ZEIT */
X
X		ansi("md");
X		printf("\n\n%s ", LOP19_MSG);
X		ansi("me");
X		printf("%s\n", (unsigned char *) mytime( 0 ));
X		ansi("md");
X		printf("Online: ");
X		ansi("me");
X		time(&time_now);
X		printf("%d %s\n",  (int) time_now - time_start, LOP20_MSG);
X		break;
X
X
X	   case 390:		/* SPIELE */
X
X		games();
X		break;
X	
X
X	    case 400:		/* RICHTUNG */
X
X		ansi("md");
X		printf("\n\n%s ", LOP21_MSG);
X		ansi("me");
X
X		if (USER.leserichtung == 1) {
X			USER.leserichtung = 2;
X			printf("%s\n", LOP22_MSG);
X		}
X		else {
X			USER.leserichtung = 1;
X			printf("%s\n", LOP22aMSG);
X		}
X		break;
X
X
X	    case 410:           /* STATISTIK */
X
X		if ((argument[0] != '#') && (argument[0] != '$') && (argument[0] != '%') && (argument[0] != '!') && (argument[0] != '>')) {
X			headline( LOP23_MSG );
X			printf("%s\n", LOP24_MSG);
X			printf("===============================================================================\n");
X
X			if (argument[0] != '*') {
X				show(MB_DLOG, 19, USER.more);
X			}
X			else {
X				show(MB_DLOG, 9999, USER.more + 100);
X			}
X		}
X		if(argument[0] == '$') {
X			headline( LOP25_MSG );
X			show(UUCPCOSTS, 9999, USER.more);
X		}
X   		if(argument[0] == '#') {
X			headline( LOP26_MSG );
X			printf("%s\n", LOP27_MSG);
X			printf("===============================================================================\n");
X
X			show(PDLOG, 9999, USER.more + 100);
X		}
X		if(argument[0] == '>') {
X			headline( LOP27aMSG );
X			printf("%s\n", LOP27bMSG);
X			printf("===============================================================================\n");
X
X			show(XMDLOG, 9999, USER.more + 100);
X		}
X		if(argument[0] == '%') {
X			headline( LOP32_MSG );
X			printf("%s\n", LOP33_MSG);
X			printf("===============================================================================\n");
X			printf("%s ..", LOP29_MSG);
X	
X			switch( (fpid = fork()) ){
X				case -1 :
X					break;
X				case  0 : 
X					while(1){
X						printf(".");
X						sleep(2);
X					}	
X					break;
X			}
X			sprintf(t, "%s/%d.srt", TMP, getpid());
X			sprintf(l, SORTEDCUT, PDLOG, t);
X			system(l); 			
X			kill( fpid, SIGKILL );
X			(void) wait( &fpid );
X			printf("%c", CR);
X			show(t, 9999, USER.more + 100);
X			unlink(t);
X		}
X		if(argument[0] == '!') {
X			headline( " OUTDIAL " );
X			show("/local/mbox/etc/outdial.log", 9999, USER.more);
X		}
X
X		break;
X 
X
X	    case 430:		/* SUCHEN */
X
X		suchen( argument );
X		break;	
X
X	    			
X	    case 420:		/* RING */
X
X		ende = 1;
X		break;
X
X
X	    case 440:		/* DOWNLOAD */
X
X		download( argument );
X		break;
X
X 	    case 450:		/* OUTDIAL */
X
X		outdial();
X		break;
X
X	    case 460:		/* AREA */
X
X		if((strcomp("++", argument) == 0) || (strcomp("--", argument) == 0)){
X			scanner( argument[0] + 1500 );
X		}
X		else{
X			scanner( argument[0] + 500 );
X		}	
X		break;
X
X
X	    case 470:		/* SYSINFO */
X
X		headline( " SYSiNFO " );
X		show(SYSINFO, 9999, USER.more);
X		break;
X
X	    case 480:		/* EDIT */
X
X		edit( argument );
X		break;
X
X	    case 490:		/* DIS */
X
X		dis( argument );
X		break;
X
X	    case 500:		/* UMLAUT */
X
X		ansi("md");
X		printf("\n\n%s ", LOP33aMSG);
X		ansi("me");
X
X		if (UMLAUT_MODUS == 4) {
X			UMLAUT_MODUS = USER.schluessel[2];
X			switch(UMLAUT_MODUS){
X				case 1 : printf("%s\n", ADM70dMSG);
X					 break;
X				case 2 : printf("%s\n", ADM70eMSG);
X					 break;
X				case 3 : printf("%s\n", ADM70fMSG);
X					 break;
X				case 4 : printf("%s\n", ADM70gMSG);
X					 break;
X			}
X		}
X		else {
X			UMLAUT_MODUS = 4;
X			printf("%s\n", LOP33bMSG);
X		}
X		break;
X
X	    case 510:		/* MONITOR */
X
X		i = atoi( argument );
X 		if(i < 1) i = 15;
X
X		switch( (fpid = fork()) ){
X			case -1 :
X				break;
X			case  0 : 
X				while(1){
X					headline( LOP14_MSG );
X					printf("%s\n", LOP15_MSG);
X					printf("===============================================================================\n");
X					show(CALLS, 19, USER.more);
X					sleep( i ); 
X					statistik();
X					sleep( i ); 
X					port( "" );
X					sleep( i ); 
X					headline( LOP23_MSG );
X					printf("%s\n", LOP24_MSG);
X					printf("===============================================================================\n");
X					show(MB_DLOG, 19, USER.more);
X					sleep( i ); 
X				}	
X		}
X		c = getch();
X		kill( fpid, SIGKILL );
X		(void) wait( &fpid );		
X		break;
X
X	    case 1000:		/* User Defined Command */
X
X		/* See 'befehl.c' how that works ;-) */
X		break;
X
X	    case 180:		/* ENDE */
X
X#ifdef _MINIX
X		if (tty() >= FIRST_EX_TTY) {
X			printf("\n\n");
X			ansi("mr");
X			printf("%c%s [%c, %c] > ", CR, LOP28_MSG, GBL06_MSG, GBL07_MSG);
X			ansi("me");
X			
X			c = yesno();
X		} else
X#endif
X			c = GBL06_MSG;
X
X
X		if (c == GBL06_MSG)
X			ende = 1;
X		else
X			printf("\n");
X
X		if(argument[0] == '*'){
X			USER.lasttime = LASTTIME;
X			strcpy(USER.lastlog, (unsigned char *) datereconv( LASTLOG ));
X		}
X		else{
X			strcpy(s, (unsigned char *) mydate(0));
X			s[10] = '\0';
X			strcpy(USER.lastlog, s);
X			strcpy(s, (unsigned char *) mytime(1));
X			USER.lasttime = timeconv(s);
X		}
X
X		break;
X
X	    case -1:		/* LEVEL ??? */
X
X		wasok = 0;
X		ansi("md");
X		printf(" %s %d ...\n", LOP30_MSG, USER.level);
X		ansi("me");
X		break;
X
X	    default:
X
X		wasok = 0;
X		ansi("md");
X		printf(" %s\n", LOP31_MSG);
X		ansi("me");
X	}
X
X  } while (ende == 0);
X}
END_OF_FILE
  if test 22323 -ne `wc -c <'src/loop.c'`; then
    echo shar: \"'src/loop.c'\" unpacked with wrong size!
  fi
  # end of 'src/loop.c'
fi
if test -f 'src/mail.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/mail.c'\"
else
  echo shar: Extracting \"'src/mail.c'\" \(22275 characters\)
  sed "s/^X//" >'src/mail.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*	    PROGRAMM  ix/Mbox						   */
X/*             DATEI  mail.c						   */
X/*        FUNKTIONEN  brief()						   */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)		   */
X/*  LETZTE AENDERUNG  16.11.1992					   */
X/***************************************************************************/
X
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <unistd.h>
X#include <stdio.h>
X#include <fcntl.h>
X#include <time.h>
X
X#include "mbox.h"
X
X
X
X/***************************************************************************/
X/*      FUNKTION  brief()						   */
X/*  BESCHREIBUNG  Eine persoenliche Nachricht wird verschickt. Je nach     */
X/*		  Empfaenger-Adresse und Parameter wird die Post ins       */
X/*		  MBox-interne Mailsystem geschickt, oder an MAIL          */
X/*		  weitergleitet. Die Adresse des Empfaengers wird ent-     */
X/*		  weder als Parameter uebergeben, oder aus einer Datei     */
X/*		  gefiltert, auf die geantwortet werden soll (REPLY-Mode). */
X/*     PARAMETER  arg  =  "~REPLY~"    =  REPLY-Modus aktivieren           */
X/*		  arg  =  "Empfaenger" =  verwertbare Adresse fuer das     */
X/*			  interen Mail-System oder MAIL.                   */
X/*     RUECKGABE   -1  =  Abbruch                                          */
X/***************************************************************************/
X
Xint brief(arg)
Xunsigned char arg[];
X{
X  FILE *fp;
X  FILE *ff;
X  FILE *ft;
X  int fd;
X  int i, j;
X  int ok;
X  struct userdaten LOOSER;
X
X  time_t timer;
X  struct tm *timeptr;
X
X  int receiver;
X  int mail_id;
X  int EX_PM = 0;
X  int REPLY = 0;
X  int lines = 0;
X  int WEITERLEITEN = 0;
X  int HOLD = 0;
X  int UMLEITUNG = 0;
X  int KOPIE = 0;
X
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char TEP[STRING];
X  unsigned char REP[STRING];
X  unsigned char f[STRING];
X  unsigned char subject[STRING];
X  unsigned char from[STRING];
X  unsigned char rec_char[STRING];
X  unsigned char ex[LONGSTRING];
X  unsigned char user[STRING];
X  unsigned char mesg_id[STRING];
X  unsigned char refs[STRING];
X  unsigned char date[STRING];
X  unsigned char c;
X  unsigned char protokoll;
X  unsigned char lf;
X  unsigned char pubdir[STRING];
X  unsigned char dummy[STRING];
X  unsigned char username[STRING];
X  unsigned char reply[STRING];
X  unsigned char priority[STRING];
X  unsigned char action[STRING];
X  unsigned char cc[STRING];
X  unsigned char bcc[STRING];
X  unsigned char encrypted[STRING];
X  unsigned char comments[STRING];
X  unsigned char keywords[STRING];
X  unsigned char fortune[STRING];
X  unsigned char content[STRING];
X  unsigned char receipt[STRING];
X
X  long cont_length = 0;
X
X  unsigned char YOUR_SITE[STRING];
X
X  int BINFILE;
X  int news_reply = 0;
X
X  struct stat fst;
X
X
X  i = 0;
X  ok = 0;
X
X  mesg_id[0] = '\0';
X
X  if (arg[0] == '\0') {
X	ansi("md");
X	printf(" %s\n", MAL03_MSG);
X	ansi("me");
X	return -1;
X  }
X  EX_PM = 0;
X
X  i = 0;
X  strcpy(t, USER.name);
X  while (t[i] != '\0') {
X	if (t[i] == ' ') t[i] = '.';
X	i++;
X  }
X  strcpy(username, t);
X  action[0] = '\0';
X  priority[0] = '\0';
X  encrypted[0] = '\0';
X  keywords[0] = '\0';
X  comments[0] = '\0';
X  cc[0] = '\0';
X  bcc[0] = '\0';
X  fortune[0] = '\0';
X  content[0] = '\0';
X  receipt[0] = '\0';
X
X#ifdef _UMLAUT
X  if(UMLAUT_MODUS < 3) strcpy(content, (unsigned char *) "text/plain; charset=iso-8859-1");
X#endif
X
X  i = 0;
X  while (arg[i] != '\0') {
X	if ((arg[i] == '!') || (arg[i] == '@') || (arg[i] == '%')) EX_PM++;
X	i++;
X  }
X
X  if ((EX_PM > 0) && (USER.level < MAILOUT_LEV)) {
X	ansi("md");
X	printf("\n\n%s (%d) %s\n", MAL04_MSG, MAILOUT_LEV, MAL05_MSG);
X	ansi("me");
X	return -1;
X  }
X
X  if(arg[length(arg) -1] == '?'){
X	arg[length(arg) -1] = '$';
X	HOLD++;
X	KOPIE++;
X  }
X
X  if(arg[length(arg) -1] == '$'){
X	WEITERLEITEN++;
X	arg[length(arg) -1] = '\0';
X	sprintf(TEP, "%s/usr/%d/.lastletter", HOME, USER.id);
X	sprintf(t, "%s/usr/%d/.lastsubject", HOME, USER.id);
X	fp = fopen( t, "r" );
X	if(fp == NULL) {
X		return -1; 
X	}
X	fgets(s, 80, fp);
X	fclose(fp);
X	if(HOLD == 0){
X		sprintf(subject, "%s %s", MAL06_MSG, s);
X		UMLEITUNG++;
X	}else
X		sprintf(subject, "%s", s);
X  }
X
X  user[0] = '\0';
X  strcat(user, arg);
X
X  if(WEITERLEITEN != 0) goto TRY_AGAIN;
X
X  if (strcomp("~REPLY~", arg) == 0) {
X	REPLY++;
X	sprintf(REP, "%s/%dRep", TMP, getpid());
X	sprintf(TEP, "%s/%dTep", TMP, getpid());
X	fp = fopen(REP, "r");
X	if (fp == NULL) {
X		nerror("mail.c", 278, "brief", "Datei-Lesefehler", REP);
X	}
X	fgets(s, 80, fp	);			/* HEADER: Autor */
X
X	sprintf(dummy, "%s %s", GBL01_MSG, X_MAIL_DEMON);
X
X	if ((strcomp(GBL01_MSG, s) == 0) && (strcomp(dummy, s) != 0)) {
X		strcpy(user, (unsigned char *) strcopy(s, (1+strlen(GBL01_MSG)), 80));
X
X		fgets(s, 80, fp);		/* HEADER: Datum */
X		fgets(s, 80, fp);		/* HEADER: Betreff */
X
X		strcpy(t, (unsigned char *) strcopy(s, (1+strlen(GBL03_MSG)), 80));
X		subject[0]= '\0';
X		if (strcomp("Re: ", t) != 0) {
X			strcpy(subject, "Re: ");
X		}
X		strcat(subject, (unsigned char *) stripped(t));
X
X		fgets(s, 80, fp);	/* HEADER: Leer */
X		fgets(s, 80, fp);	/* HEADER: Leer */
X	}
X	else {		/* UUCP-Header (!MBox) */
X
X		sprintf(subject, MAL07_MSG);
X		refs[0] = '\0';
X		mesg_id[0] = '\0';
X
X		ok = -1;
X
X		while ((ok < 1) && (fgets(s, 80, fp) != NULL)) {
X			if (strcomp("Lines: ", s)      == 0) ok = 1;
X			if (strcomp("Date: ",  s)      == 0) {
X				strcpy(date, (unsigned char *) strcopy(s, 6, 80));
X			}
X			if (strcomp("Newsgroups: ", s) == 0) news_reply++;
X			if (strcomp("Subject: ", s)    == 0) {
X				subject[0] = '\0';
X				strcpy(t, (unsigned char *) strcopy(s, 9, 80));
X				if (strcomp("Re: ", t) != 0) {
X					sprintf(subject, "%s", "Re: ");
X				}
X				strcat(subject, (unsigned char *) stripped(t));
X			}
X			if (strcomp("Message-Id: ", s) == 0) {
X				strcpy(mesg_id, (unsigned char *) strcopy(s, 12, 80));
X			}
X			if (strcomp("From: ", s) == 0) {
X				strcpy(from, (unsigned char *) strcopy(s, 6, 80));
X				ok = 0;
X			}
X			if (strcomp("From ", s) == 0) {
X				strcpy(from, (unsigned char *) strcopy(s, 5, 80));
X				ok = 0;
X			}
X			if (strcomp("References: ", s) == 0) {
X				strcpy(refs, (unsigned char *) strcopy(s, 12, 80));
X			}
X			if (strcomp("Comments: ", s) == 0) {
X				strcpy(comments, (unsigned char *) strcopy(s, 10, 80));
X				strcpy(comments, (unsigned char *) stripped(comments));	
X			}
X			if (strcomp("Keywords: ", s) == 0) {
X				strcpy(keywords, (unsigned char *) strcopy(s, 10, 80));
X				strcpy(keywords, (unsigned char *) stripped(keywords));
X			}
X			if (strcomp("Content-Type: ", s) == 0) {
X				strcpy(content, (unsigned char *) strcopy(s, 14, 80));
X				strcpy(content, (unsigned char *) stripped(content));
X			}
X
X			if ((strlen(s) < 5) && (ok == 0)) ok = 1;
X		}
X	}
X
X	ff = fopen(TEP, "w");
X	while (fgets(s, 80, fp) != NULL) {
X		if(s[0] != '\n') fputs("> ", ff);
X		fputs((unsigned char *) iso_line(s), ff);
X	}
X	fputs("", ff);
X	fclose(ff);
X	fclose(fp);
X  }
X
X  TRY_AGAIN:
X
X  if((WEITERLEITEN != 0) && (EX_PM != 0)){
X	sprintf(rec_char, "%s", user);
X	if(checkdomaintype( rec_char ) != 0) return -1;
X	goto ONCE_MORE;
X  }
X
X  receiver = 0;
X
X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
X  fd = open(UDBASE, O_RDONLY);
X  if (fd == -1) {
X	nerror("mail.c", 216, "brief", "Datei-Lesefehler", UDBASE);
X  }
X  lseek(fd, 0L, SEEK_SET);
X  while ((receiver == 0) && (read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER))) {
X	if ((strcomp(user, LOOSER.name) == 0) ||
X	    (strcomp(LOOSER.name, user) == 0) ||
X	    (strcomp(user, LOOSER.nick) == 0) ||
X	    (strcomp(user, LOOSER.sh_name) == 0)) {
X		receiver = LOOSER.id;
X		strcpy(rec_char, LOOSER.name);
X	}
X  }
X  close(fd);
X  mbunlock(UDBASE);
X
X  if ((receiver == 0) && (EX_PM == 0)) {
X
X	if (REPLY != 0) {
X		strcpy(user, fetch_reciepy(REP));
X		if (fetch_local == 1) goto TRY_AGAIN;
X		strcpy(rec_char, (unsigned char *) stripped(user));
X		if (strcomp(user, "OOPS") == 0) {
X			ansi("md");
X			printf("\n\n%s\n", MAL08_MSG);
X			ansi("me ");
X			unlink(TEP);
X			unlink(REP); /* ??? */
X			return -1;
X		}
X		EX_PM = 1;
X		c = MAL13_MSG;
X		goto REPLY_MARK;
X	}
X	else {
X		ansi("md");
X		strcpy(rec_char, (unsigned char *) stripped(user));
X		printf("\n\n%s \"%s\" %s\n", MAL09_MSG, user, MAL10_MSG);
X		ansi("me");
X		if(WEITERLEITEN == 0) unlink(TEP);
X		unlink(REP);
X		return -1;
X	}
X  }
X
X  if(WEITERLEITEN != 0) goto ONCE_MORE;
X
X  unlink(REP);
X
X  if (EX_PM == 0) {
X	ansi("md");
X	sprintf(s, "%s/usr/%d/.hello", HOME, receiver);
X	printf("\n\n");
X	show(s, 22, 0);
X	ansi("me");
X  }
X  else {
X	strcpy(rec_char, arg);
X  }
X
X  if(checkdomaintype( rec_char ) != 0) return -1;
X
X  if (REPLY != 0) {
X	c = MAL13_MSG;
X	goto REPLY_MARK;
X  }
X  printf("\n\n");
X  ansi("mr");
X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL12_MSG);
X  ansi("me");
X  printf("%c%c", MAL13_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, MAL16_MSG);
X		ansi("me");
X	}
X	if (c == ENTER) c = MAL13_MSG;
X	if ((c != MAL13_MSG) && (c != MAL14_MSG) && (c != MAL15_MSG)) c = 0;
X  } while (c == 0);
X
X  printf("%c", c);
X
X  if (c == MAL15_MSG) {		/* VERWERFEN */
X	unlink(REP);
X	unlink(TEP);
X	printf("\n");
X	return -1;
X  }
X  sprintf(TEP, "%s/M%d", TMP, getpid());
X  sprintf(pubdir, "%s/dir%d", TMP, getpid());
X
X  if (c == MAL14_MSG) {		/* UPLOAD */
X	clearline();
X	ansi("mr");
X	printf("%c%s, ? > ", CR, MAL17_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, MAL17aMSG);
X			ansi("me");
X		}
X		if ((protokoll != MAL18_MSG) && (protokoll != MAL18_MSG) &&
X		    (protokoll != MAL20_MSG) && (protokoll != MAL21_MSG))
X			protokoll = 0;
X	} while (protokoll == 0);
X
X	printf("%c", protokoll);
X
X  }
X  printf("\n\n%c", CR);
X  ansi("mr");
X  printf("%s ", MAL22_MSG);
X  ansi("me");
X  printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
X  ansi("mr");
X  printf("%s ", MAL23_MSG);
X  ansi("me");
X  printf(" %s\n%c", rec_char, CR);
X  ansi("mr");
X  printf("%s ", MAL24_MSG);
X  ansi("me");
X  printf(" ");
X  strcpy(subject, (unsigned char *) getline(50, -11, '.', ""));
X  printf("\n");
X  ansi("mr");
X  printf("%s ", MAL23aMSG);
X  ansi("me");
X  printf(" ");
X  strcpy(cc, (unsigned char *) getline(50, -11, '.', ""));
X
X  REPLY_MARK:
X
X  if(checkdomaintype( rec_char ) != 0) return -1;
X
X  if (c == MAL13_MSG) {
X	sprintf(s, "%s %s", EDDY, TEP);
X	noctrlx();
X	system(s);
X	ctrlx();
X	protokoll = '*';
X  }
X  else {			/* UPLOAD */
X
X	printf("\n\n");
X	printf("%s\n\n", MAL25_MSG); 
X	ansi("md");
X	printf("%s", MAL26_MSG);
X	ansi("me");
X          
X	unlink( TEP );
X	
X	switch (protokoll) {
X	    case MAL18_MSG:
X			fp = fopen(TEP, "w");
X			if (fp == NULL) {
X				nerror("mail.c", 268, "brief", "DSF", TEP);
X			}
X			c = 0;
X			lf = CR;
X
X			fputc(LF, fp);
X
X			while ((c != CTRL_X) && (c != CTRL_D)) {
X				c = getint();
X				if ((c == CR) && (lf == CR)) 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
X	    case MAL19_MSG:
X			printf("\n");
X			sprintf(s, "exec %s -bc TimeTravelAgency", RX);
X			break;
X	    case MAL20_MSG:
X			printf("\n");
X			sprintf(s, "exec %s -b", RB);
X			break;
X	    case MAL21_MSG:
X			printf("\n");
X			sprintf(s, "exec %s -b", RZ);
X			break;
X	}
X	if (protokoll != MAL18_MSG){
X		mkdir( pubdir, 0777 );
X		chdir( pubdir );
X
X		system( s );
X
X		chdir( HOME );
X		sprintf(s, "mv %s/* %s", pubdir, TEP);
X		system( s );
X		sprintf(s, "rm -r %s", pubdir);
X		system( s );
X	}
X	sync();
X	stat(TEP, &fst);
X	if (fst.st_size < 3L) {
X		printf("\n\n%s\n", MAL27_MSG);
X		control(MAL28_MSG, 3);
X		unlink(REP);	/* ??? */
X		unlink(TEP);
X		return -1;
X	}	
X	if (prf(TEP) == 1) {
X		printf("\n\n");
X		ansi( "md" );
X		printf("%s", MAL25_MSG);		
X		ansi( "me" );
X		unlink(REP); 	/* ??? */
X		unlink(TEP);
X		return -1;
X		BINFILE++;
X	}
X	else{
X		mkix(TEP);
X	}
X  }
X
X  sprintf(reply, "%s <%s@%s>", USER.name, username, UUCPID);
X
X  ONCE_MORE:
X
X    
X  if((HOLD != 0) || ((WEITERLEITEN != 0) && (IS_BUFFERED != 0))) goto HOLD_MARK;
X
X  printf("\n\n");
X  ansi("mr");
X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL28aMSG);
X  ansi("me");
X  printf("%c%c", MAL29_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, MAL32_MSG);
X		ansi("me");
X	}
X	if (c == ENTER) c = MAL29_MSG;
X	if ((c != MAL29_MSG) && (c != MAL30_MSG) && (c != MAL30aMSG) &&  (c != MAL31_MSG) && (c != MAL31aMSG)) c = 0;
X  } while (c == 0);
X
X  printf("%c", c);
X
X  if (c == MAL31_MSG) {		/* WEITERSCHREIBEN */
X	sprintf(s, "%s %s", EDDY, TEP);
X	noctrlx();
X	system(s);
X	ctrlx();
X	goto ONCE_MORE;
X  }
X  if (c == MAL30_MSG) {		/* VERWERFEN */
X	printf("\n");
X	unlink(TEP);
X	unlink(REP);
X	return -1;
X  }
X  if (c == MAL31aMSG) {		/* HEADER */
X	headline( MAL32aMSG );
X	printf("\n");
X
X	time(&timer);
X
X	ansi( "md" );
X	printf("From: ");
X	ansi( "me" );
X	printf("%s <%s@%s>\n", USER.name, username, UUCPID);
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("Return-Receipt-To: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		/*
X		if(receipt[0] == '\0') sprintf(receipt, (unsigned char *) "%s@%s",  username, UUCPID);
X		*/
X		strcpy(receipt, (unsigned char *) getline(80, -1001, 32, receipt));
X		printf("\n");
X	}
X
X	i = 0; j = 0;			/* Empfaenger: Realname */
X	while(from[i] != '\0'){
X		if(from[i] == '<'){
X			strcpy(s, (unsigned char *) strcopy(from, 0, (i-1)));
X			j = i;
X		}
X		if(from[i] == '(') j = i+1;
X		if(from[i] == ')') strcpy(s, (unsigned char *) strcopy(from, j, (i-1)));
X		i++;
X	}
X	if(j == 0) strcpy(s, from);
X		
X	if(mesg_id[0] != '\0'){
X		ansi( "md" );
X		printf("In-Reply-To: ");
X		ansi( "me" );
X		printf("%s; ", (unsigned char *) stripped(mesg_id)); 
X		printf("from \"%s\" at %s", (unsigned char *) stripped(s), date);
X
X		if(refs[0] != '\0') 
X			sprintf(s, "%s ", stripped(refs));
X		else
X			s[0] = '\0';
X		strcat(s, mesg_id);
X		ansi( "md" );
X		printf("References: ");
X		ansi( "me" );
X		printf("%s", s);
X	}
X
X	ansi( "md" );
X	printf("To: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(rec_char, (unsigned char *) getline(80, -1001, 32, rec_char));
X		printf("\n");
X	}
X	else printf("%s\n", rec_char);
X
X	ansi( "md" );
X	printf("Cc: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(cc, (unsigned char *) getline(80, -1001, 32, cc));
X		printf("\n");
X	}
X	else printf("%s\n", cc);
X
X	ansi( "md" );
X	printf("Bcc: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(bcc, (unsigned char *) getline(80, -1001, 32, bcc));
X		printf("\n");
X	}
X	else printf("%s\n", bcc);
X
X
X	ansi( "md" );
X	printf("Subject: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(subject, (unsigned char *) getline(80, -1001, 32, subject));
X		printf("\n");
X	}
X	else printf("%s\n", subject);
X
X	ansi( "md" );
X	printf("Keywords: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(keywords, (unsigned char *) getline(80, -1001, 32, keywords));
X		printf("\n");
X	}
X	else printf("%s\n", keywords);
X
X	ansi( "md" );
X	printf("Comments: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(comments, (unsigned char *) getline(80, -1001, 32, comments));
X		printf("\n");
X	}
X	else printf("%s\n", comments);
X
X	ansi( "md" );
X	printf("Encrypted: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(encrypted, (unsigned char *) getline(80, -1001, 32, encrypted));
X		printf("\n");
X	}
X	else printf("%s\n", encrypted);
X
X#ifdef _MULTIMEDIA
X	ansi( "md" );
X	printf("MIME-Version: ");
X	ansi( "me" );
X	printf("%s\n", MIME_VERSION);
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("Content-Type: ");
X		ansi( "me" );
X		strcpy(content, (unsigned char *) getline(80, -1001, 32, content));
X		printf("\n");
X	}
X#endif
X
X	ansi( "md" );
X	printf("X-Mailer: ");
X	ansi( "me" );
X	printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);	
X
X	ansi( "md" );
X	printf("Priority: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(priority, (unsigned char *) getline(80, -1001, 32, priority));
X		printf("\n");
X	}
X	else printf("%s\n", priority);
X
X	ansi( "md" );
X	printf("Action: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(action, (unsigned char *) getline(80, -1001, 32, action));
X		printf("\n");
X	}
X	else printf("%s\n", action);
X
X	ansi( "md" );
X	printf("X-Fortune: ");
X	ansi( "me" );
X	if(USER.level > GUEST_LEV){
X		strcpy(fortune, (unsigned char *) getline(80, -1001, 32, fortune));
X		printf("\n");
X	}
X	else printf("%s\n", fortune);
X
X
X	ansi( "md" );
X	printf("Message-Id: ");
X	ansi( "me" );
X   	printf("<%x.%d@%s>\n", timer, USER.id, UUCPID);
X
X	goto ONCE_MORE;
X  }
X
X
X  HOLD_MARK:
X
X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0) && (strcomp(TMP, TEP) == 0)){
X	sprintf(s, "cp %s %s/usr/%d/.lastletter > /dev/null", TEP, HOME, USER.id);
X	system( s );     
X	sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
X	fp = fopen( s, "w" );
X	if(fp == NULL){
X		nerror("mail.c", 500, "brief", "Datei-Schreibfehler", s);
X	}
X	fprintf(fp, "%s", subject);
X	fclose(fp);
X  }
X
X
X  if (EX_PM == 0) {
X	sprintf(s, "%s/usr/%d/seq", HOME, receiver);
X	maybe_locked(s, "r");
X	fp = fopen(s, "r");
X	if (fp == NULL) {
X		nerror("mail.c", 431, "brief", "Datei-Lesefehler", s);
X	}
X	fscanf(fp, "%d", &mail_id);
X	fclose(fp);
X	fp = fopen(s, "w");
X	fprintf(fp, "%d\n", (mail_id + 1));
X	fclose(fp);
X
X	sprintf(s, "%s/usr/%d/%d", HOME, receiver, mail_id);
X  }
X  else {
X	umask(0000);
X	sprintf(s, "%s/%d.expm", TMP, getpid());
X  }
X
X
X  fp = fopen(s, "w");
X
X  if (EX_PM == 0) {
X	sprintf(s, "%s %s (%s)\n", GBL01_MSG, USER.name, USER.nick);
X	fputs(s, fp);
X
X	time(&timer);
X	timeptr = localtime(&timer);
X	strcpy(t, asctime(timeptr));
X
X	sprintf(s, "%s %s", GBL02_MSG, t);
X	fputs(s, fp);
X
X	sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
X	fputs(s, fp);
X
X	fputs("Content-Type: text/richtext;\n", fp);
X
X	lines = 5;
X   }
X   else {
X	lines = 4;
X  }
X
X  ff = fopen(TEP, "r");
X  if (ff == 0) {
X	printf("\n\n");
X	ansi("md");
X	printf("%s\n", MAL33_MSG);
X	ansi("me");
X	control(MAL34_MSG, 3);
X	return;
X  }
X  stat(TEP, &fst);
X  cont_length = fst.st_size;
X
X  if(EX_PM != 0){
X
X	time(&timer);
X
X	i = 0; j = 0;			/* Empfaenger: Realname */
X	while(from[i] != '\0'){
X		if(from[i] == '<'){
X			strcpy(s, (unsigned char *) strcopy(from, 0, (i-1)));
X			j = i;
X		}
X		if(from[i] == '(') j = i+1;
X		if(from[i] == ')') strcpy(s, (unsigned char *) strcopy(from, j, (i-1)));
X		i++;
X	}
X	if(j == 0) strcpy(s, from);
X
X	fprintf(fp, "From: %s@%s (%s)\n", username, UUCPID, USER.name); 
X	if(reply[0] != '\0')
X		fprintf(fp, "Reply-To: %s\n", reply);
X	if(receipt[0] != '\0')
X		fprintf(fp, "Return-Receipt-To: %s\n", receipt);
X	fprintf(fp, "Organization: %s\n", ORGANIZATION);
X	if(mesg_id[0] != '\0'){
X		fprintf(fp, "In-Reply-To: %s; ", (unsigned char *) stripped(mesg_id)); 
X		fprintf(fp, "from \"%s\" at %s", (unsigned char *) stripped(s), date);
X		if(refs[0] != '\0') 
X			sprintf(s, "%s ", stripped(refs));
X		else
X			s[0] = '\0';
X		strcat(s, mesg_id);
X		fprintf(fp, "References: %s", s);
X	}
X        fprintf(fp, "To: %s\n", rec_char);
X	if(cc[0] != '\0')
X		fprintf(fp, "Cc: %s\n", cc);
X
X	sprintf(s, "%s/usr/%d/.face", HOME, USER.id); /* X-Face ??? */
X	ft = fopen( s, "r" );
X	if(ft != NULL){
X		while(fgets(s, 70, ft) != NULL){
X			fprintf(fp, "X-Face: %s\n", (unsigned char *) stripped(s));
X		}
X		fclose(ft);
X	}
X
X	if(subject[0] != '\0')
X		fprintf(fp, "Subject: %s\n", subject);
X	if(keywords[0] != '\0')
X		fprintf(fp, "Keywords: %s\n", keywords);
X	if(comments[0] != '\0')
X		fprintf(fp, "Comments: %s\n", comments);
X	if(encrypted[0] != '\0')
X		fprintf(fp, "Encrypted: %s\n", encrypted);
X
X#ifdef _MULTIMEDIA
X	fprintf(fp, "MIME-Version: %s\n", MIME_VERSION);
X	if(content[0] != '\0'){
X		fprintf(fp, "Content-Type: %s\n", content);
X		if(UMLAUT_MODUS < 3) fprintf(fp, "Content-Transfer-Encoding: 8bit\n");
X		fprintf(fp, "Content-Length: %ld\n", cont_length);
X	}
X#endif
X	fprintf(fp, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);	
X	if(priority[0] != '\0')
X		fprintf(fp, "Priority: %s\n", priority);
X	if(action[0] != '\0')
X		fprintf(fp, "Action: %s\n", action);
X	if(fortune[0] != '\0')
X		fprintf(fp, "X-Fortune: %s\n", fortune);
X   	fprintf(fp, "Message-Id: <%x.%d@%s>\n", timer, USER.id, UUCPID);
X 	fputs("\n", fp);
X  }
X
X  UMLAUT_MODUS = 1;
X  while (fgets(s, 80, ff) != 0) {
X	fputs((unsigned char *) iso_line(s), fp);
X	lines++;
X  }
X  fclose(ff);
X
X  if(UMLEITUNG == 0){
X	  sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
X	  ff = fopen(s, "r");
X	  if (ff != NULL) {
X		while (fgets(s, 80, ff) != 0) {
X			fputs((unsigned char *) iso_line(s), fp);
X			lines++;
X		}
X		fclose(ff);
X	  }
X  }
X
X  UMLAUT_MODUS = USER.schluessel[2];
X
X  if(WEITERLEITEN == 0) unlink(TEP);
X  fclose(fp);
X
X  if (EX_PM == 0) {
X	sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
X	maybe_locked(s, "r"); 
X	fp = fopen(s, "a");
X	if (fp == NULL) {
X		nerror("mail.c", 527, "brief", "Datei-Ergaenzungsfehler", s);
X	}
X	sprintf(s, "%d              ", mail_id);
X	s[6] = '\0';
X	if(HOLD != 0){
X		s[5] = '>';
X	}
X	fputs(s, fp);
X
X	sprintf(ex, "%s                                ", subject);
X	ex[26] = '\0';
X	fputs(ex, fp);
X
X	sprintf(ex, "  %s                                        ", USER.name);
X	ex[22] = '\0';
X	fputs(ex, fp);
X
X	strcpy(s, (unsigned char *) mydate(1));
X	strcpy(t, (unsigned char *) mytime(1));
X	sprintf(ex, "  %s  %s         ", s, t);
X	ex[19] = '\0';
X	fputs(ex, fp);
X
X	sprintf(s, "%-6.d\n", lines);
X	fputs(s, fp);
X
X	fclose(fp);
X  }
X  else {
X	sprintf(s, " X-Mail via UUCP (%s) ", rec_char);
X	headline(s);
X	printf("\n%s", MAL35_MSG);
X	sprintf(s, "%s/%d.expm", TMP, getpid());
X	sprintf(t, "/bin/sh ./etc/rmail.sh %s %s 2>&1 /dev/null", s, rec_char);
X	system(t);
X	unlink(s);
X	unlink(f);
X	umask(0007);
X	printf(" %s\n", MAL36_MSG);
X  }
X
X  unlink(REP);
X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0)) unlink(TEP);
X
X  sprintf(s, "%s \"%s\" %s", MAL11_MSG, rec_char, MAL37_MSG);
X  control(s, 3);
X
X  printf("\n");
X
X
X#ifdef _PMCOPY
X
X  IS_BUFFERED = 0;
X
X  if(WEITERLEITEN == 0){
X	  if((strcomp(POSTMASTER, LOOSER.sh_name) == 0) || (strcomp(POSTMASTER, LOOSER.nick) == 0)){
X		if(bcc[0] != '\0') strcat(bcc, ", ");
X		sprintf(s, "%s!root", UUCPSITE);
X		strcat(bcc, (unsigned char *) s);
X		IS_BUFFERED = 1;
X	  }
X  }
X#endif
X
X  if((cc[0] != '\0') || (bcc[0] != '\0')){
X	carboncopy(cc, bcc);
X  }
X
X  return 0;
X}
END_OF_FILE
  if test 22275 -ne `wc -c <'src/mail.c'`; then
    echo shar: \"'src/mail.c'\" unpacked with wrong size!
  fi
  # end of 'src/mail.c'
fi
if test -f 'src/makro.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/makro.c'\"
else
  echo shar: Extracting \"'src/makro.c'\" \(5585 characters\)
  sed "s/^X//" >'src/makro.c' <<'END_OF_FILE'
X/***************************************************************************/
X/*	    PROGRAMM  ix/Mbox						   */
X/*             DATEI  makro.c						   */
X/*        FUNKTIONEN  makro()						   */
X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)		   */
X/*  LETZTE AENDERUNG  16.11.1991					   */
X/***************************************************************************/
X
X#include <stdio.h>
X
X#include "mbox.h"
X
X
Xvoid get_makros();
X
X/***************************************************************************/
X/*      FUNKTION  makro()						   */
X/*  BESCHREIBUNG  Makros auswerten					   */
X/*     PARAMETER  s  =  Eingabezeile                                       */
X/*     RUECKGABE  Eingabezeile mit Gegenwerten der Makros	           */
X/***************************************************************************/
X
Xunsigned char *makro( s )
Xunsigned char s[];
X{
X  static unsigned char t[STRING];
X  unsigned char f[STRING];
X  int a = 0, b = 0, i = 0;
X  int m = 0, ok = 0;
X  int subcom = 0;
X
X  t[0] = '\0';
X
X  strcat(s, " ");
X
X  while(s[0] == ' ') *s++;
X
X  while(s[i] != '\0'){
X
X	if(s[i] == ' '){
X		b = i -1;
X		f[0] = '\0';
X		strcat(f, strcopy(s, a, b));
X		a = i +1;
X		ok = 0; 
X		m = 0;
X
X		while(MAK[m].makname[0] != '\0'){
X			if((strcomp(f, MAK[m].makname) == 0) && (strcomp(MAK[m].makname, f) == 0) && (subcom == 0)){
X				ok = 1; 
X				strcat(t, MAK[m].makwert);
X			}
X			m++;
X		}
X		if(ok == 0) strcat(t, stripped(f));
X		strcat(t, " ");
X	
X		subcom++;
X	}
X	i++;
X  }
X  return (unsigned char *) t;
X}
X
X
X
X/***************************************************************************/
X/*      FUNKTION  set_makros						   */
X/*  BESCHREIBUNG  Die Makro-Datei wird angezeigt und kann geandert werden. */
X/*     PARAMETER  keine	                                                   */
X/*     RUECKGABE  keine	                                                   */
X/***************************************************************************/
X
Xvoid set_makros()
X{
X  FILE *ff;
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  unsigned char tmp[STRING];
X  unsigned char c;
X  int b;
X
X
X  printf("\n\n%s\n\n", MAK01_MSG);
X
X  ansi("md");
X  b = 4;
X  while(MAK[b].makname[0] != '\0'){
X	printf("%s%c=%c%s\n", MAK[b].makname, TAB, TAB, MAK[b].makwert);
X	b++;
X  }  
X  printf("\n");  
X  ansi("mr");
X  printf("%c%s [%c, %c] > ", CR, MAK02_MSG, GBL06_MSG, GBL07_MSG);
X  ansi("me");
X
X  c = yesno();
X
X  if (c == GBL06_MSG) {
X	sprintf(t, "%s %s", EDDY, MAKRO);
X	system(t);
X  }
X
X  get_makros();
X
X  printf("\n");
X}
X
X
X
X
X/***************************************************************************/
X/*      FUNKTION  get_makros()						   */
X/*  BESCHREIBUNG  Liest die userabhaengigen Makro-Vereinbarungen in die    */
X/*		  Stuktur ein				                   */
X/*     PARAMETER  keine	                                                   */
X/*     RUECKGABE  keine							   */
X/***************************************************************************/
X
Xvoid get_makros()
X{
X  FILE *fp;
X  unsigned char s[STRING];
X  unsigned char t[STRING];
X  int b = 0, i = 0;
X
X
X  sprintf(MAK[0].makname, "demo");
X  sprintf(MAK[0].makwert, "?, sl 3, PM, sl 3, i, sl 3, anr, sl 3, dem1");
X  sprintf(MAK[1].makname, "dem1");
X  sprintf(MAK[1].makwert, "b, sl 3, +, +, +, +, +, +, i, sl 3, +, dem2");
X  sprintf(MAK[2].makname, "dem2");
X  sprintf(MAK[2].makwert, "i, sl 3, +, i, sl 3, b, +, i, sl 3, ?, dem3");
X  sprintf(MAK[3].makname, "dem3");
X  sprintf(MAK[3].makwert, "sl 3, v, sl 3, h hilf, sl 3, st, sl 3, pm, i");
X 
X
X  fp = fopen(MAKRO, "r");
X  if (fp == NULL) {
X	MAK[4].makname[0] = '\0';
X	return;
X  }
X
X
X  b = 4;
X
X  while(fgets(s, 80, fp) != NULL){
X
X	MAK[b].makname[0] = '\0';
X	MAK[b].makwert[0] = '\0';
X	
X	i = 0;
X
X	while((s[i] != '=') && (s[i] != '\0')) i++;
X
X	t[0] = '\0'; strcat(t, strcopy(s, 0, (i-1)));
X	strcat(MAK[b].makname, stripped(t));
X
X	t[0] = '\0'; strcat(t, strcopy(s, (i+1), length(s)));
X 	strcat(MAK[b].makwert, stripped(t));
X
X	b++;
X	if (b >= (MAX_MAK -1)) {
X		nerror("makro.c", 108, "get_makro", "MAX_MAK ueberschritten !!", "???");
X	}
X  }
X  MAK[b].makname[0] = '\0';
X
X  fclose(fp);
X
X}
X
X/***************************************************************************/
X/*      FUNKTION  add_makros()						   */
X/*  BESCHREIBUNG  Haengt Makro-Definition aus einer Prompt-Eingabe an die  */
X/*		  Makro-Datei an			                   */
X/*     PARAMETER  s  =  Makro-Definition                                   */
X/*     RUECKGABE  keine							   */
X/***************************************************************************/
X
Xvoid add_makro( s )
Xunsigned char s[];
X{
X  FILE *fp;
X
X  fp = fopen( MAKRO, "a" );
X  if(fp == NULL){
X	nerror("makro.c", 189, "add_makro", "Datei-Erweiterungsfehler", MAKRO);
X  }
X  fputs((unsigned char *) stripped(s), fp);
X  fputs("\n", fp);
X  fclose(fp);
X
X  get_makros();
X
X  printf("\n\n%s\n", MAK03_MSG);
X  
X}
X
X
X/***************************************************************************/
X/*      FUNKTION  makro_definition()					   */
X/*  BESCHREIBUNG  Prueft ob die Prompt-Eingabe eine Makro-Definition ent-  */
X/*		  haelt.    				                   */
X/*     PARAMETER  s  =  Prompt-Eingabe                                     */
X/*     RUECKGABE  0  =  Keine Definition				   */
X/*                1  =  Makro-Definition				   */
X/***************************************************************************/
X
Xint makro_definition( s )
Xunsigned char s[];
X{
X  int i = 0;
X  int ok = 0;
X
X  while(s[i] != '\0'){
X	if(s[i] == '=') ok++;
X	i++;
X  }
X
X  if(ok == 1){
X	add_makro( s );
X  }
X  if(ok > 1){
X	ansi("md");
X	printf(" %s\n", MAK04_MSG);
X	ansi("me");
X  }
X  return ok;
X}
X
END_OF_FILE
  if test 5585 -ne `wc -c <'src/makro.c'`; then
    echo shar: \"'src/makro.c'\" unpacked with wrong size!
  fi
  # end of 'src/makro.c'
fi
if test -f 'wendy/fast' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'wendy/fast'\"
else
  echo shar: Extracting \"'wendy/fast'\" \(99 characters\)
  sed "s/^X//" >'wendy/fast' <<'END_OF_FILE'
Xmake clean
X/etc/mount /dev/PS1 /user
Xcpdir -mvs /local/mbox/wendy /user
Xsync
X/etc/umount /dev/PS1
X
END_OF_FILE
  if test 99 -ne `wc -c <'wendy/fast'`; then
    echo shar: \"'wendy/fast'\" unpacked with wrong size!
  fi
  chmod +x 'wendy/fast'
  # end of 'wendy/fast'
fi
echo shar: End of archive 7 \(of 15\).
cp /dev/null ark7isdone
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...

