X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Flib%2Flibudev-util.c;h=2b8cda59f6e30cb41b2d6c6bfee3732f5051fe45;hp=867a41d21120df2361c75bcfcf1ef5e6e96fdb4d;hb=dacea9ff6be55f1b115c13b1ab530812d0d66879;hpb=4061ab9f4bb0bdad3858e8ef1738dc892afe9de4 diff --git a/udev/lib/libudev-util.c b/udev/lib/libudev-util.c index 867a41d21..2b8cda59f 100644 --- a/udev/lib/libudev-util.c +++ b/udev/lib/libudev-util.c @@ -101,12 +101,12 @@ int util_log_priority(const char *priority) return 0; } -size_t util_path_encode(char *s, size_t len) +size_t util_path_encode(char *s, size_t size) { - char t[(len * 3)+1]; + char t[(size * 4)+1]; size_t i, j; - for (i = 0, j = 0; s[i] != '\0'; i++) { + for (i = 0, j = 0; s[i] != '\0' && i < size; i++) { if (s[i] == '/') { memcpy(&t[j], "\\x2f", 4); j += 4; @@ -118,11 +118,12 @@ size_t util_path_encode(char *s, size_t len) j++; } } - if (len == 0) - return j; - i = (j < len - 1) ? j : len - 1; - memcpy(s, t, i); - s[i] = '\0'; + if (i >= size) + return 0; + if (j >= size) + return 0; + memcpy(s, t, j); + s[j] = '\0'; return j; } @@ -134,7 +135,7 @@ size_t util_path_decode(char *s) if (memcmp(&s[i], "\\x2f", 4) == 0) { s[j] = '/'; i += 4; - }else if (memcmp(&s[i], "\\x5c", 4) == 0) { + } else if (memcmp(&s[i], "\\x5c", 4) == 0) { s[j] = '\\'; i += 4; } else { @@ -448,3 +449,28 @@ int udev_util_encode_string(const char *str, char *str_enc, size_t len) err: return -1; } + +void util_set_fd_cloexec(int fd) +{ + int flags; + + flags = fcntl(fd, F_GETFD); + if (flags < 0) + flags = FD_CLOEXEC; + else + flags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, flags); +} + +unsigned int util_string_hash32(const char *str) +{ + unsigned int hash = 0; + + while (str[0] != '\0') { + hash += str[0] << 4; + hash += str[0] >> 4; + hash *= 11; + str++; + } + return hash; +}