要想看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;
}註釋部分是我爲了看程序的具體步驟而打印結果查看的,其中那一大段被註釋的代碼是錯的。