summaryrefslogtreecommitdiff
path: root/sys/src/ape/cmd/pax/names.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/cmd/pax/names.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/pax/names.c')
-rwxr-xr-xsys/src/ape/cmd/pax/names.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/pax/names.c b/sys/src/ape/cmd/pax/names.c
new file mode 100755
index 000000000..34ff1d8d6
--- /dev/null
+++ b/sys/src/ape/cmd/pax/names.c
@@ -0,0 +1,254 @@
+/* $Source: /u/mark/src/pax/RCS/names.c,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * names.c - Look up user and/or group names.
+ *
+ * DESCRIPTION
+ *
+ * These functions support UID and GID name lookup. The results are
+ * cached to improve performance.
+ *
+ * AUTHOR
+ *
+ * Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
+ *
+ * Sponsored by The USENIX Association for public distribution.
+ *
+ * Copyright (c) 1989 Mark H. Colburn.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice is duplicated in all such
+ * forms and that any documentation, advertising materials, and other
+ * materials related to such distribution and use acknowledge that the
+ * software was developed * by Mark H. Colburn and sponsored by The
+ * USENIX Association.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Log: names.c,v $
+ * Revision 1.2 89/02/12 10:05:05 mark
+ * 1.2 release fixes
+ *
+ * Revision 1.1 88/12/23 18:02:19 mark
+ * Initial revision
+ *
+ */
+
+#ifndef lint
+static char *ident = "$Id: names.c,v 1.2 89/02/12 10:05:05 mark Exp $";
+static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
+#endif /* ! lint */
+
+
+/* Headers */
+
+#include "pax.h"
+
+
+/* Defines */
+
+#define myuid ( my_uid < 0? (my_uid = getuid()): my_uid )
+#define mygid ( my_gid < 0? (my_gid = getgid()): my_gid )
+
+
+/* Internal Identifiers */
+
+static int saveuid = -993;
+static char saveuname[TUNMLEN];
+static int my_uid = -993;
+
+static int savegid = -993;
+static char savegname[TGNMLEN];
+static int my_gid = -993;
+
+
+/* finduname - find a user or group name from a uid or gid
+ *
+ * DESCRIPTION
+ *
+ * Look up a user name from a uid/gid, maintaining a cache.
+ *
+ * PARAMETERS
+ *
+ * char uname[] - name (to be returned to user)
+ * int uuid - id of name to find
+ *
+ *
+ * RETURNS
+ *
+ * Returns a name which is associated with the user id given. If there
+ * is not name which corresponds to the user-id given, then a pointer
+ * to a string of zero length is returned.
+ *
+ * FIXME
+ *
+ * 1. for now it's a one-entry cache.
+ * 2. The "-993" is to reduce the chance of a hit on the first lookup.
+ */
+
+#ifdef __STDC__
+
+char *finduname(int uuid)
+
+#else
+
+char *finduname(uuid)
+int uuid;
+
+#endif
+{
+ struct passwd *pw;
+
+ if (uuid != saveuid) {
+ saveuid = uuid;
+ saveuname[0] = '\0';
+ pw = getpwuid(uuid);
+ if (pw) {
+ strncpy(saveuname, pw->pw_name, TUNMLEN);
+ }
+ }
+ return(saveuname);
+}
+
+
+/* finduid - get the uid for a given user name
+ *
+ * DESCRIPTION
+ *
+ * This does just the opposit of finduname. Given a user name it
+ * finds the corresponding UID for that name.
+ *
+ * PARAMETERS
+ *
+ * char uname[] - username to find a UID for
+ *
+ * RETURNS
+ *
+ * The UID which corresponds to the uname given, if any. If no UID
+ * could be found, then the UID which corrsponds the user running the
+ * program is returned.
+ *
+ */
+
+#ifdef __STDC__
+
+int finduid(char *uname)
+
+#else
+
+int finduid(uname)
+char *uname;
+
+#endif
+{
+ struct passwd *pw;
+ extern struct passwd *getpwnam();
+
+ if (uname[0] != saveuname[0]/* Quick test w/o proc call */
+ ||0 != strncmp(uname, saveuname, TUNMLEN)) {
+ strncpy(saveuname, uname, TUNMLEN);
+ pw = getpwnam(uname);
+ if (pw) {
+ saveuid = pw->pw_uid;
+ } else {
+ saveuid = myuid;
+ }
+ }
+ return (saveuid);
+}
+
+
+/* findgname - look up a group name from a gid
+ *
+ * DESCRIPTION
+ *
+ * Look up a group name from a gid, maintaining a cache.
+ *
+ *
+ * PARAMETERS
+ *
+ * int ggid - goupid of group to find
+ *
+ * RETURNS
+ *
+ * A string which is associated with the group ID given. If no name
+ * can be found, a string of zero length is returned.
+ */
+
+#ifdef __STDC__
+
+char *findgname(int ggid)
+
+#else
+
+char *findgname(ggid)
+int ggid;
+
+#endif
+{
+ struct group *gr;
+
+ if (ggid != savegid) {
+ savegid = ggid;
+ savegname[0] = '\0';
+#ifndef _POSIX_SOURCE
+ setgrent();
+#endif
+ gr = getgrgid(ggid);
+ if (gr) {
+ strncpy(savegname, gr->gr_name, TGNMLEN);
+ }
+ }
+ return(savegname);
+}
+
+
+
+/* findgid - get the gid for a given group name
+ *
+ * DESCRIPTION
+ *
+ * This does just the opposit of finduname. Given a group name it
+ * finds the corresponding GID for that name.
+ *
+ * PARAMETERS
+ *
+ * char uname[] - groupname to find a GID for
+ *
+ * RETURNS
+ *
+ * The GID which corresponds to the uname given, if any. If no GID
+ * could be found, then the GID which corrsponds the group running the
+ * program is returned.
+ *
+ */
+
+#ifdef __STDC__
+
+int findgid(char *gname)
+
+#else
+
+int findgid(gname)
+char *gname;
+
+#endif
+{
+ struct group *gr;
+
+ /* Quick test w/o proc call */
+ if (gname[0] != savegname[0] || strncmp(gname, savegname, TUNMLEN) != 0) {
+ strncpy(savegname, gname, TUNMLEN);
+ gr = getgrnam(gname);
+ if (gr) {
+ savegid = gr->gr_gid;
+ } else {
+ savegid = mygid;
+ }
+ }
+ return (savegid);
+}