# 2.11BSD#431 - /usr/src/new/notes/src/savtxt.c

##### Functions

    savtxt            X

       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

- in /usr/src/new/notes/src/readem.c line 824-834(3), 840

#### 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: 854 |