直接使用geteuid()得到的是当前用户的编号,要得到用户名,还需要到/etc/passwd中去取得相应编号的用户名
程序如下
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <fcntl.h>
#define max 8192 #define umax 128
int slip(char *,char *,char*); int char2int(char *);
int main() { int fp; FILE* stream; uid_t cuser; char temp[umax][max]; char fname; int i=0; char cname[20]; char userid[10]; cuser=geteuid(); if((stream=fopen("/etc/passwd","r"))==NULL)exit(1); while((fname=fgetc(stream))!=EOF) { temp[i][0]=fname; if(fgets(&temp[i++][1],max,stream)==NULL)exit(1); } for(i=0;i<umax&&temp[i][0];i++) { if(slip(temp[i],cname,userid)==0)exit(1); if(cuser==char2int(userid))break; } printf("the users name is %s\n",cname); }
int slip(char* str,char* name,char* userid) { int i=0,j=0,k; char* cp; char retvalu[10]={}; for(k=0;k<20;k++) name[k]=0; cp=str; while((*cp)!='''':'''') { name[i++]=*cp; cp++; } cp++; while((*cp)!='''':'''') { cp++; } cp++; while((*cp)!='''':'''') { retvalu[j++]=*cp; cp++; } k=0; while(k<10) { userid[k]=retvalu[k]; k++; }; if(name==NULL)return 0; return 1; }
int char2int(char* ca) { char* p; int ret; p=ca; if(p[4]) { return ret=((int)p[0]-48)*10000+((int)p[1]-48)*1000+((int)p[2]-48)*100+((int)p[3]-48)*10+((int)p[4]-48); } else if(p[3]) { return ret=((int)p[0]-48)*1000+((int)p[1]-48)*100+((int)p[2]-48)*10+((int)p[3]-48); } else if(p[2]) { return ret=((int)p[0]-48)*100+((int)p[1]-48)*10+((int)p[2]-48); } else if(p[1]) { return ret=((int)p[0]-48)*10+((int)p[1]-48); } else if(p[0]) { return ret=((int)p[0]-48); } else return 0; }
[SyBase]linux下使用系统调用取得当前用户名 (修订)
|