source: roaraudio/libroar/vio_dstr.c @ 3277:26c286f86c41

Last change on this file since 3277:26c286f86c41 was 3277:26c286f86c41, checked in by phi, 14 years ago

added RTP to DSTR API

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