source: roaraudio/libroar/vio_dstr.c @ 1335:548e9191245b

Last change on this file since 1335:548e9191245b was 1335:548e9191245b, checked in by phi, 15 years ago

got socket: and tcp: working, most others only need backend to be completed

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