aboutsummaryrefslogtreecommitdiff
path: root/nss/nss_db/db-open.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-01-04 17:51:12 +0000
committerUlrich Drepper <drepper@redhat.com>2000-01-04 17:51:12 +0000
commitcbc85992cd683cbadbf2ed2011cad1ee04aa42b5 (patch)
tree9a09d928fbaa199a801ae58cc0063c89bd0af0ef /nss/nss_db/db-open.c
parent52354636d3ba63e3467c9062f6ddbaf5138f0229 (diff)
downloadglibc-cbc85992cd683cbadbf2ed2011cad1ee04aa42b5.zip
glibc-cbc85992cd683cbadbf2ed2011cad1ee04aa42b5.tar.gz
glibc-cbc85992cd683cbadbf2ed2011cad1ee04aa42b5.tar.bz2
Update.
2000-01-04 Andreas Jaeger <aj@suse.de> * nss/nss_db/dummy-db.h (struct db24): Add missing field flags. (struct db27): Add missing fields byteswapped, join and flags; remove wrong member handleq. (struct dbc27): Correct lock field. * nss/makedb.c: Remove __P. 2000-01-04 Andreas Jaeger <aj@suse.de> * nss/nss_db/db-open.c (internal_setent): Check for db_open for success, fix a memory leak and clean up function. 2000-01-04 Ulrich Drepper <drepper@cygnus.com> * Makefile (install): Pass $(install_root) to ldconfig. Patch by Akira YOSHIYAMA <yosshy@tkf.att.ne.jp>. 2000-01-03 Jakub Jelinek <jakub@redhat.com> * soft-fp/op-1.h: Fix division for machines using not normalizing version of udiv_qrnnd in longlong.h. * soft-fp/sysdeps/mips/sfp-machine.h: Likewise. * soft-fp/sysdeps/mips/mips64/sfp-machine.h: Likewise. * soft-fp/sysdeps/sparc/sparc64/sfp-machine.h: Likewise. Patch by Eddie C. Dost <ecd@skynet.be>. * soft-fp/soft-fp.h (QItype, UQItype): New types used by longlong.h. 2000-01-03 Andreas Schwab <schwab@suse.de> * sysdeps/generic/dl-sysdep.c: Initialize __libc_multiple_libcs, needed for change in common symbol handing in newer binutils.
Diffstat (limited to 'nss/nss_db/db-open.c')
-rw-r--r--nss/nss_db/db-open.c111
1 files changed, 54 insertions, 57 deletions
diff --git a/nss/nss_db/db-open.c b/nss/nss_db/db-open.c
index c3a0679..75d39ef 100644
--- a/nss/nss_db/db-open.c
+++ b/nss/nss_db/db-open.c
@@ -118,6 +118,9 @@ internal_setent (const char *file, NSS_DB **dbp)
enum nss_status status = NSS_STATUS_SUCCESS;
int err;
void *db;
+ int fd;
+ int result;
+
if (*dbp == NULL)
{
@@ -138,77 +141,71 @@ internal_setent (const char *file, NSS_DB **dbp)
err = DL_CALL_FCT (libdb_db_open,
(file, DB_BTREE, DB_RDONLY, 0, NULL, NULL, &db));
+ if (err != 0)
+ {
+ __set_errno (err);
+ *dbp = NULL;
+ return err == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
+ }
+
/* Construct the object we pass up. */
*dbp = (NSS_DB *) malloc (sizeof (NSS_DB));
- if (*dbp != NULL)
+ if (*dbp == NULL)
+ return NSS_STATUS_UNAVAIL;
+
+ (*dbp)->db = db;
+
+ /* The functions are at different positions for the different
+ versions. Sigh. */
+ switch (libdb_version)
{
- (*dbp)->db = db;
-
- /* The functions are at different positions for the different
- versions. Sigh. */
- switch (libdb_version)
- {
- case db24:
- (*dbp)->close =
- (int (*) (void *, uint32_t)) ((struct db24 *) db)->close;
- (*dbp)->fd =
- (int (*) (void *, int *)) ((struct db24 *) db)->fd;
- (*dbp)->get =
- (int (*) (void *, void *, void *, void *, uint32_t))
- ((struct db24 *) db)->get;
- break;
- case db27:
- (*dbp)->close =
- (int (*) (void *, uint32_t)) ((struct db27 *) db)->close;
- (*dbp)->fd =
- (int (*) (void *, int *)) ((struct db27 *) db)->fd;
- (*dbp)->get =
- (int (*) (void *, void *, void *, void *, uint32_t))
- ((struct db27 *) db)->get;
- break;
- default:
- abort ();
- }
+ case db24:
+ (*dbp)->close =
+ (int (*) (void *, uint32_t)) ((struct db24 *) db)->close;
+ (*dbp)->fd =
+ (int (*) (void *, int *)) ((struct db24 *) db)->fd;
+ (*dbp)->get =
+ (int (*) (void *, void *, void *, void *, uint32_t))
+ ((struct db24 *) db)->get;
+ break;
+ case db27:
+ (*dbp)->close =
+ (int (*) (void *, uint32_t)) ((struct db27 *) db)->close;
+ (*dbp)->fd =
+ (int (*) (void *, int *)) ((struct db27 *) db)->fd;
+ (*dbp)->get =
+ (int (*) (void *, void *, void *, void *, uint32_t))
+ ((struct db27 *) db)->get;
+ break;
+ default:
+ abort ();
}
+ /* We have to make sure the file is `closed on exec'. */
+ err = DL_CALL_FCT ((*dbp)->fd, (db, &fd));
if (err != 0)
{
__set_errno (err);
- *dbp = NULL;
- status = err == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
+ result = -1;
}
else
{
- /* We have to make sure the file is `closed on exec'. */
- int fd;
- int result;
-
- err = DL_CALL_FCT ((*dbp)->fd, (db, &fd));
- if (err != 0)
- {
- __set_errno (err);
- result = -1;
- }
- else
- {
- int flags = result = fcntl (fd, F_GETFD, 0);
+ int flags = result = fcntl (fd, F_GETFD, 0);
- if (result >= 0)
- {
- flags |= FD_CLOEXEC;
- result = fcntl (fd, F_SETFD, flags);
- }
- }
- if (result < 0)
+ if (result >= 0)
{
- /* Something went wrong. Close the stream and return a
- failure. */
- DL_CALL_FCT ((*dbp)->close, (db, 0));
- status = NSS_STATUS_UNAVAIL;
+ flags |= FD_CLOEXEC;
+ result = fcntl (fd, F_SETFD, flags);
}
-
- if (result < 0)
- *dbp = NULL;
+ }
+ if (result < 0)
+ {
+ /* Something went wrong. Close the stream and return a
+ failure. */
+ DL_CALL_FCT ((*dbp)->close, (db, 0));
+ status = NSS_STATUS_UNAVAIL;
+ free (*dbp);
+ *dbp = NULL;
}
}