Annotation of coherent/d/etc/SYSVcron/src/misc.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  *     The information contained herein is a trade secret of Mark Williams
                      3:  *     Company, and  is confidential information.  It is provided  under a
                      4:  *     license agreement,  and may be  copied or disclosed  only under the
                      5:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      6:  *     material without the express written authorization of Mark Williams
                      7:  *     Company or persuant to the license agreement is unlawful.
                      8:  *
                      9:  *     An unpublished work by Mark Williams Company, Chicago.
                     10:  *     All rights reserved.
                     11:  */
                     12: 
                     13: /*
                     14:  * misc.c
                     15:  *
                     16:  * Miscelenious functions for crontab and cron.
                     17:  *
                     18:  * $ 12-9-1991 vlad (Vladimir Smelyansky)
                     19:  */
                     20: #include       <stdio.h>
                     21: #include       <string.h>
                     22: #include       <pwd.h>
                     23: #include       <errno.h>
                     24: #include       <time.h>
                     25: #include       <errno.h>
                     26: #include       <sys/ino.h>
                     27: #include       <sys/stat.h>
                     28: #include       <sys/times.h>
                     29: #include       "cron.h"
                     30: 
                     31: FILE   *fpOpenTable();         /* Open crontable */
                     32: int    iAllow();               /* Check permissions to use crontab */
                     33: int    iInFile();              /* Check if the user is in a file */
                     34: int    lock();                 /* Create a lock FIFO */
                     35: int    set_uid();              /* Set user and group ids */
                     36: void   vDelete();              /* Delete user crontable */
                     37: void   vGetName();             /* Get Real User name */
                     38: void   vList();                /* List user crontable */
                     39: void   vMailDisable();         /* Disable the mail messages */
                     40: void   vMailEnable();          /* Enable the mail messages */
                     41: void   vReplace();             /* Replace user crontable */
                     42: 
                     43: char           *pcFileName;    /* Source table for crontab */
                     44: extern char    acRealUser[MAX_UNAME];  /* Real user name */
                     45: 
                     46: /*
                     47:  * Get real user name and id.
                     48:  */
                     49: void vGetName()
                     50: {
                     51:        int             iRealUid;       /* Real user ID */
                     52:        struct passwd   *pstPasswd;     
                     53: 
                     54:        /* Find real user name. 
                     55:         *
                     56:         * NOTE: functions getpwuid and getpwnam will /etc/passwd file
                     57:         * by calling setpwent.
                     58:         */
                     59:        iRealUid = getuid();    /* Get real user id */
                     60:        if ((pstPasswd = getpwuid(iRealUid)) == NULL) {
                     61:                fprintf(stderr, "crontab: cannot find user id %d\n", iRealUid);
                     62:                exit(1);
                     63:        }
                     64:        strncpy(acRealUser, pstPasswd->pw_name, MAX_UNAME);
                     65: }
                     66: 
                     67: /* 
                     68:  * Check if user allowed to use cron.
                     69:  * Return TRUE if user autorized to use cron, FALSE otherwise.
                     70:  */
                     71: int iAllow()   
                     72: {
                     73:        FILE    *fpAllow,               /* /usr/lib/cron/cron.allow */
                     74:                *fpDeny;                /* /usr/lib/cron/cron.deny */
                     75:        int     iAllowExist = FALSE;    /* By default allow  doesn't exist*/
                     76:        int     iDenyExist = FALSE;     /* By default deny doesn't exist*/
                     77: 
                     78:        vGetName();     /* Get reqal user name */
                     79: 
                     80:        if (!strcmp(acRealUser, "root")) /* Superuser allowed by definition */
                     81:                return TRUE;
                     82:        
                     83:        /* If allow exist we do not want read anything more */
                     84:        if ((fpAllow = fopen(F_ALLOW, "r")) != NULL) 
                     85:                return iInFile(fpAllow, acRealUser);/* return TRUE if allow
                     86:                                                     * FALSE otherwise */
                     87:                
                     88:        if ((fpDeny = fopen(F_DENY, "r")) != NULL) 
                     89:                return !iInFile(fpDeny, acRealUser);/* return FALSE if deny
                     90:                                                     * TRUE otherwise */
                     91:        
                     92:        return FALSE;   /* If neither exist not autorized */
                     93: }
                     94: 
                     95: /* 
                     96:  * Return TRUE if one of the lines in file "fp" matches string "pString" 
                     97:  * exactly, FALSE otherwise.
                     98:  */
                     99: int iInFile(fp, pString)
                    100: FILE   *fp;            
                    101: char   *pString;
                    102: {
                    103:        char acLine[MAX_UNAME];
                    104: 
                    105:        rewind(fp);     /* Just to be safty */
                    106: 
                    107:        while (fgets(acLine, MAX_UNAME, fp)) {
                    108:                if (acLine[0] != '\0')
                    109:                        acLine[strlen(acLine)-1] = '\0';
                    110:                if (0 == strcmp(acLine, pString)) 
                    111:                        return TRUE;    /* Line was found */
                    112:        }
                    113:        /* We didn't find the line */
                    114:        return FALSE;
                    115: }
                    116: 
                    117: /*
                    118:  * Disable the mail messages.
                    119:  */
                    120: void vMailDisable()
                    121: {
                    122:        char    *buf;
                    123: 
                    124:        if ((buf = malloc(strlen(D_MAIN) + MAX_UNAME)) == 
                    125:                                NULL) {
                    126:                fprintf(stderr, "crontab: not enough memory\n");
                    127:                exit(1);
                    128:        }
                    129:        sprintf(buf, "%s/%s", D_MAIN, acRealUser);
                    130:        Dprint("vMailDisable: create lock %s\n", buf);
                    131:        lock(buf);
                    132: }
                    133: 
                    134: /*
                    135:  * Enable the mail messages.
                    136:  */
                    137: void vMailEnable()
                    138: {
                    139:        char    *buf;
                    140: 
                    141:        if ((buf = malloc(strlen(D_MAIN) + MAX_UNAME)) == NULL) {
                    142:                fprintf(stderr, "crontab: not enough memory\n");
                    143:                exit(1);
                    144:        }
                    145:        sprintf(buf, "%s/%s", D_MAIN, acRealUser);
                    146:        Dprint("vMailDisable: remove lock %s\n", buf);
                    147:        unlink(buf);
                    148: }
                    149: 
                    150: /* 
                    151:  * Create a cron lock FIFO. Return TRUE on succes, FALSE if lock exist,
                    152:  * exit 1 if cannot lock.
                    153:  */
                    154: int lock(file_name)
                    155: char   *file_name;
                    156: {
                    157:        if (mknod(file_name, IFPIPE, 0) < 0)
                    158:                if (errno == EEXIST) 
                    159:                        return FALSE;   /* Lock exist */
                    160:                else {
                    161:                        /* Something bad with system at all */
                    162:                        fprintf(stderr, "cron: cannot lock\n");
                    163:                        exit(1);
                    164:                }
                    165:        else
                    166:                return TRUE;            /* Cron can run */
                    167: }
                    168: 
                    169: /*
                    170:  * Set user ID to user_name
                    171:  */
                    172: int set_uid(cpUserName)
                    173: char   *cpUserName;
                    174: {
                    175:        struct passwd   *stpPwd;
                    176: 
                    177:        Dprint("set_uid: Effective ID before setuid is %d\n", geteuid());
                    178:        
                    179:        setpwent();     /* Rewind /etc/passwd. Just to be safety */
                    180:        if ((stpPwd = getpwnam(cpUserName)) == NULL)
                    181:                return FALSE;
                    182:        else {
                    183:                /* You cannot setgid and setuid in the same if statement 
                    184:                 * because there is no garanty in what order they will be 
                    185:                 * evaluated.
                    186:                 */
                    187:                if (setgid(stpPwd->pw_gid)) {
                    188:                        fprintf(stderr, 
                    189:                                "cron: cannot set gid %d for user %s\n", 
                    190:                                                stpPwd->pw_gid, cpUserName);
                    191:                        return FALSE;
                    192:                }                       
                    193:                if (setuid(stpPwd->pw_uid)) {
                    194:                        fprintf(stderr, 
                    195:                                        "cron: cannot set uid %d for user %s\n", 
                    196:                                                stpPwd->pw_uid, cpUserName);
                    197:                        return FALSE;
                    198:                }
                    199:        }
                    200:        /* We have to cd to $HOME here */
                    201:        chdir(stpPwd->pw_dir);
                    202:        return TRUE;
                    203: }
                    204: 
                    205: /*
                    206:  * List user crontable.
                    207:  */
                    208: void vList()
                    209: {
                    210:        FILE    *fp;
                    211:        char    acBuf[MAX_STR_LEN];
                    212: 
                    213:        if ((fp = fpOpenTable("r")) == NULL) {
                    214:                printf("There is no table for user '%s'\n", acRealUser);
                    215:                exit(0);
                    216:        }
                    217: 
                    218:        while (fgets(acBuf, MAX_STR_LEN, fp))
                    219:                printf("%s", acBuf);
                    220: }
                    221: 
                    222: /* 
                    223:  * Delete user crontable.
                    224:  */
                    225: void   vDelete()
                    226: {
                    227:        char    *pcTableName;
                    228: 
                    229:        if ((pcTableName = malloc(strlen(D_SPOOL) + MAX_UNAME )) == NULL) {
                    230:                fprintf(stderr, "crontab: not enough memory\n");
                    231:                exit(1);
                    232:        }
                    233: 
                    234:        sprintf(pcTableName, "%s/%s", D_SPOOL, acRealUser);
                    235:        Dprint("vDelete: delete table %s\n", pcTableName);
                    236:        unlink(pcTableName);
                    237: }
                    238: 
                    239: void   vReplace()
                    240: {
                    241:        FILE    *fpInTable;     /* Source table */
                    242:        FILE    *fpOutTable;    /* Destination */
                    243:        char    acBuf[MAX_STR_LEN];
                    244:        time_t  tTime;
                    245:        
                    246:        Dprint("File name is %s\n", pcFileName);
                    247:        if (strcmp(pcFileName, "-") != 0) {
                    248:                if ((fpInTable = fopen(pcFileName, "r")) == NULL) {
                    249:                        fprintf(stderr, "crontab: cannot open file '%s'\n", 
                    250:                                                                pcFileName);
                    251:                        exit(1);
                    252:                } 
                    253:        } else  /* If input file name is '-' read from stdin */
                    254:                fpInTable = stdin;
                    255: 
                    256:        Dprint("vReplace: source table is %s\n", pcFileName);
                    257: 
                    258:        if ((fpOutTable = fpOpenTable("w")) == NULL) {
                    259:                fprintf(stderr, "crontab: cannot open file '%s/%s'\n", 
                    260:                                                D_SPOOL, acRealUser);
                    261:                exit(1);
                    262:        }
                    263: 
                    264:        /* Print a crontab logo.
                    265:        */
                    266:        time(&tTime);
                    267:        fprintf(fpOutTable, "# Cron Version %s. Installed on %s", VERSION,
                    268:                                                ctime(&tTime));
                    269:        fprintf(fpOutTable, "# Source was %s.\n", pcFileName);
                    270: 
                    271:        while (fgets(acBuf, MAX_STR_LEN, fpInTable))
                    272:                fprintf(fpOutTable, "%s", acBuf);
                    273: }      
                    274: 
                    275: /*
                    276:  * Open user table. Return file pointer if file is open, NULL othewrwise.
                    277:  */
                    278: FILE   *fpOpenTable(cmd)
                    279: char   *cmd;
                    280: {
                    281:        char    *pcTableName;
                    282:        FILE    *fp;
                    283: 
                    284:        if ((pcTableName = malloc(strlen(D_SPOOL) + MAX_UNAME + 1)) == NULL) {
                    285:                system("echo \"cron*: not enough memory\" > /dev/console");
                    286:        }
                    287: 
                    288:        strcpy(pcTableName, D_SPOOL);
                    289:        strcat(pcTableName, "/");
                    290:        strcat(pcTableName, acRealUser);
                    291: 
                    292:        Dprint("Destination file is %s\n", pcTableName);
                    293:        
                    294:        fp = fopen(pcTableName, cmd);
                    295:        free(pcTableName);
                    296:        return(fp);
                    297: }
                    298: 
                    299: /*
                    300:  * if_log - return TRUE if log file should be used.
                    301:  */
                    302: if_log()
                    303: {
                    304:        char    buf[64];
                    305:        FILE    *fp_log;
                    306: 
                    307:        if ((fp_log = fopen(F_DEF, "r")) == NULL)
                    308:                return FALSE;
                    309:        
                    310:        fgets(buf, 64, fp_log);
                    311:        if (!strncmp(buf, "CRONLOG=YES", 11))
                    312:                return TRUE;
                    313:        return FALSE;
                    314: }
                    315:        

unix.superglobalmegacorp.com

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