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

unix.superglobalmegacorp.com

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