Merge "Fix crash caused by decryption response delay" into tizen
[platform/upstream/connman.git] / src / timezone.c
old mode 100644 (file)
new mode 100755 (executable)
index d82502b..cc49909
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
  *
  *  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
@@ -23,7 +23,6 @@
 #include <config.h>
 #endif
 
-#define _GNU_SOURCE
 #include <errno.h>
 #include <stdio.h>
 #include <fcntl.h>
@@ -60,7 +59,7 @@ static char *read_key_file(const char *pathname, const char *key)
        }
 
        map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (map == NULL || map == MAP_FAILED) {
+       if (!map || map == MAP_FAILED) {
                close(fd);
                return NULL;
        }
@@ -81,25 +80,25 @@ static char *read_key_file(const char *pathname, const char *key)
                }
 
                ptr = memchr(ptr + 1, key[0], ptrlen - 1);
-               if (ptr == NULL)
+               if (!ptr)
                        break;
 
                ptrlen = st.st_size - (ptr - map);
        }
 
-       if (ptr != NULL) {
+       if (ptr) {
                char *end, *val;
 
                ptrlen = st.st_size - (ptr - map);
 
                end = memchr(ptr, '\n', ptrlen);
-               if (end != NULL)
+               if (end)
                        ptrlen = end - ptr;
 
                val = memchr(ptr, '"', ptrlen);
-               if (val != NULL) {
+               if (val) {
                        end = memchr(val + 1, '"', end - val - 1);
-                       if (end != NULL)
+                       if (end)
                                str = g_strndup(val + 1, end - val - 1);
                        else
                                str = NULL;
@@ -137,10 +136,10 @@ static int compare_file(void *src_map, struct stat *src_st,
        }
 
        dst_map = mmap(0, dst_st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (dst_map == NULL || dst_map == MAP_FAILED) {
+       if (!dst_map || dst_map == MAP_FAILED) {
                close(fd);
                return -1;
-        }
+       }
 
        result = memcmp(src_map, dst_map, src_st->st_size);
 
@@ -157,15 +156,17 @@ static char *find_origin(void *src_map, struct stat *src_st,
        DIR *dir;
        struct dirent *d;
        char *str, pathname[PATH_MAX];
+       struct stat buf;
+       int ret;
 
-       if (subpath == NULL)
-               strncpy(pathname, basepath, sizeof(pathname));
+       if (!subpath)
+               strncpy(pathname, basepath, sizeof(pathname) - 1);
        else
                snprintf(pathname, sizeof(pathname),
                                        "%s/%s", basepath, subpath);
 
        dir = opendir(pathname);
-       if (dir == NULL)
+       if (!dir)
                return NULL;
 
        while ((d = readdir(dir))) {
@@ -177,7 +178,7 @@ static char *find_origin(void *src_map, struct stat *src_st,
 
                switch (d->d_type) {
                case DT_REG:
-                       if (subpath == NULL)
+                       if (!subpath)
                                snprintf(pathname, PATH_MAX,
                                                "%s/%s", basepath, d->d_name);
                        else
@@ -186,21 +187,35 @@ static char *find_origin(void *src_map, struct stat *src_st,
                                                        subpath, d->d_name);
 
                        if (compare_file(src_map, src_st, pathname) == 0) {
-                               str = g_strdup_printf("%s/%s",
+                               if (!subpath)
+                                       str = g_strdup(d->d_name);
+                               else
+                                       str = g_strdup_printf("%s/%s",
                                                        subpath, d->d_name);
                                closedir(dir);
                                return str;
                        }
                        break;
+               case DT_UNKNOWN:
+                       /*
+                        * If there is no d_type support use fstatat()
+                        * to check if d_name is directory
+                        */
+                       ret = fstatat(dirfd(dir), d->d_name, &buf, 0);
+                       if (ret < 0)
+                               continue;
+                       if ((buf.st_mode & S_IFDIR) == 0)
+                               continue;
+                       /* fall through */
                case DT_DIR:
-                       if (subpath == NULL)
+                       if (!subpath)
                                strncpy(pathname, d->d_name, sizeof(pathname));
                        else
                                snprintf(pathname, sizeof(pathname),
                                                "%s/%s", subpath, d->d_name);
 
                        str = find_origin(src_map, src_st, basepath, pathname);
-                       if (str != NULL) {
+                       if (str) {
                                closedir(dir);
                                return str;
                        }
@@ -235,14 +250,14 @@ char *__connman_timezone_lookup(void)
 
        if (S_ISREG(st.st_mode)) {
                map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-               if (map == NULL || map == MAP_FAILED) {
+               if (!map || map == MAP_FAILED) {
                        g_free(zone);
                        zone = NULL;
 
                        goto done;
                }
 
-               if (zone != NULL) {
+               if (zone) {
                        char pathname[PATH_MAX];
 
                        snprintf(pathname, PATH_MAX, "%s/%s",
@@ -254,7 +269,7 @@ char *__connman_timezone_lookup(void)
                        }
                }
 
-               if (zone == NULL)
+               if (!zone)
                        zone = find_origin(map, &st, USR_SHARE_ZONEINFO, NULL);
 
                munmap(map, st.st_size);
@@ -318,7 +333,7 @@ int __connman_timezone_change(const char *zone)
        }
 
        map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (map == NULL || map == MAP_FAILED) {
+       if (!map || map == MAP_FAILED) {
                close(fd);
                return -EIO;
        }
@@ -402,7 +417,7 @@ int __connman_timezone_init(void)
                return -EIO;
 
        channel = g_io_channel_unix_new(fd);
-       if (channel == NULL) {
+       if (!channel) {
                close(fd);
                return -EIO;
        }
@@ -420,7 +435,7 @@ int __connman_timezone_init(void)
        dirname = g_path_get_dirname(ETC_LOCALTIME);
 
        wd = inotify_add_watch(fd, dirname, IN_DONT_FOLLOW |
-                                               IN_MODIFY | IN_MOVED_TO);
+                                               IN_CLOSE_WRITE | IN_MOVED_TO);
 
        g_free(dirname);