Annotation of coherent/d/bin/mail/lmail/send.c, revision 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.