4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
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.
20 #include <sys/types.h>
21 #include <sys/socket.h>
28 #include <vconf-keys.h>
31 #include "dd-deviced.h"
32 #include "deviced-priv.h"
36 #define PREDEF_PWROFF_POPUP "pwroff-popup"
37 #define PREDEF_ENTERSLEEP "entersleep"
38 #define PREDEF_LEAVESLEEP "leavesleep"
39 #define PREDEF_REBOOT "reboot"
40 #define PREDEF_BACKGRD "backgrd"
41 #define PREDEF_FOREGRD "foregrd"
42 #define PREDEF_ACTIVE "active"
43 #define PREDEF_INACTIVE "inactive"
44 #define PREDEF_SET_DATETIME "set_datetime"
45 #define PREDEF_SET_TIMEZONE "set_timezone"
47 #define PREDEF_SET_MAX_FREQUENCY "set_max_frequency"
48 #define PREDEF_SET_MIN_FREQUENCY "set_min_frequency"
49 #define PREDEF_RELEASE_MAX_FREQUENCY "release_max_frequency"
50 #define PREDEF_RELEASE_MIN_FREQUENCY "release_min_frequency"
52 #define PREDEF_FACTORY_MODE "factorymode"
54 #define PREDEF_DUMP_LOG "dump_log"
55 #define PREDEF_DELETE_DUMP "delete_dump"
56 #define FLIGHT_MODE "flightmode"
58 #define ALARM_BUS_NAME "com.samsung.alarm.manager"
59 #define ALARM_PATH_NAME "/com/samsung/alarm/manager"
60 #define ALARM_INTERFACE_NAME ALARM_BUS_NAME
61 #define ALARM_SET_TIME_METHOD "alarm_set_time"
63 enum deviced_noti_cmd {
68 #define SYSTEM_NOTI_SOCKET_PATH "/tmp/sn"
69 #define RETRY_READ_COUNT 10
71 static inline int send_int(int fd, int val)
73 return write(fd, &val, sizeof(int));
76 static inline int send_str(int fd, char *str)
82 ret = write(fd, &len, sizeof(int));
85 if (len > SYSTEM_NOTI_MAXSTR)
86 len = SYSTEM_NOTI_MAXSTR;
87 write(fd, &len, sizeof(int));
88 ret = write(fd, str, len);
93 static int noti_send(struct sysnoti *msg)
100 struct sockaddr_un clientaddr;
103 client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
104 if (client_sockfd == -1) {
105 _E("socket create failed");
108 bzero(&clientaddr, sizeof(clientaddr));
109 clientaddr.sun_family = AF_UNIX;
110 strncpy(clientaddr.sun_path, SYSTEM_NOTI_SOCKET_PATH, sizeof(clientaddr.sun_path) - 1);
111 client_len = sizeof(clientaddr);
113 if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) <
115 _E("connect failed");
116 close(client_sockfd);
120 send_int(client_sockfd, msg->pid);
121 send_int(client_sockfd, msg->cmd);
122 send_str(client_sockfd, msg->type);
123 send_str(client_sockfd, msg->path);
124 send_int(client_sockfd, msg->argc);
125 for (i = 0; i < msg->argc; i++)
126 send_str(client_sockfd, msg->argv[i]);
128 while (retry_count < RETRY_READ_COUNT) {
129 r = read(client_sockfd, &result, sizeof(int));
131 if (errno == EINTR) {
132 _E("Re-read for error(EINTR)");
136 _E("Read fail for str length");
143 if (retry_count == RETRY_READ_COUNT) {
144 _E("Read retry failed");
147 close(client_sockfd);
151 static int dbus_flightmode_handler(char* type, char *buf)
162 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
163 DEVICED_PATH_POWER, DEVICED_INTERFACE_POWER,
168 dbus_error_init(&err);
170 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
172 _E("no message : [%s:%s]", err.name, err.message);
176 dbus_message_unref(msg);
177 dbus_error_free(&err);
179 _D("%s-%s : %d", DEVICED_INTERFACE_POWER, pa[0], val);
183 API int deviced_change_flightmode(int mode)
186 snprintf(buf, sizeof(buf), "%d", mode);
187 return dbus_flightmode_handler(FLIGHT_MODE, buf);
190 API int deviced_call_predef_action(const char *type, int num, ...)
198 if (type == NULL || num > SYSTEM_NOTI_MAXARG) {
203 msg = malloc(sizeof(struct sysnoti));
206 /* Do something for not enought memory error */
211 msg->cmd = CALL_deviced_ACTION;
212 msg->type = (char *)type;
216 va_start(argptr, num);
217 for (i = 0; i < num; i++) {
218 args = va_arg(argptr, char *);
223 ret = noti_send(msg);
229 static int dbus_proc_handler(char* type, char *buf)
240 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
241 DEVICED_PATH_PROCESS, DEVICED_INTERFACE_PROCESS,
246 dbus_error_init(&err);
248 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
250 _E("no message : [%s:%s]", err.name, err.message);
254 dbus_message_unref(msg);
255 dbus_error_free(&err);
257 _D("%s-%s : %d", DEVICED_INTERFACE_PROCESS, pa[0], val);
261 API int deviced_inform_foregrd(void)
264 snprintf(buf, sizeof(buf), "%d", getpid());
265 return dbus_proc_handler(PREDEF_FOREGRD, buf);
268 API int deviced_inform_backgrd(void)
271 snprintf(buf, sizeof(buf), "%d", getpid());
272 return dbus_proc_handler(PREDEF_BACKGRD, buf);
275 API int deviced_inform_active(pid_t pid)
278 snprintf(buf, sizeof(buf), "%d", pid);
279 return dbus_proc_handler(PREDEF_ACTIVE, buf);
282 API int deviced_inform_inactive(pid_t pid)
285 snprintf(buf, sizeof(buf), "%d", pid);
286 return dbus_proc_handler(PREDEF_INACTIVE, buf);
289 static int dbus_power_handler(char* type)
299 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
300 DEVICED_PATH_POWER, DEVICED_INTERFACE_POWER,
305 dbus_error_init(&err);
307 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
309 _E("no message : [%s:%s]", err.name, err.message);
313 dbus_message_unref(msg);
314 dbus_error_free(&err);
316 _D("%s-%s : %d", DEVICED_INTERFACE_POWER, pa[0], val);
320 API int deviced_request_poweroff(void)
322 return dbus_power_handler(PREDEF_PWROFF_POPUP);
325 API int deviced_request_entersleep(void)
327 return dbus_power_handler(PREDEF_ENTERSLEEP);
330 API int deviced_request_leavesleep(void)
332 return dbus_power_handler(PREDEF_LEAVESLEEP);
335 API int deviced_request_reboot(void)
337 return dbus_power_handler(PREDEF_REBOOT);
340 static int dbus_time_handler(char* type, char* buf)
354 ret = deviced_get_cmdline_name(pid, name, sizeof(name));
356 snprintf(name, sizeof(name), "%d", pid);
358 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
359 DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI,
364 dbus_error_init(&err);
366 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
368 _E("no message : [%s:%s]", err.name, err.message);
372 dbus_message_unref(msg);
373 dbus_error_free(&err);
375 _SI("[%s] %s-%s(%s) : %d", name, DEVICED_INTERFACE_SYSNOTI, pa[0], pa[2], val);
380 static DBusMessage *alarm_set_time_sync_with_reply(time_t timet)
382 DBusConnection *conn;
384 DBusMessageIter iter;
389 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
391 _E("dbus_bus_get error");
395 msg = dbus_message_new_method_call(ALARM_BUS_NAME, ALARM_PATH_NAME, ALARM_INTERFACE_NAME, ALARM_SET_TIME_METHOD);
397 _E("dbus_message_new_method_call(%s:%s-%s)",
398 ALARM_PATH_NAME, ALARM_INTERFACE_NAME, ALARM_SET_TIME_METHOD);
402 dbus_message_iter_init_append(msg, &iter);
403 dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &timet);
405 dbus_error_init(&err);
407 reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
409 _E("dbus_connection_send error(No reply) %s %s:%s-%s",
410 ALARM_BUS_NAME, ALARM_PATH_NAME, ALARM_INTERFACE_NAME, ALARM_SET_TIME_METHOD);
413 if (dbus_error_is_set(&err)) {
414 _E("dbus_connection_send error(%s:%s) %s %s:%s-%s",
415 err.name, err.message, ALARM_BUS_NAME, ALARM_PATH_NAME, ALARM_INTERFACE_NAME, ALARM_SET_TIME_METHOD);
416 dbus_error_free(&err);
420 dbus_message_unref(msg);
424 static int alarm_set_time(time_t timet)
433 ret = deviced_get_cmdline_name(pid, name, sizeof(name));
435 snprintf(name, sizeof(name), "%d", pid);
436 _SI("[%s]start %s %ld", name, ALARM_INTERFACE_NAME, timet);
438 msg = alarm_set_time_sync_with_reply(timet);
442 dbus_error_init(&err);
444 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
446 _E("no message : [%s:%s]", err.name, err.message);
450 dbus_message_unref(msg);
451 dbus_error_free(&err);
453 _SI("[%s]end %s %ld, %d", name, ALARM_INTERFACE_NAME, timet, val);
457 API int deviced_set_datetime(time_t timet)
461 return alarm_set_time(timet);
464 API int deviced_set_timezone(char *tzpath_str)
466 if (tzpath_str == NULL)
469 snprintf(buf, sizeof(buf), "%s", tzpath_str);
470 return dbus_time_handler(PREDEF_SET_TIMEZONE, buf);
473 static int dbus_cpu_handler(char* type, char* buf_pid, char* buf_freq)
485 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
486 DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI,
491 dbus_error_init(&err);
493 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
495 _E("no message : [%s:%s]", err.name, err.message);
499 dbus_message_unref(msg);
500 dbus_error_free(&err);
502 _D("%s-%s : %d", DEVICED_INTERFACE_SYSNOTI, pa[0], val);
506 API int deviced_request_set_cpu_max_frequency(int val)
511 // to do - need to check new frequncy is valid
512 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
513 snprintf(buf_freq, sizeof(buf_freq), "%d", val * 1000);
515 return dbus_cpu_handler(PREDEF_SET_MAX_FREQUENCY, buf_pid, buf_freq);
518 API int deviced_request_set_cpu_min_frequency(int val)
523 // to do - need to check new frequncy is valid
524 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
525 snprintf(buf_freq, sizeof(buf_freq), "%d", val * 1000);
527 return dbus_cpu_handler(PREDEF_SET_MIN_FREQUENCY, buf_pid, buf_freq);
530 API int deviced_release_cpu_max_frequency()
534 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
536 return dbus_cpu_handler(PREDEF_RELEASE_MAX_FREQUENCY, buf_pid, "2");
539 API int deviced_release_cpu_min_frequency()
543 snprintf(buf_pid, sizeof(buf_pid), "%d", getpid());
545 return dbus_cpu_handler(PREDEF_RELEASE_MIN_FREQUENCY, buf_pid, "2");
548 static int dbus_factory_handler(char* type, char* buf)
559 msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
560 DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI,
565 dbus_error_init(&err);
567 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
569 _E("no message : [%s:%s]", err.name, err.message);
573 dbus_message_unref(msg);
574 dbus_error_free(&err);
576 _D("%s-%s : %d", DEVICED_INTERFACE_SYSNOTI, pa[0], val);
580 API int deviced_request_set_factory_mode(int val)
583 if ( val == 0 || val == 1 ) {
584 snprintf(buf_mode, sizeof(buf_mode), "%d", val);
585 return dbus_factory_handler(PREDEF_FACTORY_MODE, buf_mode);
591 static int dbus_crash_handler(char* type, char* buf)
601 msg = dbus_method_sync_with_reply(CRASHD_BUS_NAME,
602 CRASHD_PATH_CRASH, CRASHD_INTERFACE_CRASH,
607 dbus_error_init(&err);
609 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
611 _E("no message : [%s:%s]", err.name, err.message);
615 dbus_message_unref(msg);
616 dbus_error_free(&err);
618 _D("%s-%s : %d", CRASHD_INTERFACE_CRASH, pa[0], val);
622 API int deviced_request_dump_log(int type)
625 if ( type == AP_DUMP || type == CP_DUMP || type == ALL_DUMP) {
626 snprintf(buf_mode, sizeof(buf_mode), "%d", type);
627 return dbus_crash_handler(PREDEF_DUMP_LOG, buf_mode);
633 API int deviced_request_delete_dump(char *ticket)
636 if ( ticket == NULL) {
639 snprintf(buf, sizeof(buf), "%s", ticket);
640 return dbus_crash_handler(PREDEF_DELETE_DUMP, buf);