#include "alarm-manager-dbus.h"
/* link path for timezone info */
-#define TIMEZONE_INFO_LINK_PATH tzplatform_mkpath(TZ_SYS_ETC, "localtime")
+#define TIMEZONE_INFO_LINK_DIR_PATH tzplatform_getenv(TZ_SYS_ETC)
+#define TIMEZONE_INFO_LINK_FILE_NAME "localtime"
#ifndef RTC_WKALM_BOOT_SET
#define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
char *tzpath_str;
time_t cur_time;
+ int dirfd = -1;
g_variant_get(parameters, "(&s)", &tzpath_str);
goto done;
}
- retval = lstat(TIMEZONE_INFO_LINK_PATH, &statbuf);
+ dirfd = open(TIMEZONE_INFO_LINK_DIR_PATH, O_DIRECTORY);
+ if (dirfd < 0) {
+ LOGE("open(%s) failed: %d", TIMEZONE_INFO_LINK_DIR_PATH, errno);
+ return_code = ERR_ALARM_SYSTEM_FAIL;
+ goto done;
+ }
+
+ retval = fstatat(dirfd, TIMEZONE_INFO_LINK_FILE_NAME, &statbuf,
+ AT_SYMLINK_NOFOLLOW);
if (retval == 0 || (retval == -1 && errno != ENOENT)) {
/* unlink the current link */
- if (unlink(TIMEZONE_INFO_LINK_PATH) < 0) {
+ if (unlinkat(dirfd, TIMEZONE_INFO_LINK_FILE_NAME, 0) < 0) {
LOGE("unlink() is failed.");
return_code = ERR_ALARM_SYSTEM_FAIL;
goto done;
}
/* create a new symlink when the /opt/etc/localtime is empty. */
- if (symlink(tzpath_str, TIMEZONE_INFO_LINK_PATH) < 0) {
+ if (symlinkat(tzpath_str, dirfd, TIMEZONE_INFO_LINK_FILE_NAME) < 0) {
LOGE("Failed to create an symlink of %s.", tzpath_str);
return_code = ERR_ALARM_SYSTEM_FAIL;
goto done;
bundle_free(b);
done:
+ if (dirfd >= 0)
+ close(dirfd);
+
if (return_code == ALARMMGR_RESULT_SUCCESS)
strncpy(log_tag, "SET TIMEZONE", sizeof(log_tag) - 1);
else