《UNIX高级环境编程》读书笔记之文件与目录(3)

来源:互联网 发布:传智播客大数据 编辑:程序博客网 时间:2024/05/21 11:03

练习:

实现shell里面的umask命令

void get_umask(int argc,char * argv[]){    if(argc == 2)//get umask    {        mode_t mode = umask(0000);        int user = 0,group = 0,other = 0;        if(mode & S_IRUSR)            user = user + 4;        if(mode & S_IWUSR)            user = user + 2;        if(mode & S_IXUSR)            user = user + 1;        if(mode & S_IRGRP)            group = group + 4;        if(mode & S_IWGRP)            group = group + 2;        if(mode & S_IXGRP)            group = group + 1;        if(mode & S_IROTH)            other = other + 4;        if(mode & S_IWOTH)            other = other + 2;        if(mode & S_IXOTH)            other = other + 1;        umask(mode);        printf("0%d%d%d\n",user,group,other);    }    else//set umask    {        int len = strlen(argv[2]);        switch(len)        {            case 1:            {                int a;                a = argv[2][0] - '0';                mode_t mode = 0;                if(a < 0 || a > 7)                    {                        printf("octal number out of range\n");                        return ;                    }                if(a & 0x04)                    mode = mode | S_IROTH;                if(a & 0x02)                    mode = mode | S_IWOTH;                if(a & 0x01)                    mode = mode | S_IXOTH;                umask(mode);                break;            }            case 2:            {                int a,b;                mode_t mode = 0;                a = argv[2][0] - '0';                b = argv[2][1] - '0';                if(a < 0 || a > 7 || b < 0 || b > 7)                    {                        printf("octal number out of range\n");                        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;                umask(mode);                break;            }            case 3:            {                int a,b,c;                mode_t mode = 0;                a = argv[2][0];                b = argv[2][1];                c = argv[2][2];                if(a < 0 || a > 7 || b < 0 || b > 7 || c < 0 || c > 7)                    {                        printf("octal number out of range\n");                        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;                umask(mode);                break;            }            default:            {                int a,b,c,d;                mode_t mode = 0;                a = argv[2][len-4];                b = argv[2][len-3];                c = argv[2][len-2];                d = argv[2][len-1];                if(a != 0 || b < 0 || b > 7 || c < 0 || c > 7 || d < 0 || d >7)                    {                        printf("octal number out of range\n");                        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;                umask(mode);                break;            }        }    }}


0 0
原创粉丝点击