[zz] 浅析dev目录下设备文件mknod节点gid,uid和mode的如何方便设置

http://blog.chinaunix.net/u1/38994/showart.php?id=1348852

init
= > handle_device_fd 收到uevent信息
= > handle_device_event
= >
static void handle_device_event( struct uevent * uevent)
{
    . . .
    /* are we block or char? where should we live? */
    if ( ! strncmp ( uevent- > path, "/block" , 6) ) {
        block = 1;
        base = "/dev/block/" ; //根据uevent路径改变该节点路径
        mkdir( base, 0755) ;
    } else {
        block = 0;
            /* this should probably be configurable somehow */
        if ( ! strncmp ( uevent- > path, "/class/graphics/" , 16) ) {
            base = "/dev/graphics/" ; //
根据uevent路径 改变该uevent需要创建节点的路径
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/oncrpc/" , 14) ) {
            base = "/dev/oncrpc/" ;
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/adsp/" , 12) ) {
            base = "/dev/adsp/" ;
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/input/" , 13) ) {
            base = "/dev/input/" ; //
根据uevent路径 改变该uevent需要创建节点的路径
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/sensors/" , 15) ) {
            base = "/dev/sensors/" ;
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/mtd/" , 11) ) {
            base = "/dev/mtd/" ; //
根据uevent路径 改变该uevent需要创建节点的路径
            mkdir( base, 0755) ;
        } else if ( ! strncmp ( uevent- > path, "/class/misc/" , 12) & &
                    ! strncmp ( name, "log_" , 4) ) {
            base = "/dev/log/" ; //
根据uevent路径 改变该uevent需要创建节点的路径
            mkdir( base, 0755) ;
            name + = 4;
        } else if ( ! strncmp ( uevent- > path, "/class/sound/" , 13) ) {
            base = "/dev/snd/" ;
            mkdir( base, 0755) ;
        } else
            base = "/dev/" ;
    }
    
    snprintf( devpath, sizeof ( devpath) , "%s%s" , base, name) ;

    if ( ! strcmp ( uevent- > action, "add" ) ) {
        make_device( devpath, block, uevent- > major, uevent- > minor) ; //创建节点文件文件devpath
        return ;
    }
    . . .
}

static void make_device( const char * path, int block, int major, int minor)
{
    unsigned uid;
    unsigned gid;
    mode_t mode;
    dev_t dev;

    if ( major > 255 | | minor > 255)
        return ;

    mode = get_device_perm( path, & uid, & gid) | ( block ? S_IFBLK : S_IFCHR) ; //获取将要创建的节点是否需要重设它的mode数值
    dev = ( major < < 8) | minor;
    mknod( path, mode, dev) ;
    chown( path, uid, gid) ;
}
get_device_perm函数会比较path路径是否和下面的devperms[ ] 数组中的inode路径相一致, 如果一致, 那么返回devperms[ ] 数组中指定的uid, gid和mode数值, 这样make_device就会向/ dev这个tmpfs'内存虚拟物理盘' 创建inode节点, 同时改变该inode的uid和gid.
于是在devperms[ ] 数组中我们就可以方便的控制生成的/ dev文件的uid, gid和mode了.

static struct perms_ devperms[ ] = {
    { "/dev/null" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/zero" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/full" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/ptmx" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/tty" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/random" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/urandom" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/ashmem" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/binder" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/m2d" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/bmm" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/innodev" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/innodev0" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/innodev1" , 0666, AID_ROOT, AID_ROOT, 0 } ,
    { "/dev/innodev2" , 0666, AID_ROOT, AID_ROOT, 0 } ,


    /* logger should be world writable (for logging) but not readable */
    { "/dev/log/" , 0662, AID_ROOT, AID_LOG, 1 } ,

        /* these should not be world writable */
    { "/dev/android_adb" , 0660, AID_ADB, AID_ADB, 0 } ,
    { "/dev/android_adb_enable" , 0660, AID_ADB, AID_ADB, 0 } ,
    { "/dev/ttyMSM0" , 0660, AID_BLUETOOTH, AID_BLUETOOTH, 0 } ,
    { "/dev/alarm" , 0664, AID_SYSTEM, AID_RADIO, 0 } ,
    { "/dev/tty0" , 0666, AID_ROOT, AID_SYSTEM, 0 } ,
    { "/dev/graphics/" , 0666, AID_ROOT, AID_GRAPHICS, 1 } ,
    { "/dev/hw3d" , 0660, AID_SYSTEM, AID_GRAPHICS, 0 } ,
    { "/dev/input/" , 0660, AID_ROOT, AID_INPUT, 1 } ,
    { "/dev/eac" , 0660, AID_ROOT, AID_AUDIO, 0 } ,
    { "/dev/cam" , 0660, AID_ROOT, AID_CAMERA, 0 } ,
    { "/dev/video0" , 0660, AID_ROOT, AID_CAMERA, 0 } ,
    { "/dev/mved" , 0660, AID_SYSTEM, AID_CAMERA, 0 } ,
    { "/dev/pmem" , 0660, AID_SYSTEM, AID_GRAPHICS, 0 } ,
    { "/dev/pmem_gpu" , 0660, AID_SYSTEM, AID_GRAPHICS, 1 } ,
    { "/dev/pmem_adsp" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/pmem_camera" , 0660, AID_SYSTEM, AID_CAMERA, 1 } ,
    { "/dev/oncrpc/" , 0660, AID_ROOT, AID_SYSTEM, 1 } ,
    { "/dev/adsp/" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/sensors/" , 0666, AID_SYSTEM, AID_SYSTEM, 1 } ,
    { "/dev/mt9t013" , 0660, AID_SYSTEM, AID_SYSTEM, 0 } ,
    { "/dev/akm8976_daemon" , 0640, AID_COMPASS, AID_SYSTEM, 0 } ,
    { "/dev/akm8976_aot" , 0640, AID_COMPASS, AID_SYSTEM, 0 } ,
    { "/dev/akm8976_pffd" , 0640, AID_COMPASS, AID_SYSTEM, 0 } ,
    { "/dev/msm_pcm_out" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/msm_pcm_in" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/msm_pcm_ctl" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/msm_mp3" , 0660, AID_SYSTEM, AID_AUDIO, 1 } ,
    { "/dev/smd0" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/qmi" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/qmi0" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/qmi1" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/qmi2" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/htc-acoustic" , 0640, AID_RADIO, AID_RADIO, 0 } ,
    { "/dev/snd/" , 0666, AID_ROOT, AID_AUDIO, 1 } ,
    { NULL , 0, 0, 0, 0 } ,
} ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值