4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <sys/types.h>
22 #include <sys/socket.h>
29 #include <vconf-keys.h>
31 #include "dd-deviced.h"
32 #include "deviced-priv.h"
35 #define PREDEF_PWROFF_POPUP "pwroff-popup"
36 #define PREDEF_ENTERSLEEP "entersleep"
37 #define PREDEF_LEAVESLEEP "leavesleep"
38 #define PREDEF_REBOOT "reboot"
39 #define PREDEF_BACKGRD "backgrd"
40 #define PREDEF_FOREGRD "foregrd"
41 #define PREDEF_ACTIVE "active"
42 #define PREDEF_INACTIVE "inactive"
43 #define PREDEF_SET_DATETIME "set_datetime"
44 #define PREDEF_SET_TIMEZONE "set_timezone"
45 #define PREDEF_MOUNT_MMC "mountmmc"
46 #define PREDEF_UNMOUNT_MMC "unmountmmc"
47 #define PREDEF_FORMAT_MMC "formatmmc"
49 #define PREDEF_SET_MAX_FREQUENCY "set_max_frequency"
50 #define PREDEF_SET_MIN_FREQUENCY "set_min_frequency"
51 #define PREDEF_RELEASE_MAX_FREQUENCY "release_max_frequency"
52 #define PREDEF_RELEASE_MIN_FREQUENCY "release_min_frequency"
54 enum deviced_noti_cmd {
59 #define SYSTEM_NOTI_SOCKET_PATH "/tmp/sn"
60 #define RETRY_READ_COUNT 10
62 static inline int send_int(int fd, int val)
64 return write(fd, &val, sizeof(int));
67 static inline int send_str(int fd, char *str)
73 ret = write(fd, &len, sizeof(int));
76 if (len > SYSTEM_NOTI_MAXSTR)
77 len = SYSTEM_NOTI_MAXSTR;
78 write(fd, &len, sizeof(int));
79 ret = write(fd, str, len);
84 static int deviced_noti_send(struct sysnoti *msg)
86 _E("--- %s: start", __FUNCTION__);
92 struct sockaddr_un clientaddr;
95 client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
96 if (client_sockfd == -1) {
97 _E("%s: socket create failed\n", __FUNCTION__);
100 bzero(&clientaddr, sizeof(clientaddr));
101 clientaddr.sun_family = AF_UNIX;
102 strncpy(clientaddr.sun_path, SYSTEM_NOTI_SOCKET_PATH, sizeof(clientaddr.sun_path) - 1);
103 client_len = sizeof(clientaddr);
105 if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) <
107 _E("%s: connect failed\n", __FUNCTION__);
108 close(client_sockfd);
112 send_int(client_sockfd, msg->pid);
113 send_int(client_sockfd, msg->cmd);
114 send_str(client_sockfd, msg->type);
115 send_str(client_sockfd, msg->path);
116 send_int(client_sockfd, msg->argc);
117 for (i = 0; i < msg->argc; i++)
118 send_str(client_sockfd, msg->argv[i]);
120 _E("--- %s: read", __FUNCTION__);
121 while (retry_count < RETRY_READ_COUNT) {
122 r = read(client_sockfd, &result, sizeof(int));
124 if (errno == EINTR) {
125 _E("Re-read for error(EINTR)");
129 _E("Read fail for str length");
136 if (retry_count == RETRY_READ_COUNT) {
137 _E("Read retry failed");
140 close(client_sockfd);
141 _E("--- %s: end", __FUNCTION__);
145 API int deviced_call_predef_action(const char *type, int num, ...)
147 _E("--- %s: start", __FUNCTION__);
155 if (type == NULL || num > SYSTEM_NOTI_MAXARG) {
160 msg = malloc(sizeof(struct sysnoti));
163 /* Do something for not enought memory error */
168 msg->cmd = CALL_DEVICED_ACTION;
169 msg->type = (char *)type;
173 va_start(argptr, num);
174 for (i = 0; i < num; i++) {
175 args = va_arg(argptr, char *);
180 _E("--- %s: send msg", __FUNCTION__);
181 ret = deviced_noti_send(msg);
184 _E("--- %s: end", __FUNCTION__);
188 API int deviced_inform_foregrd(void)
191 snprintf(buf, sizeof(buf), "%d", getpid());
192 return deviced_call_predef_action(PREDEF_FOREGRD, 1, buf);
195 API int deviced_inform_backgrd(void)
198 snprintf(buf, sizeof(buf), "%d", getpid());
199 return deviced_call_predef_action(PREDEF_BACKGRD, 1, buf);
202 API int deviced_inform_active(pid_t pid)
205 snprintf(buf, sizeof(buf), "%d", pid);
206 return deviced_call_predef_action(PREDEF_ACTIVE, 1, buf);
209 API int deviced_inform_inactive(pid_t pid)
212 snprintf(buf, sizeof(buf), "%d", pid);
213 return deviced_call_predef_action(PREDEF_INACTIVE, 1, buf);
216 API int deviced_request_poweroff(void)
218 return deviced_call_predef_action(PREDEF_PWROFF_POPUP, 0);
221 API int deviced_request_entersleep(void)
223 return deviced_call_predef_action(PREDEF_ENTERSLEEP, 0);
226 API int deviced_request_leavesleep(void)
228 return deviced_call_predef_action(PREDEF_LEAVESLEEP, 0);
231 API int deviced_request_reboot(void)
233 return deviced_call_predef_action(PREDEF_REBOOT, 0);
236 API int deviced_set_datetime(time_t timet)
240 char buf[255] = { 0 };
241 snprintf(buf, sizeof(buf), "%ld", timet);
242 return deviced_call_predef_action(PREDEF_SET_DATETIME, 1, buf);
245 API int deviced_set_timezone(char *tzpath_str)
247 if (tzpath_str == NULL)
250 snprintf(buf, sizeof(buf), "%s", tzpath_str);
251 return deviced_call_predef_action(PREDEF_SET_TIMEZONE, 1, buf);
254 static int deviced_noti_mount_mmc_cb(keynode_t *key_nodes, void *data)
256 struct mmc_contents *mmc_data;
258 mmc_data = (struct mmc_contents *)data;
259 _D("mountmmc_cb called");
260 if (vconf_keynode_get_int(key_nodes) ==
261 VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED) {
263 (mmc_data->mmc_cb)(0, mmc_data->user_data);
264 } else if (vconf_keynode_get_int(key_nodes) ==
265 VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY) {
267 (mmc_data->mmc_cb)(-2, mmc_data->user_data);
270 vconf_get_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, &mmc_err);
271 (mmc_data->mmc_cb)(mmc_err, mmc_data->user_data);
273 vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_MOUNT,
274 (void *)deviced_noti_mount_mmc_cb);
278 API int deviced_request_mount_mmc(struct mmc_contents *mmc_data)
280 if (mmc_data != NULL && mmc_data->mmc_cb != NULL)
281 vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_MOUNT,
282 (void *)deviced_noti_mount_mmc_cb, (void *)mmc_data);
283 return deviced_call_predef_action(PREDEF_MOUNT_MMC, 0);
286 static int deviced_noti_unmount_mmc_cb(keynode_t *key_nodes, void *data)
288 struct mmc_contents *mmc_data;
290 mmc_data = (struct mmc_contents *)data;
291 _D("unmountmmc_cb called");
292 if (vconf_keynode_get_int(key_nodes) ==
293 VCONFKEY_SYSMAN_MMC_UNMOUNT_COMPLETED) {
295 (mmc_data->mmc_cb)(0, mmc_data->user_data);
298 vconf_get_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, &mmc_err);
299 (mmc_data->mmc_cb)(mmc_err, mmc_data->user_data);
301 vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_UNMOUNT,
302 (void *)deviced_noti_unmount_mmc_cb);
306 API int deviced_request_unmount_mmc(struct mmc_contents *mmc_data, int option)
309 if (option != 1 && option != 2) {
310 _D("option is wrong. default option 1 will be used");
313 snprintf(buf, sizeof(buf), "%d", option);
315 if (mmc_data != NULL && mmc_data->mmc_cb != NULL)
316 vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_UNMOUNT,
317 (void *)deviced_noti_unmount_mmc_cb,
319 return deviced_call_predef_action(PREDEF_UNMOUNT_MMC, 1, buf);
322 static int deviced_noti_format_mmc_cb(keynode_t *key_nodes, void *data)
324 struct mmc_contents *mmc_data;
325 mmc_data = (struct mmc_contents *)data;
326 _D("format_cb called");
327 if (vconf_keynode_get_int(key_nodes) ==
328 VCONFKEY_SYSMAN_MMC_FORMAT_COMPLETED) {
330 (mmc_data->mmc_cb)(0, mmc_data->user_data);
334 (mmc_data->mmc_cb)(-1, mmc_data->user_data);
336 vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_FORMAT,
337 (void *)deviced_noti_format_mmc_cb);
341 API int deviced_request_format_mmc(struct mmc_contents *mmc_data)
343 if (mmc_data != NULL && mmc_data->mmc_cb != NULL)
344 vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_FORMAT,
345 (void *)deviced_noti_format_mmc_cb,
347 return deviced_call_predef_action(PREDEF_FORMAT_MMC, 0);
350 API int deviced_request_set_cpu_max_frequency(int val)
355 // to do - need to check new frequncy is valid
356 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
357 snprintf(buf_freq, sizeof(buf_freq), "%d", val * 1000);
359 return deviced_call_predef_action(PREDEF_SET_MAX_FREQUENCY, 2, buf_pid, buf_freq);
362 API int deviced_request_set_cpu_min_frequency(int val)
367 // to do - need to check new frequncy is valid
368 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
369 snprintf(buf_freq, sizeof(buf_freq), "%d", val * 1000);
371 return deviced_call_predef_action(PREDEF_SET_MIN_FREQUENCY, 2, buf_pid, buf_freq);
374 API int deviced_release_cpu_max_frequency()
378 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
380 return deviced_call_predef_action(PREDEF_RELEASE_MAX_FREQUENCY, 1, buf_pid);
383 API int deviced_release_cpu_min_frequency()
387 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
389 return deviced_call_predef_action(PREDEF_RELEASE_MIN_FREQUENCY, 1, buf_pid);