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;

}註釋部分是我爲了看程序的具體步驟而打印結果查看的,其中那一大段被註釋的代碼是錯的。
發佈了35 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章