aboutsummaryrefslogtreecommitdiffstats
path: root/awklib/eg/prog
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2020-09-11 11:45:49 +0300
committerArnold D. Robbins <arnold@skeeve.com>2020-09-11 11:45:49 +0300
commit2f2803957202a42b7dbfc00c62affe23b5c70d76 (patch)
tree72fb2e9f211df6fe4b8e43d3aeec48515c8a342c /awklib/eg/prog
parenta9440d51fdf9286dc657b10368503aecb74eb19d (diff)
downloadegawk-2f2803957202a42b7dbfc00c62affe23b5c70d76.tar.gz
egawk-2f2803957202a42b7dbfc00c62affe23b5c70d76.tar.bz2
egawk-2f2803957202a42b7dbfc00c62affe23b5c70d76.zip
Update id program to POSIX.
Diffstat (limited to 'awklib/eg/prog')
-rw-r--r--awklib/eg/prog/id.awk154
1 files changed, 133 insertions, 21 deletions
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
}
}