From 2f2803957202a42b7dbfc00c62affe23b5c70d76 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 11 Sep 2020 11:45:49 +0300 Subject: Update id program to POSIX. --- awklib/eg/prog/id.awk | 154 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 133 insertions(+), 21 deletions(-) (limited to 'awklib/eg/prog/id.awk') diff --git a/awklib/eg/prog/id.awk b/awklib/eg/prog/id.awk index b6061f9b..50c40c05 100644 --- a/awklib/eg/prog/id.awk +++ b/awklib/eg/prog/id.awk @@ -1,61 +1,173 @@ # id.awk --- implement id in awk # -# Requires user and group library functions +# Requires user and group library functions and getopt # # Arnold Robbins, arnold@skeeve.com, Public Domain # May 1993 # Revised February 1996 # Revised May 2014 # Revised September 2014 +# Revised September 2020 # output is: # uid=12(foo) euid=34(bar) gid=3(baz) \ # egid=5(blat) groups=9(nine),2(two),1(one) +# Options: +# -G Output all group ids as space separated numbers (ruid, euid, groups) +# -g Output only the euid as a number +# -n Ouput name instead of the numeric value (with -g/-G/-u) +# -r Output ruid/rguid instead of effective id +# -u Output only effective user id, as a number + +function usage() +{ + printf("Usage:\n" \ + "\tid [user]\n" \ + "\tid −G [−n] [user]\n" \ + "\tid −g [−nr] [user]\n" \ + "\tid −u [−nr] [user]\n") > "/dev/stderr" + + exit 1 +} BEGIN { - uid = PROCINFO["uid"] - euid = PROCINFO["euid"] - gid = PROCINFO["gid"] - egid = PROCINFO["egid"] + # parse args + while ((c = getopt(ARGC, ARGV, "Ggnru")) != -1) { + if (c == "G") + groupset_only++ + else if (c == "g") + egid_only++ + else if (c == "n") + names_not_groups++ + else if (c == "r") + real_ids_only++ + else if (c == "u") + euid_only++ + else + usage() + } + if (groupset_only && real_ids_only) + usage() + else if (ARGC - Optind > 1) + usage() + if (ARGC - Optind == 0) { + # gather info for current user + uid = PROCINFO["uid"] + euid = PROCINFO["euid"] + gid = PROCINFO["gid"] + egid = PROCINFO["egid"] + for (i = 1; ("group" i) in PROCINFO; i++) + groupset[i] = PROCINFO["group" i] + } else { + fill_info_for_user(ARGV[ARGC-1]) + real_ids_only++ + } + if (groupset_only) { + if (names_not_groups) { + for (i = 1; i in groupset; i++) { + entry = getgrgid(groupset[i]) + name = get_first_field(entry) + printf("%s", name) + if ((i + 1) in groupset) + printf(" ") + } + } else { + for (i = 1; i in groupset; i++) { + printf("%u", groupset[i]) + if ((i + 1) in groupset) + printf(" ") + } + } + print "" # final newline + exit 0 + } + else if (egid_only) { + id = real_ids_only ? gid : egid + if (names_not_groups) { + entry = getgrgid(id) + name = get_first_field(entry) + printf("%s\n", name) + } else { + printf("%u\n", id) + } + + exit 0 + } + else if (euid_only) { + id = real_ids_only ? uid : euid + if (names_not_groups) { + entry = getpwuid(id) + name = get_first_field(entry) + printf("%s\n", name) + } else { + printf("%u\n", id) + } + + exit 0 + } printf("uid=%d", uid) pw = getpwuid(uid) - pr_first_field(pw) - - if (euid != uid) { + print_first_field(pw) + if (euid != uid && ! real_ids_only) { printf(" euid=%d", euid) pw = getpwuid(euid) - pr_first_field(pw) + print_first_field(pw) } - printf(" gid=%d", gid) pw = getgrgid(gid) - pr_first_field(pw) + print_first_field(pw) - if (egid != gid) { + if (egid != gid && ! real_ids_only) { printf(" egid=%d", egid) pw = getgrgid(egid) - pr_first_field(pw) + print_first_field(pw) } - - for (i = 1; ("group" i) in PROCINFO; i++) { + for (i = 1; i in groupset; i++) { if (i == 1) printf(" groups=") - group = PROCINFO["group" i] + group = groupset[i] printf("%d", group) pw = getgrgid(group) - pr_first_field(pw) - if (("group" (i+1)) in PROCINFO) + print_first_field(pw) + if ((i + 1) in groupset) printf(",") } print "" } - -function pr_first_field(str, a) +function get_first_field(str, a) { if (str != "") { split(str, a, ":") - printf("(%s)", a[1]) + return a[1] + } +} +function print_first_field(str) +{ + first = get_first_field(str) + printf("(%s)", first) +} +function fill_info_for_user(user, + pwent, fields, groupnames, grent, groups, i) +{ + pwent = getpwnam(user) + if (pwent == "") { + printf("id: '%s': no such user\n", user) > "/dev/stderr" + exit 1 + } + + split(pwent, fields, ":") + uid = fields[3] + 0 + gid = fields[4] + 0 +ignore + +end ignore + groupnames = getgruser(user) + split(groupnames, groups, " ") + for (i = 1; i in groups; i++) { + grent = getgrnam(groups[i]) + split(grent, fields, ":") + groupset[i] = fields[3] + 0 } } -- cgit v1.2.3