b7d406befd72e57ce4689bc3cf900abb7d8b4386
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / sun_compat.c
1 /* Copyright (C) 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <pwd.h>
21 #include <grp.h>
22 #include <unistd.h>
23 #include <alloca.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 struct passwd * __getpwnam_r_sun (const char *name, struct passwd *pwbuf,
28       char *buf, size_t buflen)
29 {
30   struct passwd *bufp;
31   return (getpwnam_r (name, pwbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
32 }
33
34
35 struct passwd * __getpwuid_r_sun (uid_t uid, struct passwd *pwbuf, char *buf,
36      size_t buflen)
37 {
38   struct passwd *bufp;
39   return (getpwuid_r (uid, pwbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
40 }
41
42
43 struct passwd * __getpwent_r_sun (struct passwd *pwbuf, char *buf, size_t buflen)
44 {
45   struct passwd *bufp;
46   return (getpwent_r (pwbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
47 }
48
49
50 struct passwd * __fgetpwent_r_sun (FILE *fp, struct passwd *pwbuf, char *buf,
51       size_t buflen)
52 {
53   struct passwd *bufp;
54   return (fgetpwent_r (fp, pwbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
55 }
56
57
58 struct group * __getgrnam_r_sun (const char *name, struct group *gbuf,
59       char *buf, size_t buflen)
60 {
61   struct group *bufp;
62   return (getgrnam_r (name, gbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
63 }
64
65
66 struct group * __getgrgid_r_sun (gid_t gid, struct group *gbuf, char *buf,
67       size_t buflen)
68 {
69   struct group *bufp;
70   return (getgrgid_r (gid, gbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
71 }
72
73
74 struct group * __getgrent_r_sun (struct group *gbuf, char *buf, size_t buflen)
75 {
76   struct group *bufp;
77   return (getgrent_r (gbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
78 }
79
80
81 struct group * __fgetgrent_r_sun (FILE *fp, struct group *gbuf, char *buf,
82       size_t buflen)
83 {
84   struct group *bufp;
85   return (fgetgrent_r (fp, gbuf, buf, buflen, &bufp) == 0) ? bufp : NULL;
86 }
87
88
89 int __getopt_sun (int argc, char * const argv[], const char *optstring)
90 {
91   size_t len = strlen (optstring) + 2;
92   int use_alloca = __libc_use_alloca (len);
93   char *optstr;
94   if (use_alloca)
95     optstr = alloca (len);
96   else
97     {
98       optstr = malloc (len);
99       if (!optstr)
100         return -1;
101     }
102
103   optstr[0] = '+';
104   memcpy (optstr + 1, optstring, len - 1);
105
106   int res = getopt (argc, argv, optstr);
107
108   if (!use_alloca)
109     free (optstr);
110
111   return res;
112 }