source: roaraudio/libroar/basic.c @ 448:d76cc7b1f5ae

Last change on this file since 448:d76cc7b1f5ae was 448:d76cc7b1f5ae, checked in by phi, 16 years ago

try to read symlink /etc/roarserver

File size: 5.7 KB
Line 
1//basic.c:
2
3#include "libroar.h"
4
5int roar_connect_raw (char * server) {
6 char user_sock[80];
7 char * roar_server;
8 int i;
9 int port = 0;
10 int fh = -1;
11
12 if ( server == NULL && (roar_server = getenv("ROAR_SERVER")) != NULL )
13  server = roar_server;
14
15 if ( server == NULL && (i = readlink("/etc/roarserver", user_sock, 79)) != -1 ) {
16   user_sock[i] = 0;
17   server = user_sock;
18 }
19
20 if ( server == NULL || *server == 0 ) {
21  /* connect via defaults */
22
23
24  snprintf(user_sock, 79, "%s/%s", getenv("HOME"), ROAR_DEFAULT_SOCK_USER);
25
26  if ( (fh = roar_socket_connect(user_sock, 0)) != -1 )
27   return fh;
28
29  if ( (fh = roar_socket_connect(ROAR_DEFAULT_SOCK_GLOBAL, 0)) != -1 )
30   return fh;
31
32  if ( (fh = roar_socket_connect(ROAR_DEFAULT_HOST, ROAR_DEFAULT_PORT)) != -1 )
33   return fh;
34
35 } else {
36  /* connect via (char*)server */
37  for (i = 0; server[i] != 0; i++) {
38   if ( server[i] == ':' ) {
39    port = atoi(server+i+1);
40    server[i] = 0;
41    break;
42   }
43  }
44
45  if ( port ) {
46   fh = roar_socket_connect(server, port);
47   // restore the original string
48   server[i] = ':';
49  } else {
50   fh = roar_socket_connect(server, ROAR_DEFAULT_PORT);
51  }
52 }
53
54 ROAR_DBG("roar_connect_raw(*) = %i", fh);
55
56 return fh;
57}
58
59int roar_connect    (struct roar_connection * con, char * server) {
60 con->fh = roar_connect_raw(server);
61
62 if ( con->fh == -1 )
63  return -1;
64
65 return 0;
66}
67
68int roar_disconnect (struct roar_connection * con) {
69 struct roar_message m;
70
71 m.datalen = 0;
72 m.stream  = 0;
73 m.pos     = 0;
74 m.cmd     = ROAR_CMD_QUIT;
75
76 roar_req(con, &m, NULL);
77
78 close(con->fh);
79
80 con->fh = -1;
81
82 return 0;
83}
84
85int roar_identify   (struct roar_connection * con, char * name) {
86 struct roar_message mes;
87 pid_t pid;
88 int max_len;
89
90 ROAR_DBG("roar_identify(*): try to identify myself...");
91
92 mes.cmd    = ROAR_CMD_IDENTIFY;
93 mes.stream = 0;
94 mes.pos    = 0;
95
96 ROAR_DBG("roar_identify(*): name=%p", name);
97
98 if ( name == NULL )
99  name = "libroar client";
100
101 ROAR_DBG("roar_identify(*): name=%p", name);
102
103 max_len = strlen(name);
104 ROAR_DBG("roar_identify(*): strlen(name) = %i", max_len);
105
106 if ( max_len > (LIBROAR_BUFFER_MSGDATA - 5) )
107  max_len = LIBROAR_BUFFER_MSGDATA - 5;
108
109 mes.datalen = 5 + max_len;
110 mes.data[0] = 1;
111
112 pid = getpid();
113 *(uint32_t*)(mes.data+1) = ROAR_HOST2NET32(pid);
114 ROAR_DBG("roar_identify(*): pid = %i", pid);
115
116 strncpy(mes.data+5, name, max_len);
117
118 return roar_req(con, &mes, NULL);
119}
120
121#define _ROAR_MESS_BUF_LEN (1 /* version */ + 1 /* cmd */ + 2 /* stream */ + 4 /* pos */ + 2 /* datalen */)
122int roar_send_message (struct roar_connection * con, struct roar_message * mes, char * data) {
123 char buf[_ROAR_MESS_BUF_LEN];
124
125 ROAR_DBG("roar_send_message(*): try to send an request...");
126
127 buf[0] = _ROAR_MESSAGE_VERSION;
128 buf[1] = (unsigned char) mes->cmd;
129 *(uint16_t*)(buf+2) = ROAR_HOST2NET16(mes->stream);
130 *(uint32_t*)(buf+4) = ROAR_HOST2NET32(mes->pos);
131 *(uint16_t*)(buf+8) = ROAR_HOST2NET16(mes->datalen);
132
133 if ( write(con->fh, buf, _ROAR_MESS_BUF_LEN) != _ROAR_MESS_BUF_LEN )
134  return -1;
135
136 if ( mes->datalen != 0 )
137  if ( write(con->fh, data == NULL ? mes->data : data, mes->datalen) != mes->datalen )
138   return -1;
139
140 ROAR_DBG("roar_send_message(*) = 0");
141 return 0;
142}
143
144int roar_recv_message (struct roar_connection * con, struct roar_message * mes, char ** data) {
145 char buf[_ROAR_MESS_BUF_LEN];
146
147 ROAR_DBG("roar_recv_message(*): try to get a response form the server...");
148
149 if ( data )
150  *data = NULL;
151
152 if ( read(con->fh, buf, _ROAR_MESS_BUF_LEN) != _ROAR_MESS_BUF_LEN )
153  return -1;
154
155 ROAR_DBG("roar_recv_message(*): Got a header");
156
157 if ( buf[0] != _ROAR_MESSAGE_VERSION )
158  return -1;
159
160 mes->cmd     = (unsigned char)buf[1];
161 mes->stream  = ROAR_NET2HOST16(*(uint16_t*)(buf+2));
162 mes->pos     = ROAR_NET2HOST32(*(uint32_t*)(buf+4));
163 mes->datalen = ROAR_NET2HOST16(*(uint16_t*)(buf+8));
164
165 ROAR_DBG("roar_recv_message(*): command=%i(%s)", mes->cmd,
166           mes->cmd == ROAR_CMD_OK ? "OK" : (mes->cmd == ROAR_CMD_ERROR ? "ERROR" : "UNKNOWN"));
167
168 if ( mes->datalen == 0 ) {
169  ROAR_DBG("roar_recv_message(*): no data in this pkg");
170  ROAR_DBG("roar_recv_message(*) = 0");
171  return 0;
172 }
173
174 if ( mes->datalen <= LIBROAR_BUFFER_MSGDATA ) {
175  if ( read(con->fh, mes->data, mes->datalen) == mes->datalen ) {
176   ROAR_DBG("roar_recv_message(*): Got data!");
177   ROAR_DBG("roar_recv_message(*) = 0");
178   return 0;
179  }
180  return -1;
181 } else {
182  if ( data == NULL )
183   return -1;
184
185  if ( (*data = malloc(mes->datalen)) == NULL )
186   return -1;
187
188  if ( mes->datalen == 0 )
189   return 0;
190
191  if ( read(con->fh, *data, mes->datalen) == mes->datalen ) {
192   ROAR_DBG("roar_recv_message(*): Got data!");
193   ROAR_DBG("roar_recv_message(*) = 0");
194   return 0;
195  }
196  return -1;
197 }
198
199 return -1;
200}
201
202int roar_req (struct roar_connection * con, struct roar_message * mes, char ** data) {
203 if ( roar_send_message(con, mes, data ? *data : NULL) != 0 )
204  return -1;
205
206 if ( data )
207  free(*data);
208
209 return roar_recv_message(con, mes, data);
210}
211
212int roar_debug_message_print (struct roar_message * mes) {
213 if ( mes == NULL )
214  return -1;
215
216 ROAR_DBG("roar_debug_message_print(*): Command: %i", mes->cmd);
217 ROAR_DBG("roar_debug_message_print(*): Stream : %u", mes->stream);
218 ROAR_DBG("roar_debug_message_print(*): Pos    : %u", mes->pos);
219 ROAR_DBG("roar_debug_message_print(*): Datalen: %i", mes->datalen);
220
221 ROAR_DBG("roar_debug_message_print(*) = 0");
222 return 0;
223}
224
225int roar_debug_audio_info_print (struct roar_audio_info * info) {
226 if ( info == NULL )
227  return -1;
228
229 ROAR_DBG("roar_debug_audio_info_print(*): Rate    : %i", info->rate);
230 ROAR_DBG("roar_debug_audio_info_print(*): Channels: %i", info->channels);
231 ROAR_DBG("roar_debug_audio_info_print(*): Bits    : %i", info->bits);
232 ROAR_DBG("roar_debug_audio_info_print(*): Codec   : %i", info->codec);
233
234 ROAR_DBG("roar_debug_audio_info_print(*) = 0");
235 return 0;
236}
237
238//ll
Note: See TracBrowser for help on using the repository browser.