Ports can now be specified by number or by name.
[lcr.git] / socket_server.c
index 81ec55b..4b5a841 100644 (file)
@@ -15,7 +15,7 @@
 #include <curses.h>
 
 
-char *socket_name = SOCKET_NAME;
+char socket_name[128];
 int sock = -1;
 struct sockaddr_un sock_address;
 
@@ -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);
 }
 
@@ -176,6 +181,8 @@ void admin_cleanup(void)
                close(sock);
                fhuse--;
        }
+
+       unlink(socket_name);
 }
 
 
@@ -185,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())
@@ -562,7 +569,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 */
@@ -701,8 +708,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 */
@@ -880,6 +887,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 */
@@ -919,6 +928,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++;
                                }
                        }
@@ -1170,7 +1180,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);