r25868: nss_wrapper: add solaris versions of getpwent_r and getgrent_r
authorStefan Metzmacher <metze@samba.org>
Tue, 6 Nov 2007 08:26:42 +0000 (09:26 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:44:33 +0000 (05:44 +0100)
metze

source/lib/nss_wrapper/nss_wrapper.c

index 1b75aa59e648aef357b7485b897c3081440001a4..72ddd8d5c328cb96455633fc0e3c94e7c4ef0197 100644 (file)
@@ -892,6 +892,36 @@ _PUBLIC_ struct passwd *nwrap_getpwent(void)
        return pw;
 }
 
+#ifdef SOLARIS_GETPWENT_R
+_PUBLIC_ struct passwd *nwrap_getpwent_r(struct passwd *pwdst,
+                                        char *buf,
+                                        int buflen)
+{
+       struct passwd *pw;
+       struct passwd *pwdstp = NULL;
+       int ret;
+
+       if (!nwrap_enabled()) {
+               return real_getpwent_r(pwdst, buf, buflen);
+       }
+
+       pw = nwrap_getpwent();
+       if (!pw) {
+               if (errno == 0) {
+                       errno = ENOENT;
+               }
+               return NULL;
+       }
+
+       ret = nwrap_pw_copy_r(pw, pwdst, buf, buflen, &pwdstp);
+       if (ret != 0) {
+               errno = ret;
+               return NULL;
+       }
+
+       return pwdstp;
+}
+#else
 _PUBLIC_ int nwrap_getpwent_r(struct passwd *pwdst, char *buf,
                              size_t buflen, struct passwd **pwdstp)
 {
@@ -911,6 +941,7 @@ _PUBLIC_ int nwrap_getpwent_r(struct passwd *pwdst, char *buf,
 
        return nwrap_pw_copy_r(pw, pwdst, buf, buflen, pwdstp);
 }
+#endif
 
 _PUBLIC_ void nwrap_endpwent(void)
 {
@@ -1064,6 +1095,36 @@ _PUBLIC_ struct group *nwrap_getgrent(void)
        return gr;
 }
 
+#ifdef SOLARIS_GETGRENT_R
+_PUBLIC_ struct group *nwrap_getgrent_r(struct group *grdst,
+                                       char *buf,
+                                       int buflen)
+{
+       struct group *gr;
+       struct group *grdstp = NULL;
+       int ret;
+
+       if (!nwrap_enabled()) {
+               return real_getgrent_r(grdst, buf, buflen);
+       }
+
+       gr = nwrap_getgrent();
+       if (!gr) {
+               if (errno == 0) {
+                       errno = ENOENT;
+               }
+               return NULL;
+       }
+
+       ret = nwrap_gr_copy_r(gr, grdst, buf, buflen, &grdstp);
+       if (ret != 0) {
+               errno = ret;
+               return NULL;
+       }
+
+       return grdstp;
+}
+#else
 _PUBLIC_ int nwrap_getgrent_r(struct group *grdst, char *buf,
                              size_t buflen, struct group **grdstp)
 {
@@ -1083,6 +1144,7 @@ _PUBLIC_ int nwrap_getgrent_r(struct group *grdst, char *buf,
 
        return nwrap_gr_copy_r(gr, grdst, buf, buflen, grdstp);
 }
+#endif
 
 _PUBLIC_ void nwrap_endgrent(void)
 {