1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** Asterisk socket client **
10 \*****************************************************************************/
17 #include <sys/types.h>
21 #include <sys/ioctl.h>
22 #include <sys/socket.h>
25 #include "extension.h"
32 struct admin_list *next;
34 } *admin_first = NULL;
37 * enque message from asterisk
39 int admin_asterisk(int message_type, union parameter *param)
41 struct admin_list *admin, **adminp;
43 adminp = &admin_first;
45 adminp = &((*adminp)->next);
46 admin = (struct admin_list *)MALLOC(sizeof(struct admin_list));
49 admin->msg.type = message_type;
50 memcpy(&admin->msg.param, param, sizeof(union parameter));
57 * warning! not thread safe
58 * returns -1 for socket error, 0 for no work, 1 for work
60 int handle_socket(void)
64 struct admin_message msg;
65 struct admin_list *admin;
67 /* read from socket */
68 len = read(sock, &msg, sizeof(msg));
71 printf("Socket closed\n");
72 return(-1); // socket closed
76 if (len != sizeof(msg))
78 fprintf(stderr, "Socket short read (%d)\n", len);
79 return(-1); // socket error
81 if (msg.message != ADMIN_MESSAGE)
83 fprintf(stderr, "Socket received illegal message %d\n", msg.message);
84 return(-1); // socket error
86 printf("message received %d\n", msg.u.msg.type);
90 if (errno != EWOULDBLOCK)
92 fprintf(stderr, "Socket error %d\n", errno);
101 len = write(sock, &admin->msg, sizeof(msg));
104 printf("Socket closed\n");
105 return(-1); // socket closed
109 if (len != sizeof(msg))
111 fprintf(stderr, "Socket short write (%d)\n", len);
112 return(-1); // socket error
115 admin_first = admin->next;
121 if (errno != EWOULDBLOCK)
123 fprintf(stderr, "Socket error %d\n", errno);
134 int main(int argc, char *argv[])
136 char *socket_name = SOCKET_NAME;
138 struct sockaddr_un sock_address;
140 unsigned long on = 1;
141 union parameter hello_param;
144 if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
146 fprintf(stderr, "Failed to create socket.\n");
150 /* set socket address and name */
151 memset(&sock_address, 0, sizeof(sock_address));
152 sock_address.sun_family = PF_UNIX;
153 UCPY(sock_address.sun_path, socket_name);
156 if ((conn = connect(sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0)
159 fprintf(stderr, "Failed to connect to socket \"%s\".\nIs LCR running?\n", sock_address.sun_path);
163 /* set non-blocking io */
164 if (ioctl(sock, FIONBIO, (unsigned char *)(&on)) < 0)
167 fprintf(stderr, "Failed to set socket into non-blocking IO.\n");
171 /* enque hello message */
172 memset(&hello_param, 0, sizeof(hello_param));
173 admin_asterisk(MESSAGE_HELLO, &hello_param);
177 ret = handle_socket();
186 /* now we say good bye */