Annotation of coherent/d/etc/mknod.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * mknod -- make a special file or named pipe
                      3:  * Usage: /etc/mknod filename type major minor
                      4:  *        /etc/mknod filename p
                      5:  * The 'type' is 'b' for block special or 'c' for character special;
                      6:  * 'major' and 'minor' are numbers.
                      7:  * The second form creates a pipe with the given filename.
                      8:  */
                      9: 
                     10: #include <sys/stat.h>
                     11: 
                     12: #define        NMAJOR  256
                     13: #define        NMINOR  256
                     14: 
                     15: int force;
                     16: struct stat sb;
                     17: 
                     18: main( argc, argv )
                     19: 
                     20: int argc;
                     21: register char **argv;
                     22: 
                     23: {
                     24:        register unsigned mode;
                     25:        unsigned maj, min;
                     26:        dev_t dev;
                     27: 
                     28:        if ( argc >= 2 && strcmp( argv[1], "-f" ) == 0 ) {
                     29:                ++force;
                     30:                ++argv;
                     31:                --argc;
                     32:        }
                     33: 
                     34:        if ( argc < 3 )
                     35:                usage();
                     36: 
                     37:        if ( strlen( argv[2] ) != 1 )
                     38:                usage();
                     39: 
                     40:        switch ( argc ) {
                     41: 
                     42:        case 3:
                     43:                if ( argv[2][0] != 'p' )
                     44:                        usage();
                     45: 
                     46:                mode = S_IFPIP;
                     47:                dev = 0;
                     48:                break;
                     49: 
                     50:        case 5: 
                     51:                if ( getuid() != 0 )
                     52:                        fatal( "not superuser\n", 0 );
                     53: 
                     54:                switch ( argv[2][0] ) {
                     55:                
                     56:                case 'c':                       /* mknod name c major minor */
                     57:                        mode = S_IFCHR;
                     58:                        break;
                     59: 
                     60:                case 'b':                       /* mknod name b major minor */
                     61:                        mode = S_IFBLK;
                     62:                        break;
                     63: 
                     64:                default:
                     65:                        usage();
                     66:                }
                     67: 
                     68:                if ((maj = atoi(argv[3])) >= NMAJOR)
                     69:                        usage();
                     70: 
                     71:                if ((min = atoi(argv[4])) >= NMINOR)
                     72:                        usage();
                     73: 
                     74:                dev = makedev( maj, min );
                     75:                break;
                     76: 
                     77:        default:
                     78:                usage();
                     79:        }
                     80: 
                     81:        if ( (stat( argv[1], &sb )) >= 0 ) {
                     82: 
                     83:                if ((sb.st_mode & S_IFMT) == S_IFDIR)
                     84:                        usage();
                     85: 
                     86:                if (force)
                     87:                        unlink( argv[1] );
                     88:        }
                     89: 
                     90:        if ( mknod( argv[1], mode | 0777, dev ) < 0 )
                     91:                fatal( "can't mknod: ", argv[1] );
                     92: 
                     93:        exit( 0 );
                     94: }
                     95: 
                     96: usage()
                     97: {
                     98:        fatal( "\
                     99: Usage: mknod [-f] filename b major minor\n\
                    100:        mknod [-f] filename c major minor\n\
                    101:        mknod [-f] filename p", 0 );
                    102: }
                    103: 
                    104: fatal( mesg, file )
                    105: register char *mesg, *file;
                    106: {
                    107:        write( 2, mesg, strlen(mesg) );
                    108:        if (file)
                    109:                write( 2, file, strlen(file) );
                    110:        write( 2, "\n", 1 );
                    111:        exit( 1 );
                    112: }
                    113: 
                    114: /*
                    115:  * atoi ( s )
                    116:  *
                    117:  *     Input:  s = numeric string to evaluate.
                    118:  *
                    119:  *     Action: Convert numeric string into a positive integer.
                    120:  *
                    121:  *     Return: -1 = invalid character(s) encountered.
                    122:  *             *  = numeric equivalent.
                    123:  */
                    124: 
                    125: atoi( s )
                    126: register char *s;
                    127: {
                    128:        register int n = 0;
                    129: 
                    130:        while ( *s ) {
                    131: 
                    132:                if ( ('0' <= *s) && (*s <= '9') ) {
                    133:                        n *= 10;
                    134:                        n += *s++ - '0';
                    135:                }
                    136:                else
                    137:                        return -1;
                    138:        }
                    139:        return n;
                    140: }

unix.superglobalmegacorp.com

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