1: #include "parms.h"
   2: #include "structs.h"
   3: 
   4: #ifdef  RCSIDENT
   5: static char rcsid[] = "$Header: savtxt.c,v 1.7 85/01/18 15:39:14 notes Rel $";
   6: #endif	RCSIDENT
   7: 
   8: /*
   9:  *	savtxt - will format and write the note/response handed to
  10:  *	it in a specified file in the users working directory.
  11:  *	We have to do some forking in this case because the directory
  12:  *	may be protected against us.
  13:  *	first save the text in a /tmp/nfs file, then fork and
  14:  *	setuid to the user. The file is then copied to the end
  15:  *	of the ultimate destination.
  16:  *		-- Thanks to Rick Spickelmier (tekcad!ricks)
  17:  *
  18:  *	returns the number of lines written to the file.
  19:  *
  20:  *	Original Coding:	Ray Essick	December 1981
  21:  */
  22: 
  23: long    lseek ();                   /* declare for lint */
  24: FILE * popen ();                    /* for lint */
  25: #include <signal.h>                 /* define signal processing */
  26: 
  27: savtxt (io, where, author, date, txtwhere, title)
  28: struct io_f *io;
  29: char   *where;
  30: struct auth_f  *author;
  31: struct when_f  *date;
  32: struct daddr_f *txtwhere;
  33: char   *title;
  34: {
  35:     int     (*p) (),
  36:             (*q) (),
  37:             (*r) ();
  38:     int     retcode,
  39:             lines;
  40:     int     c;                      /* character scratch */
  41:     register    pid,
  42:                 rpid;
  43:     FILE * txtfile;
  44:     FILE * outfile;
  45:     char    tmpfile[20];                /* hold scratch file name */
  46: 
  47:     sprintf (tmpfile, "/tmp/nfs%d", getpid ());
  48:     if ((txtfile = fopen (tmpfile, "w")) == NULL)
  49:     return 0;                   /* no lines saved */
  50:     lines = preptxt (io, txtfile, author, date, txtwhere, title);
  51:     fclose (txtfile);
  52: 
  53: /*
  54:  *	open it now so we don't have to hassle with permissions and
  55:  *	such.  the file is passed across the fork.
  56:  */
  57:     if ((txtfile = fopen (tmpfile, "r")) == NULL)
  58:     return 0;                   /* couldn't reopen */
  59: 
  60:     if ((pid = fork ()) == 0)               /* also makes him own file */
  61:     {
  62: #ifdef  RUNSUID
  63:     x (setuid (globuid) < 0, "savtxt: couldn't setuid(your uid)");
  64: #else
  65:     x (setgid (getgid ()) < 0, "savtxt: couldn't setgid(your gid)");
  66: #endif	RUNSUID
  67:     if (where[0] == '|')                /* make it a pipe */
  68:         outfile = popen (&where[1], "w");       /* writing */
  69:     else
  70:         outfile = fopen (where, "a");       /* a simple file */
  71:     if (outfile == NULL)                /* no way jose */
  72:         exit (1);                   /* error */
  73: /*
  74:  *	copy the file over
  75:  *		there are faster ways... this works.
  76:  */
  77:     while ((c = getc (txtfile)) != EOF)
  78:         putc (c, outfile);              /* copy it */
  79:     if (where[0] == '|')
  80:         pclose (outfile);               /* pipes wait */
  81:     else
  82:         fclose (outfile);
  83:     fclose (txtfile);
  84:     exit (0);                   /* exit ok */
  85:     }                           /* end of forked process code */
  86: 
  87:     /* wait here for the son to finish */
  88:     p = signal (1, SIG_IGN);
  89:     q = signal (2, SIG_IGN);
  90:     r = signal (3, SIG_IGN);
  91:     while ((rpid = wait (&retcode)) != pid && rpid != -1);
  92:     if (rpid == -1)
  93:     retcode = -1;
  94:     signal (1, p);
  95:     signal (2, q);
  96:     signal (3, r);
  97: 
  98:     fclose (txtfile);                   /* close it in this one too */
  99:     x (unlink (tmpfile) < 0, "savtxt: bad unlink of text file");
 100:     if (retcode)                    /* something wrong */
 101:     return 0;                   /* no lines saved */
 102:     else
 103:     return lines;
 104: }

Defined functions

savtxt defined in line 27; used 4 times

Defined variables

rcsid defined in line 5; never used
Last modified: 1985-01-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2650
Valid CSS Valid XHTML 1.0 Strict