Initial release

This commit is contained in:
Pierre Pronchery 2004-02-29 02:21:50 +00:00
parent cf88c0c80b
commit 898a2be432
2 changed files with 306 additions and 0 deletions

3
src/TODO Normal file
View File

@ -0,0 +1,3 @@
id:
- write more readable code
- check if it's complete

303
src/id.c Normal file
View File

@ -0,0 +1,303 @@
/* id.c */
#include <unistd.h>
extern int optind;
#include <pwd.h>
#include <grp.h>
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char * strdup(char const * s);
/* print_gid */
static struct group * print_gid(gid_t gid)
{
struct group * group;
if((group = getgrgid(gid)) == NULL)
{
printf("\n");
perror("getgrgid");
}
else
printf("gid=%u(%s)", group->gr_gid, group->gr_name);
return group;
}
/* id_all */
static int id_all(char * user)
{
struct passwd * passwd;
struct group * group;
char ** p;
if(user == NULL)
{
if((passwd = getpwuid(getuid())) == NULL)
{
printf("\n");
perror("geteuid");
return 2;
}
printf("uid=%u(%s) ", passwd->pw_uid, passwd->pw_name);
if((group = print_gid(passwd->pw_gid)) == NULL)
return 2;
if((user = strdup(group->gr_name)) == NULL)
{
printf("\n");
perror("strdup");
return 2;
}
if(geteuid() != getuid())
{
if((passwd = getpwuid(geteuid())) == NULL)
{
printf("\n");
perror("geteuid");
return 2;
}
printf(" euid=%u(%s) e", passwd->pw_uid,
passwd->pw_name);
if(print_gid(passwd->pw_gid) == NULL)
return 2;
}
}
else
{
if((passwd = getpwnam(user)) == NULL)
{
perror("getpwnam");
return 2;
}
printf("uid=%u(%s) ", passwd->pw_uid, passwd->pw_name);
if((group = print_gid(passwd->pw_gid)) == NULL)
return 2;
if((user = strdup(group->gr_name)) == NULL)
{
printf("\n");
perror("strdup");
return 2;
}
}
printf(" groups=%u(%s)", getgid(), user);
setgrent();
for(group = getgrent(); group != NULL; group = getgrent())
for(p = group->gr_mem; *p != NULL; p++)
if(strcmp(user, *p) == 0)
printf(",%u(%s)", group->gr_gid,
group->gr_name);
printf("\n");
endgrent();
free(user);
return 0;
}
/* id_G */
static int id_G(char * user, int flagn)
{
struct group * group;
char ** p;
if(user == NULL)
{
if((group = getgrgid(getegid())) == NULL)
{
perror("getgrgid");
return 2;
}
if(getegid() != getgid())
{
if(flagn == 0)
printf("%u %u", getegid(), getgid());
else
{
printf("%s", group->gr_name);
if((group = getgrgid(getgid())) == NULL)
{
printf("\n");
perror("getgrgid");
return 2;
}
printf(" %s", group->gr_name);
}
}
else
{
if(flagn == 0)
printf("%u", getgid());
else
printf("%s", group->gr_name);
}
}
else
{
if((group = getgrnam(user)) == NULL)
{
perror("getgrnam");
return 2;
}
if(flagn == 0)
printf("%u", group->gr_gid);
else
printf("%s", group->gr_name);
}
if((user = strdup(group->gr_name)) == NULL)
{
perror("strdup");
return 2;
}
setgrent();
for(group = getgrent(); group != NULL; group = getgrent())
{
for(p = group->gr_mem; *p != NULL; p++)
{
if(strcmp(user, *p) == 0)
{
if(flagn == 0)
printf(" %u", group->gr_gid);
else
printf(" %s", group->gr_name);
}
}
}
printf("\n");
endgrent();
free(user);
return 0;
}
/* id_g */
static int id_g(char * user, int flagn, int flagr)
{
struct group * group;
if(user == NULL)
{
if(flagn == 0)
{
printf("%u\n", flagr ? getegid() : getgid());
return 0;
}
if((group = getgrgid(flagr ? getegid() : getgid())) == NULL)
{
perror("getgrgid");
return 2;
}
printf("%s\n", group->gr_name);
return 0;
}
if((group = getgrnam(user)) == NULL)
{
perror("getgrnam");
return 2;
}
if(flagn == 0)
printf("%u\n", group->gr_gid);
else
printf("%s\n", group->gr_name);
return 0;
}
/* id_u */
static int id_u(char * user, int flagn, int flagr)
{
struct passwd * passwd;
if(user == NULL)
{
if(flagn == 0)
{
printf("%u\n", flagr ? geteuid() : getuid());
return 0;
}
if((passwd = getpwuid(flagr ? geteuid() : getuid())) == NULL)
{
perror("getpwuid");
return 2;
}
printf("%s\n", passwd->pw_name);
return 0;
}
if((passwd = getpwnam(user)) == NULL)
{
perror("getpwnam");
return 2;
}
if(flagn == 0)
printf("%u\n", passwd->pw_uid);
else
printf("%s\n", passwd->pw_name);
return 0;
}
/* id */
int id(char * user, int flag, int flagn, int flagr)
{
if(flag == 'G')
return id_G(user, flagn);
if(flag == 'g')
return id_g(user, flagn, flagr);
if(flag == 'u')
return id_u(user, flagn, flagr);
return id_all(user);
}
/* usage */
static int usage()
{
fprintf(stderr, "Usage: id [-Ggu][-nr] [user]\n\
-G \n\
-g \n\
-u \n\
-n \n\
-r \n");
return 1;
}
/* main */
int main(int argc, char * argv[])
{
int o;
int flag = 0;
int flagn = 0;
int flagr = 0;
while((o = getopt(argc, argv, "Ggunr")) != -1)
{
switch(o)
{
case 'G':
case 'g':
case 'u':
flag = o;
break;
case 'n':
flagn = 1;
break;
case 'r':
flagr = 1;
break;
case '?':
return usage();
}
}
if(optind == argc)
return id(NULL, flag, flagn, flagr);
if(optind + 1 == argc)
return id(argv[optind], flag, flagn, flagr);
return usage();
}