X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_libc_wrapper.c;h=1852141c9378c7baa9b389013ed838a90a2d9871;hp=df5451520662b58e463e85353cfa6bc77495cee5;hb=f943722e0a0485d030cae171b8758dba68564398;hpb=57e1a2770c4d85edd377488906c437f6d1e9b369 diff --git a/udev_libc_wrapper.c b/udev_libc_wrapper.c index df5451520..1852141c9 100644 --- a/udev_libc_wrapper.c +++ b/udev_libc_wrapper.c @@ -27,21 +27,70 @@ #include #include -#include "../udev_libc_wrapper.h" -#include "../udev.h" -#include "../udev_utils.h" -#include "../logging.h" - +#include "udev_libc_wrapper.h" +#include "udev.h" +#include "udev_utils.h" +#include "logging.h" #ifdef __KLIBC__ #define __OWN_USERDB_PARSER__ #endif + +#ifdef __GLIBC__ +#define __OWN_STRLCPYCAT__ +#endif + #ifdef USE_STATIC #define __OWN_USERDB_PARSER__ #endif -#ifndef __OWN_USERDB_PARSER__ +#ifdef __OWN_STRLCPYCAT__ +size_t strlcpy(char *dst, const char *src, size_t size) +{ + size_t bytes = 0; + char *q = dst; + const char *p = src; + char ch; + + while ((ch = *p++)) { + if (bytes+1 < size) + *q++ = ch; + bytes++; + } + + /* If size == 0 there is no space for a final null... */ + if (size) + *q = '\0'; + + return bytes; +} +size_t strlcat(char *dst, const char *src, size_t size) +{ + size_t bytes = 0; + char *q = dst; + const char *p = src; + char ch; + + while (bytes < size && *q) { + q++; + bytes++; + } + if (bytes == size) + return (bytes + strlen(src)); + + while ((ch = *p++)) { + if (bytes+1 < size) + *q++ = ch; + bytes++; + } + + *q = '\0'; + return bytes; +} +#endif /* __OWN_STRLCPYCAT__ */ + +#ifndef __OWN_USERDB_PARSER__ #include #include #include @@ -98,7 +147,7 @@ static unsigned long get_id_by_name(const char *uname, const char *dbfile) dbg("can't open '%s' as db file", dbfile); return 0; } - dbg("reading '%s' as db file", dbfile); + dbg("search '%s' in '%s'", uname, dbfile); /* loop through the whole file */ cur = 0; @@ -107,11 +156,10 @@ static unsigned long get_id_by_name(const char *uname, const char *dbfile) bufline = &buf[cur]; cur += count+1; - if (count >= LINE_SIZE) + if (count >= sizeof(line)) continue; - strncpy(line, bufline, count); - line[count] = '\0'; + strlcpy(line, bufline, count); pos = line; /* get name */ @@ -158,5 +206,4 @@ gid_t lookup_group(const char *group) id = get_id_by_name(group, GROUP_FILE); return (gid_t) id; } - #endif /* __OWN_USERDB_PARSER__ */