diff options
Diffstat (limited to 'nss')
-rw-r--r-- | nss/getXXbyYY_r.c | 34 | ||||
-rw-r--r-- | nss/getXXent_r.c | 88 | ||||
-rw-r--r-- | nss/nss_files/files-XXX.c | 60 | ||||
-rw-r--r-- | nss/nss_files/files-netgrp.c | 114 | ||||
-rw-r--r-- | nss/nss_files/files-parse.c | 34 | ||||
-rw-r--r-- | nss/nss_files/files-spwd.c | 3 | ||||
-rw-r--r-- | nss/nsswitch.c | 34 |
7 files changed, 203 insertions, 164 deletions
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index d85169ab81..1295772819 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "nsswitch.h" diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index 1d06a9477a..52e2136dd8 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <libc-lock.h> @@ -48,17 +48,17 @@ Boston, MA 02111-1307, USA. */ /* To make the real sources a bit prettier. */ #define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME) -#define APPEND_R(name) APPEND_R1 (name) -#define APPEND_R1(name) name##_r -#define INTERNAL(name) INTERNAL1 (name) -#define INTERNAL1(name) __##name +#define APPEND_R(Name) CONCAT2_2 (Name, _r) +#define INTERNAL(Name) CONCAT2_2 (__, Name) +#define CONCAT2_1(Pre, Post) CONCAT2_2 (Pre, Post) +#define CONCAT2_2(Pre, Post) Pre##Post #define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME) #define GETFUNC_NAME_STRING STRINGIZE (REENTRANT_GETNAME) #define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME) #define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME) -#define STRINGIZE(name) STRINGIZE1 (name) -#define STRINGIZE1(name) #name +#define STRINGIZE(Name) STRINGIZE1 (Name) +#define STRINGIZE1(Name) #Name #define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup) #define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post) @@ -74,9 +74,13 @@ Boston, MA 02111-1307, USA. */ #endif /* Some databases take the `stayopen' flag. */ -#ifndef STAYOPEN -#define STAYOPEN void -#define STAYOPEN_VAR +#ifdef STAYOPEN +# define STAYOPEN_TMP CONCAT2_1 (STAYOPEN, _tmp) +# define STAYOPEN_TMPVAR CONCAT2_1 (STAYOPEN_VAR, _tmp) +#else +# define STAYOPEN void +# define STAYOPEN_VAR +# define STAYOPEN_TMPVAR #endif /* Prototype for the setXXXent functions we use here. */ @@ -95,6 +99,13 @@ static service_user *nip; /* Remember the first service_entry, it's always the same. */ static service_user *startp; +#ifdef STAYOPEN_TMP +/* We need to remember the last `stayopen' flag given by the user + since the `setent' function is only called for the first available + service. */ +static STAYOPEN_TMP; +#endif + /* Protect above variable against multiple uses at the same time. */ __libc_lock_define_initialized (static, lock) @@ -143,15 +154,21 @@ SETFUNC_NAME (STAYOPEN) __libc_lock_lock (lock); - /* Cycle through all the services and run their setXXent functions. */ + /* Cycle through the services and run their `setXXent' functions until + we find an available service. */ no_more = setup ((void **) &fct, SETFUNC_NAME_STRING, 1); while (! no_more) { - /* Ignore status, we force check in __NSS_NEXT. */ - (void) (*fct) (STAYOPEN_VAR); + enum nss_status status = (*fct) (STAYOPEN_VAR); - no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, 0, 1); + no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, + status, 1); } + nip = NULL; + +#ifdef STAYOPEN_TMP + STAYOPEN_TMPVAR = STAYOPEN_VAR; +#endif __libc_lock_unlock (lock); } @@ -182,6 +199,7 @@ ENDFUNC_NAME (void) no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1); } + nip = NULL; __libc_lock_unlock (lock); } @@ -214,10 +232,26 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, no_more = setup ((void **) &fct, GETFUNC_NAME_STRING, 0); while (! no_more) { + service_user *current_nip = nip; + status = (*fct) (resbuf, buffer, buflen H_ERRNO_VAR); no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct, status, 0); + + if (! no_more && current_nip != nip) + /* Call the `setXXent' function. This wasn't done before. */ + do + { + set_function *sfct; + + no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING, + (void **) &sfct); + + if (! no_more) + status = (*sfct) (STAYOPEN_TMPVAR); + } + while (! no_more && status != NSS_STATUS_SUCCESS); } __libc_lock_unlock (lock); diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 404a9f9750..b6702b0366 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -1,21 +1,21 @@ /* Common code for file-based databases in nss_files module. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <stdio.h> #include <ctype.h> @@ -54,6 +54,8 @@ __libc_lock_define_initialized (static, lock) /* Maintenance of the shared stream open on the database file. */ static FILE *stream; +static fpos_t position; +static enum { none, getent, getby } last_use; static int keep_stream; /* Open database file if not already opened. */ @@ -90,6 +92,15 @@ CONCAT(_nss_files_set,ENTNAME) (int stayopen) status = internal_setent (stayopen); + if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) + { + fclose (stream); + stream = NULL; + status = NSS_STATUS_UNAVAIL; + } + + last_use = getent; + __libc_lock_unlock (lock); return status; @@ -182,11 +193,25 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, int buflen H_ERRNO_PROTO) { /* Return next entry in host file. */ - int status; + int status = NSS_STATUS_SUCCESS; __libc_lock_lock (lock); - status = internal_getent (result, buffer, buflen H_ERRNO_ARG); + /* If the last use was not by the getent function we need the + position the stream. */ + if (last_use != getent) + if (fsetpos (stream, &position) < 0) + status = NSS_STATUS_UNAVAIL; + else + last_use = getent; + + if (status == NSS_STATUS_SUCCESS) + { + status = internal_getent (result, buffer, buflen H_ERRNO_ARG); + + /* Remember this position. */ + fgetpos (stream, &position); + } __libc_lock_unlock (lock); @@ -218,6 +243,9 @@ _nss_files_get##name##_r (proto, \ /* Reset file pointer to beginning or open file. */ \ internal_setent (keep_stream); \ \ + /* Tell getent function that we have repositioned the file pointer. */ \ + last_use = getby; \ + \ while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \ == NSS_STATUS_SUCCESS) \ { break_if_match } \ diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c index 427c6bfe8d..5f8b9398d8 100644 --- a/nss/nss_files/files-netgrp.c +++ b/nss/nss_files/files-netgrp.c @@ -1,26 +1,25 @@ /* Netgroup file parser in nss_files modules. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <ctype.h> #include <errno.h> -#include <libc-lock.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> @@ -31,39 +30,27 @@ Boston, MA 02111-1307, USA. */ #define DATAFILE "/etc/netgroup" -/* Locks the static variables in this file. */ -__libc_lock_define_initialized (static, lock) - -/* We share a single place where we store the data for the current - netgroup. This buffer is allocated by `setnetgrent' and freed on - the next call of this function or when calling `endnetgrent'. */ -static char *data; -static size_t data_size; -static char *cursor; -static int first; - - #define EXPAND(needed) \ do \ { \ - size_t old_cursor = cursor - data; \ + size_t old_cursor = result->cursor - result->data; \ \ - data_size += 512 > 2 * needed ? 512 : 2 * needed; \ - data = realloc (data, data_size); \ + result->data_size += 512 > 2 * needed ? 512 : 2 * needed; \ + result->data = realloc (result->data, result->data_size); \ \ - if (data == NULL) \ + if (result->data == NULL) \ { \ status = NSS_STATUS_UNAVAIL; \ goto the_end; \ } \ \ - cursor = data + old_cursor; \ + result->cursor = result->data + old_cursor; \ } \ while (0) enum nss_status -_nss_files_setnetgrent (const char *group) +_nss_files_setnetgrent (const char *group, struct __netgrent *result) { FILE *fp; enum nss_status status; @@ -71,8 +58,6 @@ _nss_files_setnetgrent (const char *group) if (group[0] == '\0') return NSS_STATUS_UNAVAIL; - __libc_lock_lock (lock); - /* Find the netgroups file and open it. */ fp = fopen (DATAFILE, "r"); if (fp == NULL) @@ -86,7 +71,7 @@ _nss_files_setnetgrent (const char *group) const ssize_t group_len = strlen (group); status = NSS_STATUS_NOTFOUND; - cursor = data; + result->cursor = result->data; while (!feof (fp)) { @@ -108,8 +93,9 @@ _nss_files_setnetgrent (const char *group) { /* Store the data from the first line. */ EXPAND (curlen - group_len); - memcpy (cursor, &line[group_len + 1], curlen - group_len); - cursor += (curlen - group_len) - 1; + memcpy (result->cursor, &line[group_len + 1], + curlen - group_len); + result->cursor += (curlen - group_len) - 1; } while (line[curlen - 1] == '\n' && line[curlen - 2] == '\\') @@ -117,7 +103,7 @@ _nss_files_setnetgrent (const char *group) /* Yes, we have a continuation line. */ if (found) /* Remove these characters from the stored line. */ - cursor -= 2; + result->cursor -= 2; /* Get netxt line. */ curlen = getline (&line, &line_len, fp); @@ -130,11 +116,11 @@ _nss_files_setnetgrent (const char *group) EXPAND (1 + curlen + 1); /* Add separator in case next line starts immediately. */ - *cursor++ = ' '; + *result->cursor++ = ' '; /* Copy new line. */ - memcpy (cursor, line, curlen + 1); - cursor += curlen; + memcpy (result->cursor, line, curlen + 1); + result->cursor += curlen; } } @@ -142,8 +128,8 @@ _nss_files_setnetgrent (const char *group) { /* Now we have read the line. */ status = NSS_STATUS_SUCCESS; - cursor = data; - first = 1; + result->cursor = result->data; + result->first = 1; break; } } @@ -154,33 +140,27 @@ _nss_files_setnetgrent (const char *group) fclose (fp); } - __libc_lock_unlock (lock); - return status; } int -_nss_files_endnetgrent (void) +_nss_files_endnetgrent (struct __netgrent *result) { - __libc_lock_lock (lock); - /* Free allocated memory for data if some is present. */ - if (data != NULL) + if (result->data != NULL) { - free (data); - data = NULL; - data_size = 0; - cursor = NULL; + free (result->data); + result->data = NULL; + result->data_size = 0; + result->cursor = NULL; } - __libc_lock_unlock (lock); - return NSS_STATUS_SUCCESS; } -enum nss_status +static enum nss_status _nss_netgroup_parseline (char **cursor, struct __netgrent *result, char *buffer, int buflen) { @@ -216,31 +196,31 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result, if (! last) ++cp; *cursor = cp; - first = 0; + result->first = 0; return NSS_STATUS_SUCCESS; } - return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; + return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; } /* Match host name. */ host = ++cp; while (*cp != ',') if (*cp++ == '\0') - return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; + return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; /* Match user name. */ user = ++cp; while (*cp != ',') if (*cp++ == '\0') - return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; + return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; /* Match domain name. */ domain = ++cp; while (*cp != ')') if (*cp++ == '\0') - return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; + return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; ++cp; @@ -271,7 +251,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result, /* Rememember where we stopped reading. */ *cursor = cp; - first = 0; + result->first = 0; } return status; @@ -283,11 +263,7 @@ _nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen) { enum nss_status status; - __libc_lock_lock (lock); - - status = _nss_netgroup_parseline (&cursor, result, buffer, buflen); - - __libc_lock_unlock (lock); + status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen); return status; } diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c index 6bebfa287c..1250bb9572 100644 --- a/nss/nss_files/files-parse.c +++ b/nss/nss_files/files-parse.c @@ -1,21 +1,21 @@ /* Common code for file-based database parsers in nss_files module. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <ctype.h> #include <errno.h> diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c index df0106bdd6..27cc5882a4 100644 --- a/nss/nss_files/files-spwd.c +++ b/nss/nss_files/files-spwd.c @@ -32,6 +32,7 @@ struct spent_data {}; DB_LOOKUP (spnam, 1 + strlen (name), (".%s", name), { - if (! strcmp (name, result->sp_namp)) + if (name[0] != '+' && name[0] != '-' + && ! strcmp (name, result->sp_namp)) break; }, const char *name) diff --git a/nss/nsswitch.c b/nss/nsswitch.c index 9f27ef80ff..8ce1e8d122 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <ctype.h> #include <dlfcn.h> |