chown命令

要想看chown的使用方法,自己去man吧。

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
void my_error(char *error_string ,int line)
{
    printf("error -> line :%d\n",line);
    perror(error_string);
    exit(1);
}
/*
 *
 *函数功能 : 找出string(用户/用户组)的uid/gid数值
 *
 */
int search(char *string)
{
    int i=0,j=0;
    int mao=0;
    int e=0;
    char uid[5];
    int ui=0;
    int len=strlen(string);
    char buffer[1024];
    FILE *fp;
    int flag=0;
    if((fp=fopen("/etc/passwd","r"))==NULL)
    {
        my_error("open",__LINE__);
    }
    while(!feof(fp))
    {
        fgets(buffer,1024,fp);
        //printf("%s\n\n",buffer);
        for(i=0;i<len;i++)
        {
            flag=0;
            if(buffer[i]==string[i])
            i++;
            else
            {
                flag++;
                break;
            }
        }
        for(i=0;i<1024;i++)
        if(buffer[i]==':')
        break;//找到第一个冒号的位置
        if(i!=len)
        continue;
       // prrintf("i= %d\n",i);
       // printf("flag= %d \n",flag);
        if(flag==0)
        {
        
            for(i=0;i<1024;i++)
            {
                if(buffer[i]==':')
                mao++;
                //printf("mao = %d\n",mao);
                if(mao==2)
                {
                    i++;
                    int j=0;
                    for(;j<4;j++)
                    uid[j]=buffer[i+j];//对应数字放进去
                    uid[4]='\0';
                    //printf("此时1 : ui_t字符串=%s\n",uid);
                    ui=atoi(uid);
                    //printf("此时 : id 是 : %d \n",ui);
                    return ui;
                }
            }
        }
    
    }
    fclose(fp);
    return -1;
    /*int f;//文件描述符
    if((f=open("/etc/passwd",O_RDONLY))<0)
    {
        my_error("open",__LINE__);
        
    }//打开文件
    
    if(read(f,buffer,10240)<0)
    {
        my_error("read",__LINE__);
    }
    printf("-------第一次检查--------\n");
    printf("string : %s\n",string);
    for(i=0;i<10240;i++)
    {
        for(j=0;j<strlen(string);j++)
        {
            if(string[j]==buffer[i+j])
            printf("%c  %c  \n",string[j],buffer[j+i]);
            else
            break;
        }
        if(i==10240)
        {
            printf("该用户不存在\n");
            return -1;
        }
        if(j==strlen(string))
        break;
    }//找到匹配的那一行了
    
    for(e=i+len-1;e<i+len+24;e++)//e的初始值是用户名字后的第一个字符
    {
        if(buffer[e]>0&&buffer[e]<=9)
        {
            int k=0;
            for(;k<4;i++)
            uid[k]=buffer[e+k];//找出来了所有的数字,放进了uid的字符串里
            uid[4]='\0';//现在形成的是类似"1004"这样的字符串
            ui=atoi(uid);//把字符串转成int型数据
            return ui;
        }
    }*/

}
int shu(int a)
{
    if(a<=999)
    return -1;
    else
    return 0;
}
int main(int argc, char ** argv)
{
    
    int ui_t;
    int gi_t;
    //printf("argv[0]: %s\n",argv[0]);
    //printf("argv[1]: %s\n",argv[1]);
    //printf("argv[2]: %s\n",argv[2]);
    //printf("argv[3]: %s\n",argv[3]);
    if(argc!=4)//1.my_chown  2.文件名称  3.用户名/用户代号  4.用户组名/用户组代号
    {
        printf("书写规范 :sudo %s <uer_name/usr_num> <group_name/group_num> <filename>\n",argv[0]);
        return -1;
    }
    if(strcmp(argv[1],"A")>0)
    {
        ui_t=search(argv[1]);
        //printf("执行字母时 : ui_t = %d \n",ui_t);
    }
    else
    {   
        ui_t=atoi(argv[1]);
        //printf("执行数字时 : ui_t = %d\n",ui_t);
        if(shu(ui_t)<0)
        {
            printf("数字不符合规范 ! \n");
            exit(1);
        }
    }
    if(strcmp(argv[2],"A")>0)
    {
        gi_t=search(argv[2]);
        //printf("执行字母时,gi_t = %d\n",gi_t);
    }
    else
    {
        gi_t=atoi(argv[2]);
        //printf("执行数字时,gi_t = %d\n",gi_t);
        if(shu(gi_t)<0)
        {
            printf("数字不符合规范 !\n");
            exit(1);
        }
    }
    //printf("%d  %d  \n",ui_t,gi_t);
    //printf("-----%lu\n",sizeof(gid_t));
    if(chown(argv[3],ui_t,gi_t)<0)
    {
        my_error("chown",__LINE__);
    }
    return 0;

}注释部分是我为了看程序的具体步骤而打印结果查看的,其中那一大段被注释的代码是错的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值