fixed id, uname

This commit is contained in:
Your Name 2024-02-15 14:40:04 +03:00
parent 5e28e895e6
commit e067b7c784
2 changed files with 84 additions and 39 deletions

View File

@ -56,7 +56,7 @@ int ids(uid_t uid, struct passwd *pwd) {
printf("%d", uid);
}
if (G_flag)
else if (G_flag || g_flag)
print_groups(pwd, "%s", 0);
putchar('\n');
@ -76,33 +76,46 @@ int def_ids(uid_t uid, struct passwd *pwd) {
return 0;
}
void usage(int sig) {
printf("id [user]\n\t[-u User ID] [-g Group ID]\n\t[-G Supplementary group IDs]\n\t[-n Print names instead of numbers]\n\t[-r Print real ID instead of effective ID]\n");
exit(sig);
}
int main(int argc, char **argv) {
int opt;
while ((opt = getopt(argc, argv, "gGnru")) != -1) {
switch (opt) {
case 'g':
if (G_flag || u_flag)
usage(1);
g_flag = 1;
/* fallthrough */
break;
case 'G':
if (g_flag || u_flag)
usage(1);
G_flag = 1;
break;
case 'n':
n_flag = 1;
case 'u':
if (G_flag || g_flag)
usage(1);
u_flag = 1;
break;
case 'r':
r_flag = 1;
break;
case 'u':
u_flag = 1;
case 'n':
n_flag = 1;
break;
default:
printf("id [user]\n\t[-u User ID] [-g Group ID]\n\t[-G Supplementary group IDs]\n\t[-n Print names instead of numbers]\n\t[-r Print real ID instead of effective ID]\n");
return 0;
usage(0);
}
}
@ -119,8 +132,9 @@ int main(int argc, char **argv) {
return 1;
}
if (u_flag || G_flag)
if (u_flag || G_flag || g_flag)
return ids(uid, pwd);
return def_ids(uid, pwd);
}

View File

@ -4,7 +4,8 @@
#include <unistd.h>
#include <sys/utsname.h>
#if defined(__ANDROID__)
#if defined(OS_NAME)
#elif defined(__ANDROID__)
#define OS_NAME "Android"
#elif defined(__linux__)
@ -24,6 +25,32 @@
#endif
enum {
SYSNAME,
NODENAME,
RELEASE,
VERSION,
MACHINE,
OS,
CPU,
ALL,
COUNT
};
char flags[COUNT];
unsigned int counter = 0;
void print(const char *msg) {
if (counter > 0 && !flags[ALL])
putchar(' ');
printf("%s", msg);
counter++;
if (flags[ALL] && counter <= COUNT)
putchar(' ');
}
int main(int argc, char **argv) {
struct utsname uts;
if (uname(&uts)) {
@ -36,53 +63,39 @@ int main(int argc, char **argv) {
return 0;
}
unsigned int a_flag = 0;
int opt;
while ((opt = getopt(argc, argv, "asnrvmop")) != -1) {
switch (opt) {
case 'a':
a_flag = 1;
/* fallthrough */
flags[ALL] = 1;
break;
case 's':
printf("%s ", uts.sysname);
if (!a_flag)
break;
/* fallthrough */
flags[SYSNAME] = 1;
break;
case 'n':
printf("%s ", uts.nodename);
if (!a_flag)
break;
/* fallthrough */
flags[NODENAME] = 1;
break;
case 'r':
printf("%s ", uts.release);
if (!a_flag)
break;
/* fallthrough */
flags[RELEASE] = 1;
break;
case 'v':
printf("%s ", uts.version);
if (!a_flag)
break;
/* fallthrough */
flags[VERSION] = 1;
break;
case 'm':
printf("%s ", uts.machine);
if (!a_flag)
break;
/* fallthrough */
flags[MACHINE] = 1;
break;
case 'o':
printf("%s ", OS_NAME);
if (!a_flag)
break;
/* fallthrough */
flags[OS] = 1;
break;
case 'p':
printf("%s ", uts.machine);
flags[CPU] = 1;
break;
default:
@ -91,5 +104,23 @@ int main(int argc, char **argv) {
}
}
if (flags[SYSNAME] || flags[ALL])
print(uts.sysname);
if (flags[NODENAME] || flags[ALL])
print(uts.nodename);
if (flags[VERSION] || flags[ALL])
print(uts.version);
if (flags[MACHINE] || flags[ALL])
print(uts.machine);
if (flags[OS] || flags[ALL])
print(OS_NAME);
if (flags[CPU] || flags[ALL])
print("unknow");
putchar('\n');
}