diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/dev.c | 123 | ||||
-rw-r--r-- | src/lib/ipcp.c | 8 | ||||
-rw-r--r-- | src/lib/irm.c | 72 | ||||
-rw-r--r-- | src/lib/irmd_messages.proto | 39 | ||||
-rw-r--r-- | src/lib/utils.c | 18 |
5 files changed, 91 insertions, 169 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c index ae6d0f6c..ab4365b8 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -58,6 +58,9 @@ struct ap_data { int ap_init(char * ap_name) { int i = 0; + + ap_name = path_strip(ap_name); + _ap_instance = malloc(sizeof(struct ap_data)); if (_ap_instance == NULL) { return -1; @@ -154,109 +157,7 @@ static int port_id_to_fd(int port_id) } #endif -int ap_reg(char ** difs, - size_t len) -{ - irm_msg_t msg = IRM_MSG__INIT; - irm_msg_t * recv_msg = NULL; - int fd = -1; - - if (difs == NULL || - len == 0 || - difs[0] == NULL) { - return -EINVAL; - } - - rw_lock_rdlock(&_ap_instance->data_lock); - - if (_ap_instance == NULL) { - rw_lock_unlock(&_ap_instance->data_lock); - return -1; /* -ENOTINIT */ - } - - msg.code = IRM_MSG_CODE__IRM_AP_REG; - msg.has_pid = true; - msg.dif_name = difs; - msg.n_dif_name = len; - - msg.pid = _ap_instance->api->id; - msg.ap_name = _ap_instance->api->name; - - recv_msg = send_recv_irm_msg(&msg); - if (recv_msg == NULL) { - rw_lock_unlock(&_ap_instance->data_lock); - return -1; - } - - if (!recv_msg->has_result) { - rw_lock_unlock(&_ap_instance->data_lock); - irm_msg__free_unpacked(recv_msg, NULL); - return -1; - } - - if (recv_msg->result < 0) - fd = -1; - - irm_msg__free_unpacked(recv_msg, NULL); - - rw_lock_wrlock(&_ap_instance->flows_lock); - - fd = bmp_allocate(_ap_instance->fds); - _ap_instance->flows[fd].port_id = -1; - - rw_lock_unlock(&_ap_instance->flows_lock); - rw_lock_unlock(&_ap_instance->data_lock); - - return fd; -} - -int ap_unreg(char ** difs, - size_t len) -{ - irm_msg_t msg = IRM_MSG__INIT; - irm_msg_t * recv_msg = NULL; - int ret = -1; - - if (difs == NULL || - len == 0 || - difs[0] == NULL) { - return -EINVAL; - } - - msg.code = IRM_MSG_CODE__IRM_AP_UNREG; - msg.has_pid = true; - msg.dif_name = difs; - msg.n_dif_name = len; - - rw_lock_rdlock(&_ap_instance->data_lock); - - msg.pid = _ap_instance->api->id; - msg.ap_name = _ap_instance->api->name; - - recv_msg = send_recv_irm_msg(&msg); - if (recv_msg == NULL) { - rw_lock_unlock(&_ap_instance->data_lock); - return -1; - } - - if (!recv_msg->has_result) { - rw_lock_unlock(&_ap_instance->data_lock); - irm_msg__free_unpacked(recv_msg, NULL); - return -1; - } - - ret = recv_msg->result; - - rw_lock_unlock(&_ap_instance->data_lock); - - irm_msg__free_unpacked(recv_msg, NULL); - - return ret; -} - -int flow_accept(int fd, - char ** ap_name, - char ** ae_name) +int flow_accept(char ** ae_name) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; @@ -267,6 +168,7 @@ int flow_accept(int fd, rw_lock_rdlock(&_ap_instance->data_lock); + msg.ap_name = _ap_instance->api->name; msg.pid = _ap_instance->api->id; rw_lock_unlock(&_ap_instance->data_lock); @@ -301,23 +203,9 @@ int flow_accept(int fd, return -1; } - if (ap_name != NULL) { - *ap_name = strdup(recv_msg->ap_name); - if (*ap_name == NULL) { - shm_ap_rbuff_close(_ap_instance->flows[cfd].rb); - bmp_release(_ap_instance->fds, cfd); - rw_lock_unlock(&_ap_instance->flows_lock); - rw_lock_unlock(&_ap_instance->data_lock); - irm_msg__free_unpacked(recv_msg, NULL); - return -1; - } - } - if (ae_name != NULL) { *ae_name = strdup(recv_msg->ae_name); if (*ae_name == NULL) { - if (*ap_name != NULL) - free(*ap_name); shm_ap_rbuff_close(_ap_instance->flows[cfd].rb); bmp_release(_ap_instance->fds, cfd); rw_lock_unlock(&_ap_instance->flows_lock); @@ -406,7 +294,6 @@ int flow_alloc(char * dst_name, rw_lock_rdlock(&_ap_instance->data_lock); msg.pid = _ap_instance->api->id; - msg.ap_name = _ap_instance->api->name; rw_lock_unlock(&_ap_instance->data_lock); diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index ec681f9e..16fb67af 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -365,7 +365,6 @@ int ipcp_flow_alloc(pid_t pid, int port_id, pid_t n_pid, char * dst_name, - char * src_ap_name, char * src_ae_name, enum qos_cube qos) { @@ -373,7 +372,7 @@ int ipcp_flow_alloc(pid_t pid, ipcp_msg_t * recv_msg = NULL; int ret = -1; - if (dst_name == NULL || src_ap_name == NULL || src_ae_name == NULL) + if (dst_name == NULL || src_ae_name == NULL) return -EINVAL; msg.code = IPCP_MSG_CODE__IPCP_FLOW_ALLOC; @@ -381,7 +380,6 @@ int ipcp_flow_alloc(pid_t pid, msg.port_id = port_id; msg.has_pid = true; msg.pid = n_pid; - msg.src_ap_name = src_ap_name; msg.src_ae_name = src_ae_name; msg.dst_name = dst_name; msg.has_qos_cube = true; @@ -436,21 +434,19 @@ int ipcp_flow_alloc_resp(pid_t pid, int ipcp_flow_req_arr(pid_t pid, char * dst_name, - char * src_ap_name, char * src_ae_name) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int port_id = -1; - if (src_ap_name == NULL || src_ae_name == NULL) + if (dst_name == NULL || src_ae_name == NULL) return -EINVAL; msg.code = IRM_MSG_CODE__IPCP_FLOW_REQ_ARR; msg.has_pid = true; msg.pid = pid; msg.dst_name = dst_name; - msg.ap_name = src_ap_name; msg.ae_name = src_ae_name; recv_msg = send_recv_irm_msg(&msg); diff --git a/src/lib/irm.c b/src/lib/irm.c index cff5a76a..7c87f034 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -199,27 +199,39 @@ int irm_enroll_ipcp(instance_name_t * api, return ret; } -int irm_reg_ipcp(instance_name_t * api, - char ** difs, - size_t difs_size) +int irm_reg(char * name, + instance_name_t * api, + int argc, + char ** argv, + bool autoexec, + char ** difs, + size_t difs_len) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int ret = -1; - if (api->name == NULL || - difs == NULL || - difs_size == 0 || - difs[0] == NULL) { + if (name == NULL || api->name == NULL) return -EINVAL; - } - msg.code = IRM_MSG_CODE__IRM_REG_IPCP; + msg.code = IRM_MSG_CODE__IRM_AP_REG; + msg.dst_name = name; msg.ap_name = api->name; - msg.has_api_id = true; - msg.api_id = api->id; - msg.dif_name = difs; - msg.n_dif_name = difs_size; + if (difs != NULL) { + msg.dif_name = difs; + msg.n_dif_name = difs_len; + } + + if (argv != NULL) { + msg.n_args = argc; + msg.args = argv; + } else { + msg.has_api_id = true; + msg.api_id = api->id; + } + + msg.has_autoexec = true; + msg.autoexec = autoexec; recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) @@ -236,28 +248,36 @@ int irm_reg_ipcp(instance_name_t * api, return ret; } -int irm_unreg_ipcp(const instance_name_t * api, - char ** difs, - size_t difs_size) +int irm_unreg(char * name, + const instance_name_t * api, + char ** difs, + size_t difs_len, + bool hard) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int ret = -1; - if (api == NULL || - api->name == NULL || - difs == NULL || - difs_size == 0 || - difs[0] == NULL) { + if (name == NULL && api == NULL) + return -EINVAL; + + if (difs == NULL || + difs_len == 0 || + difs[0] == NULL) return -EINVAL; + + msg.code = IRM_MSG_CODE__IRM_AP_UNREG; + if (api != NULL) { + msg.ap_name = api->name; + msg.has_api_id = true; + msg.api_id = api->id; } - msg.code = IRM_MSG_CODE__IRM_UNREG_IPCP; - msg.ap_name = api->name; - msg.has_api_id = true; - msg.api_id = api->id; msg.dif_name = difs; - msg.n_dif_name = difs_size; + msg.n_dif_name = difs_len; + if (name != NULL) + msg.dst_name = name; + msg.hard = hard; recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) diff --git a/src/lib/irmd_messages.proto b/src/lib/irmd_messages.proto index 27194ccb..34366975 100644 --- a/src/lib/irmd_messages.proto +++ b/src/lib/irmd_messages.proto @@ -27,19 +27,17 @@ enum irm_msg_code { IRM_DESTROY_IPCP = 2; IRM_BOOTSTRAP_IPCP = 3; IRM_ENROLL_IPCP = 4; - IRM_REG_IPCP = 5; - IRM_UNREG_IPCP = 6; - IRM_AP_REG = 7; - IRM_AP_UNREG = 8; - IRM_FLOW_ACCEPT = 9; - IRM_FLOW_ALLOC_RESP = 10; - IRM_FLOW_ALLOC = 11; - IRM_FLOW_ALLOC_RES = 12; - IRM_FLOW_DEALLOC = 13; - IPCP_FLOW_REQ_ARR = 14; - IPCP_FLOW_ALLOC_REPLY = 15; - IPCP_FLOW_DEALLOC = 16; - IRM_REPLY = 17; + IRM_AP_REG = 5; + IRM_AP_UNREG = 6; + IRM_FLOW_ACCEPT = 7; + IRM_FLOW_ALLOC_RESP = 8; + IRM_FLOW_ALLOC = 9; + IRM_FLOW_ALLOC_RES = 10; + IRM_FLOW_DEALLOC = 11; + IPCP_FLOW_REQ_ARR = 12; + IPCP_FLOW_ALLOC_REPLY = 13; + IPCP_FLOW_DEALLOC = 14; + IRM_REPLY = 15; }; message irm_msg { @@ -49,10 +47,13 @@ message irm_msg { optional uint32 api_id = 3; optional uint32 ipcp_type = 5; repeated string dif_name = 6; - optional sint32 response = 7; - optional string dst_name = 8; - optional sint32 port_id = 9; - optional int32 pid = 10; - optional dif_config_msg conf = 11; - optional sint32 result = 12; + repeated string args = 7; + optional sint32 response = 8; + optional string dst_name = 9; + optional sint32 port_id = 10; + optional int32 pid = 11; + optional dif_config_msg conf = 12; + optional bool autoexec = 13; + optional bool hard = 14; + optional sint32 result = 15; }; diff --git a/src/lib/utils.c b/src/lib/utils.c index 5744fb7c..49065138 100644 --- a/src/lib/utils.c +++ b/src/lib/utils.c @@ -53,3 +53,21 @@ char * strdup(const char * src) return dst; } + +char * path_strip(char * src) +{ + char * dst = NULL; + + if (src == NULL) + return NULL; + + dst = src + strlen(src); + + while (dst > src && *dst != '/') + --dst; + + if (*dst == '/') + ++dst; + + return dst; +} |