diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipcpd/ipcp-data.c | 18 | ||||
| -rw-r--r-- | src/ipcpd/ipcp-data.h | 2 | ||||
| -rw-r--r-- | src/ipcpd/ipcp.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/shim-udp/main.c | 29 | ||||
| -rw-r--r-- | src/ipcpd/shim-udp/tests/shim_udp_test.c | 3 | ||||
| -rw-r--r-- | src/irmd/main.c | 127 | ||||
| -rw-r--r-- | src/lib/ipcp.c | 21 | ||||
| -rw-r--r-- | src/lib/irm.c | 10 | ||||
| -rw-r--r-- | src/tools/irm/irm_create_ipcp.c | 11 | 
9 files changed, 97 insertions, 127 deletions
diff --git a/src/ipcpd/ipcp-data.c b/src/ipcpd/ipcp-data.c index e6997e3e..106226de 100644 --- a/src/ipcpd/ipcp-data.c +++ b/src/ipcpd/ipcp-data.c @@ -104,18 +104,28 @@ struct ipcp_data * ipcp_data_create()  }  struct ipcp_data * ipcp_data_init(struct ipcp_data * dst, -                                  instance_name_t * iname, -                                  enum ipcp_type    ipcp_type) +                                  const char *       ipcp_name, +                                  enum ipcp_type     ipcp_type)  {          if (dst == NULL)                  return NULL; -        dst->iname = instance_name_dup(iname); +        dst->iname = instance_name_create(); +        if (dst->iname == NULL) +                return NULL; + +        if(instance_name_init_from(dst->iname, ipcp_name, getpid()) == NULL) { +                instance_name_destroy(dst->iname); +                return NULL; +        } +          dst->type  = ipcp_type;          dst->dum = shm_du_map_open(); -        if (dst->dum == NULL) +        if (dst->dum == NULL) { +                instance_name_destroy(dst->iname);                  return NULL; +        }          /* init the lists */          INIT_LIST_HEAD(&dst->registry); diff --git a/src/ipcpd/ipcp-data.h b/src/ipcpd/ipcp-data.h index 7e48df24..1dea8c3c 100644 --- a/src/ipcpd/ipcp-data.h +++ b/src/ipcpd/ipcp-data.h @@ -53,7 +53,7 @@ struct ipcp_data {  struct ipcp_data * ipcp_data_create();  struct ipcp_data * ipcp_data_init(struct ipcp_data * dst, -                                  instance_name_t *  iname, +                                  const char *       ipcp_name,                                    enum ipcp_type     ipcp_type);  void               ipcp_data_destroy(struct ipcp_data * data); diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index c1071e05..23c432f1 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -31,7 +31,7 @@  int ipcp_arg_check(int argc, char * argv[])  { -        if (argc != 4) +        if (argc != 3)                  return -1;          /* argument 1: pid of irmd */ @@ -41,7 +41,6 @@ int ipcp_arg_check(int argc, char * argv[])          /* name conformity responsibility of NMS */          /* argument 2: ap name */ -        /* argument 3: instance id */          return 0;  } diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index f67c66ca..785f2344 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -96,7 +96,7 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c)          case SIGHUP:                  LOG_DBG("Terminating by order of %d. Bye.", info->si_pid);                  if (info->si_pid == irmd_pid) { -                        shm_du_map_close(_ipcp->data->dum); +                        /* shm_du_map_close(_ipcp->data->dum); */                          exit(0);                  }          default: @@ -104,29 +104,13 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c)          }  } -struct ipcp_udp_data * ipcp_udp_data_create(char * ap_name, -                                            char * ap_id) +struct ipcp_udp_data * ipcp_udp_data_create(char * ap_name)  {          struct ipcp_udp_data * udp_data;          struct ipcp_data *     data; -        instance_name_t *      instance_name;          enum ipcp_type         ipcp_type;          int                    n; -        instance_name = instance_name_create(); -        if (instance_name  == NULL) { -                LOG_ERR("Failed to create instance name struct."); -                return NULL; -        } - -        instance_name = instance_name_init_with( -                instance_name, ap_name, (uint16_t) atoi(ap_id)); - -        if (instance_name == NULL) { -                LOG_ERR("Failed to create instance name struct."); -                return NULL; -        } -          udp_data = malloc(sizeof *udp_data);          if (udp_data == NULL) {                  LOG_DBGF("Failed to allocate."); @@ -135,7 +119,7 @@ struct ipcp_udp_data * ipcp_udp_data_create(char * ap_name,          ipcp_type = THIS_TYPE;          data = (struct ipcp_data *) udp_data; -        if (ipcp_data_init(data, instance_name, ipcp_type) == NULL) { +        if (ipcp_data_init(data, ap_name, ipcp_type) == NULL) {                  free(udp_data);                  return NULL;          } @@ -548,7 +532,7 @@ int ipcp_udp_du_read(uint32_t port_id,          return 0;  } -struct ipcp * ipcp_udp_create(char * ap_name, char * i_id) +struct ipcp * ipcp_udp_create(char * ap_name)  {          struct ipcp * i;          struct ipcp_udp_data * data; @@ -558,7 +542,7 @@ struct ipcp * ipcp_udp_create(char * ap_name, char * i_id)          if (i == NULL)                  return NULL; -        data = ipcp_udp_data_create(ap_name, i_id); +        data = ipcp_udp_data_create(ap_name);          if (data == NULL) {                  free(i);                  return NULL; @@ -597,7 +581,6 @@ int main (int argc, char * argv[])  {          /* argument 1: pid of irmd ? */          /* argument 2: ap name */ -        /* argument 3: instance id */          struct sigaction sig_act;          if (ipcp_arg_check(argc, argv)) { @@ -619,7 +602,7 @@ int main (int argc, char * argv[])          sigaction(SIGTERM, &sig_act, NULL);          sigaction(SIGHUP,  &sig_act, NULL); -        _ipcp = ipcp_udp_create(argv[2], argv[3]); +        _ipcp = ipcp_udp_create(argv[2]);          if (_ipcp == NULL) {                  LOG_ERR("Won't.");                  exit(1); diff --git a/src/ipcpd/shim-udp/tests/shim_udp_test.c b/src/ipcpd/shim-udp/tests/shim_udp_test.c index 0fcf9f4d..4e0c2dd6 100644 --- a/src/ipcpd/shim-udp/tests/shim_udp_test.c +++ b/src/ipcpd/shim-udp/tests/shim_udp_test.c @@ -39,7 +39,6 @@ int shim_udp_test(int argc, char ** argv)          /* argument 3: instance id */          struct shm_du_map * dum;          char * ipcp_name = "test-shim-ipcp"; -        char * i_id = "1";          int i = 0;          char bogus[15]; @@ -57,7 +56,7 @@ int shim_udp_test(int argc, char ** argv)                  exit(1);          } -        _ipcp = ipcp_udp_create(ipcp_name, i_id); +        _ipcp = ipcp_udp_create(ipcp_name);          if (_ipcp == NULL) {                  LOG_ERR("Could not instantiate shim IPCP.");                  shm_du_map_close(dum); diff --git a/src/irmd/main.c b/src/irmd/main.c index df3070f4..c47bcffc 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -48,7 +48,6 @@  struct ipcp_entry {          struct list_head  next; -        pid_t             pid;          instance_name_t * api;          char *            dif_name;  }; @@ -75,8 +74,9 @@ struct irm {  struct irm * instance = NULL; -static pid_t find_pid_by_ipcp_name(instance_name_t * api) +static struct ipcp_entry * find_ipcp_entry_by_name(instance_name_t * api)  { +        struct ipcp_entry * tmp = NULL;          struct list_head * pos = NULL;          list_for_each(pos, &instance->ipcps) { @@ -84,44 +84,43 @@ static pid_t find_pid_by_ipcp_name(instance_name_t * api)                          list_entry(pos, struct ipcp_entry, next);                  if (instance_name_cmp(api, tmp->api) == 0) -                        return tmp->pid; +                        return tmp;          } -        return 0; +        return tmp;  } -static struct ipcp_entry * find_ipcp_by_name(instance_name_t * api) +static instance_name_t * get_ipcp_by_name(char * ap_name)  { -        struct ipcp_entry * tmp = NULL;          struct list_head * pos = NULL;          list_for_each(pos, &instance->ipcps) { -                struct ipcp_entry * tmp = +                struct ipcp_entry * e =                          list_entry(pos, struct ipcp_entry, next); -                if (instance_name_cmp(api, tmp->api) == 0) -                        return tmp; +                if (strcmp(e->api->name, ap_name) == 0) +                        return e->api;          } -        return tmp; +        return NULL;  } -static pid_t find_pid_by_dif_name(char * dif_name) +static instance_name_t * get_ipcp_by_dif_name(char * dif_name)  {          struct list_head * pos = NULL;          list_for_each(pos, &instance->ipcps) { -                struct ipcp_entry * tmp = +                struct ipcp_entry * e =                          list_entry(pos, struct ipcp_entry, next); -                if (tmp->dif_name == NULL) -                        return tmp->pid; +                if (e->dif_name == NULL) +                        continue; -                if (strcmp(dif_name, tmp->dif_name) == 0) -                        return tmp->pid; +                if (strcmp(dif_name, e->dif_name) == 0) +                        return e->api;          } -        return 0; +        return NULL;  }  static struct reg_name_entry * reg_name_entry_create() @@ -219,13 +218,13 @@ static int reg_name_entry_del_name(char * name)          return 0;  } -static int create_ipcp(instance_name_t * api, -                       enum ipcp_type    ipcp_type) +static int create_ipcp(char *         ap_name, +                       enum ipcp_type ipcp_type)  {          pid_t pid;          struct ipcp_entry * tmp = NULL; -        pid = ipcp_create(api, ipcp_type); +        pid = ipcp_create(ap_name, ipcp_type);          if (pid == -1) {                  LOG_ERR("Failed to create IPCP");                  return -1; @@ -238,13 +237,18 @@ static int create_ipcp(instance_name_t * api,          INIT_LIST_HEAD(&tmp->next); -        tmp->pid = pid; -        tmp->api = instance_name_dup(api); +        tmp->api = instance_name_create();          if (tmp->api == NULL) {                  free(tmp);                  return -1;          } +        if(instance_name_init_from(tmp->api, ap_name, pid) == NULL) { +                instance_name_destroy(tmp->api); +                free(tmp); +                return -1; +        } +          tmp->dif_name = NULL;          LOG_DBG("Created IPC process with pid %d", pid); @@ -255,19 +259,20 @@ static int create_ipcp(instance_name_t * api,  static int destroy_ipcp(instance_name_t * api)  { -        pid_t pid = 0;          struct list_head * pos = NULL;          struct list_head * n = NULL; -        pid = find_pid_by_ipcp_name(api); -        if (pid == 0) { -                LOG_ERR("No such IPCP"); +        if (api->id == 0) +                api = get_ipcp_by_name(api->name); + +        if (api == NULL) { +                LOG_ERR("No such IPCP in the system.");                  return -1;          } -        LOG_DBG("Destroying ipcp with pid %d", pid); +        LOG_DBG("Destroying ipcp %s-%d", api->name, api->id); -        if (ipcp_destroy(pid)) +        if (ipcp_destroy(api->id))                  LOG_ERR("Could not destroy IPCP");          list_for_each_safe(pos, n, &(instance->ipcps)) { @@ -286,7 +291,15 @@ static int bootstrap_ipcp(instance_name_t *  api,  {          struct ipcp_entry * entry = NULL; -        entry = find_ipcp_by_name(api); +        if (api->id == 0) +                api = get_ipcp_by_name(api->name); + +        if (api == NULL) { +                LOG_ERR("No such IPCP in the system."); +                return -1; +        } + +        entry = find_ipcp_entry_by_name(api);          if (entry == NULL) {                  LOG_ERR("No such IPCP");                  return -1; @@ -298,7 +311,7 @@ static int bootstrap_ipcp(instance_name_t *  api,                  return -1;          } -        if (ipcp_bootstrap(entry->pid, conf)) { +        if (ipcp_bootstrap(entry->api->id, conf)) {                  LOG_ERR("Could not bootstrap IPCP");                  free(entry->dif_name);                  entry->dif_name = NULL; @@ -316,7 +329,7 @@ static int enroll_ipcp(instance_name_t  * api,          ssize_t n_1_difs_size = 0;          struct ipcp_entry * entry = NULL; -        entry = find_ipcp_by_name(api); +        entry = find_ipcp_entry_by_name(api);          if (entry == NULL) {                  LOG_ERR("No such IPCP");                  return -1; @@ -344,7 +357,7 @@ static int enroll_ipcp(instance_name_t  * api,                  return -1;          } -        if (ipcp_enroll(entry->pid, member, n_1_difs[0])) { +        if (ipcp_enroll(entry->api->id, member, n_1_difs[0])) {                  LOG_ERR("Could not enroll IPCP");                  free(entry->dif_name);                  entry->dif_name = NULL; @@ -358,15 +371,7 @@ static int reg_ipcp(instance_name_t * api,                      char **           difs,                      size_t            difs_size)  { -        pid_t pid = 0; - -        pid = find_pid_by_ipcp_name(api); -        if (pid == 0) { -                LOG_ERR("No such IPCP"); -                return -1; -        } - -        if (ipcp_reg(pid, difs, difs_size)) { +        if (ipcp_reg(api->id, difs, difs_size)) {                  LOG_ERR("Could not register IPCP to N-1 DIF(s)");                  return -1;          } @@ -378,15 +383,8 @@ static int unreg_ipcp(instance_name_t  * api,                        char **            difs,                        size_t             difs_size)  { -        pid_t pid = 0; - -        pid = find_pid_by_ipcp_name(api); -        if (pid == 0) { -                LOG_ERR("No such IPCP"); -                return -1; -        } -        if (ipcp_unreg(pid, difs, difs_size)) { +        if (ipcp_unreg(api->id, difs, difs_size)) {                  LOG_ERR("Could not unregister IPCP from N-1 DIF(s)");                  return -1;          } @@ -418,7 +416,7 @@ static int ap_unreg_id(uint32_t reg_ap_id,                          struct ipcp_entry * e =                                  list_entry(pos, struct ipcp_entry, next); -                        if (ipcp_name_unreg(e->pid, rne->name)) { +                        if (ipcp_name_unreg(e->api->id, rne->name)) {                                  LOG_ERR("Could not unregister %s in DIF %s.",                                          rne->name, e->dif_name);                                  --ret; @@ -426,12 +424,6 @@ static int ap_unreg_id(uint32_t reg_ap_id,                  }          } else {                  for (i = 0; i < len; ++i) { -                        pid = find_pid_by_dif_name(difs[i]); -                        if (pid == 0) { -                                LOG_ERR("%s: No such DIF.", difs[i]); -                                continue; -                        } -                          if (ipcp_name_unreg(pid, rne->name)) {                                  LOG_ERR("Could not unregister %s in DIF %s.",                                          rne->name, difs[i]); @@ -450,14 +442,14 @@ static int ap_reg(char *  ap_name,                    char ** difs,                    size_t  len)  { -        pid_t pid = 0;          int i;          int ret = 0;          int reg_ap_id = 0;          struct list_head * pos = NULL;          struct reg_name_entry * rne = NULL; -        instance_name_t * api = NULL; +        instance_name_t * api   = NULL; +        instance_name_t * ipcpi = NULL;          if (instance->ipcps.next == NULL)                  LOG_ERR("No IPCPs in this system."); @@ -493,7 +485,7 @@ static int ap_reg(char *  ap_name,                          struct ipcp_entry * e =                                  list_entry(pos, struct ipcp_entry, next); -                        if (ipcp_name_reg(e->pid, api->name)) { +                        if (ipcp_name_reg(e->api->id, ap_name)) {                                  LOG_ERR("Could not register %s in DIF %s.",                                          api->name, e->dif_name);                          } else { @@ -502,13 +494,13 @@ static int ap_reg(char *  ap_name,                  }          } else {                  for (i = 0; i < len; ++i) { -                        pid = find_pid_by_dif_name(difs[i]); -                        if (pid == 0) { +                        ipcpi = get_ipcp_by_dif_name(difs[i]); +                        if (ipcpi == NULL) {                                  LOG_ERR("%s: No such DIF.", difs[i]);                                  continue;                          } -                        if (ipcp_name_reg(pid, api->name)) { +                        if (ipcp_name_reg(ipcpi->id, api->name)) {                                  LOG_ERR("Could not register %s in DIF %s.",                                          api->name, difs[i]);                          } else { @@ -539,6 +531,7 @@ static int ap_unreg(char *  ap_name,          instance_name_t * api = instance_name_create();          if (api == NULL)                  return -1; +          if (instance_name_init_from(api, ap_name, ap_id) == NULL) {                  instance_name_destroy(api);                  return -1; @@ -652,14 +645,17 @@ int main()          if (instance == NULL)                  return -1; -        if ((instance->dum = shm_du_map_create()) == NULL) +        if ((instance->dum = shm_du_map_create()) == NULL) { +                free(instance);                  return -1; +        }          INIT_LIST_HEAD(&instance->ipcps);          INIT_LIST_HEAD(&instance->reg_names);          sockfd = server_socket_open(IRM_SOCK_PATH);          if (sockfd < 0) { +                shm_du_map_close(instance->dum);                  free(instance);                  return -1;          } @@ -694,12 +690,13 @@ int main()                  }                  api.name = msg->ap_name; -                api.id   = msg->api_id; +                if (msg->has_api_id == true) +                        api.id = msg->api_id;                  switch (msg->code) {                  case IRM_MSG_CODE__IRM_CREATE_IPCP:                          ret_msg.has_result = true; -                        ret_msg.result = create_ipcp(&api, +                        ret_msg.result = create_ipcp(msg->ap_name,                                                       msg->ipcp_type);                          break;                  case IRM_MSG_CODE__IRM_DESTROY_IPCP: diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index b93f5488..387572b3 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -99,12 +99,11 @@ static ipcp_msg_t * send_recv_ipcp_msg(pid_t pid,         return recv_msg;  } -pid_t ipcp_create(instance_name_t * api, -                  enum ipcp_type    ipcp_type) +pid_t ipcp_create(char *         ipcp_name, +                  enum ipcp_type ipcp_type)  {          pid_t pid = 0;          char irmd_pid[10]; -        char * api_id = NULL;          size_t len = 0;          char * ipcp_dir = "bin";          char * full_name = NULL; @@ -122,21 +121,12 @@ pid_t ipcp_create(instance_name_t * api,                  return pid;          } -        api_id = malloc(n_digits(api->id) + 1); -        if (!api_id) { -                LOG_ERR("Failed to malloc"); -                exit(EXIT_FAILURE); -        } -        sprintf(api_id, "%d", api->id); -          if (ipcp_type == IPCP_NORMAL)                  exec_name = IPCP_NORMAL_EXEC;          else if (ipcp_type == IPCP_SHIM_UDP)                  exec_name = IPCP_SHIM_UDP_EXEC; -        else { -                free(api_id); +        else                  exit(EXIT_FAILURE); -        }          len += strlen(INSTALL_DIR);          len += strlen(ipcp_dir); @@ -146,7 +136,6 @@ pid_t ipcp_create(instance_name_t * api,          full_name = malloc(len + 1);          if (full_name == NULL) {                  LOG_ERR("Failed to malloc"); -                free(api_id);                  exit(EXIT_FAILURE);          } @@ -161,8 +150,7 @@ pid_t ipcp_create(instance_name_t * api,          char * argv[] = {full_name,                           irmd_pid, -                         api->name, -                         api_id, +                         ipcp_name,                           0};          char * envp[] = {0}; @@ -172,7 +160,6 @@ pid_t ipcp_create(instance_name_t * api,          LOG_DBG("%s", strerror(errno));          LOG_ERR("Failed to load IPCP daemon");          LOG_ERR("Make sure to run the installed version"); -        free(api_id);          free(full_name);          exit(EXIT_FAILURE);  } diff --git a/src/lib/irm.c b/src/lib/irm.c index b17cb04c..d3c77f2e 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -30,20 +30,18 @@  #include <stdlib.h> -int irm_create_ipcp(instance_name_t * api, -                    enum ipcp_type    ipcp_type) +int irm_create_ipcp(char *         ipcp_name, +                    enum ipcp_type ipcp_type)  {          irm_msg_t msg = IRM_MSG__INIT;          irm_msg_t * recv_msg = NULL;          int ret = -1; -        if (api == NULL || api->name == NULL) +        if (ipcp_name == NULL)                  return -EINVAL;          msg.code = IRM_MSG_CODE__IRM_CREATE_IPCP; -        msg.ap_name = api->name; -        msg.has_api_id = true; -        msg.api_id = api->id; +        msg.ap_name = ipcp_name;          msg.has_ipcp_type = true;          msg.ipcp_type = ipcp_type; diff --git a/src/tools/irm/irm_create_ipcp.c b/src/tools/irm/irm_create_ipcp.c index 08b55259..3c9b9cb8 100644 --- a/src/tools/irm/irm_create_ipcp.c +++ b/src/tools/irm/irm_create_ipcp.c @@ -39,7 +39,6 @@ static void usage()  {          printf("Usage: irm create_ipcp\n"                 "           ap <application process name>\n" -               "           [api <application process instance>]\n"                 "           type [TYPE]\n\n"                 "where TYPE = {" NORMAL " " SHIM_UDP "}\n");  } @@ -47,16 +46,14 @@ static void usage()  int do_create_ipcp(int argc, char ** argv)  {          char * ipcp_type = NULL; -        instance_name_t api = {NULL, 0}; +        char * ipcp_name = NULL;          enum ipcp_type type = 0;          while (argc > 0) {                  if (matches(*argv, "type") == 0) {                          ipcp_type = *(argv + 1);                  } else if (matches(*argv, "ap") == 0) { -                        api.name = *(argv + 1); -                } else if (matches(*argv, "api") == 0) { -                        api.id = atoi(*(argv + 1)); +                        ipcp_name = *(argv + 1);                  } else {                          printf("\"%s\" is unknown, try \"irm "                                 "create_ipcp\".\n", *argv); @@ -67,7 +64,7 @@ int do_create_ipcp(int argc, char ** argv)                  argv += 2;          } -        if (ipcp_type == NULL || api.name == NULL) { +        if (ipcp_type == NULL || ipcp_name == NULL) {                  usage();                  return -1;          } @@ -81,5 +78,5 @@ int do_create_ipcp(int argc, char ** argv)                  return -1;          } -        return irm_create_ipcp(&api, type); +        return irm_create_ipcp(ipcp_name, type);  }  | 
