source: roaraudio/libroar/vio_dstr.c @ 1365:b13ad1406546

Last change on this file since 1365:b13ad1406546 was 1365:b13ad1406546, checked in by phi, 15 years ago

make vio dstr optional

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