1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** Asterisk socket client **
10 \*****************************************************************************/
16 To connect, open a socket and send a MESSAGE_HELLO to admin socket with
17 the application name. This name is unique an can be used for routing calls.
19 To make a call, send a MESSAGE_NEWREF and a new reference is received.
20 When receiving a call, a new reference is received.
21 The reference is received with MESSAGE_NEWREF.
23 Make a MESSAGE_SETUP or receive a MESSAGE_SETUP with the reference.
25 To release call and reference, send or receive MESSAGE_RELEASE.
26 From that point on, the ref is not valid, so no other message may be sent
36 #include <sys/types.h>
40 #include <sys/ioctl.h>
41 #include <sys/socket.h>
44 #include "extension.h"
51 struct admin_list *next;
53 } *admin_first = NULL;
56 * enque message from asterisk
58 int admin_asterisk(int message_type, union parameter *param)
60 struct admin_list *admin, **adminp;
62 adminp = &admin_first;
64 adminp = &((*adminp)->next);
65 admin = (struct admin_list *)MALLOC(sizeof(struct admin_list));
68 admin->msg.type = message_type;
69 memcpy(&admin->msg.param, param, sizeof(union parameter));
76 * warning! not thread safe
77 * returns -1 for socket error, 0 for no work, 1 for work
79 int handle_socket(void)
83 struct admin_message msg;
84 struct admin_list *admin;
86 /* read from socket */
87 len = read(sock, &msg, sizeof(msg));
90 printf("Socket closed\n");
91 return(-1); // socket closed
95 if (len != sizeof(msg))
97 fprintf(stderr, "Socket short read (%d)\n", len);
98 return(-1); // socket error
100 if (msg.message != ADMIN_MESSAGE)
102 fprintf(stderr, "Socket received illegal message %d\n", msg.message);
103 return(-1); // socket error
105 printf("message received %d\n", msg.u.msg.type);
109 if (errno != EWOULDBLOCK)
111 fprintf(stderr, "Socket error %d\n", errno);
116 /* write to socket */
120 len = write(sock, &admin->msg, sizeof(msg));
123 printf("Socket closed\n");
124 return(-1); // socket closed
128 if (len != sizeof(msg))
130 fprintf(stderr, "Socket short write (%d)\n", len);
131 return(-1); // socket error
134 admin_first = admin->next;
140 if (errno != EWOULDBLOCK)
142 fprintf(stderr, "Socket error %d\n", errno);
153 int main(int argc, char *argv[])
155 char *socket_name = SOCKET_NAME;
157 struct sockaddr_un sock_address;
159 unsigned long on = 1;
160 union parameter param;
163 if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
165 fprintf(stderr, "Failed to create socket.\n");
169 /* set socket address and name */
170 memset(&sock_address, 0, sizeof(sock_address));
171 sock_address.sun_family = PF_UNIX;
172 UCPY(sock_address.sun_path, socket_name);
175 if ((conn = connect(sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0)
178 fprintf(stderr, "Failed to connect to socket \"%s\".\nIs LCR running?\n", sock_address.sun_path);
182 /* set non-blocking io */
183 if (ioctl(sock, FIONBIO, (unsigned char *)(&on)) < 0)
186 fprintf(stderr, "Failed to set socket into non-blocking IO.\n");
190 /* enque hello message */
191 memset(¶m, 0, sizeof(param));
192 SCPY(param.hello.application, "asterisk");
193 admin_asterisk(MESSAGE_HELLO, ¶m);
197 ret = handle_socket();
206 /* now we say good bye */