source: roaraudio/libroar/vio_dstr.c @ 3116:8ed19f241788

Last change on this file since 3116:8ed19f241788 was 3116:8ed19f241788, checked in by phi, 14 years ago

get tantalos basicly working

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