zoukankan      html  css  js  c++  java
  • 自己动手写shell之chgrp,chown,chmod

    1.chgrp实现

    #include <grp.h>
    #include <unistd.h>
    
    void chgrp(char * groupname,char * filename)
    {
        struct group * groupinfo = NULL;
        if((groupinfo = getgrnam(groupname)) == NULL)
        {
            printf("groupname does not exist
    ");
            return;
        }
    
        if(access(filename,F_OK) != 0)
        {
            printf("file %s does not exist
    ",filename);
            return;
        }
    
        int gid = groupinfo->gr_gid;
        chown(filename,-1,gid);
        printf("the group id of the file has been changed successfully
    ");
    }

    2.chown实现

    void chowner(char * ownername,char * filename)
    {
        struct passwd *password_info = NULL;
        if((password_info = getpwnam(ownername)) == NULL)
        {
            printf("username does not exist
    ");
            return;
        }
        if(access(filename,F_OK) != 0)
        {
            printf("file %s does not exist
    ",filename);
            return;
        }
        int uid = password_info->pw_uid;
        chown(filename,uid,-1);
        printf("the user id of the file has been changed successfully
    ");
    }

    3.chmod实现

    void _chmod(char * mod,char * filename)
    {
        if(access(filename,F_OK) != 0)
            {
                printf("the file %s does not exist",filename);
                return;
            }
    
        int len = strlen(mod);
        switch(len)
            {
                case 1:
                {
                    int a;
                    a = mod[0] - '0';
                    mode_t mode = 0;
                    if(a < 0 || a > 7)
                        {
                            printf("octal number out of range
    ");
                            return ;
                        }
                    if(a & 0x04)
                        mode = mode | S_IROTH;
                    if(a & 0x02)
                        mode = mode | S_IWOTH;
                    if(a & 0x01)
                        mode = mode | S_IXOTH;
                    chmod(filename,mode);
                    printf("the mode has been changed successfully
    ");
                    break;
                }
                case 2:
                {
                    int a,b;
                    mode_t mode = 0;
                    a = mod[0] - '0';
                    b = mod[1] - '0';
    
                    if(a < 0 || a > 7 || b < 0 || b > 7)
                        {
                            printf("octal number out of range
    ");
                            return ;
                        }
    
                    if(b & 0x04)
                        mode = mode | S_IROTH;
                    if(b & 0x02)
                        mode = mode | S_IWOTH;
                    if(b & 0x01)
                        mode = mode | S_IXOTH;
    
                    if(a & 0x04)
                        mode = mode | S_IRGRP;
                    if(a & 0x02)
                        mode = mode | S_IWGRP;
                    if(a & 0x01)
                        mode = mode | S_IXGRP;
                    chmod(filename,mode);
                    printf("the mode has been changed successfully
    ");
                    break;
                }
                case 3:
                {
                    int a,b,c;
                    mode_t mode = 0;
                    a = mod[0] - '0';
                    b = mod[1] - '0';
                    c = mod[2] - '0';
    
                    if(a < 0 || a > 7 || b < 0 || b > 7 || c < 0 || c > 7)
                        {
                            printf("octal number out of range
    ");
                            return ;
                        }
    
    
                    if(a & 0x04)
                        mode = mode | S_IRUSR;
                    if(a & 0x02)
                        mode = mode | S_IWUSR;
                    if(a & 0x01)
                        mode = mode | S_IXUSR;
    
                    if(b & 0x04)
                        mode = mode | S_IRGRP;
                    if(b & 0x02)
                        mode = mode | S_IWGRP;
                    if(b & 0x01)
                        mode = mode | S_IXGRP;
    
                    if(c & 0x04)
                        mode = mode | S_IROTH;
                    if(c & 0x02)
                        mode = mode | S_IWOTH;
                    if(c & 0x01)
                        mode = mode | S_IXOTH;
                    chmod(filename,mode);
                    printf("the mode has been changed successfully
    ");
                    break;
                }
                default:
                {
                    int a,b,c,d;
                    mode_t mode = 0;
                    a = mod[len-4] - '0';
                    b = mod[len-3] - '0';
                    c = mod[len-2] - '0';
                    d = mod[len-1] - '0';
    
                    if(a != 0 || b < 0 || b > 7 || c < 0 || c > 7 || d < 0 || d >7)
                        {
                            printf("octal number out of range
    ");
                            return ;
                        }
    
                    if(b & 0x04)
                        mode = mode | S_IRUSR;
                    if(b & 0x02)
                        mode = mode | S_IWUSR;
                    if(b & 0x01)
                        mode = mode | S_IXUSR;
    
                    if(c & 0x04)
                        mode = mode | S_IRGRP;
                    if(c & 0x02)
                        mode = mode | S_IWGRP;
                    if(c & 0x01)
                        mode = mode | S_IXGRP;
    
                    if(d & 0x04)
                        mode = mode | S_IROTH;
                    if(d & 0x02)
                        mode = mode | S_IWOTH;
                    if(d & 0x01)
                        mode = mode | S_IXOTH;
                    chmod(filename,mode);
                    printf("the mode has been changed successfully
    ");
                    break;
                }
            }
    }


  • 相关阅读:
    删除List集合中的元素你碰到过这样的陷阱吗?
    从spring框架中的事件驱动模型出发,优化实际应用开发代码
    SpringBoot启动原理及相关流程
    基于SpringBoot实现定时任务的设置(常用:定时清理数据库)
    C#开发中常用的加密解密方法
    http://go.microsoft.com/fwlink/?linkid问题
    移动端开发必须知道的小技巧
    工作中遇到的细节问题总结(二)
    redis分布式锁和消息队列
    join和wait
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4022577.html
Copyright © 2011-2022 走看看