Annotation of coherent/d/bin/mail/lmail/send.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     The code that basically handles the sending of 
                      3:  *     an individual message in the mail system.
                      4:  */
                      5: 
                      6: #include "mail.h"
                      7: 
                      8: #define SITENAMELEN    32      /* max length of sitename */
                      9: 
                     10: extern char    *strtok();
                     11: FILE   *aliasfp;
                     12: char   aliasbuf [BUFSIZ];
                     13: static char    **tolist;
                     14: 
                     15: extern char    *temp;
                     16: extern int     myuid;          /* User-id of mail user */
                     17: extern int     mygid;          /* Group-id of mail user */
                     18: extern char    cmdname[];      /* Command for x{en,de}code filter */
                     19:                                /* and for tail recursion to uumail */
                     20:                                /* and for editor recursion */
                     21: extern char    *editname;      /* name of editor          */
                     22: extern char    *askcc;         /* Ask for CC: list? (YES/NO) */
                     23: extern int     callmexmail;    /* Xmail modifier present */
                     24: extern char    wrerr[];
                     25: extern char    myname[];       /* User name */
                     26: extern char    myfullname[];   /* full user name */
                     27: extern int     mflag;          /* `You have mail.' message to recipient */
                     28: extern int     verbflag;       /* verbose flag */
                     29: extern char    templ[];        /* Temp file name template */
                     30: extern char    nosave[];
                     31: extern int     callmermail;
                     32: 
                     33: static int     senderr;
                     34: struct tm      *tp;
                     35: char   toerr[] = "Cannot create temporary file\n";
                     36: char   header[BUFSIZ];         /* Message header */
                     37: char   boxname[256];           /* Destination mailbox */
                     38: char   remotefrom [32];        /* "remote from uucp" */
                     39: 
                     40: char   nosend[] = "Can't send mail to '%s'\n";
                     41: char   nopubk[] = "Can't send xmail to '%s'\n";
                     42: 
                     43: /*
                     44:  * Send the message found on
                     45:  * the file pointer to the list
                     46:  * of people (argv style) with
                     47:  * a NULL pointer at the end.
                     48:  * The message is copied to a temp-file
                     49:  * from position `start' to `end' (or EOF).
                     50:  */
                     51: send2(fp, users, start, end, asksubj)
                     52: FILE *fp;
                     53: register char **users;
                     54: fsize_t start, end;
                     55: int    asksubj;
                     56: {
                     57:        char    **getcc();
                     58:        FILE    *xfp, *tfp, *sigfp;
                     59:        time_t  curtime;
                     60: 
                     61:        senderr = 0;
                     62:        temp = templ;
                     63: 
                     64:        if ((tfp = fopen(temp, "w")) != NULL) {
                     65:                fclose(tfp);
                     66:                if ((tfp = fopen(temp, "r+w")) == NULL)
                     67:                        merr(toerr);
                     68:        } else
                     69:                merr(toerr);
                     70:        chown(temp, myuid, mygid);
                     71:        unlink(temp);
                     72:        temp = NULL;
                     73:        fseek(fp, start, 0);
                     74:        end -= start;
                     75: 
                     76:        if (intcheck()) {
                     77:                fclose(tfp);
                     78:                return(1);
                     79:        }
                     80: 
                     81:        for (;;) {
                     82:                if (fgets(msgline, NLINE, fp) == NULL)
                     83:                        break;
                     84:                fputs(msgline, tfp);
                     85:                if ( (end-=strlen(msgline)) <= 0 )
                     86:                        break;
                     87:        }
                     88: 
                     89:        if (intcheck()) {
                     90:                fclose(tfp);
                     91:                return(1);
                     92:        }
                     93: 
                     94:        /*
                     95:         * if empty message, bug out.
                     96:         */
                     97: 
                     98:        if (ftell(tfp) == 0) {
                     99:                fclose(tfp);
                    100:                return(1);
                    101:        }
                    102: 
                    103:        /*
                    104:         * Now send the message.
                    105:         */
                    106: 
                    107:        time(&curtime);
                    108:        tp = localtime(&curtime);
                    109: 
                    110:        if (callmexmail)
                    111:                xsend(users, tfp);
                    112:        else
                    113:                usend(users, tfp);
                    114: 
                    115:        return( senderr );
                    116: }
                    117: 
                    118: usend(users, tfp)
                    119: char **users;
                    120: FILE *tfp;
                    121: {
                    122:        FILE *xfp;
                    123:        char    *cp, *name;
                    124:        char    **ulist;
                    125:        register struct passwd *pwp;
                    126: 
                    127:        for (ulist = users; (name=*ulist) != NULL; ulist++) {
                    128:                rewind(tfp);
                    129: 
                    130: 
                    131:                sprintf(boxname, "%s%s", SPOOLDIR, name);
                    132:                if ((pwp = getpwnam(name)) == NULL) {
                    133:                        /* RFC 822 (Internet) addresses are case independent,
                    134:                         * so valid local addresses must should be lower case.
                    135:                         */
                    136:                        lcase(name);
                    137:                        sprintf(boxname, "%s%s", SPOOLDIR, name);
                    138:                        if ((pwp = getpwnam(name)) == NULL) {
                    139:                                mmsg(nosend, name);
                    140:                                logdump(nosend, name);
                    141:                                senderr = 1;
                    142:                                continue;
                    143:                        }
                    144:                }
                    145: 
                    146:                mlock(pwp->pw_uid);
                    147:                if ((xfp = fopen(boxname, "a")) == NULL) {
                    148:                        mmsg(nosend, name);
                    149:                        logdump(nosend, name);
                    150:                        senderr = 1;
                    151:                        munlock();
                    152:                        continue;
                    153:                }
                    154:                chown(boxname, pwp->pw_uid, pwp->pw_gid);
                    155:                mcopy(tfp, xfp, ftell(tfp), (fsize_t)MAXLONG, 0);
                    156:                fprintf(xfp, "\n\1\1\n");
                    157:                fclose(xfp);
                    158:                munlock();
                    159:                advise(name);
                    160:        }
                    161: 
                    162:        if (senderr && callmermail) {
                    163:                mmsg("error sending mail, text of message follows:\n\n");
                    164:                mmsg("------------------------\n\n");
                    165:                rewind(tfp);
                    166:                mcopy(tfp, stdout, ftell(tfp), (fsize_t)MAXLONG, 0);
                    167:                mmsg("\n------------------------\n\n");
                    168:        }
                    169:                
                    170:        fclose(tfp);
                    171: }
                    172: 
                    173: xsend(users, tfp) char **users; FILE *tfp;
                    174: {
                    175:        register char **ulist;
                    176:        register char *cp;
                    177:        register struct passwd *pwp;
                    178:        FILE *xfp;
                    179: 
                    180:        for (ulist = users; *ulist!=NULL; ulist++) {
                    181:                rewind(tfp);
                    182:                sprintf(boxname, "%s%s", SPOOLDIR, *ulist);
                    183:                sprintf(cmdname, "xencode %s >> %s", *ulist, boxname);
                    184:                if (index(*ulist, '!') != NULL
                    185:                 || (pwp = getpwnam(*ulist)) == NULL) {
                    186:                        mmsg(nosend, *ulist);
                    187:                        continue;
                    188:                }
                    189:                if (xaccess(*ulist) == 0) {
                    190:                        mmsg(nopubk, *ulist);
                    191:                        continue;
                    192:                }
                    193:                mlock(pwp->pw_uid);
                    194:                if ((xfp = fopen(boxname, "a")) == NULL) {
                    195:                        mmsg(nosend, *ulist);
                    196:                        munlock();
                    197:                        continue;
                    198:                }
                    199:                chown(boxname, pwp->pw_uid, pwp->pw_gid);
                    200:                fprintf(xfp, "From xmail %s %s\n", cp,
                    201:                        tzname[tp->tm_isdst ? 1 : 0]);
                    202:                fclose(xfp);
                    203:                if ((xfp = popen(cmdname, "w")) == NULL) {
                    204:                        mmsg("Can't pipe to xencode\n");
                    205:                        continue;
                    206:                }
                    207:                if (fwrite(header, strlen(header), 1, xfp) != 1
                    208:                 || mcopy(tfp, xfp, (fsize_t)0, (fsize_t)MAXLONG, 0)) {
                    209:                        merr(wrerr, cmdname);
                    210:                }
                    211:                pclose(xfp);
                    212:                munlock();
                    213:        }
                    214:        fclose(tfp);
                    215: }
                    216: 
                    217: /*
                    218:  * If the `-m' option is specified, advise
                    219:  * the recipient of the presence of mail.
                    220:  */
                    221: advise(recipient)
                    222: char *recipient;
                    223: {
                    224:        register FILE *fp;
                    225:        register FILE *tfp;
                    226:        struct utmp ut;
                    227:        char tty[30];
                    228:        struct stat sb;
                    229: 
                    230:        if (!mflag)
                    231:                return;
                    232:        if ((fp = fopen("/etc/utmp", "r")) == NULL)
                    233:                return;
                    234:        while (fread(&ut, sizeof ut, 1, fp) == 1)
                    235:                if (strncmp(ut.ut_name, recipient, DIRSIZ) == 0) {
                    236:                        sprintf(tty, "/dev/%s", ut.ut_line);
                    237:                        if (stat(tty, &sb)<0 || (sb.st_mode&S_IEXEC)==0)
                    238:                                continue;
                    239:                        if ((tfp = fopen(tty, "w")) != NULL) {
                    240:                                fprintf(tfp, "\7%s: you have mail.\n", myname);
                    241:                                fclose(tfp);
                    242:                        }
                    243:                }
                    244:        fclose(fp);
                    245: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.