[PATCH] Port ndbm

Gedare Bloom gedare at rtems.org
Fri Jun 7 19:30:17 UTC 2019


I wouldn't send the patch, I would suggest you write an email to
discuss about how you are porting ndbm, and that the current version
relies on the search/hash functions, and that the interface has
changed a bit over time so inquire whether you should update
hash/search functions to newer versions.  This should reduce the
number of changes you have to make to the ndbm files to get them to
work.

On Fri, Jun 7, 2019 at 11:24 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>
> Sure! I will send the patch to newlib and ask them if they need updated set of files inside libc/search.
>
> On Fri, 7 Jun, 2019, 10:29 PM Gedare Bloom, <gedare at rtems.org> wrote:
>>
>> On Thu, Jun 6, 2019 at 8:02 PM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >
>> > Please review the code so that I can send it to newlib-devel.
>> >
>> > On Fri, Jun 7, 2019 at 7:22 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >>
>> >> ---
>> >>  newlib/libc/include/ndbm.h    |  86 ++++++++++++++
>> >>  newlib/libc/posix/Makefile.am |   4 +-
>> >>  newlib/libc/posix/ndbm.c      | 214 ++++++++++++++++++++++++++++++++++
>> >>  3 files changed, 302 insertions(+), 2 deletions(-)
>> >>  create mode 100644 newlib/libc/include/ndbm.h
>> >>  create mode 100644 newlib/libc/posix/ndbm.c
>> >>
>> >> diff --git a/newlib/libc/include/ndbm.h b/newlib/libc/include/ndbm.h
>> >> new file mode 100644
>> >> index 000000000..1fd5e5198
>> >> --- /dev/null
>> >> +++ b/newlib/libc/include/ndbm.h
>> >> @@ -0,0 +1,86 @@
>> >> +/*-
>> >> + * SPDX-License-Identifier: BSD-3-Clause
>> >> + *
>> >> + * Copyright (c) 1990, 1993
>> >> + *     The Regents of the University of California.  All rights reserved.
>> >> + *
>> >> + * This code is derived from software contributed to Berkeley by
>> >> + * Margo Seltzer.
>> >> + *
>> >> + * Redistribution and use in source and binary forms, with or without
>> >> + * modification, are permitted provided that the following conditions
>> >> + * are met:
>> >> + * 1. Redistributions of source code must retain the above copyright
>> >> + *    notice, this list of conditions and the following disclaimer.
>> >> + * 2. Redistributions in binary form must reproduce the above copyright
>> >> + *    notice, this list of conditions and the following disclaimer in the
>> >> + *    documentation and/or other materials provided with the distribution.
>> >> + * 3. Neither the name of the University nor the names of its contributors
>> >> + *    may be used to endorse or promote products derived from this software
>> >> + *    without specific prior written permission.
>> >> + *
>> >> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
>> >> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>> >> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>> >> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
>> >> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>> >> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>> >> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
>> >> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
>> >> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
>> >> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>> >> + * SUCH DAMAGE.
>> >> + *
>> >> + *     @(#)ndbm.h      8.1 (Berkeley) 6/2/93
>> >> + * $FreeBSD$
>> >> + */
>> >> +
>> >> +#ifndef _NDBM_H_
>> >> +#define        _NDBM_H_
>> >> +
>> >> +#ifndef __DBINTERFACE_PRIVATE
>> >> +#define __DBINTERFACE_PRIVATE
>> >> +#endif
>> >
>> > Included the above lines in ndbm.h, since     __hash_open     was under conditional compilation in db_local.h . Line 211 (https://github.com/VARoDeK/newlib/blob/master/newlib/libc/search/db_local.h ).
>> >>
>> >> +
>> >> +#include <db_local.h>
>> >> +
>> >> +/* Map dbm interface onto db(3). */
>> >> +#define DBM_RDONLY     O_RDONLY
>> >> +
>> >> +/* Flags to dbm_store(). */
>> >> +#define DBM_INSERT      0
>> >> +#define DBM_REPLACE     1
>> >> +
>> >> +/*
>> >> + * The db(3) support for ndbm always appends this suffix to the
>> >> + * file name to avoid overwriting the user's original database.
>> >> + */
>> >> +#define        DBM_SUFFIX      ".db"
>> >> +
>> >> +typedef struct {
>> >> +       void *dptr;
>> >> +       int dsize;      /* XXX Should be size_t according to 1003.1-2008. */
>> >> +} datum;
>> >> +
>> >> +typedef DB DBM;
>> >> +#define        dbm_pagfno(a)   DBM_PAGFNO_NOT_AVAILABLE
>> >> +
>> >> +__BEGIN_DECLS
>> >> +int     dbm_clearerr(DBM *);
>> >> +void    dbm_close(DBM *);
>> >> +int     dbm_delete(DBM *, datum);
>> >> +int     dbm_error(DBM *);
>> >> +datum   dbm_fetch(DBM *, datum);
>> >> +datum   dbm_firstkey(DBM *);
>> >> +#if __BSD_VISIBLE
>> >> +long    dbm_forder(DBM *, datum);
>> >> +#endif
>> >> +datum   dbm_nextkey(DBM *);
>> >> +DBM    *dbm_open(const char *, int, mode_t);
>> >> +int     dbm_store(DBM *, datum, datum, int);
>> >> +#if __BSD_VISIBLE
>> >> +int     dbm_dirfno(DBM *);
>> >> +#endif
>> >> +__END_DECLS
>> >> +
>> >> +#endif /* !_NDBM_H_ */
>> >> diff --git a/newlib/libc/posix/Makefile.am b/newlib/libc/posix/Makefile.am
>> >> index 6cdee1df0..01334c7fa 100644
>> >> --- a/newlib/libc/posix/Makefile.am
>> >> +++ b/newlib/libc/posix/Makefile.am
>> >> @@ -2,12 +2,12 @@
>> >>
>> >>  AUTOMAKE_OPTIONS = cygnus
>> >>
>> >> -INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
>> >> +INCLUDES = -I$(srcdir)/../search $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
>> >>
>> >>  GENERAL_SOURCES = \
>> >>         closedir.c collate.c collcmp.c creat.c dirfd.c \
>> >>         fnmatch.c glob.c _isatty.c isatty.c \
>> >> -       opendir.c readdir.c readdir_r.c \
>> >> +       ndbm.c opendir.c readdir.c readdir_r.c \
>> >>         regcomp.c regerror.c regexec.c regfree.c \
>> >>         rewinddir.c sleep.c usleep.c \
>> >>         telldir.c
>> >> diff --git a/newlib/libc/posix/ndbm.c b/newlib/libc/posix/ndbm.c
>> >> new file mode 100644
>> >> index 000000000..63e54df37
>> >> --- /dev/null
>> >> +++ b/newlib/libc/posix/ndbm.c
>> >> @@ -0,0 +1,214 @@
>> >> +/*-
>> >> + * SPDX-License-Identifier: BSD-3-Clause
>> >> + *
>> >> + * Copyright (c) 1990, 1993
>> >> + *     The Regents of the University of California.  All rights reserved.
>> >> + *
>> >> + * This code is derived from software contributed to Berkeley by
>> >> + * Margo Seltzer.
>> >> + *
>> >> + * Redistribution and use in source and binary forms, with or without
>> >> + * modification, are permitted provided that the following conditions
>> >> + * are met:
>> >> + * 1. Redistributions of source code must retain the above copyright
>> >> + *    notice, this list of conditions and the following disclaimer.
>> >> + * 2. Redistributions in binary form must reproduce the above copyright
>> >> + *    notice, this list of conditions and the following disclaimer in the
>> >> + *    documentation and/or other materials provided with the distribution.
>> >> + * 3. Neither the name of the University nor the names of its contributors
>> >> + *    may be used to endorse or promote products derived from this software
>> >> + *    without specific prior written permission.
>> >> + *
>> >> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
>> >> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>> >> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>> >> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
>> >> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>> >> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>> >> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
>> >> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
>> >> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
>> >> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>> >> + * SUCH DAMAGE.
>> >> + */
>> >> +
>> >> +#if defined(LIBC_SCCS) && !defined(lint)
>> >> +static char sccsid[] = "@(#)ndbm.c     8.4 (Berkeley) 7/21/94";
>> >> +#endif /* LIBC_SCCS and not lint */
>> >> +#include <sys/cdefs.h>
>> >> +__FBSDID("$FreeBSD$");
>> >> +
>> >> +/*
>> >> + * This package provides a dbm compatible interface to the new hashing
>> >> + * package described in db(3).
>> >> + */
>> >> +
>> >> +#include <sys/param.h>
>> >> +
>> >> +#include <stdio.h>
>> >> +#include <string.h>
>> >> +#include <errno.h>
>> >> +
>> >> +#include <ndbm.h>
>> >> +#include <hash.h>
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *     *DBM on success
>> >> + *      NULL on failure
>> >> + */
>> >> +extern DBM *
>> >> +dbm_open(const char *file, int flags, mode_t mode)
>> >> +{
>> >> +       HASHINFO info;
>> >> +       char path[MAXPATHLEN];
>> >> +
>> >> +       info.bsize = 4096;
>> >> +       info.ffactor = 40;
>> >> +       info.nelem = 1;
>> >> +       info.cachesize = 0;
>> >> +       info.hash = NULL;
>> >> +       info.lorder = 0;
>> >> +
>> >> +       if( strlen(file) >= sizeof(path) - strlen(DBM_SUFFIX)) {
>> >> +               errno = ENAMETOOLONG;
>> >> +               return(NULL);
>> >> +       }
>> >> +       (void)strcpy(path, file);
>> >> +       (void)strcat(path, DBM_SUFFIX);
>> >> +       return ((DBM *)__hash_open(path, flags, mode, 0, &info));
>> >
>> > In ndbm.c,
>> > The original code was:  return ((DBM *)__hash_open(path, flags, mode, &info, 0));
>> > But the declaration of this function in db_local.h is: __hash_open(const char *, int, int, int, const HASHINFO *);
>> >  hence changed the original code to: return ((DBM *)__hash_open(path, flags, mode, 0, &info));
>> >
>>
>> Should db_local.h be updated? how about hash.h? Maybe, the entire
>> search.h should be updated to newer FreeBSD sources?  This is probably
>> something to discuss at newlib ML...
>>
>> >>
>> >> +}
>> >> +
>> >> +extern void
>> >> +dbm_close(DBM *db)
>> >> +{
>> >> +       (void)(db->close)(db);
>> >> +}
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *     DATUM on success
>> >> + *     NULL on failure
>> >> + */
>> >> +extern datum
>> >> +dbm_fetch(DBM *db, datum key)
>> >> +{
>> >> +       datum retdata;
>> >> +       int status;
>> >> +       DBT dbtkey, dbtretdata;
>> >> +
>> >> +       dbtkey.data = key.dptr;
>> >> +       dbtkey.size = key.dsize;
>> >> +       status = (db->get)(db, &dbtkey, &dbtretdata, 0);
>> >> +       if (status) {
>> >> +               dbtretdata.data = NULL;
>> >> +               dbtretdata.size = 0;
>> >> +       }
>> >> +       retdata.dptr = dbtretdata.data;
>> >> +       retdata.dsize = dbtretdata.size;
>> >> +       return (retdata);
>> >> +}
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *     DATUM on success
>> >> + *     NULL on failure
>> >> + */
>> >> +extern datum
>> >> +dbm_firstkey(DBM *db)
>> >> +{
>> >> +       int status;
>> >> +       datum retkey;
>> >> +       DBT dbtretkey, dbtretdata;
>> >> +
>> >> +       status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
>> >> +       if (status)
>> >> +               dbtretkey.data = NULL;
>> >> +       retkey.dptr = dbtretkey.data;
>> >> +       retkey.dsize = dbtretkey.size;
>> >> +       return (retkey);
>> >> +}
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *     DATUM on success
>> >> + *     NULL on failure
>> >> + */
>> >> +extern datum
>> >> +dbm_nextkey(DBM *db)
>> >> +{
>> >> +       int status;
>> >> +       datum retkey;
>> >> +       DBT dbtretkey, dbtretdata;
>> >> +
>> >> +       status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
>> >> +       if (status)
>> >> +               dbtretkey.data = NULL;
>> >> +       retkey.dptr = dbtretkey.data;
>> >> +       retkey.dsize = dbtretkey.size;
>> >> +       return (retkey);
>> >> +}
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *      0 on success
>> >> + *     <0 failure
>> >> + */
>> >> +extern int
>> >> +dbm_delete(DBM *db, datum key)
>> >> +{
>> >> +       int status;
>> >> +       DBT dbtkey;
>> >> +
>> >> +       dbtkey.data = key.dptr;
>> >> +       dbtkey.size = key.dsize;
>> >> +       status = (db->del)(db, &dbtkey, 0);
>> >> +       if (status)
>> >> +               return (-1);
>> >> +       else
>> >> +               return (0);
>> >> +}
>> >> +
>> >> +/*
>> >> + * Returns:
>> >> + *      0 on success
>> >> + *     <0 failure
>> >> + *      1 if DBM_INSERT and entry exists
>> >> + */
>> >> +extern int
>> >> +dbm_store(DBM *db, datum key, datum data, int flags)
>> >> +{
>> >> +       DBT dbtkey, dbtdata;
>> >> +
>> >> +       dbtkey.data = key.dptr;
>> >> +       dbtkey.size = key.dsize;
>> >> +       dbtdata.data = data.dptr;
>> >> +       dbtdata.size = data.dsize;
>> >> +       return ((db->put)(db, &dbtkey, &dbtdata,
>> >> +           (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
>> >> +}
>> >> +
>> >> +extern int
>> >> +dbm_error(DBM *db)
>> >> +{
>> >> +       HTAB *hp;
>> >> +
>> >> +       hp = (HTAB *)db->internal;
>> >> +       return (hp->error);
>> >> +}
>> >> +
>> >> +extern int
>> >> +dbm_clearerr(DBM *db)
>> >> +{
>> >> +       HTAB *hp;
>> >> +
>> >> +       hp = (HTAB *)db->internal;
>> >> +       hp->error = 0;
>> >> +       return (0);
>> >> +}
>> >> +
>> >> +extern int
>> >> +dbm_dirfno(DBM *db)
>> >> +{
>> >> +       return(((HTAB *)db->internal)->fp);
>> >> +}
>> >> --
>> >> 2.21.0
>> >>
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list