source: roaraudio/libroar/vio_dstr.c @ 1325:13b46f83762f

Last change on this file since 1325:13b46f83762f was 1325:13b46f83762f, checked in by phi, 15 years ago

wrote a lot dstr code, started def setting code

File size: 10.2 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_SOCKETFH,   "socketfh",
50      {ROAR_VIO_DEF_TYPE_EOL}},
51 {ROAR_VIO_DSTR_OBJT_PASS,       "pass",
52      {ROAR_VIO_DEF_TYPE_EOL}},
53 {ROAR_VIO_DSTR_OBJT_RE,         "re",
54      {ROAR_VIO_DEF_TYPE_EOL}},
55 {ROAR_VIO_DSTR_OBJT_EXEC,       "exec",
56      {ROAR_VIO_DEF_TYPE_EOL}},
57
58 {ROAR_VIO_DSTR_OBJT_SOCKET,     "socket",
59      {ROAR_VIO_DEF_TYPE_EOL}},
60 {ROAR_VIO_DSTR_OBJT_UNIX,       "unix",
61      {ROAR_VIO_DEF_TYPE_EOL}},
62 {ROAR_VIO_DSTR_OBJT_DECNET,     "decnet",
63      {ROAR_VIO_DEF_TYPE_EOL}},
64 {ROAR_VIO_DSTR_OBJT_TCP,        "tcp",
65      {ROAR_VIO_DEF_TYPE_EOL}},
66 {ROAR_VIO_DSTR_OBJT_UDP,        "udp",
67      {ROAR_VIO_DEF_TYPE_EOL}},
68 {ROAR_VIO_DSTR_OBJT_TCP6,       "tcp6",
69      {ROAR_VIO_DEF_TYPE_EOL}},
70 {ROAR_VIO_DSTR_OBJT_UDP6,       "udp6",
71      {ROAR_VIO_DEF_TYPE_EOL}},
72
73 {ROAR_VIO_DSTR_OBJT_SOCKS,      "socks",
74      {ROAR_VIO_DEF_TYPE_EOL}},
75 {ROAR_VIO_DSTR_OBJT_SOCKS4,     "socks4",
76      {ROAR_VIO_DEF_TYPE_EOL}},
77 {ROAR_VIO_DSTR_OBJT_SOCKS4A,    "socks4a",
78      {ROAR_VIO_DEF_TYPE_EOL}},
79 {ROAR_VIO_DSTR_OBJT_SOCKS4D,    "socks4d",
80      {ROAR_VIO_DEF_TYPE_EOL}},
81 {ROAR_VIO_DSTR_OBJT_SOCKS5,     "socks5",
82      {ROAR_VIO_DEF_TYPE_EOL}},
83 {ROAR_VIO_DSTR_OBJT_SSH,        "ssh",
84      {ROAR_VIO_DEF_TYPE_EOL}},
85
86 {ROAR_VIO_DSTR_OBJT_HTTP09,     "http09",
87      {ROAR_VIO_DEF_TYPE_EOL}},
88 {ROAR_VIO_DSTR_OBJT_HTTP10,     "http10",
89      {ROAR_VIO_DEF_TYPE_EOL}},
90 {ROAR_VIO_DSTR_OBJT_HTTP11,     "http11",
91      {ROAR_VIO_DEF_TYPE_EOL}},
92 {ROAR_VIO_DSTR_OBJT_HTTP,       "http",
93      {ROAR_VIO_DEF_TYPE_EOL}},
94 {ROAR_VIO_DSTR_OBJT_GOPHER,     "gopher",
95      {ROAR_VIO_DEF_TYPE_EOL}},
96
97 {ROAR_VIO_DSTR_OBJT_GZIP,       "gzip",
98      {ROAR_VIO_DEF_TYPE_EOL}},
99 {ROAR_VIO_DSTR_OBJT_BZIP2,      "bzip2",
100      {ROAR_VIO_DEF_TYPE_EOL}},
101
102 {ROAR_VIO_DSTR_OBJT_PGP,        "pgp",
103      {ROAR_VIO_DEF_TYPE_EOL}},
104 {ROAR_VIO_DSTR_OBJT_PGP_ENC,    "pgp_enc",
105      {ROAR_VIO_DEF_TYPE_EOL}},
106 {ROAR_VIO_DSTR_OBJT_PGP_STORE,  "pgp_store",
107      {ROAR_VIO_DEF_TYPE_EOL}},
108 {ROAR_VIO_DSTR_OBJT_SSL1,       "ssl1",
109      {ROAR_VIO_DEF_TYPE_EOL}},
110 {ROAR_VIO_DSTR_OBJT_SSL2,       "ssl2",
111      {ROAR_VIO_DEF_TYPE_EOL}},
112 {ROAR_VIO_DSTR_OBJT_SSL3,       "ssl3",
113      {ROAR_VIO_DEF_TYPE_EOL}},
114 {ROAR_VIO_DSTR_OBJT_TLS,        "tls",
115      {ROAR_VIO_DEF_TYPE_EOL}},
116 {ROAR_VIO_DSTR_OBJT_SSLTLS,     "ssltls",
117      {ROAR_VIO_DEF_TYPE_EOL}},
118
119 {ROAR_VIO_DSTR_OBJT_MAGIC,      "magic",
120      {ROAR_VIO_DEF_TYPE_EOL}},
121
122 {ROAR_VIO_DSTR_OBJT_INTERNAL, "INTERNAL",
123      {ROAR_VIO_DEF_TYPE_FILE, ROAR_VIO_DEF_TYPE_SOCKET, ROAR_VIO_DEF_TYPE_FH, ROAR_VIO_DEF_TYPE_SOCKETFH,
124       ROAR_VIO_DEF_TYPE_EOL}},
125 {ROAR_VIO_DSTR_OBJT_EOL, NULL, {ROAR_VIO_DEF_TYPE_EOL}}
126};
127
128int     roar_vio_dstr_get_type(char * str) {
129 int i;
130
131 for (i = 0; _roar_vio_dstr_objs[i].id != ROAR_VIO_DSTR_OBJT_EOL; i++) {
132  if ( strcasecmp(_roar_vio_dstr_objs[i].name, str) == 0 )
133   return _roar_vio_dstr_objs[i].id;
134 }
135
136 return -1;
137}
138
139char *  roar_vio_dstr_get_name(int type) {
140 int i;
141
142 for (i = 0; _roar_vio_dstr_objs[i].id != ROAR_VIO_DSTR_OBJT_EOL; i++) {
143  if ( _roar_vio_dstr_objs[i].id == type )
144   return _roar_vio_dstr_objs[i].name;
145 }
146
147 if ( type == ROAR_VIO_DSTR_OBJT_EOL )
148  return "<<EOL>>";
149
150 return NULL;
151}
152
153int     roar_vio_dstr_init_defaults (struct roar_vio_defaults * def, int type, int o_flags, mode_t o_mode) {
154 if ( def == NULL )
155  return -1;
156
157 memset(def, 0, sizeof(struct roar_vio_defaults));
158
159 def->type    = type;
160 def->o_flags = o_flags;
161 def->o_mode  = o_mode;
162
163 return 0;
164}
165
166int     roar_vio_open_dstr    (struct roar_vio_calls * calls, char * dstr, struct roar_vio_defaults * def, int dnum) {
167 return roar_vio_open_dstr_vio(calls, dstr, def, dnum, NULL);
168}
169
170#define _ret(x) free(dstr); return (x)
171
172int     roar_vio_open_dstr_vio(struct roar_vio_calls * calls,
173                               char * dstr, struct roar_vio_defaults * def, int dnum,
174                               struct roar_vio_calls * vio) {
175 struct roar_vio_dstr_chain chain[ROAR_VIO_DSTR_MAX_OBJ_PER_CHAIN];
176 char * next;
177 char * this;
178 char * name;
179 char * opts;
180 char * dst;
181 char * c;
182 int    inopts;
183 int    type;
184 int    cc = 0; // current chain element
185
186 if ( calls == NULL || dstr == NULL )
187  return -1;
188
189 if ( dnum != 0 && def == NULL )
190  return -1;
191
192 if ( (dstr = strdup(dstr)) == NULL )
193  return -1;
194
195 memset(chain, 0, sizeof(chain));
196
197 next = dstr;
198
199 while (next != NULL) {
200  if ( (cc+1) == ROAR_VIO_DSTR_MAX_OBJ_PER_CHAIN ) {
201   _ret(-1);
202  }
203
204  this = next;
205  next = strstr(next, "##");
206
207  if (next != NULL) {
208   *next = 0;
209   next += 2;
210  }
211
212  // we have the current token in 'this'.
213
214  opts   = NULL;
215  dst    = NULL;
216
217  if ( strstr(this, ":") != NULL ) {
218   name   = this;
219   inopts = 0;
220   for (c = this; *c != 0; c++) {
221    if ( *c == '[' ) {
222     *c     = 0;
223     opts   = c + 1;
224     inopts = 1;
225    } else if ( *c == ']' &&  inopts ) {
226     *c     = 0;
227     inopts = 0;
228    } else if ( *c == ':' && !inopts ) {
229     *c     = 0;
230     dst    = *(c+1) == 0 ? NULL : c + 1;
231     break;
232    }
233   }
234  } else {
235   // we need to guess that this is here...
236   // currently we guess this is a file in all cases
237   name = "file";
238   dst  = this;
239  }
240
241  ROAR_WARN("roar_vio_open_dstr_vio(*): name='%s', opts='%s', dst='%s'", name, opts, dst);
242
243  if ( (type = roar_vio_dstr_get_type(name)) == -1 ) {
244   _ret(-1);
245  }
246
247  ROAR_WARN("roar_vio_open_dstr_vio(*): type=0x%.4x(%s)", type, roar_vio_dstr_get_name(type));
248
249  chain[cc].type     = type;
250  chain[cc].opts     = opts;
251  chain[cc].dst      = dst;
252  chain[cc].def      = NULL;
253  chain[cc].vio      = NULL;
254  chain[cc].need_vio = -1;
255  cc++;
256
257 }
258
259 chain[cc].type = ROAR_VIO_DSTR_OBJT_EOL;
260
261 if ( roar_vio_dstr_parse_opts(chain) == -1 ) {
262  _ret(-1);
263 }
264
265 if ( roar_vio_dstr_set_defaults(chain, cc, def, dnum) == -1 ) {
266  _ret(-1);
267 }
268
269 if ( roar_vio_dstr_build_chain(chain, calls, vio) == -1 ) {
270  _ret(-1);
271 }
272
273 _ret(0);
274}
275
276#undef _ret
277
278int     roar_vio_dstr_parse_opts(struct roar_vio_dstr_chain * chain) {
279 if ( chain == NULL )
280  return -1;
281
282 // TODO: we should add some code here later...
283
284 return 0;
285}
286
287#define _toggle(x) ((x) = ((x) ? 0 : 1))
288
289int     roar_vio_dstr_set_defaults(struct roar_vio_dstr_chain * chain, int len, struct roar_vio_defaults * def, int dnum) {
290 struct roar_vio_dstr_chain * c, * next;
291 int i;
292
293 if ( chain == NULL )
294  return -1;
295
296 if ( def == NULL && dnum != 0 )
297  return -1;
298
299 if ( dnum > 1 ) /* currently not supported */
300  return -1;
301
302 if ( dnum == 0 )
303  def = NULL;
304
305 chain[len].def = def;
306
307 for (i = len; i >= 0; i--) {
308  c    = &chain[i];
309  next = &chain[i-1];
310
311  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));
312  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,
313                   roar_vio_dstr_get_name(c->type), c->def, c->def == NULL ? -1 : c->def->type);
314
315  c->need_vio = 1;
316
317  switch (c->type) {
318   case ROAR_VIO_DSTR_OBJT_PASS:
319   case ROAR_VIO_DSTR_OBJT_RE:
320   case ROAR_VIO_DSTR_OBJT_GZIP:
321   case ROAR_VIO_DSTR_OBJT_BZIP2:
322   case ROAR_VIO_DSTR_OBJT_PGP:
323   case ROAR_VIO_DSTR_OBJT_PGP_ENC:
324   case ROAR_VIO_DSTR_OBJT_PGP_STORE:
325   case ROAR_VIO_DSTR_OBJT_SSL1:
326   case ROAR_VIO_DSTR_OBJT_SSL2:
327   case ROAR_VIO_DSTR_OBJT_SSL3:
328   case ROAR_VIO_DSTR_OBJT_TLS:
329   case ROAR_VIO_DSTR_OBJT_MAGIC:
330    _toggle(c->need_vio);
331   case ROAR_VIO_DSTR_OBJT_EOL:
332    _toggle(c->need_vio);
333     next->def = c->def;
334    break;
335   case ROAR_VIO_DSTR_OBJT_FILE:
336     if ( c->dst == NULL ) /* should we allow multible cascaed file: objects? */
337      return -1;
338
339     c->need_vio = 0;
340     next->def = &(next->store_def);
341     if ( c->def != NULL ) {
342      roar_vio_dstr_init_defaults(next->def, ROAR_VIO_DEF_TYPE_FILE, c->def->o_flags, c->def->o_mode);
343     } else {
344      roar_vio_dstr_init_defaults(next->def, ROAR_VIO_DEF_TYPE_FILE, O_RDONLY, 0644);
345     }
346
347     if ( c->dst[0] == '/' && c->dst[1] == '/' ) {
348      next->def->d.file = c->dst + 1;
349     } else {
350      next->def->d.file = c->dst;
351     }
352    break;
353   default:
354    return -1;
355  }
356
357  ROAR_WARN("roar_vio_dstr_set_defaults(*): i=%i, c->type=0x%.4x(%s): next->def=%p, next->def->type=%i", i,
358                   c->type & 0xFFFF, roar_vio_dstr_get_name(c->type),
359                   next->def, next->def == NULL ? -1 : next->def->type);
360 }
361
362 return 0;
363}
364
365int     roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls, struct roar_vio_calls * vio) {
366 if ( chain == NULL || calls == NULL )
367  return -1;
368
369 return -1;
370}
371
372//ll
Note: See TracBrowser for help on using the repository browser.