source: roaraudio/roard/roard.c @ 68:797b3512e1d9

Last change on this file since 68:797b3512e1d9 was 68:797b3512e1d9, checked in by phi, 16 years ago

added basic demon support, a option to not listen on any sockets and support to create clients out of given FHs

File size: 6.8 KB
Line 
1//roard.c:
2
3#include "roard.h"
4
5char * server = ROAR_DEFAULT_SOCK_GLOBAL; // global server address
6
7void usage (void) {
8 printf("Usage: roard [OPTIONS]...\n\n");
9
10 printf("Misc Options:\n\n");
11 printf(
12        " --demon               - bring the server into background after init\n"
13       );
14
15 printf("\nAudio Options:\n\n");
16 printf(
17        " -R  --rate   RATE     - Set server rate\n"
18        " -B  --bits   BITS     - Set server bits\n"
19        " -C  --chans  CHANNELS - Set server channels\n"
20       );
21
22 printf("\nDriver Options:\n\n");
23 printf(" -d  --driver DRV      - Set the driver, use '-d list' to get a list (default: %s)\n", ROAR_DRIVER_DEFAULT);
24 printf(" -D  --device DEV      - Set the device\n");
25 printf(" -dO OPTS              - Set output options\n");
26
27 printf("\nSource Options:\n\n");
28 printf(" -s  --source DRV      - Use DRV as input driver\n"
29        " -S           DEV      - Use DEV as input device\n"
30        " -sO          OPTS     - Use OPTS as input options\n"
31        " -sP                   - Make souce as primary\n"
32       );
33
34
35 printf("\nServer Options:\n\n");
36 printf(" -t  --tcp             - Use TCP listen socket\n"
37        " -u  --unix            - Use UNIX Domain listen socket (default)\n"
38        " -p  --port            - TCP Port to bind to\n"
39        " -b  --bind            - IP/Hostname to bind to\n"
40        " -s  --sock            - Filename for UNIX Domain Socket\n"
41        " -G  GROUP             - Sets the group for the UNIX Domain Socket, (default: audio)\n"
42        "                         You need the permittions to change the GID\n"
43        " --no-listen           - Do not listen for new clients (only usefull for relaing)\n"
44        " --client-fh           - Communite with a client over this handle\n"
45        "                         (only usefull for relaing)\n"
46       );
47// printf("\n Options:\n\n");
48 printf("\n");
49}
50
51int main (int argc, char * argv[]) {
52 int i;
53 char * k;
54 char user_sock[80] = {0};
55 struct roar_audio_info sa;
56 int    demon = 0;
57 char * driver = NULL;
58 char * device = NULL;
59 char * opts   = NULL;
60// char * server = ROAR_DEFAULT_SOCK_GLOBAL;
61 int      port = ROAR_DEFAULT_PORT;
62 int               drvid;
63 char * s_dev  = NULL;
64 char * s_con  = NULL;
65 char * s_opt  = NULL;
66 int    s_prim = 0;
67 char * sock_grp = "audio";
68 struct group * grp;
69 DRIVER_USERDATA_T drvinst;
70 struct roar_client * self = NULL;
71
72 g_listen_socket = -1;
73 g_standby       =  0;
74
75 sa.bits     = ROAR_BITS_DEFAULT;
76 sa.channels = ROAR_CHANNELS_DEFAULT;
77 sa.rate     = ROAR_RATE_DEFAULT;
78 sa.codec    = ROAR_CODEC_DEFAULT;
79
80 g_sa = &sa;
81
82
83 if ( getuid() != 0 && getenv("HOME") ) {
84  snprintf(user_sock, 79, "%s/%s", getenv("HOME"), ROAR_DEFAULT_SOCK_USER);
85  server = user_sock;
86 }
87
88 if ( clients_init() == -1 ) {
89  ROAR_ERR("Can not init clients!");
90  return 1;
91 }
92
93 if ( streams_init() == -1 ) {
94  ROAR_ERR("Can not init streams!");
95  return 1;
96 }
97
98 if ( (g_self_client = clients_new()) == -1 ) {
99  ROAR_ERR("Can not create self client!");
100  return 1;
101 }
102
103 if ( sources_init() == -1 ) {
104  ROAR_ERR("Can not init sources!");
105  return 1;
106 }
107
108 if ( (sources_set_client(g_self_client)) == -1 ) {
109  ROAR_ERR("Can not init set source client!");
110  return 1;
111 }
112
113 for (i = 1; i < argc; i++) {
114  k = argv[i];
115
116  if ( strcmp(k, "-h") == 0 || strcmp(k, "--help") == 0 ) {
117   usage();
118   return 0;
119
120  } else if ( strcmp(k, "--demon") == 0 ) {
121   demon = 1;
122
123  } else if ( strcmp(k, "-R") == 0 || strcmp(k, "--rate") == 0 ) {
124   sa.rate = atoi(argv[++i]);
125  } else if ( strcmp(k, "-B") == 0 || strcmp(k, "--bits") == 0 ) {
126   sa.bits = atoi(argv[++i]);
127  } else if ( strcmp(k, "-C") == 0 || strcmp(k, "--chans") == 0 ) {
128   sa.channels = atoi(argv[++i]);
129
130  } else if ( strcmp(k, "-d") == 0 || strcmp(k, "--driver") == 0 ) {
131   driver = argv[++i];
132   if ( strcmp(driver, "list") == 0 ) {
133    print_driverlist();
134   }
135  } else if ( strcmp(k, "-D") == 0 || strcmp(k, "--device") == 0 ) {
136   device = argv[++i];
137  } else if ( strcmp(k, "-dO") == 0 ) {
138   opts = argv[++i];
139
140  } else if ( strcmp(k, "-s") == 0 || strcmp(k, "--source") == 0 ) {
141   k = argv[++i];
142   if ( sources_add(k, s_dev, s_con, s_opt, s_prim) == -1 ) {
143    ROAR_ERR("main(*): adding source '%s' via '%s' failed!", s_dev, k);
144   }
145   s_opt = s_dev = s_con = NULL;
146   s_prim = 0;
147  } else if ( strcmp(k, "-S") == 0 ) {
148   s_dev = argv[++i];
149  } else if ( strcmp(k, "-sO") == 0 ) {
150   s_opt = argv[++i];
151  } else if ( strcmp(k, "-sC") == 0 ) {
152   s_con = argv[++i];
153  } else if ( strcmp(k, "-sP") == 0 ) {
154   s_prim = 1;
155
156  } else if ( strcmp(k, "-p") == 0 || strcmp(k, "--port") == 0 ) {
157   port = atoi(argv[++i]);
158  } else if ( strcmp(k, "-b") == 0 || strcmp(k, "--bind") == 0 || strcmp(k, "-s") == 0 || strcmp(k, "--sock") == 0 ) {
159   server = argv[++i];
160  } else if ( strcmp(k, "-t") == 0 ) {
161   server = ROAR_DEFAULT_HOST;
162  } else if ( strcmp(k, "-u") == 0 ) {
163   // ignore this case as it is the default behavor.
164  } else if ( strcmp(k, "-G") == 0 ) {
165   sock_grp = argv[++i];
166
167  } else if ( strcmp(k, "--no-listen") == 0 ) {
168   *server = 0;
169  } else if ( strcmp(k, "--client-fh") == 0 ) {
170   if ( clients_set_fh(clients_new(), atoi(argv[++i])) == -1 ) {
171    ROAR_ERR("main(*): Can not set client's fh");
172    return 1;
173   }
174
175  } else {
176   usage();
177   return 1;
178  }
179
180 }
181
182 ROAR_DBG("Server config: rate=%i, bits=%i, chans=%i", sa.rate, sa.bits, sa.channels);
183
184 if ( *server != 0 ) {
185  if ( (g_listen_socket = roar_socket_listen(ROAR_SOCKET_TYPE_UNKNOWN, server, port)) == -1 ) {
186   ROAR_ERR("Can not open listen socket!");
187   return 1;
188  }
189
190  if ( *server == '/' ) {
191   if ( (grp = getgrnam(sock_grp)) == NULL ) {
192    ROAR_ERR("Can not get GID for group %s: %s", sock_grp, strerror(errno));
193   } else {
194    chown(server, -1, grp->gr_gid);
195    if ( getuid() == 0 )
196     chmod(server, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
197   }
198  }
199 }
200
201 if ( output_buffer_init(&sa) == -1 ) {
202  ROAR_ERR("Can not init output buffer!");
203  return 1;
204 }
205
206 if ( driver_open(&drvinst, &drvid, driver, device, &sa) == -1 ) {
207  ROAR_ERR("Can not open output driver!");
208  return 1;
209 }
210
211 if ( samples_init() == -1 ) {
212  ROAR_ERR("Can not init samples!");
213  return 1;
214 }
215
216
217 signal(SIGINT,  on_sig_int);
218 signal(SIGPIPE, SIG_IGN);  // ignore broken pipes
219
220
221 clients_set_pid(g_self_client, getpid());
222 clients_get(g_self_client, &self);
223
224 if ( self == NULL ) {
225  ROAR_ERR("Can not get self client!");
226  return 1;
227 }
228
229 strcpy(self->name, "RoarAudio demon internal");
230
231 if ( demon ) {
232  close(ROAR_STDIN );
233  close(ROAR_STDOUT);
234  close(ROAR_STDERR);
235  if ( fork() )
236   _exit(0);
237 }
238
239 // start main loop...
240 main_loop(drvid, drvinst, &sa);
241
242 // clean up.
243 clean_quit_prep();
244 driver_close(drvinst, drvid);
245 output_buffer_free();
246
247 return 0;
248}
249
250void clean_quit_prep (void) {
251 close(g_listen_socket);
252
253 if ( *server == '/' )
254  unlink(server);
255
256
257 sources_free();
258 streams_free();
259 clients_free();
260}
261
262void clean_quit (void) {
263 clean_quit_prep();
264// driver_close(drvinst, drvid);
265// output_buffer_free();
266 exit(0);
267}
268
269//ll
Note: See TracBrowser for help on using the repository browser.