source: roaraudio/libroar/vio_dstr.c @ 1353:d3fff5536a2e

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

we need to set access modes and init next->def in case of sockets, got tcp:...##gopher:##file:... working :)

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