11e72d8d2Sderaadt /* pwd.c - Try to approximate UN*X's getuser...() functions under MS-DOS.
21e72d8d2Sderaadt Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
31e72d8d2Sderaadt
41e72d8d2Sderaadt This program is free software; you can redistribute it and/or modify
51e72d8d2Sderaadt it under the terms of the GNU General Public License as published by
61e72d8d2Sderaadt the Free Software Foundation; either version 1, or (at your option)
71e72d8d2Sderaadt any later version.
81e72d8d2Sderaadt
91e72d8d2Sderaadt This program is distributed in the hope that it will be useful,
101e72d8d2Sderaadt but WITHOUT ANY WARRANTY; without even the implied warranty of
111e72d8d2Sderaadt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
122286d8edStholo GNU General Public License for more details. */
131e72d8d2Sderaadt
141e72d8d2Sderaadt /* This 'implementation' is conjectured from the use of this functions in
151e72d8d2Sderaadt the RCS and BASH distributions. Of course these functions don't do too
161e72d8d2Sderaadt much useful things under MS-DOS, but using them avoids many "#ifdef
171e72d8d2Sderaadt MSDOS" in ported UN*X code ... */
181e72d8d2Sderaadt
191e72d8d2Sderaadt
201e72d8d2Sderaadt #include <stdio.h>
211e72d8d2Sderaadt #include <stdlib.h>
221e72d8d2Sderaadt #include <string.h>
231e72d8d2Sderaadt #include <pwd.h>
241e72d8d2Sderaadt
251e72d8d2Sderaadt char* win32getlogin();
261e72d8d2Sderaadt static char *lookup_env (char **);
271e72d8d2Sderaadt
281e72d8d2Sderaadt /* where people might scribble their name into the environment ... */
291e72d8d2Sderaadt
301e72d8d2Sderaadt static char *login_strings[] =
311e72d8d2Sderaadt {
321e72d8d2Sderaadt "LOGIN", "USER", "MAILNAME", (char *) 0
331e72d8d2Sderaadt };
341e72d8d2Sderaadt
351e72d8d2Sderaadt static char *group_strings[] =
361e72d8d2Sderaadt {
371e72d8d2Sderaadt "GROUP", (char *) 0
381e72d8d2Sderaadt };
391e72d8d2Sderaadt
401e72d8d2Sderaadt
411e72d8d2Sderaadt static char *anonymous = "anonymous"; /* if all else fails ... */
421e72d8d2Sderaadt
431e72d8d2Sderaadt static char *home_dir = "."; /* we feel (no|every)where at home */
441e72d8d2Sderaadt static char *login_shell = "not command.com!";
451e72d8d2Sderaadt
461e72d8d2Sderaadt static char *login = (char *) 0;/* cache the names here */
471e72d8d2Sderaadt static char *group = (char *) 0;
481e72d8d2Sderaadt
491e72d8d2Sderaadt static struct passwd pw; /* should we return a malloc()'d structure */
501e72d8d2Sderaadt static struct group gr; /* instead of pointers to static structures? */
511e72d8d2Sderaadt
521e72d8d2Sderaadt /* return something like a username in a (butchered!) passwd structure. */
531e72d8d2Sderaadt struct passwd *
getpwuid(int uid)541e72d8d2Sderaadt getpwuid (int uid)
551e72d8d2Sderaadt {
561e72d8d2Sderaadt pw.pw_name = getlogin ();
571e72d8d2Sderaadt pw.pw_dir = home_dir;
581e72d8d2Sderaadt pw.pw_shell = login_shell;
591e72d8d2Sderaadt pw.pw_uid = 0;
601e72d8d2Sderaadt
611e72d8d2Sderaadt return &pw;
621e72d8d2Sderaadt }
631e72d8d2Sderaadt
641e72d8d2Sderaadt struct passwd *
getpwnam(char * name)651e72d8d2Sderaadt getpwnam (char *name)
661e72d8d2Sderaadt {
671e72d8d2Sderaadt return (struct passwd *) 0;
681e72d8d2Sderaadt }
691e72d8d2Sderaadt
701e72d8d2Sderaadt /* return something like a groupname in a (butchered!) group structure. */
711e72d8d2Sderaadt struct group *
getgrgid(int uid)721e72d8d2Sderaadt getgrgid (int uid)
731e72d8d2Sderaadt {
741e72d8d2Sderaadt gr.gr_name = getgr_name ();
751e72d8d2Sderaadt gr.gr_gid = 0;
761e72d8d2Sderaadt
771e72d8d2Sderaadt return &gr;
781e72d8d2Sderaadt }
791e72d8d2Sderaadt
801e72d8d2Sderaadt struct group *
getgrnam(char * name)811e72d8d2Sderaadt getgrnam (char *name)
821e72d8d2Sderaadt {
831e72d8d2Sderaadt return (struct group *) 0;
841e72d8d2Sderaadt }
851e72d8d2Sderaadt
861e72d8d2Sderaadt /* return something like a username. */
871e72d8d2Sderaadt char *
getlogin()881e72d8d2Sderaadt getlogin ()
891e72d8d2Sderaadt {
90*e77048c1Stholo /* This is how a windows user would override their login name. */
91*e77048c1Stholo if (!login)
92*e77048c1Stholo login = lookup_env (login_strings);
93*e77048c1Stholo
94*e77048c1Stholo /* In the absence of user override, ask the operating system. */
951e72d8d2Sderaadt if (!login)
961e72d8d2Sderaadt login = win32getlogin();
971e72d8d2Sderaadt
98*e77048c1Stholo /* If all else fails, fall back on Old Faithful. */
99*e77048c1Stholo if (!login)
1001e72d8d2Sderaadt login = anonymous;
1011e72d8d2Sderaadt
1021e72d8d2Sderaadt return login;
1031e72d8d2Sderaadt }
1041e72d8d2Sderaadt
1051e72d8d2Sderaadt /* return something like a group. */
1061e72d8d2Sderaadt char *
getgr_name()1071e72d8d2Sderaadt getgr_name ()
1081e72d8d2Sderaadt {
1091e72d8d2Sderaadt if (!group) /* have we been called before? */
1101e72d8d2Sderaadt group = lookup_env (group_strings);
1111e72d8d2Sderaadt
1121e72d8d2Sderaadt if (!group) /* have we been successful? */
1131e72d8d2Sderaadt group = anonymous;
1141e72d8d2Sderaadt
1151e72d8d2Sderaadt return group;
1161e72d8d2Sderaadt }
1171e72d8d2Sderaadt
1181e72d8d2Sderaadt /* return something like a uid. */
1191e72d8d2Sderaadt int
getuid()1201e72d8d2Sderaadt getuid ()
1211e72d8d2Sderaadt {
1221e72d8d2Sderaadt return 0; /* every user is a super user ... */
1231e72d8d2Sderaadt }
1241e72d8d2Sderaadt
1251e72d8d2Sderaadt int
getgid()1261e72d8d2Sderaadt getgid ()
1271e72d8d2Sderaadt {
1281e72d8d2Sderaadt return 0;
1291e72d8d2Sderaadt }
1301e72d8d2Sderaadt
1311e72d8d2Sderaadt int
geteuid()1321e72d8d2Sderaadt geteuid ()
1331e72d8d2Sderaadt {
1341e72d8d2Sderaadt return 0;
1351e72d8d2Sderaadt }
1361e72d8d2Sderaadt
1371e72d8d2Sderaadt int
getegid()1381e72d8d2Sderaadt getegid ()
1391e72d8d2Sderaadt {
1401e72d8d2Sderaadt return 0;
1411e72d8d2Sderaadt }
1421e72d8d2Sderaadt
1431e72d8d2Sderaadt struct passwd *
getpwent()1441e72d8d2Sderaadt getpwent ()
1451e72d8d2Sderaadt {
1461e72d8d2Sderaadt return (struct passwd *) 0;
1471e72d8d2Sderaadt }
1481e72d8d2Sderaadt
1491e72d8d2Sderaadt void
setpwent()1501e72d8d2Sderaadt setpwent ()
1511e72d8d2Sderaadt {
1521e72d8d2Sderaadt }
1531e72d8d2Sderaadt
1541e72d8d2Sderaadt void
endpwent()1551e72d8d2Sderaadt endpwent ()
1561e72d8d2Sderaadt {
1571e72d8d2Sderaadt }
1581e72d8d2Sderaadt
1591e72d8d2Sderaadt void
endgrent()1601e72d8d2Sderaadt endgrent ()
1611e72d8d2Sderaadt {
1621e72d8d2Sderaadt }
1631e72d8d2Sderaadt
1641e72d8d2Sderaadt /* return groups. */
1651e72d8d2Sderaadt int
getgroups(int ngroups,int * groups)1661e72d8d2Sderaadt getgroups (int ngroups, int *groups)
1671e72d8d2Sderaadt {
1681e72d8d2Sderaadt *groups = 0;
1691e72d8d2Sderaadt return 1;
1701e72d8d2Sderaadt }
1711e72d8d2Sderaadt
1721e72d8d2Sderaadt /* lookup environment. */
1731e72d8d2Sderaadt static char *
lookup_env(char * table[])1741e72d8d2Sderaadt lookup_env (char *table[])
1751e72d8d2Sderaadt {
1761e72d8d2Sderaadt char *ptr;
1771e72d8d2Sderaadt char *entry;
1781e72d8d2Sderaadt size_t len;
1791e72d8d2Sderaadt
1801e72d8d2Sderaadt while (*table && !(ptr = getenv (*table++))) ; /* scan table */
1811e72d8d2Sderaadt
1821e72d8d2Sderaadt if (!ptr)
1831e72d8d2Sderaadt return (char *) 0;
1841e72d8d2Sderaadt
1851e72d8d2Sderaadt len = strcspn (ptr, " \n\t\n\r"); /* any WS? */
1861e72d8d2Sderaadt if (!(entry = malloc (len + 1)))
1871e72d8d2Sderaadt {
1881e72d8d2Sderaadt fprintf (stderr, "Out of memory.\nStop.");
1891e72d8d2Sderaadt exit (-1);
1901e72d8d2Sderaadt }
1911e72d8d2Sderaadt
1921e72d8d2Sderaadt strncpy (entry, ptr, len);
1931e72d8d2Sderaadt entry[len] = '\0';
1941e72d8d2Sderaadt
1951e72d8d2Sderaadt return entry;
1961e72d8d2Sderaadt
1971e72d8d2Sderaadt }
1981e72d8d2Sderaadt
1991e72d8d2Sderaadt /*
2001e72d8d2Sderaadt * Local Variables:
2011e72d8d2Sderaadt * mode:C
2021e72d8d2Sderaadt * ChangeLog:ChangeLog
2031e72d8d2Sderaadt * compile-command:make
2041e72d8d2Sderaadt * End:
2051e72d8d2Sderaadt */
206