Annotation of researchv10no/cmd/upas/send/local.c, revision 1.1.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.