X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=4eb64934ee4cf1437956f3629e3c6271e2b98077;hb=cec4ead904978b07db2154c618eeb48d3102da66;hp=49d2a0dacec74ea5b0ec9e0d72c775a47d5b1701;hpb=ab7d9b674e8eb1388dff4d44def1b661892832e6;p=elogind.git diff --git a/src/shared/util.c b/src/shared/util.c index 49d2a0dac..4eb64934e 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -234,6 +234,17 @@ void close_many(const int fds[], unsigned n_fd) { close_nointr_nofail(fds[i]); } +int unlink_noerrno(const char *path) { + PROTECT_ERRNO; + int r; + + r = unlink(path); + if (r < 0) + return -errno; + + return 0; +} + int parse_boolean(const char *v) { assert(v); @@ -3826,19 +3837,24 @@ bool hostname_is_valid(const char *s) { char* hostname_cleanup(char *s) { char *p, *d; + bool dot; + + for (p = s, d = s, dot = true; *p; p++) { + if (*p == '.') { + if (dot || p[1] == 0) + continue; + + dot = true; + } else + dot = false; - for (p = s, d = s; *p; p++) - if ((*p >= 'a' && *p <= 'z') || - (*p >= 'A' && *p <= 'Z') || - (*p >= '0' && *p <= '9') || - *p == '-' || - *p == '_' || - *p == '.') + if (hostname_valid_char(*p)) *(d++) = *p; + } *d = 0; - strshorten(s, HOST_NAME_MAX); + return s; } @@ -5248,7 +5264,7 @@ int get_home_dir(char **_h) { errno = 0; p = getpwuid(u); if (!p) - return errno ? -errno : -ESRCH; + return errno > 0 ? -errno : -ESRCH; if (!path_is_absolute(p->pw_dir)) return -EINVAL; @@ -5391,7 +5407,23 @@ bool is_locale_utf8(void) { goto out; } - cached_answer = streq(set, "UTF-8"); + if(streq(set, "UTF-8")) { + cached_answer = true; + goto out; + } + + /* For LC_CTYPE=="C" return true, + * because CTYPE is effectly unset and + * everything defaults to UTF-8 nowadays. */ + + set = setlocale(LC_CTYPE, NULL); + if (!set) { + cached_answer = true; + goto out; + } + + cached_answer = streq(set, "C"); + out: return (bool)cached_answer; }