home *** CD-ROM | disk | FTP | other *** search
- /*
- * UUSTAT.C
- *
- * Copyright (c) 1993 Ville Saari, All rights reserved.
- * Changes copyright 1993 by Michael B. Smith. All rights reserved.
- *
- * Created: 14-Sep-93 and updated 29-Oct-93 by Ville Saari
- *
- * CAVEAT: Ville's version was pure by default. Adding in the AmigaUUCP
- * stuff means you have to do through the DICE/SAS-C special linking
- * process to get pure back again.
- */
-
- /*#define PROCDEBUG*/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdarg.h>
-
- #include <utility/tagitem.h>
- #include <exec/memory.h>
- #include <dos/exall.h>
- #include <dos/datetime.h>
-
- #include <clib/dos_protos.h>
- #include <clib/exec_protos.h>
- #include <pragmas/dos_pragmas.h>
- #include <pragmas/exec_pragmas.h>
-
- #include "config.h"
- #include "version.h"
-
- IDENT (".02");
-
- #ifdef PROCDEBUG
- #define DG(x) Printf x
- #else
- #define DG(x)
- #endif
-
- #define VERSION "000"
- #define RELEASE "2"
- #define UNAME "UUSTAT"
- #define NAME "uustat"
-
- #define COPYRSIGN "\251"
- #define CSI(command) "\233" command
-
- #define COPYRIGHT \
- CSI("32;1m") UNAME CSI("0m")" V" RELEASE "." VERSION "\n"\
- "Copyright " COPYRSIGN " 1993 Ville Saari, All rights reserved\n"\
- "Copyright " COPYRSIGN " 1993 Michael B. Smith, All rights reserved\n"
-
- #define USAGE \
- COPYRIGHT \
- "\n" \
- "Usage: " NAME " [<options>]\n\n"\
- "Options: -a = ALL list all UUCP jobs\n"\
- "\t -c = COMMAND <cmd> list requests for named command\n"\
- "\t _C = NCOMMAND <cmd> list requests for other than named command\n"\
- "\t -e = EXECUTIONS list queued executions rather than job requests\n"\
- "\t -i = KILLPROMPT prompt for whether to kill each listed job\n"\
- "\t -k = KILL <job> kill specified UUCP job\n"\
- "\t _K = KILLLISTED kill each listed job\n"\
- "\t -m = MACHINES report status for all remote machines\n"\
- "\t -o = OLDER <hours> list all jobs older than given number of hours\n"\
- "\t -q = NUMBER list number of jobs for each system\n"\
- "\t _Q = QUIET don't list jobs, just take actions (-i, _K)\n"\
- "\t -r = REJUVENATE <job> rejuvenate specified UUCP job\n"\
- "\t -s = SYSTEM <system> list all jobs for specified system\n"\
- "\t _S = NSYSTEM <system> list all jobs for other than specified system\n"\
- "\t -u = USER <user> list all jobs for specified user\n"\
- "\t _U = NUSER <user> list all jobs for other than specified user\n"\
- "\t -y = YOUNGER <hours> list all jobs younger than given number of hours\n"
-
- #define TEMPLATE \
- "-a=ALL/S,-c=COMMAND/K,_C=NCOMMAND/K,-e=EXECUTIONS/S,-i=KILLPROMPT/S,"\
- "-k=KILL/K,_K=KILLLISTED/S,-m=MACHINES/S,-o=OLDER/N,-q=NUMBER/S,"\
- "_Q=QUIET/S,-r=REJUVENATE/K,-s=SYSTEM/K,_S=NSYSTEM/K,-u=USER/K,"\
- "_U=NUSER/K,-y=YOUNGER/N"
-
- static const char
- version [] = "\0$VER: " NAME " " RELEASE "." VERSION " (" __DATE__ ")";
-
- struct machine {
- struct machine *next;
- unsigned long commands;
- unsigned long executions;
- long oldestcmd;
- long oldestexe;
- char *message;
- char name [1];
- };
-
- struct arguments {
- /* this order is dependent on TEMPLATE above */
- long all;
- char *command;
- char *ncommand;
- long executions;
- long killprompt;
- char *kill;
- long killlisted;
- long machines;
- long *older;
- long number;
- long quiet;
- char *rejuvenate;
- char *system;
- char *nsystem;
- char *user;
- char *nuser;
- char *younger;
- };
-
- /* My few Globals */
- extern struct DosLibrary
- *DOSBase;
- extern struct ExecBase
- *SysBase;
-
- char
- *name = NULL;
- int
- UseSubDirs = 0;
- /* End globals */
-
- char *token (char **);
- void linecpy (char *, char *);
- int kill (char *);
- int spc (char);
- void SPrintf (char *, char *, ...);
- void agetos (long, char *);
- void updatemachine (char *, char *, unsigned long, unsigned long,
- struct machine **base);
- void process_logfile (struct arguments *args, struct machine **mbase);
- void process_file (struct ExAllData *, struct arguments *s, unsigned long,
- struct DateStamp *, struct machine **);
- void scan_spool (struct arguments *args, unsigned long currenttime,
- struct DateStamp *ds, struct machine **mbase);
-
- #ifdef NULL
- #undef NULL
- #define NULL 0
- #endif
-
- #ifdef __GNUC__
- #define __aligned
- #endif
-
- int
- main (int argc, char **argv)
- {
- unsigned long
- rc = 20,
- currenttime;
- struct RDArgs
- *ah;
- BPTR
- cd = NULL;
- struct DateStamp
- ds;
- struct machine
- *mbase = NULL;
- char
- *tmp;
- struct arguments
- args;
-
- #if 0
- SysBase = *((struct ExecBase **) 4L);
-
- DOSBase = (struct DosLibrary *) OpenLibrary (DOSNAME, 37);
- if (!DOSBase)
- return rc;
- #endif
-
- if (argc == 0)
- return rc;
- name = argv [0];
-
- if (DOSBase->dl_lib.lib_Version < 37)
- return rc;
-
- memset ((void *) &args, 0, sizeof (args));
- ah = ReadArgs (TEMPLATE, (long *) &args, 0);
- if (!ah) {
- PutStr (USAGE);
- goto cleanup;
- }
-
- if (!args.all && !args.command && !args.ncommand && !args.system &&
- !args.nsystem && !args.user && !args.nuser) {
- if (args.executions)
- args.all = 1;
- else {
- args.user = GetUserName ();
- if (!args.user) {
- Printf ("%s: Cannot find UserName\n", name);
- goto cleanup;
- }
- }
- }
-
- tmp = GetConfig (USESUBDIRS, "0");
- if (*tmp == 'y' || *tmp == 'Y' || *tmp == '1')
- UseSubDirs = 1;
-
- if (!args.system && !args.nsystem)
- args.all = -1;
-
- cd = Lock ("UUSpool:", ACCESS_READ);
- if (!cd) {
- Printf ("%s: Cannot lock UUSpool:\n", name);
- goto cleanup;
- }
- cd = CurrentDir (cd);
-
- DateStamp (&ds);
- currenttime =
- ds.ds_Days * 86400 +
- ds.ds_Minute * 60 +
- ds.ds_Tick / 50;
-
- if (args.kill) {
- char
- namebuf [15];
-
- namebuf [0] = 'C';
- namebuf [1] = '.';
- strncpy (namebuf + 2, args.kill, 12);
- namebuf [14] = 0;
-
- if (kill (namebuf))
- rc = 0;
- }
- else
- if (args.rejuvenate) {
- char
- filename [256];
-
- SPrintf (filename, "UUSPOOL:C.%s", args.rejuvenate);
-
- if (!SetFileDate (filename, &ds))
- Printf ("%s: Job %s doesn't exist.\n", name, args.rejuvenate);
- }
- else {
- process_logfile (&args, &mbase);
- }
-
- rc = 0;
-
- if (args.machines) {
- struct machine
- *mach;
-
- for (mach = mbase; mach; mach = mach->next)
- if (mach->message)
- Printf ("%-14s %s\n", mach->name, mach->message);
-
- goto cleanup;
- }
-
- scan_spool (&args, currenttime, &ds, &mbase);
-
- if (args.number) {
- struct machine
- *mach;
- char
- c_age [16],
- x_age [16];
-
- for (mach = mbase; mach; mach = mach->next) {
- if (mach->commands || mach->executions) {
- agetos (mach->oldestcmd, c_age);
- agetos (mach->oldestexe, x_age);
-
- Printf ("%-9s %4luC %-10s %4luX %-10s %s\n",
- mach->name,
- mach->commands, c_age,
- mach->executions, x_age,
- mach->message ? mach->message : "");
- }
- }
- }
-
- cleanup:
-
- while (mbase) {
- struct machine
- *next=mbase->next;
-
- if (mbase->message)
- FreeVec (mbase->message);
- FreeVec (mbase);
-
- mbase = next;
- }
-
- if (cd)
- UnLock (CurrentDir (cd));
- if (ah)
- FreeArgs (ah);
-
- #if 0
- if (DOSBase)
- CloseLibrary ((struct Library *) DOSBase);
- #endif
-
- return rc;
- }
-
- void agetos (long age, char *buf)
- {
- char
- *unit;
-
- if (age < 0)
- age = 0;
-
- if (age < 60)
- unit = "sec";
- else
- if ((age /= 60) < 60)
- unit = "min";
- else
- if ((age /= 60) < 24)
- unit = "hour";
- else {
- age /= 24;
- unit = "day";
- }
-
- SPrintf (buf, "(%ld %s%s)", age, unit, age == 1 ? "" : "s");
-
- return;
- }
-
- int spc (char c)
- {
- return c == ' ' || c == '\t' || c == '\n' || c == '\r';
- }
-
- char *
- token (char **p)
- {
- char
- *q;
-
- while (spc (**p))
- (*p)++;
- q=*p;
-
- while (!spc (**p)) {
- if (!**p)
- return *p;
- (*p)++;
- }
-
- *(*p)++ = 0;
-
- return q;
- }
-
- void
- linecpy (char *a, char *b)
- {
- while (spc (*b))
- b++;
-
- while (*b && *b != '\n' && *b != '\r')
- *a++ = *b++;
- *a = 0;
-
- return;
- }
-
- void
- scan_dir (BPTR dir, const char *patternbuffer, struct arguments *args,
- unsigned long currenttime, struct DateStamp *ds,
- struct machine **mbase)
- {
- struct ExAllControl
- *eac = NULL;
- struct ExAllData
- *eabuf = NULL,
- *ead = NULL;
- int
- t;
-
- eac = AllocDosObject (DOS_EXALLCONTROL, NULL);
- eabuf = (struct ExAllData *) AllocVec (2048, MEMF_ANY);
- if (!eac || !eabuf) {
- Printf ("%s: scan_dir memory shortage.\n", name);
- goto leave;
- }
-
- eac->eac_LastKey = 0;
- eac->eac_MatchString = patternbuffer;
-
- do {
- t = ExAll (dir, eabuf, 2048, ED_DATE, eac);
-
- if (t == 0 && (IoErr () != ERROR_NO_MORE_ENTRIES))
- break;
-
- if (eac->eac_Entries == 0)
- continue;
-
- ead = eabuf;
-
- do {
- process_file (ead, args, currenttime, ds, mbase);
- } while (ead = ead->ed_Next);
-
- } while (t);
-
- leave:
- if (eabuf)
- FreeVec (eabuf);
- if (eac)
- FreeDosObject (DOS_EXALLCONTROL, eac);
-
- return;
- }
-
- void
- scan_spool (struct arguments *args, unsigned long currenttime,
- struct DateStamp *ds, struct machine **mbase)
- {
- char
- pat [40],
- patbuf [82],
- sys [40];
- BPTR
- mydir;
-
- if (args->all)
- strcpy (sys, "#?");
- else
- if (args->nsystem)
- SPrintf (sys, "~(%.7s)", args->nsystem);
- else
- SPrintf (sys, "%.7s", args->system);
-
- SPrintf (pat, "%s.%s?????%s",
- args->number ? "(C|X|E)" : args->executions ? "(X|E)" : "C", sys,
- args->executions && !args->all ? "#?" : "");
-
- ParsePatternNoCase (pat, patbuf, sizeof (patbuf));
-
- /* lock on UUSpool: */
- mydir = ((struct Process *) FindTask (NULL))->pr_CurrentDir;
-
- scan_dir (mydir, patbuf, args, currenttime, ds, mbase);
-
- if (UseSubDirs) {
- /*
- ** good bet most of the files are in a subdirectory.
- ** Use good old ExNext() to find the directories, and
- ** recurse into them via scan_dir()
- */
- BPTR
- subdir,
- olddir;
- __aligned struct FileInfoBlock
- fib;
-
- DG(("UseSubDirs\n"));
- if (Examine (mydir, &fib)) {
- while (ExNext (mydir, &fib)) {
- if (fib.fib_DirEntryType < 0)
- continue;
- DG(("searching %s\n", fib.fib_FileName));
- subdir = Lock (fib.fib_FileName, ACCESS_READ);
- if (!subdir) {
- Printf ("%s: can't read UUSpool:%s\n",
- name, fib.fib_FileName);
- continue;
- }
- olddir = CurrentDir (subdir);
- scan_dir (subdir, patbuf, args, currenttime, ds, mbase);
- UnLock (CurrentDir (olddir));
- }
- }
- }
-
- return;
- }
-
- int
- really_kill (char *cmdfile, BPTR file)
- {
- int
- success = 1;
- char
- line [256];
-
- DG (("really_kill\n"));
-
- while (FGets (file, line, 256)) {
- char
- *fromname,
- *p = line;
-
- DG(("input: %s", line));
- if (*token (&p) == 'S') {
- fromname = token (&p);
- token (&p);
- token (&p);
-
- if (token (&p) [1] != 'c' && !DeleteFile (fromname))
- success = 0;
- }
- }
-
- Close (file);
-
- if (!DeleteFile (cmdfile)) {
- DG(("ioerr on deletefile (%s) %ld\n", cmdfile, IoErr()));
- success = 0;
- }
-
- if (!success && strlen (cmdfile) > 2)
- Printf ("%s: Can't kill job %s.\n", name, cmdfile + 2);
-
- DG(("really_kill exit\n"));
- if (success)
- return 0;
-
- return 20;
- }
-
- int
- process_opt (char *filename, BPTR file, int opt)
- {
- int
- result = 20;
-
- switch (opt) {
- case 1:
- result = really_kill (filename, file);
- break;
-
- default:
- Printf ("%s: internal error. help me!\n", name);
- }
-
- return result;
- }
-
- int
- dirhandler (char *cmdfile, int opt)
- {
- /*
- ** findfile
- **
- ** Given a full C.* or X.* or whatever filename, find the
- ** directory or subdirectory it resides in, and open the file.
- */
- BPTR
- olddir,
- exlock,
- lock;
- int
- result = 20;
- __aligned struct FileInfoBlock
- fib;
-
- lock = Lock ("UUSpool:", ACCESS_READ);
- if (!lock)
- return NULL;
-
- olddir = CurrentDir (lock);
-
- if (exlock = Open (cmdfile, MODE_OLDFILE)) {
- /* was in UUSpool: */
- result = process_opt (cmdfile, exlock, opt);
- UnLock (CurrentDir (olddir));
- return result;
- }
-
- if (UseSubDirs == 0)
- return 20;
-
- if (Examine (lock, &fib)) {
- while (ExNext (lock, &fib)) {
- BPTR
- subdir;
-
- if (fib.fib_DirEntryType < 0)
- continue;
-
- subdir = CurrentDir (lock);
- exlock = Open (cmdfile, MODE_OLDFILE);
- if (exlock) {
- result = process_opt (cmdfile, exlock, opt);
- }
- CurrentDir (subdir);
- if (exlock) {
- break;
- }
- }
- }
- UnLock (CurrentDir (olddir)); /* back to original directory */
- UnLock (lock);
-
- return result;
- }
-
- int kill (char *cmdfile)
- {
- return dirhandler (cmdfile, 1);
- }
-
- void SPrintf (char *buf, char *format, ...)
- {
-
- #ifdef __SASC
- void __builtin_emit(unsigned short);
- #define emit __builtin_emit
-
- /* _SPrintf movem.l a2/a3/a6,-(sp) */ emit(0x48e7); emit(0x0032);
- /* move.l (4).w,a6 */ emit(0x2c78); emit(0x0004);
- /* move.l 20(sp),a0 */ emit(0x206f); emit(0x0014);
- /* lea 24(sp),a1 */ emit(0x43ef); emit(0x0018);
- /* lea putch(pc),a2 */ emit(0x45fa); emit(0x0010);
- /* move.l 16(sp),a3 */ emit(0x266f); emit(0x0010);
- /* jsr _LVORawDoFmt(a6) */ emit(0x4eae); emit(0xfdf6);
- /* movem.l (sp)+,a2/a3/a6 */ emit(0x4cdf); emit(0x4c00);
- /* rts */ emit(0x4e75);
- /* putch move.b d0,(a3)+ */ emit(0x16c0);
- /* rts */
- #endif
- #ifdef _DCC
- extern __stkargs void
- VDoFmt (char *, char *, va_list);
- va_list
- va;
-
- va_start (va, format);
- VDoFmt (buf, format, va);
- va_end (va);
- return;
- #endif
- }
-
- void updatemachine (char *name, char *message, unsigned long cmdage,
- unsigned long exeage, struct machine **base)
- {
- struct machine
- *mach;
- int
- t;
-
- for (mach = *base; mach; mach = mach->next)
- if (!memcmp (mach->name, name, (t = strlen (mach->name), t > 7 ? 7 : t)))
- break;
-
- if (!mach) {
- if (!(mach = AllocVec (sizeof *mach + strlen (name), MEMF_CLEAR)))
- return;
-
- strcpy (mach->name, name);
- mach->next = *base;
- *base = mach;
- }
-
- if (message) {
- if (mach->message)
- FreeVec (mach->message);
- if (mach->message = AllocVec (strlen (message) + 1, 0))
- strcpy (mach->message, message);
- }
-
- if (exeage != 0x80000000) {
- mach->executions++;
- if (mach->oldestexe < exeage)
- mach->oldestexe = exeage;
- }
-
- if (cmdage != 0x80000000) {
- mach->commands++;
- if (mach->oldestcmd < cmdage)
- mach->oldestcmd = cmdage;
- }
-
- return;
- }
-
- void
- process_logfile (struct arguments *args, struct machine **mbase)
- {
- int
- l;
- BPTR
- fh;
- char
- msg [256],
- line [256],
- *p,
- *t;
-
- if (fh = Open ("UULib:L.Sys", MODE_OLDFILE)) {
- while (FGets (fh, p = line, 256))
- if (*(t = token (&p)))
- updatemachine (t, 0, 0x80000000, 0x80000000, mbase);
-
- Close (fh);
- }
-
- if (args->machines == 0 && args->number == 0)
- return;
-
- fh = Open ("UUSpool:Logfile", MODE_OLDFILE);
- if (!fh)
- return;
-
- while (FGets (fh, p = line, 256)) {
- token (&p);
-
- if (!strnicmp (t = token (&p), "uucico,", 7)) {
- l = strlen (t += 7);
-
- if (l > 2 && t [l - 2] == ',' && t [l - 1] == '-') {
- t [l-2] = 0;
-
- if (strcmp (t, "AmigaUUCP")) {
- memcpy (msg, line+1, 11);
- msg [2] = '-';
- msg [5] = msg [11] = ' ';
- while (spc (*p))
- p++;
- linecpy (msg+12, p);
- updatemachine (t, msg, 0x80000000, 0x80000000, mbase);
- }
- }
- }
- }
-
- Close (fh);
-
- return;
- }
-
- void
- process_file (struct ExAllData *ead, struct arguments *args,
- unsigned long currenttime, struct DateStamp *ds,
- struct machine **mbase)
- {
- BPTR
- mydir = ((struct Process *) FindTask (NULL))->pr_CurrentDir,
- cfh,
- dfh;
- char
- *id,
- date [9],
- time [9],
- sys [256],
- user [32],
- line [256],
- fromfile [256],
- tofile [256],
- cmd [256];
- unsigned long
- size;
- long
- age;
- struct machine
- *mach;
- int
- cchar = 0,
- t = 0,
- l;
- __aligned struct FileInfoBlock
- fib;
- struct DateTime
- dt;
-
- dt.dat_Format = FORMAT_USA;
- dt.dat_Flags = 0;
- dt.dat_StrDay = 0;
- dt.dat_StrDate = date;
- dt.dat_StrTime = time;
-
- fromfile [255] = tofile [255] = user [31] = sys [31] = 0;
-
- age = currenttime -
- ead->ed_Ticks / 50 -
- ead->ed_Mins * 60 -
- ead->ed_Days * 86400;
-
- id = ead->ed_Name + 2;
- strncpy (sys, id, 31);
- sys [strlen (sys) - 5] = 0;
-
- for (mach = *mbase; mach; mach = mach->next) {
- l = strlen (mach->name);
- l = l > 7 ? 7 : l;
-
- if (!memcmp (sys, mach->name, l)) {
- strcpy (sys, mach->name);
- break;
- }
- }
-
- if (args->number) {
- if (*ead->ed_Name == 'C')
- updatemachine (sys, 0, age, 0x80000000, mbase);
- else
- updatemachine (sys, 0, 0x80000000, age, mbase);
- }
- else {
- dt.dat_Stamp.ds_Days = ead->ed_Days;
- dt.dat_Stamp.ds_Minute = ead->ed_Mins;
- dt.dat_Stamp.ds_Tick = ead->ed_Ticks;
-
- strcpy (user, "?");
- strcpy (fromfile, user);
- strcpy (tofile, user);
- size = 0;
- cmd [0] = 0;
-
- if (cfh = Open (ead->ed_Name, MODE_OLDFILE)) {
- while (FGets (cfh, line, 256)) {
- char
- *p = line;
-
- if (args->executions) {
- char
- *c;
-
- if (*(c = token (&p)) == 'C') {
- linecpy (cmd, p);
- if (*user != '?')
- break;
- }
- else
- if (*c == 'U') {
- strcpy (user, token (&p));
- strcpy (tofile, token (&p));
- if (cmd [0])
- break;
- }
- }
- else {
- char
- *fromname,
- *toname;
- int
- cc = *line;
-
- token (&p);
- fromname = token (&p);
- toname = token (&p);
- strncpy (user, token (&p), 31);
-
- if (*toname == 'X' && *(toname + 1) == '.') {
- if (cmd [0] == 0) {
- if (dfh = Open (fromname, MODE_OLDFILE)) {
- char buf [256];
-
- if (ExamineFH (dfh, &fib))
- size += fib.fib_Size;
-
- while (FGets (dfh, buf, 256))
- if (*buf == 'C') {
- linecpy (cmd, buf+1);
- break;
- }
-
- Close (dfh);
- }
- else
- strcpy (cmd, "?");
- }
- }
- else {
- token (&p);
-
- strncpy (fromfile, token (&p), 255);
- strncpy (tofile, toname, 255);
-
- if (dfh = Lock (fromname, ACCESS_READ)) {
- if (Examine (dfh, &fib))
- size += fib.fib_Size;
-
- UnLock (dfh);
- }
-
- cchar = cc;
- }
- } /* !args->executions */
- } /* while */
-
- Close (cfh);
- } /* Open */
-
- if (!DateToStr (&dt)) {
- strcpy (date, "?????");
- strcpy (time, date);
- }
-
- if (args->user && strcmp (user, args->user))
- return;
-
- if (args->nuser && !strcmp (user, args->nuser))
- return;
-
- if (args->older && age < *args->older * 3600)
- return;
-
- if (args->younger && age > *args->younger * 3600)
- return;
-
- while (cmd [t] && cmd [t] != ' ' && cmd [t] != '\t')
- t++;
-
- if (args->command && (strncmp (cmd, args->command, t) || t != strlen (args->command)))
- return;
-
- if (args->ncommand && !strncmp (cmd, args->ncommand, t) && t == strlen (args->ncommand))
- return;
-
- } /* !args->number */
-
- if (args->executions) {
- Printf ("%s %s!%s %s %s %s%s\n",
- sys, tofile, user, date, time, cmd,
- *ead->ed_Name == 'E' ? " (execution failed)" : "");
- }
- else {
- Printf ("%s %s %s %s %s ",
- id, sys, user, date, time);
-
- if (cmd [0])
- Printf ("Executing %s (sending %ld bytes)\n", cmd, size);
- else
- if (cchar == 'R')
- Printf ("Requesting %s to %s\n", fromfile, tofile);
- else
- Printf ("Sending %s (%ld bytes) to %s\n", fromfile, size, tofile);
-
- if (args->killprompt || args->killlisted) {
- if (args->killprompt) {
- Printf ("%s: Kill %s? ", name, id);
- Flush (Output ());
- FGets (Input (), line, 256);
- if (line [0] != 'y' && line [0] != 'Y') {
- DG(("Got: '%s'\n", line)); Flush (Output ());
- return;
- }
- }
-
- kill (ead->ed_Name);
- }
- }
-
- return;
- }
-