3 * NSS walking template for nss_nonlocal proxy
5 * Copyright © 2011 Anders Kaseorg <andersk@mit.edu> and Tim Abbott
8 * This file is part of nss_nonlocal.
10 * nss_nonlocal is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public License
12 * as published by the Free Software Foundation; either version 2.1 of
13 * the License, or (at your option) any later version.
15 * nss_nonlocal is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with nss_nonlocal; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
27 static service_user *startp = NULL;
28 static void *fct_start = NULL;
35 int old_errno = errno;
37 if (fct_start == NULL &&
38 w.lookup(&startp, w.fct_name, &fct_start) != 0) {
39 *w.status = NSS_STATUS_UNAVAIL;
47 *w.buf = malloc(*w.buflen);
50 *w.status = NSS_STATUS_TRYAGAIN;
59 *w.status = NSS_STATUS_UNAVAIL;
60 else if (self != NULL && fct.l == self)
61 *w.status = NSS_STATUS_NOTFOUND;
63 *w.status = DL_CALL_FCT(fct.l, args);
64 if (*w.status == NSS_STATUS_TRYAGAIN &&
65 w.errnop != NULL && *w.errnop == ERANGE) {
70 *w.buf = malloc(*w.buflen);
76 goto walk_nss_morebuf;
78 } while (__nss_next(&nip, w.fct_name, &fct.ptr, *w.status, 0) == 0);
80 if (w.buf != NULL && *w.status != NSS_STATUS_SUCCESS) {