要想看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;
}注释部分是我为了看程序的具体步骤而打印结果查看的,其中那一大段被注释的代码是错的。