diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-04-22 12:15:36 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2005-04-22 12:15:36 +0000 |
commit | a66a22cd29417810d91c057c6febe817f3d7b26a (patch) | |
tree | 2bcb4eea28a7c693e2c0ebbda3e6e120ae2658a4 /common | |
parent | 70e5fac9bd0fb2294eb7e585c005eb096ae84f5d (diff) |
Add the textfile library for ASCII based file access
Diffstat (limited to 'common')
-rw-r--r-- | common/Makefile.am | 9 | ||||
-rw-r--r-- | common/textfile.c | 100 | ||||
-rw-r--r-- | common/textfile.h | 29 |
3 files changed, 138 insertions, 0 deletions
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 <marcel@holtmann.org> + * + * + * 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 <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <malloc.h> +#include <string.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/mman.h> + +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 <marcel@holtmann.org> + * + * + * 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); |