Initial release
This commit is contained in:
parent
cf88c0c80b
commit
898a2be432
3
src/TODO
Normal file
3
src/TODO
Normal file
|
@ -0,0 +1,3 @@
|
|||
id:
|
||||
- write more readable code
|
||||
- check if it's complete
|
303
src/id.c
Normal file
303
src/id.c
Normal 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();
|
||||
}
|
Loading…
Reference in New Issue
Block a user