Annotation of coherent/d/bin/uucheck/checkperms/do_check.c, revision 1.1.1.1

1.1       root        1: /* do_check.c - Execute a file check for the current file context.
                      2:  * part of uucheck
                      3:  */
                      4: #include <sys/stat.h>
                      5: #include <pwd.h>
                      6: #include <grp.h>
                      7: #include "y.tab.h"
                      8: #include "checkperms.h"
                      9: 
                     10: void
                     11: do_check(message_type, check_type, optional_message)
                     12:        int message_type;
                     13:        int check_type;
                     14:        char *optional_message;
                     15: {
                     16:        switch(check_type) {
                     17:        case CHMOD_PERMISSION:
                     18:                if(!it_exists) break; /* Skip this if the file does not exist.  */
                     19:                /* NB: chmod_chk has LOTS of output side effects.  */
                     20:                if(!chmod_chk(current_path, chmod_string, &current_stat, message_type)) {
                     21:                        notice(message_type, optional_message, basename(current_path));
                     22:                }
                     23:                break; /* CHMOD_PERMISSION */
                     24:        case EXIST:
                     25:                if(!it_exists){
                     26:                        notice(message_type, "%s does not exist.", current_path);
                     27:                        notice(message_type, optional_message, basename(current_path));
                     28:                } /* if it does not exist.  */
                     29:                break; /* EXIST */
                     30:        case FILE_TOKEN:
                     31:                if(!it_exists) { /* Try to fix non-existence. */
                     32:                        sprintf(command, "touch %s", current_path);
                     33:                        sprintf(bigbuf, "You can fix it with \"%s\".\n", command);
                     34:                        VERBOSE(bigbuf);
                     35:                        FIX(system(command); it_exists = TRUE;);
                     36:                } /* if !it_exists */
                     37:                if (FMODE(current_stat)&S_IFREG == 0){
                     38:                        notice(message_type, "%s is not a regular file.", current_path);
                     39:                        notice(message_type, optional_message, basename(current_path)); 
                     40:                        VERBOSE("You might consider reinstalling everything.\n");
                     41:                }       
                     42:                break; /* FILE_TOKEN */
                     43:        case DIRECTORY:
                     44:                if(!it_exists) { /* Try to fix non-existence. */
                     45:                        sprintf(command, "mkdir %s", current_path);
                     46:                        sprintf(bigbuf, "You can fix it with \"%s\".\n", command);
                     47:                        VERBOSE(bigbuf);
                     48:                        FIX(system(command); it_exists = TRUE; );
                     49:                } /* if !it_exists */
                     50:                if (FMODE(current_stat)&S_IFDIR == 0){
                     51:                        notice(message_type, "%s is not a directory.", current_path);
                     52:                        notice(message_type, optional_message, basename(current_path)); 
                     53:                        VERBOSE("You might consider reinstalling everything.\n");
                     54:                }       
                     55:                break; /* DIRECTORY */
                     56:        case PIPE:
                     57:                if(!it_exists) { /* Try to fix non-existence. */
                     58:                        sprintf(command, "mknod %s p", current_path);
                     59:                        sprintf(bigbuf, "You can fix it with \"%s\".\n", command);
                     60:                        VERBOSE(bigbuf);
                     61:                        FIX(system(command); it_exists = TRUE; );
                     62:                } /* if !it_exists */
                     63:                if (FMODE(current_stat)&S_IFPIP == 0){
                     64:                        notice(message_type, "%s is not a pipe.", current_path);
                     65:                        notice(message_type, optional_message, basename(current_path)); 
                     66:                        VERBOSE("You might consider reinstalling everything.\n");
                     67:                }       
                     68:                break; /* PIPE */
                     69:        case CHARACTER_SPECIAL:
                     70:                if(!it_exists) { /* Try to fix non-existence. */
                     71:                        sprintf(command, "mknod %s c %d %d", current_path,
                     72:                                          major, minor);
                     73:                        sprintf(bigbuf, "You can fix it with \"%s\".\n", command);
                     74:                        VERBOSE(bigbuf);
                     75:                        FIX(system(command); it_exists = TRUE; );
                     76:                } /* if !it_exists */
                     77:                if(!it_exists) break; /* Skip this if the file does not exist.  */
                     78:                if (FMODE(current_stat)&S_IFCHR == 0){
                     79:                        notice(message_type, "%s is not a character special device.", current_path);
                     80:                        notice(message_type, optional_message, basename(current_path)); 
                     81:                        VERBOSE("You might consider reinstalling everything.\n");
                     82:                }       
                     83:                break; /* CHARACTER_SPECIAL */
                     84:        case BLOCK_SPECIAL:
                     85:                if(!it_exists) { /* Try to fix non-existence. */
                     86:                        sprintf(command, "mknod %s b %d %d", current_path,
                     87:                                          major, minor);
                     88:                        sprintf(bigbuf, "You can fix it with \"%s\".\n", command);
                     89:                        VERBOSE(bigbuf);
                     90:                        FIX(system(command); it_exists = TRUE; );
                     91:                } /* if !it_exists */
                     92:                if(!it_exists) break; /* Skip this if the file does not exist.  */
                     93:                if (FMODE(current_stat)&S_IFBLK == 0){
                     94:                        notice(message_type, "%s is not a block special device.", current_path);
                     95:                        notice(message_type, optional_message, basename(current_path)); 
                     96:                        VERBOSE("You might consider reinstalling everything.\n");
                     97:                }       
                     98:                break; /* BLOCK_SPECIAL */
                     99:        case OWNER:
                    100:                if(!it_exists) break; /* Skip this if the file does not exist.  */
                    101:                if(!owner_chk(current_path,
                    102:                              id_string,
                    103:                              &current_stat,
                    104:                              message_type,
                    105:                              optional_message)) {
                    106:                        notice(message_type, optional_message, basename(current_path));
                    107:                } /* if owner does not check out.  */   
                    108:                break; /* BLOCK_SPECIAL */              break; /* OWNER */
                    109:        case GROUP:
                    110:                if(!it_exists) break; /* Skip this if the file does not exist.  */
                    111:                if(!group_chk(current_path,
                    112:                              id_string,
                    113:                              &current_stat,
                    114:                              message_type,
                    115:                              optional_message)) {
                    116:                        notice(message_type, optional_message, basename(current_path));
                    117:                } /* if owner does not check out.  */   
                    118:                break; /* GROUP */
                    119:        default:
                    120:                FATAL("Impossible check type: %d\n", check_type);
                    121:        } /* switch check_type */
                    122: } /* do_check() */
                    123: 
                    124: 
                    125: boolean
                    126: owner_chk(path, id_string, statptr, msg_type, optional_message)
                    127:        unsigned char *path;
                    128:        unsigned char *id_string;
                    129:        struct stat *statptr;
                    130:        int msg_type;   /* Error messages or just warning messages?  */
                    131:        char *optional_message;
                    132: {
                    133:        struct passwd *tmp_pwd;
                    134: 
                    135:        /* fill in statptr if it isn't already */
                    136:        if (statptr == (struct stat *) NULL) {
                    137:                statptr = (struct stat *) malloc(sizeof(struct stat));
                    138:                stat(path, statptr);
                    139:        }
                    140: 
                    141:        /* Translate the expected user name to a uid.  We want to
                    142:         * do this instead of converting the uid in the stat struct to a
                    143:         * string, because more than one user could have the same uid.
                    144:         * With "uucp" this even happens frequently.
                    145:         */
                    146:        if ((tmp_pwd = getpwnam(id_string)) == NULL) {
                    147:                sprintf(bigbuf, "User %s does not exist!\n", id_string);
                    148:                ERROR(bigbuf);
                    149:                VERBOSE("Use the newusr command to add this user.\n");
                    150:                FATAL(NULL, NULL);
                    151:        }
                    152: 
                    153:        if (tmp_pwd->pw_uid != statptr->st_uid) {
                    154:                sprintf(bigbuf, "%s is not owned by %s.", path, id_string);
                    155:                notice(msg_type, bigbuf, NULL);
                    156:                notice(msg_type, optional_message, basename(path));
                    157:                sprintf(command, "chown %s %s", id_string, path);
                    158:                sprintf(bigbuf, "Use \"%s\" to fix this.\n", command);
                    159:                VERBOSE(bigbuf);
                    160:                FIX(system(command););
                    161:        } /* if (id != statptr->st_uid) */
                    162: 
                    163: } /* owner_chk() */
                    164: 
                    165: boolean
                    166: group_chk(path, id_string, statptr, msg_type, optional_message)
                    167:        unsigned char *path;
                    168:        unsigned char *id_string;
                    169:        struct stat *statptr;
                    170:        int msg_type;   /* Error messages or just warning messages?  */
                    171:        char *optional_message;
                    172: {
                    173:        struct group *tmp_grp;
                    174: 
                    175: 
                    176:        /* fill in statptr if it isn't already */
                    177:        if (statptr == (struct stat *) NULL) {
                    178:                statptr = (struct stat *) malloc(sizeof(struct stat));
                    179:                stat(path, statptr);
                    180:        }
                    181: 
                    182:        /* Translate the expected group name to a gid.  We want to
                    183:         * do this instead of converting the gid in the stat struct to a
                    184:         * string, because more than one group could have the same gid.
                    185:         */
                    186:        if ((tmp_grp = getgrnam(id_string)) == NULL) {
                    187:                sprintf(bigbuf, "Group %s does not exist!\n", id_string);
                    188:                ERROR(bigbuf);
                    189:                VERBOSE("Edit /etc/group to add this group.\n");
                    190:                FATAL(NULL, NULL);
                    191:        }
                    192: 
                    193:        if (tmp_grp->gr_gid != statptr->st_gid) {
                    194:                sprintf(bigbuf, "%s is not group %s.", path, id_string);
                    195:                notice(msg_type, bigbuf, NULL);
                    196:                notice(msg_type, optional_message, basename(path));
                    197:                sprintf(command, "chgrp %s %s", id_string, path);
                    198:                sprintf(bigbuf, "Use \"%s\" to fix this.\n", command);
                    199:                VERBOSE(bigbuf);
                    200:                FIX(system(command););
                    201:        } /* if (id != statptr->st_uid) */
                    202: 
                    203: } /* group_chk() */

unix.superglobalmegacorp.com

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