1 /* mail.c
2    Send mail to a user.
3 
4    Copyright (C) 1992, 1993 Ian Lance Taylor
5 
6    This file is part of the Taylor UUCP package.
7 
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2 of the
11    License, or (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
21 
22    The author of the program may be contacted at ian@airs.com.
23    */
24 
25 #include "uucp.h"
26 
27 #include "uudefs.h"
28 #include "sysdep.h"
29 #include "system.h"
30 
31 #include <errno.h>
32 
33 #if HAVE_TIME_H
34 #include <time.h>
35 #endif
36 
37 #ifndef ctime
38 extern char *ctime ();
39 #endif
40 
41 /* Mail a message to a user.  */
42 
43 boolean
fsysdep_mail(zto,zsubject,cstrs,paz)44 fsysdep_mail (zto, zsubject, cstrs, paz)
45      const char *zto;
46      const char *zsubject;
47      int cstrs;
48      const char **paz;
49 {
50   char **pazargs;
51   char *zcopy, *ztok;
52   size_t cargs, iarg;
53   FILE *e;
54   pid_t ipid;
55   time_t itime;
56   int i;
57 
58   /* Parse MAIL_PROGRAM into an array of arguments.  */
59   zcopy = zbufcpy (MAIL_PROGRAM);
60 
61   cargs = 0;
62   for (ztok = strtok (zcopy, " \t");
63        ztok != NULL;
64        ztok = strtok ((char *) NULL, " \t"))
65     ++cargs;
66 
67   pazargs = (char **) xmalloc ((cargs + 4) * sizeof (char *));
68 
69   memcpy (zcopy, MAIL_PROGRAM, sizeof MAIL_PROGRAM);
70   for (ztok = strtok (zcopy, " \t"), iarg = 0;
71        ztok != NULL;
72        ztok = strtok ((char *) NULL, " \t"), ++iarg)
73     pazargs[iarg] = ztok;
74 
75 #if ! MAIL_PROGRAM_SUBJECT_BODY
76   pazargs[iarg++] = (char *) "-s";
77   pazargs[iarg++] = (char *) zsubject;
78 #endif
79 
80 #if ! MAIL_PROGRAM_TO_BODY
81   pazargs[iarg++] = (char *) zto;
82 #endif
83 
84   pazargs[iarg] = NULL;
85 
86   e = espopen ((const char **) pazargs, FALSE, &ipid);
87 
88   ubuffree (zcopy);
89   xfree ((pointer) pazargs);
90 
91   if (e == NULL)
92     {
93       ulog (LOG_ERROR, "espopen (%s): %s", MAIL_PROGRAM,
94 	    strerror (errno));
95       return FALSE;
96     }
97 
98 #if MAIL_PROGRAM_TO_BODY
99   fprintf (e, "To: %s\n", zto);
100 #endif
101 #if MAIL_PROGRAM_SUBJECT_BODY
102   fprintf (e, "Subject: %s\n", zsubject);
103 #endif
104 
105 #if MAIL_PROGRAM_TO_BODY || MAIL_PROGRAM_SUBJECT_BODY
106   fprintf (e, "\n");
107 #endif
108 
109   (void) time (&itime);
110   /* Remember that ctime includes a \n, so this skips a line.  */
111   fprintf (e, "Message from UUCP on %s %s\n", zSlocalname,
112 	   ctime (&itime));
113 
114   for (i = 0; i < cstrs; i++)
115     fputs (paz[i], e);
116 
117   (void) fclose (e);
118 
119   return ixswait ((unsigned long) ipid, MAIL_PROGRAM) == 0;
120 }
121