|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.