From fc2ae99eefeaacc062a66127e3d6e4878a8e4fa6 Mon Sep 17 00:00:00 2001 From: Sung-jae Park Date: Fri, 1 Feb 2013 18:34:19 +0000 Subject: [PATCH] Update the liveinfo. Change-Id: I04814f6cd4b8539c2ea3f6a6ab0ed03f139f03ce --- packaging/org.tizen.data-provider-master.spec | 2 +- util_liveinfo/src/liveinfo.c | 122 +++++++++++++++++--------- util_liveinfo/src/node.c | 12 ++- 3 files changed, 93 insertions(+), 43 deletions(-) diff --git a/packaging/org.tizen.data-provider-master.spec b/packaging/org.tizen.data-provider-master.spec index 8d901f3..8ab615b 100644 --- a/packaging/org.tizen.data-provider-master.spec +++ b/packaging/org.tizen.data-provider-master.spec @@ -1,6 +1,6 @@ Name: org.tizen.data-provider-master Summary: Master service provider for liveboxes. -Version: 0.15.6 +Version: 0.15.7 Release: 1 Group: framework/livebox License: Flora License diff --git a/util_liveinfo/src/liveinfo.c b/util_liveinfo/src/liveinfo.c index fe9a97e..3a72f91 100644 --- a/util_liveinfo/src/liveinfo.c +++ b/util_liveinfo/src/liveinfo.c @@ -218,7 +218,7 @@ static inline void ls(void) } info = node_data(node); - printf(" %3d %20s %5s ", info->inst_count, info->slavename ? info->slavename : "-", info->abi ? info->abi : "-"); + printf(" %3d %20s %5s ", info->inst_count, info->slavename ? info->slavename : "(none)", info->abi ? info->abi : "?"); } else if (is_provider) { struct slave *info; @@ -230,7 +230,7 @@ static inline void ls(void) } info = node_data(node); - printf(" %3d %5s %5.2f ", info->loaded_inst, info->abi ? info->abi : "-", info->ttl); + printf(" %3d %5s %5.2f ", info->loaded_inst, info->abi ? info->abi : "?", info->ttl); } else if (is_instance) { struct instance *info; struct stat stat; @@ -308,6 +308,59 @@ static void send_command(const char *cmd, const char *var, const char *val) s_info.age++; } +static int pkglist_cb(const char *appid, const char *lbid, int is_prime, void *data) +{ + struct node *parent = data; + struct node *node; + struct package *info; + + node = node_find(parent, lbid); + if (node) { + info = node_data(node); + if (!info) { + printf("Invalid node\n"); + return -EINVAL; + } + + free(info->pkgid); + info->pkgid = strdup(appid); + if (!info->pkgid) { + printf("Error: %s\n", strerror(errno)); + return -ENOMEM; + } + + node_set_age(node, s_info.age); + return 0; + } + + info = calloc(1, sizeof(*info)); + if (!info) { + printf("Error: %s\n", strerror(errno)); + return -ENOMEM; + } + + info->pkgid = strdup(appid); + if (!info->pkgid) { + printf("Error: %s\n", strerror(errno)); + free(info); + return -ENOMEM; + } + + info->primary = is_prime; + + node = node_create(parent, lbid, NODE_DIR); + if (!node) { + free(info->pkgid); + free(info); + return -ENOMEM; + } + + node_set_mode(node, NODE_READ | NODE_EXEC); + node_set_data(node, info); + node_set_age(node, s_info.age); + return 0; +} + static void send_pkg_list(void) { struct packet *packet; @@ -327,6 +380,8 @@ static void send_pkg_list(void) packet_destroy(packet); s_info.cmd = PKG_LIST; s_info.age++; + + livebox_service_get_pkglist(pkglist_cb, s_info.targetdir); } static void send_inst_delete(void) @@ -404,39 +459,6 @@ static inline void help(void) printf("----------------------------------------------------------------------------\n"); } -static int pkglist_cb(const char *appid, const char *lbid, int is_prime, void *data) -{ - struct node *parent = data; - struct node *node; - struct package *info; - - info = calloc(1, sizeof(*info)); - if (!info) { - printf("Error: %s\n", strerror(errno)); - return -ENOMEM; - } - - info->pkgid = strdup(appid); - if (!info->pkgid) { - printf("Error: %s\n", strerror(errno)); - free(info); - return -ENOMEM; - } - - info->primary = is_prime; - - node = node_create(parent, lbid, NODE_DIR); - if (!node) { - free(info->pkgid); - free(info); - return -ENOMEM; - } - - node_set_mode(node, NODE_READ | NODE_EXEC); - node_set_data(node, info); - return 0; -} - static inline void init_directory(void) { struct node *node; @@ -463,7 +485,6 @@ static inline void init_directory(void) node_set_mode(node, NODE_READ | NODE_EXEC); s_info.curdir = s_info.rootdir; - livebox_service_get_pkglist(pkglist_cb, node); return; } @@ -481,7 +502,7 @@ static inline void do_command(const char *cmd) return; } - if (sscanf(cmd, "%255[^ ] %4095[^\\0]", command, argument) == 2) + if (sscanf(cmd, "%255[^ ] %s", command, argument) == 2) cmd = command; if (!strcasecmp(cmd, "exit") || !strcasecmp(cmd, "quit")) { @@ -490,7 +511,7 @@ static inline void do_command(const char *cmd) char variable[4096] = { '0', }; char value[4096] = { '0', }; - if (sscanf(argument, "%4095[^ ] %4095[^ ]", variable, value) != 2) { + if (sscanf(argument, "%4095[^ ] %s", variable, value) != 2) { printf("Invalid argument(%s): set [VAR] [VAL]\n", argument); goto out; } @@ -709,14 +730,14 @@ static void processing_line_buffer(const char *buffer) switch (s_info.cmd) { case PKG_LIST: - if (sscanf(buffer, "%d %[^ ] %[^ ] %[^ ] %d %d %d", &pid, slavename, pkgname, abi, &refcnt, &fault_count, &list_count) != 7) { + if (sscanf(buffer, "%d %255[^ ] %255[^ ] %255[^ ] %d %d %d", &pid, slavename, pkgname, abi, &refcnt, &fault_count, &list_count) != 7) { printf("Invalid format : [%s]\n", buffer); return; } node = node_find(s_info.targetdir, pkgname); if (!node) { - pkginfo = malloc(sizeof(*pkginfo)); + pkginfo = calloc(1, sizeof(*pkginfo)); if (!pkginfo) { printf("Error: %s\n", strerror(errno)); return; @@ -740,6 +761,10 @@ static void processing_line_buffer(const char *buffer) node_set_data(node, pkginfo); } else { pkginfo = node_data(node); + if (!pkginfo) { + printf("Package info is inavlid\n"); + return; + } free(pkginfo->slavename); free(pkginfo->abi); @@ -941,6 +966,21 @@ static Eina_Bool read_cb(void *data, Ecore_Fd_Handler *fd_handler) } if (ch == '\n') { /* End of a line */ + if (line_index == bufsz - 1) { + char *new_buf; + new_buf = realloc(line_buffer, bufsz + 2); + if (!new_buf) { + printf("Error: %s\n", strerror(errno)); + free(line_buffer); + line_buffer = NULL; + line_index = 0; + bufsz = 256; + return ECORE_CALLBACK_CANCEL; + } + + line_buffer = new_buf; + } + line_buffer[line_index] = '\0'; if (!strcmp(line_buffer, "EOD")) { @@ -964,7 +1004,7 @@ static Eina_Bool read_cb(void *data, Ecore_Fd_Handler *fd_handler) if (!new_buf) { printf("Error: %s\n", strerror(errno)); free(line_buffer); - line_buffer = 0; + line_buffer = NULL; line_index = 0; bufsz = 256; return ECORE_CALLBACK_CANCEL; diff --git a/util_liveinfo/src/node.c b/util_liveinfo/src/node.c index 4ab1573..108f4c6 100644 --- a/util_liveinfo/src/node.c +++ b/util_liveinfo/src/node.c @@ -257,18 +257,28 @@ void node_delete(struct node *node, void (del_cb)(struct node *node)) if (node->sibling.next) node->sibling.next->sibling.prev = node->sibling.prev; + /* Isolate the node */ + node->sibling.prev = NULL; + node->sibling.next = NULL; + if (node->parent) { - node->parent->child = NULL; + if (node->parent->child == node) + node->parent->child = NULL; + node->parent = NULL; } tmp = node; while (tmp) { + /* Reach to the leaf node */ while (tmp->child) tmp = tmp->child; parent = tmp->parent; next = tmp->sibling.next; + if (parent && parent->child == tmp) + parent->child = NULL; + if (del_cb) del_cb(tmp); -- 2.7.4