xref: /openbsd-src/gnu/usr.bin/cvs/windows-NT/pwd.c (revision e77048c1007676349fedef3cd7d0b6b93f74c675)
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