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;
                }
            }
    }


  • 相关阅读:
    Android 在一个程序中启动另一个程序
    Android SDK Manager国内无法更新的解决方案
    Android studio 安装中遇到一些问题的解决办法,分享一下
    apache服务器伪静态配置说明
    POJ3253 Fence Repair【贪心】
    洛谷P1090 合并果子【贪心】
    POJ3069 Saruman's Army【贪心】
    洛谷P1012 拼数【字符串+排序】
    POJ3617 Best Cow Line【贪心】
    洛谷P1583 魔法照片【模拟+排序】
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4022577.html
Copyright © 2011-2022 走看看