X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=socket_server.c;h=a527114202551ae2708103806850e76aa3dc8d8b;hp=77e5309c74873d6591e885379e436f154243b392;hb=57549529c86785b7ecf5f56d2a3ff42b5e519755;hpb=026b04fc75011a144285f399b82890803b4315bd diff --git a/socket_server.c b/socket_server.c index 77e5309..a527114 100644 --- a/socket_server.c +++ b/socket_server.c @@ -15,7 +15,7 @@ #include -char *socket_name = SOCKET_NAME; +char socket_name[128]; int sock = -1; struct sockaddr_un sock_address; @@ -26,7 +26,7 @@ struct admin_list *admin_first = NULL; */ int admin_init(void) { - unsigned long on = 1; + unsigned int on = 1; /* open and bind socket */ if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) @@ -36,6 +36,7 @@ int admin_init(void) } fhuse++; memset(&sock_address, 0, sizeof(sock_address)); + SPRINT(socket_name, SOCKET_NAME, options.lock); sock_address.sun_family = AF_UNIX; UCPY(sock_address.sun_path, socket_name); unlink(socket_name); @@ -66,6 +67,10 @@ int admin_init(void) PERROR("Failed to set socket \"%s\" into non-blocking mode. (errno=%d)\n", sock_address.sun_path, errno); return(-1); } + if (chmod(socket_name, options.socketrights) < 0) + { + PERROR("Failed to change socket rigts to %d. (errno=%d)\n", options.socketrights, errno); + } return(0); } @@ -80,11 +85,13 @@ void free_connection(struct admin_list *admin) void *temp; union parameter param; class Join *join, *joinnext; + struct mISDNport *mISDNport; + int i, ii; /* free remote joins */ if (admin->remote_name[0]) { - start_trace(0, + start_trace(-1, NULL, NULL, NULL, @@ -94,6 +101,26 @@ void free_connection(struct admin_list *admin) "REMOTE APP release"); add_trace("app", "name", "%s", admin->remote_name); end_trace(); + /* release all exported channels */ + mISDNport = mISDNport_first; + while(mISDNport) + { + i = 0; + ii = mISDNport->b_num; + while(i < ii) + { + if (mISDNport->b_remote_id[i] == admin->sock) + { + mISDNport->b_state[i] = B_STATE_IDLE; + mISDNport->b_timer[i] = 0; + mISDNport->b_remote_id[i] = 0; + mISDNport->b_remote_ref[i] = 0; + } + i++; + } + mISDNport = mISDNport->next; + } + /* release join */ join = join_first; while(join) { @@ -154,6 +181,8 @@ void admin_cleanup(void) close(sock); fhuse--; } + + unlink(socket_name); } @@ -163,7 +192,7 @@ void admin_cleanup(void) int admin_interface(struct admin_queue **responsep) { struct admin_queue *response; /* response pointer */ - char *err_txt = ""; + const char *err_txt = ""; int err = 0; if (read_interfaces()) @@ -269,7 +298,7 @@ int admin_route(struct admin_queue **responsep) apppbx->e_callback = 0; apppbx->e_action = NULL; apppbx->release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); - start_trace(0, + start_trace(-1, NULL, numberrize_callerinfo(apppbx->e_callerinfo.id, apppbx->e_callerinfo.ntype, options.national, options.international), apppbx->e_dialinginfo.id, @@ -386,6 +415,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block) response->am[0].u.x.portnum = portnum; /* search for port */ + ifport = NULL; interface = interface_first; while(interface) { @@ -462,7 +492,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block) */ int admin_release(struct admin_queue **responsep, char *message) { - unsigned long id; + unsigned int id; struct admin_queue *response; /* response pointer */ class EndpointAppPBX *apppbx; @@ -540,7 +570,7 @@ int admin_call(struct admin_list *admin, struct admin_message *msg) /* * this function is called for response whenever a call state changes. */ -void admin_call_response(int adminid, int message, char *connected, int cause, int location, int notify) +void admin_call_response(int adminid, int message, const char *connected, int cause, int location, int notify) { struct admin_list *admin; struct admin_queue *response, **responsep; /* response pointer */ @@ -617,7 +647,7 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin) } /* set remote socket instance */ SCPY(admin->remote_name, msg->param.hello.application); - start_trace(0, + start_trace(-1, NULL, NULL, NULL, @@ -654,10 +684,11 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin) * no ref given for *_ack */ if (msg->type == MESSAGE_BCHANNEL) if (msg->param.bchannel.type == BCHANNEL_ASSIGN_ACK - || msg->param.bchannel.type == BCHANNEL_REMOVE_ACK) + || msg->param.bchannel.type == BCHANNEL_REMOVE_ACK + || msg->param.bchannel.type == BCHANNEL_RELEASE) { /* no ref, but address */ - message_bchannel_from_join(NULL, msg->param.bchannel.type, msg->param.bchannel.handle); + message_bchannel_from_remote(NULL, msg->param.bchannel.type, msg->param.bchannel.handle); return(0); } @@ -678,8 +709,8 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin) } if (!join) { - PERROR("No join found with serial %d.\n", msg->ref); - return(-1); + PDEBUG(DEBUG_LOG, "No join found with serial %d. (May have been already released.)\n", msg->ref); + return(0); } /* check application */ @@ -704,7 +735,7 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin) /* * this function is called for every message to remote socket */ -int admin_message_from_join(int remote_id, unsigned long ref, int message_type, union parameter *param) +int admin_message_from_join(int remote_id, unsigned int ref, int message_type, union parameter *param) { struct admin_list *admin; struct admin_queue **responsep; /* response pointer */ @@ -857,6 +888,8 @@ int admin_state(struct admin_queue **responsep) SCPY(response->am[num].u.i.interface_name, interface->name); /* portnum */ response->am[num].u.i.portnum = ifport->portnum; + /* portname */ + SCPY(response->am[num].u.i.portname, ifport->portname); /* iftype */ response->am[num].u.i.extension = interface->extension; /* block */ @@ -867,6 +900,10 @@ int admin_state(struct admin_queue **responsep) /* ptp */ response->am[num].u.i.ptp = mISDNport->ptp; + /* l1hold */ + response->am[num].u.i.l1hold = mISDNport->l1hold; + /* l2hold */ + response->am[num].u.i.l2hold = mISDNport->l2hold; /* ntmode */ response->am[num].u.i.ntmode = mISDNport->ntmode; /* pri */ @@ -896,6 +933,7 @@ int admin_state(struct admin_queue **responsep) response->am[num].u.i.busy[i] = mISDNport->b_state[i]; if (mISDNport->b_port[i]) response->am[num].u.i.port[i] = mISDNport->b_port[i]->p_serial; + response->am[num].u.i.mode[i] = mISDNport->b_mode[i]; i++; } } @@ -1097,7 +1135,7 @@ int admin_handle(void) int len; int new_sock; socklen_t sock_len = sizeof(sock_address); - unsigned long on = 1; + unsigned int on = 1; int work = 0; /* if work was done */ struct Endpoint *epoint; @@ -1147,7 +1185,6 @@ int admin_handle(void) { work = 1; brokenpipe: - printf("Broken pipe on socket %d. (errno=%d).\n", admin->sock, errno); PDEBUG(DEBUG_LOG, "Broken pipe on socket %d. (errno=%d).\n", admin->sock, errno); *adminp = admin->next; free_connection(admin);