Annotation of coherent/g/usr/bin/vi/prsvunix.c, revision 1.1.1.1

1.1       root        1: /* prsvunix.c */
                      2: 
                      3: /* This file contains the UNIX-specific parts of the "elvprsv" program. */
                      4: 
                      5: #if OSK
                      6: #define ELVPRSV
                      7: #include "osk.c"
                      8: #else
                      9: #include <sys/stat.h>
                     10: #include <pwd.h>
                     11: #endif
                     12: #ifndef __STDC__
                     13: /* some older systems don't declare this in pwd.h, I guess. */
                     14: extern struct passwd *getpwuid();
                     15: #endif
                     16: 
                     17: /* This variable is used to add extra error messages for mail sent to root */
                     18: char *ps;
                     19: 
                     20: /* This function returns the login name of the owner of a file */
                     21: char *ownername(filename)
                     22:        char    *filename;      /* name of a file */
                     23: {
                     24:        struct stat     st;
                     25:        struct passwd   *pw;
                     26: 
                     27:        /* stat the file, to get its uid */
                     28:        if (stat(filename, &st) < 0)
                     29:        {
                     30:                ps = "stat() failed";
                     31:                return "root";
                     32:        }
                     33: 
                     34:        /* get the /etc/passwd entry for that user */
                     35:        pw = getpwuid(st.st_uid);
                     36:        if (!pw)
                     37:        {
                     38:                ps = "uid not found in password file";
                     39:                return "root";
                     40:        }
                     41: 
                     42:        /* return the user's name */
                     43:        return pw->pw_name;
                     44: }
                     45: 
                     46: 
                     47: /* This function sends a mail message to a given user, saying that a file
                     48:  * has been preserved.
                     49:  */
                     50: void mail(user, file, when)
                     51:        char    *user;  /* name of user who should receive the mail */
                     52:        char    *file;  /* name of original text file that was preserved */
                     53:        char    *when;  /* description of why the file was preserved */
                     54: {
                     55:        char    cmd[80];/* buffer used for constructing a "mail" command */
                     56:        FILE    *m, *popen();   /* stream used for giving text to the "mail" program */
                     57:        char    *base;  /* basename of the file */
                     58: 
                     59:        /* separate the directory name from the basename. */
                     60:        for (base = file + strlen(file); --base > file && *base != SLASH; )
                     61:        {
                     62:        }
                     63:        if (*base == SLASH)
                     64:        {
                     65:                *base++ = '\0';
                     66:        }
                     67: 
                     68:        /* for anonymous buffers, pretend the name was "foo" */
                     69:        if (!strcmp(base, "*"))
                     70:        {
                     71:                base = "foo";
                     72:        }
                     73: 
                     74:        /* open a pipe to the "mail" program */
                     75: #if OSK
                     76:        sprintf(cmd, "mail \"-s=%s preserved!\" %s", base, user);
                     77: #else /* ANY_UNIX */
                     78:        sprintf(cmd, "mail %s >/dev/null 2>/dev/null", user);
                     79: #endif
                     80:        m = popen(cmd, "w");
                     81:        if (!m)
                     82:        {
                     83:                /* Can't send mail!  Hope the user figures it out. */
                     84:                return;
                     85:        }
                     86: 
                     87:        /* Tell the user that the file was preserved */
                     88:        fprintf(m, "A version of your file \"%s%c%s\"\n", file, SLASH, base);
                     89:        fprintf(m, "was preserved when %s.\n", when);
                     90:        fprintf(m, "To recover this file, do the following:\n");
                     91:        fprintf(m, "\n");
                     92: #if OSK
                     93:        fprintf(m, "     chd %s\n", file);
                     94: #else /* ANY_UNIX */
                     95:        fprintf(m, "     cd %s\n", file);
                     96: #endif
                     97:        fprintf(m, "     elvrec %s\n", base);
                     98:        fprintf(m, "\n");
                     99:        fprintf(m, "With fond wishes for a speedy recovery,\n");
                    100:        fprintf(m, "                                    Elvis\n");
                    101:        if (ps)
                    102:        {
                    103:                fprintf(m, "\nP.S. %s\n", ps);
                    104:                ps = (char *)0;
                    105:        }
                    106: 
                    107:        /* close the stream */
                    108:        pclose(m);
                    109: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.