Annotation of researchv10no/cmd/upas/send/local.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <pwd.h>
        !             3: #include "mail.h"
        !             4: #include "string.h"
        !             5: #include "dest.h"
        !             6: #include "aux.h"
        !             7: #include "process.h"
        !             8: #include "ugid.h"
        !             9: #include <sys/stat.h>
        !            10: 
        !            11: /* cheap foriegn import */
        !            12: extern struct passwd * getpwnam();
        !            13: extern FILE *lockopen();
        !            14: 
        !            15: /* expand a local destination into a list of destinations */
        !            16: extern dest *
        !            17: expand_local(dp)
        !            18:        dest *dp;
        !            19: {
        !            20:        FILE *fp;
        !            21:        string *file = s_new();
        !            22:        string *line = s_new();
        !            23:        dest *rv;
        !            24:        int status;
        !            25:        struct passwd *pw;
        !            26:        struct stat sbuf;
        !            27:        struct ugid ubuf;
        !            28: 
        !            29:        /* security - can't have a / in the original address */
        !            30:        if (strchr(s_to_c(dp->addr), '/')!=NULL) {
        !            31:                dp->status = d_syntax;
        !            32:                return NULL;
        !            33:        }
        !            34: 
        !            35:        /* make the mail file name */
        !            36:        if (dp->repl1 == NULL)
        !            37:                abspath(s_to_c(dp->addr), MAILROOT, file);
        !            38:        else
        !            39:                abspath(s_to_c(dp->repl1), MAILROOT, file);
        !            40:        fp = lockopen(s_to_c(file), "r", 0, 0, 0);
        !            41: 
        !            42:        /* check for forwarding or piping */
        !            43:        if (fp != NULL) {
        !            44:                fstat(fileno(fp), &sbuf);
        !            45:                (void)s_getline(fp, line);
        !            46:                lockclose(fp);
        !            47:                status = delivery_status(line);
        !            48:        } else
        !            49:                status = MF_NOMBOX;
        !            50: 
        !            51:        switch(status) {
        !            52:        case MF_PIPE:
        !            53:                dp->repl1 = s_clone(line);
        !            54:                dp->status = d_pipeto;
        !            55:                if (mboxowner(s_to_c(file),&ubuf) < 0)
        !            56:                        dp->status = d_unknown;
        !            57:                else {
        !            58:                        dp->uid = ubuf.uid;
        !            59:                        dp->gid = ubuf.gid;
        !            60:                }
        !            61:                break;
        !            62:        case MF_FORWARD:
        !            63:                rv = s_to_dest(line, dp);
        !            64:                if(rv==NULL)
        !            65:                        dp->status = d_badmbox;
        !            66:                s_free(line);
        !            67:                s_free(file);
        !            68:                return rv;
        !            69:        case MF_NORMAL:
        !            70:                dp->status = d_cat;
        !            71:                break;
        !            72:        case MF_NOMBOX:
        !            73:                /* no mailbox.  deliver only if in /etc/passwd. */
        !            74:                pw = getpwnam(basename(s_to_c(file)));
        !            75:                if (pw != NULL) {
        !            76:                        dp->uid = pw->pw_uid;
        !            77:                        dp->gid = pw->pw_gid;
        !            78:                        dp->status = d_cat;
        !            79:                } else
        !            80:                        dp->status = d_unknown;
        !            81:                break;
        !            82:        case MF_NOTMBOX:
        !            83:                /* security - don't cat onto non-mailboxes */
        !            84:                dp->status = d_badmbox;
        !            85:                break;
        !            86:        }
        !            87:        s_free(line);
        !            88:        s_free(file);
        !            89:        return NULL;
        !            90: }

unix.superglobalmegacorp.com

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