chiark / gitweb /
macro: rework how we define cleanup macros
[elogind.git] / src / shared / util.c
index 57943b64117f9afa5ac99f13599d46254e45f26b..53caa7f9e504ca8afaab61d96e1cf31f6af46070 100644 (file)
@@ -3837,19 +3837,24 @@ bool hostname_is_valid(const char *s) {
 
 char* hostname_cleanup(char *s) {
         char *p, *d;
 
 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++) = *p;
+        }
 
         *d = 0;
 
         *d = 0;
-
         strshorten(s, HOST_NAME_MAX);
         strshorten(s, HOST_NAME_MAX);
+
         return s;
 }
 
         return s;
 }
 
@@ -5259,7 +5264,7 @@ int get_home_dir(char **_h) {
         errno = 0;
         p = getpwuid(u);
         if (!p)
         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;
 
         if (!path_is_absolute(p->pw_dir))
                 return -EINVAL;
@@ -5272,26 +5277,6 @@ int get_home_dir(char **_h) {
         return 0;
 }
 
         return 0;
 }
 
-void fclosep(FILE **f) {
-        if (*f)
-                fclose(*f);
-}
-
-void pclosep(FILE **f) {
-        if (*f)
-                pclose(*f);
-}
-
-void closep(int *fd) {
-        if (*fd >= 0)
-                close_nointr_nofail(*fd);
-}
-
-void closedirp(DIR **d) {
-        if (*d)
-                closedir(*d);
-}
-
 bool filename_is_safe(const char *p) {
 
         if (isempty(p))
 bool filename_is_safe(const char *p) {
 
         if (isempty(p))
@@ -5402,7 +5387,23 @@ bool is_locale_utf8(void) {
                 goto out;
         }
 
                 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;
 }
 out:
         return (bool)cached_answer;
 }