From a66a22cd29417810d91c057c6febe817f3d7b26a Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 22 Apr 2005 12:15:36 +0000 Subject: Add the textfile library for ASCII based file access --- Makefile.am | 3 +- common/Makefile.am | 9 +++++ common/textfile.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++ common/textfile.h | 29 ++++++++++++++++ configure.in | 2 +- 5 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 common/Makefile.am create mode 100644 common/textfile.c create mode 100644 common/textfile.h diff --git a/Makefile.am b/Makefile.am index 251d8da1..49650733 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,8 @@ # $Id$ # -SUBDIRS = hcid tools rfcomm sdpd dund pand hidd cups alsa test scripts pcmcia extra +SUBDIRS = common tools rfcomm hcid sdpd dund pand hidd \ + cups alsa test scripts pcmcia extra MAINTAINERCLEANFILES = Makefile.in \ aclocal.m4 configure config.h.in config.sub config.guess \ diff --git a/common/Makefile.am b/common/Makefile.am new file mode 100644 index 00000000..ffcddf6e --- /dev/null +++ b/common/Makefile.am @@ -0,0 +1,9 @@ +# +# $Id$ +# + +noinst_LIBRARIES = libtextfile.a + +libtextfile_a_SOURCES = textfile.h textfile.c + +MAINTAINERCLEANFILES = Makefile.in diff --git a/common/textfile.c b/common/textfile.c new file mode 100644 index 00000000..6f84cfa9 --- /dev/null +++ b/common/textfile.c @@ -0,0 +1,100 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2005 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *textfile_get(const char *pathname, const char *key) +{ + struct stat st; + char *map, *off, *end, *str = NULL; + off_t size; size_t len; + int fd; + + fd = open(pathname, O_RDONLY); + if (fd < 0) + return NULL; + + if (flock(fd, LOCK_SH) < 0) + goto close; + + if (fstat(fd, &st) < 0) + goto unlock; + + size = st.st_size; + + map = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) + goto close; + + off = strstr(map, key); + if (!off) + goto unmap; + + if (off > map) { + while (*(off - 1) != '\r' && *(off - 1) != '\n') { + off = strstr(map, key); + if (!off) + goto unmap; + } + } + + end = strpbrk(off, "\r\n"); + if (!end) + goto unmap; + + len = strlen(key); + str = malloc(end - off - len); + memset(str, 0, end - off - len); + if (!str) + goto unmap; + + strncpy(str, off + len + 1, end - off - len - 1); + +unmap: + munmap(map, size); + +unlock: + flock(fd, LOCK_UN); + +close: + close(fd); + + return str; +} diff --git a/common/textfile.h b/common/textfile.h new file mode 100644 index 00000000..56a0bc10 --- /dev/null +++ b/common/textfile.h @@ -0,0 +1,29 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2005 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + * + * $Id$ + */ + +char *textfile_get(const char *pathname, const char *key); diff --git a/configure.in b/configure.in index 15febfe9..830c4527 100644 --- a/configure.in +++ b/configure.in @@ -34,4 +34,4 @@ AC_PATH_DBUS AC_ARG_BLUEZ -AC_OUTPUT(Makefile hcid/Makefile tools/Makefile rfcomm/Makefile sdpd/Makefile dund/Makefile pand/Makefile hidd/Makefile cups/Makefile alsa/Makefile test/Makefile scripts/Makefile pcmcia/Makefile extra/Makefile) +AC_OUTPUT(Makefile common/Makefile tools/Makefile rfcomm/Makefile hcid/Makefile sdpd/Makefile dund/Makefile pand/Makefile hidd/Makefile cups/Makefile alsa/Makefile test/Makefile scripts/Makefile pcmcia/Makefile extra/Makefile) -- cgit