source: roaraudio/libroar/vio_dstr.c @ 3310:d43b145fb8ab

Last change on this file since 3310:d43b145fb8ab was 3310:d43b145fb8ab, checked in by phi, 14 years ago

added some vars to type struct, needed so we can add entrys later

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