source: roaraudio/libroar/basic.c @ 237:a00c54d319a6

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

try user socket before globel

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