[PATCH v1] Port ndbm

Gedare Bloom gedare at rtems.org
Tue Jun 25 17:36:16 UTC 2019


Hi Vaibhav,

How did this turn out?  I was surprised not to hear about this
approach by now, and whether or not it worked for you.

You should post some updates to github, even if it is not working
code, on a branch or something, to show what you are trying out and to
have a history of what you investigated.

Gedare

On Mon, Jun 24, 2019 at 1:12 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>
> I will test it!
>
> On Sat, Jun 22, 2019 at 2:02 AM Gedare Bloom <gedare at rtems.org> wrote:
>>
>> On Fri, Jun 21, 2019 at 1:42 PM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >
>> >
>> >
>> > On Fri, Jun 21, 2019 at 11:38 PM Gedare Bloom <gedare at rtems.org> wrote:
>> >>
>> >> On Fri, Jun 21, 2019 at 11:03 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >> >
>> >> >
>> >> >
>> >> > On Fri, Jun 21, 2019, 9:46 PM Gedare Bloom <gedare at rtems.org> wrote:
>> >> >>
>> >> >> On Fri, Jun 21, 2019 at 4:25 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >> >> >
>> >> >> > Hello Gedare,
>> >> >> > As you suggested, I have placed   nbm.c    in    libc/search   directory. This directory contains   hash.h, db_local.h, hash.c. And all these are required by ndbm.
>> >> >> > .
>> >> >> > Here newlib got successfully compiled and It was generating function symbols.
>> >> >> > .
>> >> >> > After that when i added the patch to RSB, and tried to compile a test to check if ndbm is ported successfully or not.
>> >> >> > It gave me error:
>> >> >> > ........
>> >> >> > ........
>> >> >> > mv -f fileio/.deps/fileio-init.Tpo fileio/.deps/fileio-init.Po
>> >> >> > sparc-rtems5-gcc -DHAVE_CONFIG_H -I. -I/home/varodek/development/rtems/kernel/rtems/c/src/../../testsuites/samples   -I. -I/home/varodek/development/rtems/kernel/erc32/sparc-rtems5/c/erc32/include -I/home/varodek/development/rtems/kernel/rtems/cpukit/include -I/home/varodek/development/rtems/kernel/rtems/cpukit/score/cpu/sparc/include -I/home/varodek/development/rtems/kernel/erc32/sparc-rtems5/c/erc32/lib/libbsp/sparc/erc32/include -I/home/varodek/development/rtems/kernel/rtems/bsps/include -I/home/varodek/development/rtems/kernel/rtems/bsps/sparc/include -I/home/varodek/development/rtems/kernel/rtems/bsps/sparc/erc32/include -DT_FILE_NAME='"init.c"'  -I/home/varodek/development/rtems/kernel/rtems/c/src/../../testsuites/samples/../support/include   -mcpu=cypress -O2 -g -ffunction-sections -fdata-sections -Wall -Wmissing-prototypes -Wimplicit-function-declaration -Wstrict-prototypes -Wnested-externs -MT hello/hello-init.o -MD -MP -MF hello/.deps/hello-init.Tpo -c -o hello/hello-init.o `test -f 'hello/init.c' || echo '/home/varodek/development/rtems/kernel/rtems/c/src/../../testsuites/samples/'`hello/init.c
>> >> >> > In file included from /home/varodek/development/rtems/kernel/rtems/c/src/../../testsuites/samples/hello/init.c:17:0:
>> >> >> > /home/varodek/development/rtems/5/sparc-rtems5/include/ndbm.h:43:10: fatal error: db_local.h: No such file or directory
>> >> >> >  #include <db_local.h>
>> >> >> >           ^~~~~~~~~~~~
>> >> >> >
>> >> >> > .
>> >> >> > I found that     db_local.h    is not present in    rtems/5    directory.
>> >> >> >
>> >> >>
>> >> >> I suspect that the headers in search/ are not installed, they are only
>> >> >> to be included during compilation of newlib, and probably should be
>> >> >> included by #include "db_local.h" for example. I also find it likely
>> >> >
>> >> > ndbm.h     is in   libc/include,   db_local.h    is in libc/search.
>> >> > I will have to use   #include"../search/db_local.h"      which itself is a very bad way to do so.
>> >>
>> >> Definitely shouldn't do that.
>> >>
>> >> >>
>> >> >> that you should not be including these non-installed headers from
>> >> >> installed headers inside of libc/include.
>> >> >>
>> >> >> So, you might need to rewrite the ndbm.h so that it does not rely on
>> >> >> some internal headers of newlib.... Just my two cents. Not sure if I'm
>> >> >> right. :)
>> >> >
>> >> > I can do one thing. db_local.h    contains some data structures. Also it contains some function declarations, definitions of which are present in hash.h.
>> >> >.
>> >> > So i can put those declarations and data structures directly in    ndbm.h, so won't need to call    db_local.h
>> >> >
>> >>
>> >> It would be better if you can remove anything requiring db_local.h
>> >> from ndbm.h so that you don't have to #include db_local.h. You could
>> >> put those things into maybe db_local.h, or into some new file like
>> >> search/ndbm_local.h or something. you might need some guidance from
>> >> newlib maintainers about what is the right way to split the
>> >> public/private sides of headers like this.
>> >
>> > Actually ndbm.h has declarations of database functions. And all of them require a data-type (structure)
>> > defined in db_local.h  . So there is nothing in ndbm.h which I can shift to db_local.h
>> > or ndbm_local.h . If I transfer anything, ndbm.h will lose its meaning.
>> > .
>>
>> What about forward declare the structures?
>>
>> > Okay I will ask in newlib. Haven't got reply from them for my previous mail though.
>> >>
>> >>
>> >> The basic idea is, how to make it so that #include <ndbm.h> doesn't
>> >> need to include db_local.h? Instead, you can modify ndbm.c to do
>> >> something lilke #include "db_local.h" and #include "ndbm_local.h"
>> >> itself. This way, the ndbm.h header file does not need to "leak" the
>> >> details of db_local.h to userland.
>> >>
>> >> Gedare
>> >>  .
>> >> > Will this be practical?
>> >> >>
>> >> >>
>> >> >>
>> >> >> > Thank you
>> >> >> > Vaibhav Gupta
>> >> >> >
>> >> >> > On Fri, Jun 21, 2019 at 1:57 AM Vaibhav Gupta <vaibhavgupta40 at gmail.com> wrote:
>> >> >> >>
>> >> >> >> ---
>> >> >> >>  newlib/libc/include/ndbm.h     |  84 +++++++++++++
>> >> >> >>  newlib/libc/search/Makefile.am |   1 +
>> >> >> >>  newlib/libc/search/ndbm.c      | 214 +++++++++++++++++++++++++++++++++
>> >> >> >>  3 files changed, 299 insertions(+)
>> >> >> >>  create mode 100644 newlib/libc/include/ndbm.h
>> >> >> >>  create mode 100644 newlib/libc/search/ndbm.c
>> >> >> >>
>> >> >> >> diff --git a/newlib/libc/include/ndbm.h b/newlib/libc/include/ndbm.h
>> >> >> >> new file mode 100644
>> >> >> >> index 000000000..f89f97dd0
>> >> >> >> --- /dev/null
>> >> >> >> +++ b/newlib/libc/include/ndbm.h
>> >> >> >> @@ -0,0 +1,84 @@
>> >> >> >> +/*-
>> >> >> >> + * 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_
>> >> >> >> +
>> >> >> >> +#define __DBINTERFACE_PRIVATE
>> >> >> >> +
>> >> >> >> +#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/search/Makefile.am b/newlib/libc/search/Makefile.am
>> >> >> >> index 98920c3f4..a61107fb9 100644
>> >> >> >> --- a/newlib/libc/search/Makefile.am
>> >> >> >> +++ b/newlib/libc/search/Makefile.am
>> >> >> >> @@ -9,6 +9,7 @@ GENERAL_SOURCES = \
>> >> >> >>         db_local.h \
>> >> >> >>         extern.h \
>> >> >> >>         hash.h \
>> >> >> >> +       ndbm.c \
>> >> >> >>         page.h \
>> >> >> >>         qsort.c
>> >> >> >>
>> >> >> >> diff --git a/newlib/libc/search/ndbm.c b/newlib/libc/search/ndbm.c
>> >> >> >> new file mode 100644
>> >> >> >> index 000000000..bd9c71e4f
>> >> >> >> --- /dev/null
>> >> >> >> +++ b/newlib/libc/search/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));
>> >> >> >> +}
>> >> >> >> +
>> >> >> >> +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
>> >> >> >>


More information about the devel mailing list