import cvs 2:1.12.13+real-5 (see mircvs://src/gnu/usr.bin/cvs/ for VCS history)
[alioth/cvs.git] / windows-NT / pwd.c
1 /*  pwd.c - Try to approximate UN*X's getuser...() functions under MS-DOS.
2     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 1, or (at your option)
7     any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.  */
13
14 /* This 'implementation' is conjectured from the use of this functions in
15    the RCS and BASH distributions.  Of course these functions don't do too
16    much useful things under MS-DOS, but using them avoids many "#ifdef
17    MSDOS" in ported UN*X code ...  */
18
19 \f
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include "config.h"
24 #include "pwd.h"
25 #include "xalloc.h"
26
27 static char *lookup_env (char **);
28
29 /* where people might scribble their name into the environment ... */
30
31 static char *login_strings[] =
32 {
33   "LOGIN", "USER", "MAILNAME", "USERNAME", NULL
34 };
35
36 static char *group_strings[] =
37 {
38   "GROUP", NULL
39 };
40
41
42 static char *anonymous = "anonymous";   /* if all else fails ... */
43
44 static char *login = NULL;/* cache the names here       */
45 static char *group = NULL;
46
47 static struct passwd pw;        /* should we return a malloc()'d structure   */
48 static struct group gr;         /* instead of pointers to static structures? */
49
50 /* implement limited uid behavior */
51 #define my_fake_uid ((const uid_t) 4545)
52 #define my_fake_gid my_fake_uid
53
54 /* return something like a username in a (butchered!) passwd structure. */
55 struct passwd *
56 getpwuid (int uid)
57 {
58   pw.pw_name = getlogin ();
59   pw.pw_dir = woe32_home_dir ();
60   pw.pw_shell = woe32_shell ();
61   pw.pw_uid = 0;
62
63   return &pw;
64 }
65
66 struct passwd *
67 getpwnam (const char *name)
68 {
69   return NULL;
70 }
71
72 /* return something like a groupname in a (butchered!) group structure. */
73 struct group *
74 getgrgid (int uid)
75 {
76   gr.gr_name = getgr_name ();
77   gr.gr_gid = 0;
78
79   return &gr;
80 }
81
82 struct group *
83 getgrnam (const char *name)
84 {
85   return NULL;
86 }
87
88 /* return something like a username. */
89 char *
90 getlogin (void)
91 {
92   /* This is how a windows user would override their login name. */
93   if (!login)
94     login = lookup_env (login_strings);
95
96   /* In the absence of user override, ask the operating system. */
97   if (!login)
98      login = woe32_getlogin ();
99
100   /* If all else fails, fall back on Old Faithful. */
101   if (!login)
102     login = anonymous;
103
104   return login;
105 }
106
107 /* return something like a group.  */
108 char *
109 getgr_name (void)
110 {
111   if (!group)                   /* have we been called before? */
112     group = lookup_env (group_strings);
113
114   if (!group)                   /* have we been successful? */
115     group = anonymous;
116
117   return group;
118 }
119
120 /* return something like a uid.  */
121 uid_t
122 getuid (void)
123 {
124   return my_fake_uid;
125 }
126
127 gid_t
128 getgid (void)
129 {
130   return my_fake_gid;
131 }
132
133 uid_t
134 geteuid (void)
135 {
136   return my_fake_uid;
137 }
138
139 gid_t
140 getegid (void)
141 {
142   return my_fake_gid;
143 }
144
145 struct passwd *
146 getpwent (void)
147 {
148   return NULL;
149 }
150
151 void
152 setpwent (void)
153 {
154 }
155
156 void
157 endpwent (void)
158 {
159 }
160
161 void
162 endgrent (void)
163 {
164 }
165
166 /* return groups.  */
167 int
168 getgroups (int ngroups, gid_t *groups)
169 {
170   if (ngroups > 0)
171       *groups = my_fake_gid;
172   return 1;
173 }
174
175 /* lookup environment.  */
176 static char *
177 lookup_env (char *table[])
178 {
179   char *ptr;
180   char *entry;
181   size_t len;
182
183   while (*table && !(ptr = getenv (*table++))) ;        /* scan table */
184
185   if (!ptr) return NULL;
186
187   len = strcspn (ptr, " \n\t\n\r");     /* any WS?        */
188   if (!(entry = xmalloc (len + 1)))
189     {
190       fprintf (stderr, "Out of memory.\nStop.");
191       exit (-1);
192     }
193
194   strncpy (entry, ptr, len);
195   entry[len] = '\0';
196
197   return entry;
198
199 }
200 \f
201 /*
202  * Local Variables:
203  * mode:C
204  * ChangeLog:ChangeLog
205  * compile-command:make
206  * End:
207  */