#include <sys/socket.h>
#include <sys/un.h>
#include <curses.h>
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
#include "config.h"
char socket_name[128];
int sock = -1;
struct sockaddr_un sock_address;
-extern unsigned int new_remote;
struct admin_list *admin_first = NULL;
static struct lcr_fd admin_fd;
{
struct admin_queue *response;
void *temp;
+#ifdef WITH_MISDN
union parameter param;
class Join *join, *joinnext;
struct mISDNport *mISDNport;
int i, ii;
- struct admin_list **adminp;
class Port *port, *portnext;
class Premote *remote;
+#endif
+ struct admin_list **adminp;
/* free remote joins */
if (admin->remote_name[0]) {
"REMOTE APP release");
add_trace("app", "name", "%s", admin->remote_name);
end_trace();
+#ifdef WITH_MISDN
/* release all exported channels */
mISDNport = mISDNport_first;
while(mISDNport) {
}
mISDNport = mISDNport->next;
}
+#endif
+#ifdef WITH_MISDN
/* release join */
join = join_first;
while(join) {
}
port = portnext;
}
+#endif
}
if (admin->sock >= 0) {
goto out;
}
+#ifdef WITH_MISDN
/* no interface */
if (!ifport->mISDNport) {
/* not loaded anyway */
/* try loading interface */
ifport->block = block;
- load_port(ifport);
+ load_mISDN_port(ifport);
/* port cannot load */
if (ifport->block >= 2) {
ifport->block = 2;
goto out;
}
+#endif
/* port new blocking state */
ifport->block = response->am[0].u.x.block = block;
if (!(epoint = new Endpoint(0, 0)))
FATAL("No memory for Endpoint instance\n");
- if (!(epoint->ep_app = apppbx = new DEFAULT_ENDPOINT_APP(epoint, 1))) // outgoing
+ if (!(epoint->ep_app = apppbx = new EndpointAppPBX(epoint, 1))) // outgoing
FATAL("No memory for Endpoint Application instance\n");
apppbx->e_adminid = admin->sockserial;
admin->epointid = epoint->ep_serial;
*/
int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
{
+#ifdef WITH_MISDN
struct mISDNport *mISDNport;
- class Join *join;
- class JoinRemote *joinremote = NULL; /* make GCC happy */
class Port *port;
class Premote *remote = NULL; /* make GCC happy */
+ class Join *join;
+ class JoinRemote *joinremote = NULL; /* make GCC happy */
+#endif
struct admin_list *temp;
/* hello message */
return(-1);
}
+#ifdef WITH_MISDN
/* new join. the reply (NEWREF assignment) is sent from constructor */
if (msg->type == MESSAGE_NEWREF) {
if (msg->param.newref.mode) {
mISDNport = mISDNport->next;
}
if (!mISDNport) {
- unsigned int remote_ref = new_remote++;
union parameter param;
- memset(¶m, 0, sizeof(union parameter));
- admin_message_from_lcr(mISDNport->ifport->remote, remote_ref, MESSAGE_NEWREF, ¶m);
+ /* create new join instance */
+ join = joinremote = new JoinRemote(0, admin->remote_name, admin->sock); // must have no serial, because no endpoint is connected
+ if (!join) {
+ FATAL("No memory for remote join instance\n");
+ return(-1);
+ }
memset(¶m, 0, sizeof(union parameter));
param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
param.disconnectinfo.cause = CAUSE_RESSOURCEUNAVAIL;
- admin_message_from_lcr(mISDNport->ifport->remote, remote_ref, MESSAGE_RELEASE, ¶m);
+ admin_message_from_lcr(joinremote->j_remote_id, joinremote->j_remote_ref, MESSAGE_RELEASE, ¶m);
return 0;
}
/* creating port object, transparent until setup with hdlc */
}
return(0);
}
+#endif
+#ifdef WITH_MISDN
/* bchannel message
* 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_RELEASE) {
-#warning TODO: depending on the mode (join / remoteport) forward message
/* no ref, but address */
message_bchannel_from_remote(NULL, msg->param.bchannel.type, msg->param.bchannel.handle);
return(0);
}
+#endif
/* check for ref */
if (!msg->ref) {
return(-1);
}
+#ifdef WITH_MISDN
/* find join instance */
join = join_first;
while(join) {
- if (join->j_type != JOIN_TYPE_REMOTE) {
+ if (join->j_type == JOIN_TYPE_REMOTE) {
joinremote = (class JoinRemote *)join;
if (joinremote->j_remote_ref == msg->ref)
break;
return(0);
}
+#endif
PDEBUG(DEBUG_LOG, "No remote instance found with ref %d. (May have been already released.)\n", msg->ref);
return(0);
class Port *port;
class EndpointAppPBX *apppbx;
class Join *join;
+#ifdef WITH_MISDN
class Pdss1 *pdss1;
- struct interface *interface;
- struct interface_port *ifport;
struct mISDNport *mISDNport;
struct select_channel *selchannel;
+ int anybusy;
+#endif
+ struct interface *interface;
+ struct interface_port *ifport;
int i;
int num;
- int anybusy;
struct admin_queue *response;
struct admin_list *admin;
struct tm *now_tm;
interface = interface_first;
while(interface) {
ifport = interface->ifport;
+ if (!ifport)
+ i++;
while(ifport) {
i++;
ifport = ifport->next;
num = 0;
while(interface) {
ifport = interface->ifport;
+ if (!ifport) {
+ /* message */
+ response->am[num].message = ADMIN_RESPONSE_S_INTERFACE;
+ /* interface */
+ SCPY(response->am[num].u.i.interface_name, interface->name);
+ /* portnum */
+ response->am[num].u.i.portnum = -100; /* indicate: no ifport */
+ /* iftype */
+ response->am[num].u.i.extension = interface->extension;
+ /* block */
+ num++;
+ }
while(ifport) {
/* message */
response->am[num].message = ADMIN_RESPONSE_S_INTERFACE;
response->am[num].u.i.extension = interface->extension;
/* block */
response->am[num].u.i.block = ifport->block;
+#ifdef WITH_MISDN
if (ifport->mISDNport) {
mISDNport = ifport->mISDNport;
i++;
}
}
+#endif
num++;
ifport = ifport->next;
if (apppbx->ea_endpoint->ep_park && apppbx->ea_endpoint->ep_park_len && apppbx->ea_endpoint->ep_park_len<=(int)sizeof(response->am[num].u.e.park_callid))
memcpy(response->am[num].u.e.park_callid, apppbx->ea_endpoint->ep_park_callid, apppbx->ea_endpoint->ep_park_len);
response->am[num].u.e.park_len = apppbx->ea_endpoint->ep_park_len;
+#ifdef WITH_CRYPT
/* crypt */
if (apppbx->e_crypt == CRYPT_ON)
response->am[num].u.e.crypt = 1;
+#endif
/* */
apppbx = apppbx->next;
num++;
default:
response->am[num].u.p.state = ADMIN_STATE_IDLE;
}
+#ifdef WITH_MISDN
/* isdn */
if ((port->p_type & PORT_CLASS_mISDN_MASK) == PORT_CLASS_DSS1) {
response->am[num].u.p.isdn = 1;
response->am[num].u.p.isdn_hold = pdss1->p_m_hold;
response->am[num].u.p.isdn_ces = pdss1->p_m_d_ces;
}
+#endif
/* */
port = port->next;
num++;
if (len < 0) {
brokenpipe:
PDEBUG(DEBUG_LOG, "Broken pipe on socket %d. (errno=%d).\n", admin->sock, errno);
- free_connection(admin);
- return 0;
- }
- if (len == 0) {
end:
-
/*release endpoint if exists */
if (admin->epointid) {
epoint = find_epoint_id(admin->epointid);
- if (epoint) {
- ((class DEFAULT_ENDPOINT_APP *)epoint->ep_app)->
+ if (epoint && epoint->ep_app_type == EAPP_TYPE_PBX) {
+ ((class EndpointAppPBX *)epoint->ep_app)->
release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0);
}
}
free_connection(admin);
return 0;
}
+ if (len == 0)
+ goto end;
if (len != sizeof(msg)) {
PERROR("Short/long read on socket %d. (len=%d != size=%d).\n", admin->sock, len, sizeof(msg));
- free_connection(admin);
- return 0;
+ goto end;
}
/* process socket command */
if (admin->response && msg.message != ADMIN_MESSAGE) {
PERROR("Data from socket %d while sending response.\n", admin->sock);
- free_connection(admin);
- return 0;
+ goto end;
}
switch (msg.message) {
case ADMIN_REQUEST_CMD_INTERFACE:
if (admin_call(admin, &msg) < 0) {
PERROR("Failed to create call for socket %d.\n", admin->sock);
response_error:
- free_connection(admin);
- return 0;
+ goto end;
}
break;
default:
PERROR("Invalid message %d from socket %d.\n", msg.message, admin->sock);
- free_connection(admin);
- return 0;
+ goto end;
}
}