This is autoreply.c in view mode; [Download] [Up]
static char rcsid[] = "@(#)$Id: autoreply.c,v 5.2 1992/12/11 01:45:04 syd Exp $"; /******************************************************************************* * The Elm Mail System - $Revision: 5.2 $ $State: Exp $ * * Copyright (c) 1988-1992 USENET Community Trust * Copyright (c) 1986,1987 Dave Taylor ******************************************************************************* * Bug reports, patches, comments, suggestions should be sent to: * * Syd Weinstein, Elm Coordinator * elm@DSI.COM dsinc!elm * ******************************************************************************* * $Log: autoreply.c,v $ * Revision 5.2 1992/12/11 01:45:04 syd * remove sys/types.h include, it is now included by defs.h * and this routine includes defs.h or indirectly includes defs.h * From: Syd * * Revision 5.1 1992/10/04 00:46:45 syd * Initial checkin as of 2.4 Release at PL0 * * ******************************************************************************/ /** This is the front-end for the autoreply system, and performs two functions: it either adds the user to the list of people using the autoreply function (starting the daemon if no-one else) or removes a user from the list of people. Usage: autoreply filename autoreply "off" or autoreply [to find current status] **/ #include "elmutil.h" #include "s_autoreply.h" #include <sys/stat.h> #ifdef PWDINSYS # include <sys/pwd.h> #else # include <pwd.h> #endif #define tempdir "/tmp/arep" /* file prefix */ #define autoreply_file "/etc/autoreply.data" /* autoreply data file */ extern int errno; /* system error code */ main(argc, argv) int argc; char *argv[]; { char filename[SLEN]; int userid; struct passwd *pass; #ifndef _POSIX_SOURCE struct passwd *getpwuid(); #endif #ifdef I_LOCALE setlocale(LC_ALL, ""); #endif elm_msg_cat = catopen("elm2.4", 0); if (argc > 2) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyArgsHelp1, "Usage: %s <filename>\tto start autoreply,\n"), argv[0]); printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyArgsHelp2, " %s off\t\tto turn off autoreply\n"), argv[0]); printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyArgsHelp3, " or %s \t\tto check current status\n"), argv[0]); exit(1); } userid = getuid(); /* * Get username (logname) field from the password entry for this user id. */ if((pass = getpwuid(userid)) == NULL) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyNoPasswdEntry, "You have no password entry!\n")); exit(1); } strcpy(username, pass->pw_name); if (argc == 1 || strcmp(argv[1], "off") == 0) remove_user((argc == 1)); else { strcpy(filename, argv[1]); if (access(filename,READ_ACCESS) != 0) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrRead, "Error: Can't read file '%s'\n"), filename); exit(1); } if (filename[0] != '/') /* prefix home directory */ sprintf(filename,"%s/%s", getenv("HOME"), argv[1]); add_user(filename); } exit(0); } remove_user(stat_only) int stat_only; { /** Remove the user from the list of currently active autoreply people. If 'stat_only' is set, then just list the name of the file being used to autoreply with, if any. **/ FILE *temp, *repfile; char tempfile[SLEN], user[SLEN], filename[SLEN]; int c, copied = 0, found = 0; long filesize, bytes(); if (! stat_only) { sprintf(tempfile, "%s.%06d", tempdir, getpid()); if ((temp = fopen(tempfile, "w")) == NULL) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrOpen, "Error: couldn't open tempfile '%s'. Not removed\n"), tempfile); exit(1); } } if ((repfile = fopen(autoreply_file, "r")) == NULL) { if (stat_only) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyNotAutoreply, "You're not currently autoreplying to mail.\n")); exit(0); } printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyNoOneAutoreply, "No-one is autoreplying to their mail!\n")); exit(0); } /** copy out of real replyfile... **/ while (fscanf(repfile, "%s %s %ld", user, filename, &filesize) != EOF) if (strcmp(user, username) != 0) { if (! stat_only) { copied++; fprintf(temp, "%s %s %ld\n", user, filename, filesize); } } else { if (stat_only) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyCurrArep, "You're currently autoreplying to mail with the file %s\n"), filename); exit(0); } found++; } fclose(temp); fclose(repfile); if (! found) { if (! stat_only) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyNoArepOff, "You're not currently autoreplying to mail!\n")); unlink(tempfile); } else printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyNoArep, "You're not currently autoreplying to mail.\n")); exit(! stat_only); } /** now copy tempfile back into replyfile **/ if (copied == 0) { /* removed the only person! */ unlink(autoreply_file); } else { /* save everyone else */ if ((temp = fopen(tempfile,"r")) == NULL) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrReopenTemp, "Error: couldn't reopen tempfile '%s'. Not removed.\n"), tempfile); unlink(tempfile); exit(1); } if ((repfile = fopen(autoreply_file, "w")) == NULL) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrReopenArep, "Error: couldn't reopen autoreply file for writing! Not removed.\n")); unlink(tempfile); exit(1); } while ((c = getc(temp)) != EOF) putc(c, repfile); fclose(temp); fclose(repfile); } unlink(tempfile); if (found > 1) printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyRemovedMulti, "Warning: your username appeared %d times!! Removed all\n"), found); else printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyRemoved, "You've been removed from the autoreply table.\n")); } add_user(filename) char *filename; { /** add the user to the autoreply file... **/ FILE *repfile; char mailfile[SLEN]; long bytes(); if ((repfile = fopen(autoreply_file, "a")) == NULL) { printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrOpenArep, "Error: couldn't open the autoreply file! Not added\n")); exit(1); } sprintf(mailfile,"%s/%s", mailhome, username); fprintf(repfile,"%s %s %ld\n", username, filename, bytes(mailfile)); fclose(repfile); printf(catgets(elm_msg_cat, AutoreplySet, AutoreplyAddArep, "You've been added to the autoreply system.\n")); } long bytes(name) char *name; { /** return the number of bytes in the specified file. This is to check to see if new mail has arrived.... **/ int ok = 1; extern int errno; /* system error number! */ struct stat buffer; if (stat(name, &buffer) != 0) if (errno != 2) exit(MCprintf(catgets(elm_msg_cat, AutoreplySet, AutoreplyErrFstat, "Error %d attempting fstat on %s\n"), errno, name)); else ok = 0; return(ok ? buffer.st_size : 0L); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.