source: roaraudio/libroar/vio_dstr.c @ 3309:87551ae8faeb

Last change on this file since 3309:87551ae8faeb was 3309:87551ae8faeb, checked in by phi, 14 years ago

added some more named dstr objects, need to implement them

File size: 20.9 KB
Line 
1//vio_dstr.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009-2010
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36
37#ifndef ROAR_WITHOUT_VIO_DSTR
38struct {
39 int    id;
40 char * name;
41 int    pdeftype[16];
42} _roar_vio_dstr_objs[] = {
43/*
44grep '^#define ROAR_VIO_DSTR_OBJT_' vio_dstr.h | cut -d' ' -f2 | while read objt; do name=`cut -d_ -f5,6,7,8,9,10 <<<$objt | tr A-Z a-z`; echo -e " {$objt,\t \"$name\","; echo "      {ROAR_VIO_DEF_TYPE_EOL}},"; done;
45*/
46 {ROAR_VIO_DSTR_OBJT_FILE,       "file",
47      {ROAR_VIO_DEF_TYPE_EOL}},
48 {ROAR_VIO_DSTR_OBJT_FH,         "fh",
49      {ROAR_VIO_DEF_TYPE_EOL}},
50 {ROAR_VIO_DSTR_OBJT_FD,         "fd",
51      {ROAR_VIO_DEF_TYPE_EOL}},
52 {ROAR_VIO_DSTR_OBJT_SOCKETFH,   "socketfh",
53      {ROAR_VIO_DEF_TYPE_EOL}},
54 {ROAR_VIO_DSTR_OBJT_PASS,       "pass",
55      {ROAR_VIO_DEF_TYPE_EOL}},
56 {ROAR_VIO_DSTR_OBJT_RE,         "re",
57      {ROAR_VIO_DEF_TYPE_EOL}},
58 {ROAR_VIO_DSTR_OBJT_JUMBO,      "jumbo", /* TODO */
59      {ROAR_VIO_DEF_TYPE_EOL}},
60 {ROAR_VIO_DSTR_OBJT_EXEC,       "exec",
61      {ROAR_VIO_DEF_TYPE_EOL}},
62
63 {ROAR_VIO_DSTR_OBJT_SOCKET,     "socket",
64      {ROAR_VIO_DEF_TYPE_EOL}},
65 {ROAR_VIO_DSTR_OBJT_UNIX,       "unix",
66      {ROAR_VIO_DEF_TYPE_EOL}},
67 {ROAR_VIO_DSTR_OBJT_DECNET,     "decnet",
68      {ROAR_VIO_DEF_TYPE_EOL}},
69 {ROAR_VIO_DSTR_OBJT_TCP,        "tcp",
70      {ROAR_VIO_DEF_TYPE_EOL}},
71 {ROAR_VIO_DSTR_OBJT_UDP,        "udp",
72      {ROAR_VIO_DEF_TYPE_EOL}},
73 {ROAR_VIO_DSTR_OBJT_TCP6,       "tcp6",
74      {ROAR_VIO_DEF_TYPE_EOL}},
75 {ROAR_VIO_DSTR_OBJT_UDP6,       "udp6",
76      {ROAR_VIO_DEF_TYPE_EOL}},
77
78 {ROAR_VIO_DSTR_OBJT_SOCKS,      "socks",
79      {ROAR_VIO_DEF_TYPE_EOL}},
80 {ROAR_VIO_DSTR_OBJT_SOCKS4,     "socks4",
81      {ROAR_VIO_DEF_TYPE_EOL}},
82 {ROAR_VIO_DSTR_OBJT_SOCKS4A,    "socks4a",
83      {ROAR_VIO_DEF_TYPE_EOL}},
84 {ROAR_VIO_DSTR_OBJT_SOCKS4D,    "socks4d",
85      {ROAR_VIO_DEF_TYPE_EOL}},
86 {ROAR_VIO_DSTR_OBJT_SOCKS5,     "socks5",
87      {ROAR_VIO_DEF_TYPE_EOL}},
88 {ROAR_VIO_DSTR_OBJT_SSH,        "ssh",
89      {ROAR_VIO_DEF_TYPE_EOL}},
90
91 {ROAR_VIO_DSTR_OBJT_HTTP09,     "http09",
92      {ROAR_VIO_DEF_TYPE_EOL}},
93 {ROAR_VIO_DSTR_OBJT_HTTP10,     "http10",
94      {ROAR_VIO_DEF_TYPE_EOL}},
95 {ROAR_VIO_DSTR_OBJT_HTTP11,     "http11",
96      {ROAR_VIO_DEF_TYPE_EOL}},
97 {ROAR_VIO_DSTR_OBJT_HTTP,       "http",
98      {ROAR_VIO_DEF_TYPE_EOL}},
99 {ROAR_VIO_DSTR_OBJT_GOPHER,     "gopher",
100      {ROAR_VIO_DEF_TYPE_EOL}},
101 {ROAR_VIO_DSTR_OBJT_GOPHER_PLUS,"gopher+",
102      {ROAR_VIO_DEF_TYPE_EOL}},
103 {ROAR_VIO_DSTR_OBJT_ICY,        "icy",
104      {ROAR_VIO_DEF_TYPE_EOL}},
105 {ROAR_VIO_DSTR_OBJT_RTP2,       "rtp2",
106      {ROAR_VIO_DEF_TYPE_EOL}},
107 {ROAR_VIO_DSTR_OBJT_RTP,        "rtp",
108      {ROAR_VIO_DEF_TYPE_EOL}},
109
110 {ROAR_VIO_DSTR_OBJT_GZIP,       "gzip",
111      {ROAR_VIO_DEF_TYPE_EOL}},
112 {ROAR_VIO_DSTR_OBJT_BZIP2,      "bzip2",
113      {ROAR_VIO_DEF_TYPE_EOL}},
114
115 {ROAR_VIO_DSTR_OBJT_PGP,        "pgp",
116      {ROAR_VIO_DEF_TYPE_EOL}},
117 {ROAR_VIO_DSTR_OBJT_PGP_ENC,    "pgp_enc",
118      {ROAR_VIO_DEF_TYPE_EOL}},
119 {ROAR_VIO_DSTR_OBJT_PGP_STORE,  "pgp_store",
120      {ROAR_VIO_DEF_TYPE_EOL}},
121 {ROAR_VIO_DSTR_OBJT_SSL1,       "ssl1",
122      {ROAR_VIO_DEF_TYPE_EOL}},
123 {ROAR_VIO_DSTR_OBJT_SSL2,       "ssl2",
124      {ROAR_VIO_DEF_TYPE_EOL}},
125 {ROAR_VIO_DSTR_OBJT_SSL3,       "ssl3",
126      {ROAR_VIO_DEF_TYPE_EOL}},
127 {ROAR_VIO_DSTR_OBJT_TLS,        "tls",
128      {ROAR_VIO_DEF_TYPE_EOL}},
129 {ROAR_VIO_DSTR_OBJT_SSLTLS,     "ssltls",
130      {ROAR_VIO_DEF_TYPE_EOL}},
131
132 {ROAR_VIO_DSTR_OBJT_TRANSCODE,  "transcode", /* TODO  */
133      {ROAR_VIO_DEF_TYPE_EOL}},
134
135 {ROAR_VIO_DSTR_OBJT_RAUM,       "raum",      /* TODO */
136      {ROAR_VIO_DEF_TYPE_EOL}},
137 {ROAR_VIO_DSTR_OBJT_OGG,        "ogg",       /* TODO */
138      {ROAR_VIO_DEF_TYPE_EOL}},
139 {ROAR_VIO_DSTR_OBJT_TAR,        "tar",       /* TODO */
140      {ROAR_VIO_DEF_TYPE_EOL}},
141
142
143 {ROAR_VIO_DSTR_OBJT_MAGIC,      "magic",
144      {ROAR_VIO_DEF_TYPE_EOL}},
145 {ROAR_VIO_DSTR_OBJT_TANTALOS,   "tantalos",
146      {ROAR_VIO_DEF_TYPE_EOL}},
147
148 {ROAR_VIO_DSTR_OBJT_INTERNAL, "INTERNAL",
149      {ROAR_VIO_DEF_TYPE_FILE, ROAR_VIO_DEF_TYPE_SOCKET, ROAR_VIO_DEF_TYPE_FH, ROAR_VIO_DEF_TYPE_SOCKETFH,
150       ROAR_VIO_DEF_TYPE_EOL}},
151 {ROAR_VIO_DSTR_OBJT_EOL, NULL, {ROAR_VIO_DEF_TYPE_EOL}}
152};
153
154int     roar_vio_dstr_get_type(char * str) {
155 int i;
156
157 for (i = 0; _roar_vio_dstr_objs[i].id != ROAR_VIO_DSTR_OBJT_EOL; i++) {
158  if ( strcasecmp(_roar_vio_dstr_objs[i].name, str) == 0 )
159   return _roar_vio_dstr_objs[i].id;
160 }
161
162 return -1;
163}
164
165char *  roar_vio_dstr_get_name(int type) {
166 int i;
167
168 for (i = 0; _roar_vio_dstr_objs[i].id != ROAR_VIO_DSTR_OBJT_EOL; i++) {
169  if ( _roar_vio_dstr_objs[i].id == type )
170   return _roar_vio_dstr_objs[i].name;
171 }
172
173 if ( type == ROAR_VIO_DSTR_OBJT_EOL )
174  return "<<EOL>>";
175
176 return NULL;
177}
178#endif
179
180int     roar_vio_dstr_init_defaults (struct roar_vio_defaults * def, int type, int o_flags, mode_t o_mode) {
181 if ( def == NULL )
182  return -1;
183
184 memset(def, 0, sizeof(struct roar_vio_defaults));
185
186 def->type    = type;
187 def->o_flags = o_flags;
188 def->o_mode  = o_mode;
189
190 return 0;
191}
192
193int     roar_vio_dstr_init_defaults_c (struct roar_vio_defaults * def, int type, struct roar_vio_defaults * odef, int o_flags) {
194 if ( o_flags < 1 )
195  o_flags = O_RDONLY;
196
197 if ( odef == NULL ) {
198  return roar_vio_dstr_init_defaults(def, type, o_flags, 0644);
199 } else {
200  return roar_vio_dstr_init_defaults(def, type, odef->o_flags, odef->o_mode);
201 }
202}
203
204#ifndef ROAR_WITHOUT_VIO_DSTR
205int     roar_vio_open_default (struct roar_vio_calls * calls, struct roar_vio_defaults * def, char * opts) {
206 ROAR_DBG("roar_vio_open_default(calls=%p, def=%p, opts='%s') = ?", calls, def, opts);
207
208 if ( calls == NULL || def == NULL )
209  return -1;
210
211 switch (def->type) {
212  case ROAR_VIO_DEF_TYPE_NONE:
213   break;
214  case ROAR_VIO_DEF_TYPE_FILE:
215    if ( roar_vio_open_file(calls, def->d.file, def->o_flags, def->o_mode) == -1 )
216     return -1;
217   break;
218  case ROAR_VIO_DEF_TYPE_SOCKET:
219     if ( roar_vio_open_def_socket(calls, def, opts) == -1 )
220      return -1;
221   break;
222  case ROAR_VIO_DEF_TYPE_FH:
223    if ( roar_vio_open_fh(calls, def->d.fh) == -1 )
224     return -1;
225   break;
226  case ROAR_VIO_DEF_TYPE_SOCKETFH:
227    if ( roar_vio_open_fh_socket(calls, def->d.fh) == -1 )
228     return -1;
229   break;
230  default:
231    return -1;
232 }
233
234 return 0;
235}
236#endif
237
238int     roar_vio_open_dstr    (struct roar_vio_calls * calls, char * dstr, struct roar_vio_defaults * def, int dnum) {
239 return roar_vio_open_dstr_vio(calls, dstr, def, dnum, NULL);
240}
241
242#define _ret(x) free(dstr); return (x)
243
244int     roar_vio_open_dstr_vio(struct roar_vio_calls * calls,
245                               char * dstr, struct roar_vio_defaults * def, int dnum,
246                               struct roar_vio_calls * vio) {
247#ifndef ROAR_WITHOUT_VIO_DSTR
248 struct roar_vio_dstr_chain chain[ROAR_VIO_DSTR_MAX_OBJ_PER_CHAIN];
249 char * next;
250 char * this;
251 char * name;
252 char * opts;
253 char * dst;
254 char * c;
255 int    inopts;
256 int    type;
257 int    cc = 1; // current chain element
258
259 if ( calls == NULL || dstr == NULL )
260  return -1;
261
262 if ( dnum != 0 && def == NULL )
263  return -1;
264
265 if ( (dstr = strdup(dstr)) == NULL )
266  return -1;
267
268 memset(chain, 0, sizeof(chain));
269
270 chain[0].type = ROAR_VIO_DSTR_OBJT_INTERNAL;
271
272 next = dstr;
273
274 while (next != NULL) {
275  if ( (cc+1) == ROAR_VIO_DSTR_MAX_OBJ_PER_CHAIN ) {
276   _ret(-1);
277  }
278
279  this = next;
280  next = strstr(next, "##");
281
282  if (next != NULL) {
283   *next = 0;
284   next += 2;
285  }
286
287  // we have the current token in 'this'.
288
289  opts   = NULL;
290  dst    = NULL;
291
292  if ( strstr(this, ":") != NULL ) {
293   name   = this;
294   inopts = 0;
295   for (c = this; *c != 0; c++) {
296    if ( *c == '[' ) {
297     *c     = 0;
298     opts   = c + 1;
299     inopts = 1;
300    } else if ( *c == ']' &&  inopts ) {
301     *c     = 0;
302     inopts = 0;
303    } else if ( *c == ':' && !inopts ) {
304     *c     = 0;
305     dst    = *(c+1) == 0 ? NULL : c + 1;
306     break;
307    }
308   }
309  } else {
310   // we need to guess that this is here...
311   // currently we guess this is a file in all cases
312   name = "file";
313   dst  = this;
314  }
315
316  ROAR_DBG("roar_vio_open_dstr_vio(*): name='%s', opts='%s', dst='%s'", name, opts, dst);
317
318  if ( (type = roar_vio_dstr_get_type(name)) == -1 ) {
319   _ret(-1);
320  }
321
322  ROAR_DBG("roar_vio_open_dstr_vio(*): type=0x%.4x(%s)", type, roar_vio_dstr_get_name(type));
323
324  chain[cc].type     = type;
325  chain[cc].opts     = opts;
326  chain[cc].dst      = dst;
327  chain[cc].def      = NULL;
328  chain[cc].vio      = NULL;
329  chain[cc].need_vio = -1;
330  cc++;
331
332 }
333
334 chain[cc].type = ROAR_VIO_DSTR_OBJT_EOL;
335
336 ROAR_DBG("roar_vio_open_dstr_vio(*): chain=%p", chain);
337
338 if ( roar_vio_dstr_parse_opts(chain) == -1 ) {
339  _ret(-1);
340 }
341
342 if ( roar_vio_dstr_set_defaults(chain, cc, def, dnum) == -1 ) {
343  _ret(-1);
344 }
345
346 if ( roar_vio_dstr_build_chain(chain, calls, vio) == -1 ) {
347  _ret(-1);
348 }
349
350 _ret(0);
351#else
352 return -1;
353#endif
354}
355
356#undef _ret
357
358#ifndef ROAR_WITHOUT_VIO_DSTR
359int     roar_vio_dstr_parse_opts(struct roar_vio_dstr_chain * chain) {
360 if ( chain == NULL )
361  return -1;
362
363 // TODO: we should add some code here later...
364
365 return 0;
366}
367
368int     roar_vio_dstr_set_defaults(struct roar_vio_dstr_chain * chain, int len, struct roar_vio_defaults * def, int dnum) {
369 struct roar_vio_dstr_chain * c, * next;
370 int i;
371 int tmp[8];
372
373 if ( chain == NULL )
374  return -1;
375
376 if ( def == NULL && dnum != 0 )
377  return -1;
378
379 if ( dnum > 1 ) /* currently not supported */
380  return -1;
381
382 if ( dnum == 0 )
383  def = NULL;
384
385 chain[len].def = def;
386
387 for (i = len; i >= 0; i--) {
388  c    = &chain[i];
389
390  if ( i > 0 ) {
391   next = &chain[i-1];
392  } else {
393   next = NULL;
394
395   if ( c->type != ROAR_VIO_DSTR_OBJT_INTERNAL )
396    return -1;
397  }
398
399  memset(tmp, 0, sizeof(tmp));
400
401  ROAR_DBG("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s)", i, c->type & 0xFFFF, roar_vio_dstr_get_name(c->type));
402  ROAR_DBG("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s): c->def=%p, c->def->type=%i", i, c->type & 0xFFFF,
403                   roar_vio_dstr_get_name(c->type), c->def, c->def == NULL ? -1 : c->def->type);
404
405  c->need_vio = 1;
406
407  switch (c->type) {
408   case ROAR_VIO_DSTR_OBJT_INTERNAL:
409     c->need_vio = 0;
410    break;
411   case ROAR_VIO_DSTR_OBJT_EOL:
412     tmp[0] = 1;
413   case ROAR_VIO_DSTR_OBJT_PASS:
414   case ROAR_VIO_DSTR_OBJT_RE:
415   case ROAR_VIO_DSTR_OBJT_RTP2: // we currently only forward the defs
416   case ROAR_VIO_DSTR_OBJT_GZIP:
417   case ROAR_VIO_DSTR_OBJT_BZIP2:
418   case ROAR_VIO_DSTR_OBJT_PGP:
419   case ROAR_VIO_DSTR_OBJT_PGP_ENC:
420   case ROAR_VIO_DSTR_OBJT_PGP_STORE:
421   case ROAR_VIO_DSTR_OBJT_SSL1:
422   case ROAR_VIO_DSTR_OBJT_SSL2:
423   case ROAR_VIO_DSTR_OBJT_SSL3:
424   case ROAR_VIO_DSTR_OBJT_TLS:
425   case ROAR_VIO_DSTR_OBJT_MAGIC:
426     if ( tmp[0] )
427      c->need_vio = 0;
428
429     next->def = c->def;
430    break;
431   case ROAR_VIO_DSTR_OBJT_TANTALOS:
432     next->def = &(next->store_def);
433     roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_NONE, NULL, -1);
434    break;
435   case ROAR_VIO_DSTR_OBJT_FILE:
436     if ( c->dst == NULL ) /* should we allow multible cascaed file: objects? */
437      return -1;
438
439     c->need_vio = 0;
440     next->def = &(next->store_def);
441     roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_FILE, c->def, -1);
442
443     if ( c->dst[0] == '/' && c->dst[1] == '/' ) {
444      next->def->d.file = c->dst + 1;
445     } else {
446      next->def->d.file = c->dst;
447     }
448    break;
449   case ROAR_VIO_DSTR_OBJT_FH:
450     tmp[0] = 1;
451   case ROAR_VIO_DSTR_OBJT_SOCKETFH:
452     c->need_vio = 0;
453     next->def = &(next->store_def);
454
455     if ( c->def != NULL ) {
456      tmp[2] = c->def->o_flags;
457      tmp[3] = c->def->o_mode;
458     } else {
459      tmp[2] = O_RDONLY;
460      tmp[3] = 0644;
461     }
462
463     if ( !strcasecmp(c->dst, "stdin") ) {
464      tmp[1] = ROAR_STDIN;
465      tmp[2] = O_RDONLY;
466     } else if ( !strcasecmp(c->dst, "stdout") ) {
467      tmp[1] = ROAR_STDOUT;
468      tmp[2] = O_WRONLY;
469     } else if ( !strcasecmp(c->dst, "stderr") ) {
470      tmp[1] = ROAR_STDERR;
471      tmp[2] = O_WRONLY;
472     } else {
473      if ( sscanf(c->dst, "%i", &tmp[1]) != 1 )
474       return -1;
475     }
476
477     roar_vio_dstr_init_defaults(next->def, tmp[0] ? ROAR_VIO_DEF_TYPE_FH : ROAR_VIO_DEF_TYPE_SOCKETFH, tmp[2], tmp[3]);
478     next->def->d.fh = tmp[1];
479    break;
480#ifdef ROAR_HAVE_UNIX
481   case ROAR_VIO_DSTR_OBJT_UNIX:
482     c->need_vio = 0;
483     next->def = &(next->store_def);
484
485     if ( c->dst == NULL ) { // we don't have a destination? -> slow way
486      if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
487       return -1;
488
489      if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_UNIX, SOCK_STREAM, c->def) == -1 )
490       return -1;
491     } else {                // we have a destination? -> fast way
492      if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
493       return -1;
494
495      if ( roar_vio_socket_init_unix_def(next->def, c->dst) == -1 )
496       return -1;
497     }
498    break;
499#endif
500   case ROAR_VIO_DSTR_OBJT_SOCKET:
501     c->need_vio = 0;
502     next->def = &(next->store_def);
503
504     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
505      return -1;
506
507     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, -1, SOCK_STREAM, c->def) == -1 )
508      return -1;
509    break;
510#ifdef ROAR_HAVE_LIBDNET
511   case ROAR_VIO_DSTR_OBJT_DECNET:
512     c->need_vio = 0;
513     next->def = &(next->store_def);
514
515     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
516      return -1;
517
518     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_DECnet, SOCK_STREAM, c->def) == -1 )
519      return -1;
520    break;
521#endif
522#ifdef ROAR_HAVE_IPV4
523   case ROAR_VIO_DSTR_OBJT_TCP:
524     c->need_vio = 0;
525     next->def = &(next->store_def);
526
527     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
528      return -1;
529
530     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_INET, SOCK_STREAM, c->def) == -1 )
531      return -1;
532    break;
533   case ROAR_VIO_DSTR_OBJT_UDP:
534     c->need_vio = 0;
535     next->def = &(next->store_def);
536
537     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
538      return -1;
539
540     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_INET, SOCK_DGRAM, c->def) == -1 )
541      return -1;
542    break;
543#endif
544#ifdef ROAR_HAVE_IPV6
545   case ROAR_VIO_DSTR_OBJT_TCP6:
546     c->need_vio = 0;
547     next->def = &(next->store_def);
548
549     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
550      return -1;
551
552     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_INET6, SOCK_STREAM, c->def) == -1 )
553      return -1;
554    break;
555   case ROAR_VIO_DSTR_OBJT_UDP6:
556     c->need_vio = 0;
557     next->def = &(next->store_def);
558
559     if ( roar_vio_dstr_init_defaults_c(next->def, ROAR_VIO_DEF_TYPE_SOCKET, c->def, O_WRONLY) == -1 )
560      return -1;
561
562     if ( roar_vio_socket_init_dstr_def(next->def, c->dst, AF_INET6, SOCK_DGRAM, c->def) == -1 )
563      return -1;
564    break;
565#endif
566   case ROAR_VIO_DSTR_OBJT_HTTP09:
567   case ROAR_VIO_DSTR_OBJT_HTTP10:
568   case ROAR_VIO_DSTR_OBJT_HTTP11:
569     c->need_vio = 1;
570     next->def = &(next->store_def);
571
572     if ( roar_vio_proto_init_def(next->def, c->dst, ROAR_VIO_PROTO_P_HTTP, c->def) == -1 )
573      return -1;
574    break;
575   case ROAR_VIO_DSTR_OBJT_GOPHER:
576   case ROAR_VIO_DSTR_OBJT_GOPHER_PLUS:
577     c->need_vio = 1;
578     next->def = &(next->store_def);
579
580     if ( roar_vio_proto_init_def(next->def, c->dst, ROAR_VIO_PROTO_P_GOPHER, c->def) == -1 )
581      return -1;
582    break;
583   case ROAR_VIO_DSTR_OBJT_ICY:
584     c->need_vio = 1;
585     next->def = &(next->store_def);
586
587     if ( roar_vio_proto_init_def(next->def, c->dst, ROAR_VIO_PROTO_P_ICY, c->def) == -1 )
588      return -1;
589    break;
590   default:
591    return -1;
592  }
593
594  if ( next != NULL ) {
595   ROAR_DBG("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s): next->def=%p, next->def->type=%i", i,
596                    c->type & 0xFFFF, roar_vio_dstr_get_name(c->type),
597                    next->def, next->def == NULL ? -1 : next->def->type);
598   if ( next->def != NULL ) {
599    ROAR_DBG("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s): next->def->o_flags=%i", i,
600                     c->type & 0xFFFF, roar_vio_dstr_get_name(c->type),
601                     next->def->o_flags);
602   }
603  } else {
604   ROAR_DBG("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s): next=NULL", i,
605                    c->type & 0xFFFF, roar_vio_dstr_get_name(c->type));
606  }
607 }
608
609 ROAR_DBG("roar_vio_dstr_set_defaults(*) = 0");
610
611 return 0;
612}
613
614#define _ret(x) roar_vio_close(calls); ROAR_DBG("roar_vio_dstr_build_chain(*) = %i", (x)); return (x)
615
616int     roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls,
617                                  struct roar_vio_calls * vio) {
618 struct roar_vio_dstr_chain * c;
619 struct roar_vio_defaults   * def;
620 struct roar_vio_calls      * tc, * prev;
621 int i;
622
623 ROAR_DBG("roar_vio_dstr_build_chain(*) = ?");
624
625 if ( chain == NULL || calls == NULL )
626  return -1;
627
628 if ( roar_vio_open_stack(calls) == -1 )
629  return -1;
630
631 ROAR_DBG("roar_vio_dstr_build_chain(*): chain=%p", chain);
632
633 if ( (def = chain->def) != NULL ) {
634  if ( (tc = malloc(sizeof(struct roar_vio_calls))) == NULL ) {
635   _ret(-1);
636  }
637
638  if ( roar_vio_init_calls(tc) == -1 ) {
639   free(tc);
640   _ret(-1);
641  }
642
643  if ( roar_vio_stack_add(calls, tc) == -1 ) {
644   _ret(-1);
645  }
646
647  if ( chain->opts == NULL ) {
648   if ( chain[1].type != ROAR_VIO_DSTR_OBJT_EOL ) {
649    chain->opts = chain[1].opts;
650   }
651  }
652
653  if ( roar_vio_open_default(tc, def, chain->opts) == -1 ) {
654   _ret(-1);
655  }
656
657  prev = tc;
658 } else {
659  prev = vio;
660 }
661
662 for (i = 0; (c = &chain[i])->type != ROAR_VIO_DSTR_OBJT_EOL; i++) {
663  ROAR_DBG("roar_vio_dstr_build_chain(*): i=%i, c->type=0x%.4x(%s): need_vio=%i, def->o_flags=%i", i,
664                   c->type & 0xFFFF, roar_vio_dstr_get_name(c->type), c->need_vio, c->def->o_flags);
665
666  if ( c->need_vio ) {
667   if ( (tc = malloc(sizeof(struct roar_vio_calls))) == NULL ) {
668    _ret(-1);
669   }
670
671   if ( roar_vio_init_calls(tc) == -1 ) {
672    free(tc);
673    _ret(-1);
674   }
675
676   if ( roar_vio_stack_add(calls, tc) == -1 ) {
677    _ret(-1);
678   }
679
680
681   switch (c->type) {
682    case ROAR_VIO_DSTR_OBJT_PASS:
683      if ( roar_vio_open_pass(tc, prev) == -1 ) {
684       _ret(-1);
685      }
686     break;
687    case ROAR_VIO_DSTR_OBJT_RE:
688      if ( roar_vio_open_re(tc, prev) == -1 ) {
689       _ret(-1);
690      }
691     break;
692    case ROAR_VIO_DSTR_OBJT_GZIP:
693      if ( roar_vio_open_gzip(tc, prev, -1) == -1 ) {
694       _ret(-1);
695      }
696     break;
697    case ROAR_VIO_DSTR_OBJT_BZIP2:
698    case ROAR_VIO_DSTR_OBJT_PGP:
699      if ( roar_vio_open_pgp_decrypt(tc, prev, NULL) == -1 ) {
700       _ret(-1);
701      }
702     break;
703    case ROAR_VIO_DSTR_OBJT_HTTP09:
704    case ROAR_VIO_DSTR_OBJT_HTTP10:
705    case ROAR_VIO_DSTR_OBJT_HTTP11:
706      if ( roar_vio_open_proto(tc, prev, c->dst, ROAR_VIO_PROTO_P_HTTP, c->def) == -1 ) {
707       _ret(-1);
708      }
709     break;
710    case ROAR_VIO_DSTR_OBJT_GOPHER:
711    case ROAR_VIO_DSTR_OBJT_GOPHER_PLUS:
712      if ( roar_vio_open_proto(tc, prev, c->dst, ROAR_VIO_PROTO_P_GOPHER, c->def) == -1 ) {
713       _ret(-1);
714      }
715     break;
716    case ROAR_VIO_DSTR_OBJT_ICY:
717      if ( roar_vio_open_proto(tc, prev, c->dst, ROAR_VIO_PROTO_P_ICY, c->def) == -1 ) {
718       _ret(-1);
719      }
720     break;
721    case ROAR_VIO_DSTR_OBJT_RTP2:
722      if ( roar_vio_open_rtp(tc, prev, c->dst, c->def) == -1 ) {
723       _ret(-1);
724      }
725     break;
726    case ROAR_VIO_DSTR_OBJT_PGP_ENC:
727    case ROAR_VIO_DSTR_OBJT_PGP_STORE:
728      if ( roar_vio_open_pgp_store(tc, prev, ROAR_VIO_PGP_OPTS_NONE) == -1 ) {
729       _ret(-1);
730      }
731     break;
732    case ROAR_VIO_DSTR_OBJT_TANTALOS:
733      if ( roar_vio_open_tantalos(tc, prev, c->dst, c->def) == -1 ) {
734       _ret(-1);
735      }
736     break;
737    case ROAR_VIO_DSTR_OBJT_SSL1:
738    case ROAR_VIO_DSTR_OBJT_SSL2:
739    case ROAR_VIO_DSTR_OBJT_SSL3:
740    case ROAR_VIO_DSTR_OBJT_TLS:
741    case ROAR_VIO_DSTR_OBJT_MAGIC:
742      _ret(-1);
743     break;
744    default:
745      _ret(-1);
746   }
747
748   prev = tc;
749  } // else we can skip to the next :)
750 }
751
752 ROAR_DBG("roar_vio_dstr_build_chain(*) = 0");
753 return 0;
754}
755
756#undef _ret
757#endif
758
759//ll
Note: See TracBrowser for help on using the repository browser.