LCR now runs as a user.
[lcr.git] / socket_server.c
index 77e5309..e1853d3 100644 (file)
@@ -15,7 +15,7 @@
 #include <curses.h>
 
 
 #include <curses.h>
 
 
-char *socket_name = SOCKET_NAME;
+char socket_name[128];
 int sock = -1;
 struct sockaddr_un sock_address;
 
 int sock = -1;
 struct sockaddr_un sock_address;
 
@@ -26,7 +26,7 @@ struct admin_list *admin_first = NULL;
  */
 int admin_init(void)
 {
  */
 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)
 
        /* 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));
        }
        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);
        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);
        }
                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);
 }
 
        return(0);
 }
 
@@ -80,6 +85,8 @@ void free_connection(struct admin_list *admin)
        void *temp;
        union parameter param;
        class Join *join, *joinnext;
        void *temp;
        union parameter param;
        class Join *join, *joinnext;
+       struct mISDNport *mISDNport;
+       int i, ii;
 
        /* free remote joins */
        if (admin->remote_name[0])
 
        /* free remote joins */
        if (admin->remote_name[0])
@@ -94,6 +101,26 @@ void free_connection(struct admin_list *admin)
                        "REMOTE APP release");
                add_trace("app", "name", "%s", admin->remote_name);
                end_trace();
                        "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)
                {
                join = join_first;
                while(join)
                {
@@ -154,6 +181,8 @@ void admin_cleanup(void)
                close(sock);
                fhuse--;
        }
                close(sock);
                fhuse--;
        }
+
+       unlink(socket_name);
 }
 
 
 }
 
 
@@ -462,7 +491,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block)
  */
 int admin_release(struct admin_queue **responsep, char *message)
 {
  */
 int admin_release(struct admin_queue **responsep, char *message)
 {
-       unsigned long           id;
+       unsigned int            id;
        struct admin_queue      *response;      /* response pointer */
        class EndpointAppPBX    *apppbx;
 
        struct admin_queue      *response;      /* response pointer */
        class EndpointAppPBX    *apppbx;
 
@@ -654,10 +683,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
         * 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 */
        {
                /* 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);
        }
        
                return(0);
        }
        
@@ -678,8 +708,8 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin)
        }
        if (!join)
        {
        }
        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 */
        }
 
        /* check application */
@@ -704,7 +734,7 @@ int admin_message_to_join(struct admin_msg *msg, struct admin_list *admin)
 /*
  * this function is called for every message to remote socket
  */
 /*
  * 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 */
 {
        struct admin_list       *admin;
        struct admin_queue      **responsep;    /* response pointer */
@@ -896,6 +926,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.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++;
                                }
                        }
                                        i++;
                                }
                        }
@@ -1097,7 +1128,7 @@ int admin_handle(void)
        int                     len;
        int                     new_sock;
        socklen_t               sock_len = sizeof(sock_address);
        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;
 
        int                     work = 0; /* if work was done */
        struct Endpoint         *epoint;