Changeset 1323:ad8d25a78446 in roaraudio


Ignore:
Timestamp:
03/22/09 20:11:03 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added dstr types, added some meta funcs, wrote basic dstr parser

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_dstr.h

    r1321 r1323  
    3838#include "libroar.h" 
    3939 
     40#define ROAR_VIO_DEF_TYPE_EOL            -1  
     41#define ROAR_VIO_DEF_TYPE_NONE            0 
     42#define ROAR_VIO_DEF_TYPE_FILE            1 
     43#define ROAR_VIO_DEF_TYPE_SOCKET          2 
     44#define ROAR_VIO_DEF_TYPE_FH              3 
     45#define ROAR_VIO_DEF_TYPE_SOCKETFH        4 
     46 
     47#define ROAR_VIO_DSTR_OBJGT_INTERNAL      0x0000 
     48#define ROAR_VIO_DSTR_OBJGT_GEN           0x0100 
     49#define ROAR_VIO_DSTR_OBJGT_SOCKET        0x0200 
     50#define ROAR_VIO_DSTR_OBJGT_PROXY         0x0300 
     51#define ROAR_VIO_DSTR_OBJGT_COMP          0x0400 /* compression */ 
     52#define ROAR_VIO_DSTR_OBJGT_CRYPT         0x0500 
     53#define ROAR_VIO_DSTR_OBJGT_PROTO         0x0600 /* protocolls like HTTP and Gopher */ 
     54#define ROAR_VIO_DSTR_OBJGT_SPECAL        0xff00 
     55 
     56#define ROAR_VIO_DSTR_OBJT_EOL           -1 
     57#define ROAR_VIO_DSTR_OBJT_NONE           0 
     58#define ROAR_VIO_DSTR_OBJT_INTERNAL       1 
     59 
     60#define ROAR_VIO_DSTR_OBJT_FILE           (0x01|ROAR_VIO_DSTR_OBJGT_GEN) 
     61#define ROAR_VIO_DSTR_OBJT_FH             (0x02|ROAR_VIO_DSTR_OBJGT_GEN) 
     62#define ROAR_VIO_DSTR_OBJT_SOCKETFH       (0x03|ROAR_VIO_DSTR_OBJGT_GEN) 
     63/* some space to add memory FHs and the like */ 
     64#define ROAR_VIO_DSTR_OBJT_PASS           (0x10|ROAR_VIO_DSTR_OBJGT_GEN) 
     65#define ROAR_VIO_DSTR_OBJT_RE             (0x11|ROAR_VIO_DSTR_OBJGT_GEN) 
     66#define ROAR_VIO_DSTR_OBJT_EXEC           (0x20|ROAR_VIO_DSTR_OBJGT_GEN) 
     67 
     68#define ROAR_VIO_DSTR_OBJT_SOCKET         (0x01|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     69#define ROAR_VIO_DSTR_OBJT_UNIX           (0x02|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     70#define ROAR_VIO_DSTR_OBJT_DECNET         (0x10|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     71#define ROAR_VIO_DSTR_OBJT_TCP            (0x21|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     72#define ROAR_VIO_DSTR_OBJT_UDP            (0x22|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     73#define ROAR_VIO_DSTR_OBJT_TCP6           (0x31|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     74#define ROAR_VIO_DSTR_OBJT_UDP6           (0x32|ROAR_VIO_DSTR_OBJGT_SOCKET) 
     75 
     76#define ROAR_VIO_DSTR_OBJT_SOCKS          (0x10|ROAR_VIO_DSTR_OBJGT_PROXY) 
     77#define ROAR_VIO_DSTR_OBJT_SOCKS4         (0x14|ROAR_VIO_DSTR_OBJGT_PROXY) 
     78#define ROAR_VIO_DSTR_OBJT_SOCKS4A        (0x1a|ROAR_VIO_DSTR_OBJGT_PROXY) 
     79#define ROAR_VIO_DSTR_OBJT_SOCKS4D        (0x1d|ROAR_VIO_DSTR_OBJGT_PROXY) 
     80#define ROAR_VIO_DSTR_OBJT_SOCKS5         (0x15|ROAR_VIO_DSTR_OBJGT_PROXY) 
     81#define ROAR_VIO_DSTR_OBJT_SSH            (0x21|ROAR_VIO_DSTR_OBJGT_PROXY) 
     82//#define ROAR_VIO_DSTR_OBJT_HTTP           (0x31|ROAR_VIO_DSTR_OBJGT_PROXY) 
     83 
     84//#define ROAR_VIO_DSTR_OBJT_HTTP           (0x10|ROAR_VIO_DSTR_OBJGT_PROTO) 
     85#define ROAR_VIO_DSTR_OBJT_HTTP09         (0x11|ROAR_VIO_DSTR_OBJGT_PROTO) 
     86#define ROAR_VIO_DSTR_OBJT_HTTP10         (0x12|ROAR_VIO_DSTR_OBJGT_PROTO) 
     87#define ROAR_VIO_DSTR_OBJT_HTTP11         (0x13|ROAR_VIO_DSTR_OBJGT_PROTO) 
     88#define ROAR_VIO_DSTR_OBJT_HTTP           ROAR_VIO_DSTR_OBJT_HTTP11 
     89#define ROAR_VIO_DSTR_OBJT_GOPHER         (0x21|ROAR_VIO_DSTR_OBJGT_PROTO) 
     90 
     91/* 
     92#define ROAR_VIO_DSTR_OBJGT_CRYPT         0x0500 
     93*/ 
     94 
     95#define ROAR_VIO_DSTR_OBJT_GZIP           (0x10|ROAR_VIO_DSTR_OBJGT_COMP) 
     96#define ROAR_VIO_DSTR_OBJT_BZIP2          (0x22|ROAR_VIO_DSTR_OBJGT_COMP) 
     97 
     98#define ROAR_VIO_DSTR_OBJT_PGP            (0x10|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     99#define ROAR_VIO_DSTR_OBJT_PGP_ENC        (0x11|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     100#define ROAR_VIO_DSTR_OBJT_PGP_STORE      (0x11|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     101#define ROAR_VIO_DSTR_OBJT_SSL1           (0x21|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     102#define ROAR_VIO_DSTR_OBJT_SSL2           (0x22|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     103#define ROAR_VIO_DSTR_OBJT_SSL3           (0x23|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     104#define ROAR_VIO_DSTR_OBJT_TLS            (0x2a|ROAR_VIO_DSTR_OBJGT_CRYPT) 
     105#define ROAR_VIO_DSTR_OBJT_SSLTLS         ROAR_VIO_DSTR_OBJT_TLS 
     106 
     107#define ROAR_VIO_DSTR_OBJT_MAGIC          (0x01|ROAR_VIO_DSTR_OBJGT_SPECAL) 
     108 
     109 
     110struct roar_vio_defaults { 
     111 int type; 
     112 
     113 mode_t o_mode; 
     114 int    o_flags; 
     115 
     116 union { 
     117  char *   file; 
     118  int      fh; 
     119  struct { 
     120          int               domain; 
     121          int               type; 
     122          char            * host; 
     123          struct sockaddr * sa; 
     124          socklen_t         len; 
     125         } socket; 
     126 } d; 
     127}; 
     128 
     129struct roar_vio_dstr_chain { 
     130 int    type; 
     131 char * opts; 
     132 char * dst; 
     133 int    need_vio; 
     134 struct roar_vio_defaults * def; 
     135 struct roar_vio_calls    * vio; 
     136}; 
     137 
     138int     roar_vio_dstr_get_type(char * str); 
     139char *  roar_vio_dstr_get_name(int type); 
     140 
     141int     roar_vio_dstr_init_defaults (struct roar_vio_defaults * def, int type, int o_flags, mode_t o_mode); 
     142 
     143int     roar_vio_open_dstr    (struct roar_vio_calls * calls, char * dstr, struct roar_vio_defaults * def, int dnum); 
     144int     roar_vio_open_dstr_vio(struct roar_vio_calls * calls, char * dstr, struct roar_vio_defaults * def, int dnum, struct roar_vio_calls * vio); 
     145 
     146int     roar_vio_dstr_parse_opts(struct roar_vio_dstr_chain * chain); 
     147int     roar_vio_dstr_set_defaults(struct roar_vio_dstr_chain * chain); 
     148int     roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls, struct roar_vio_calls * vio); 
     149 
    40150#endif 
    41151 
  • libroar/vio_dstr.c

    r1321 r1323  
    3535#include "libroar.h" 
    3636 
     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 return NULL; 
     148} 
     149 
     150int     roar_vio_dstr_init_defaults (struct roar_vio_defaults * def, int type, int o_flags, mode_t o_mode) { 
     151 if ( def == NULL ) 
     152  return -1; 
     153 
     154 memset(def, 0, sizeof(struct roar_vio_defaults)); 
     155 
     156 def->type    = type; 
     157 def->o_flags = o_flags; 
     158 def->o_mode  = o_mode; 
     159 
     160 return 0; 
     161} 
     162 
     163int     roar_vio_open_dstr    (struct roar_vio_calls * calls, char * dstr, struct roar_vio_defaults * def, int dnum) { 
     164 return roar_vio_open_dstr_vio(calls, dstr, def, dnum, NULL); 
     165} 
     166 
     167#define _ret(x) free(dstr); return (x) 
     168 
     169int     roar_vio_open_dstr_vio(struct roar_vio_calls * calls, 
     170                               char * dstr, struct roar_vio_defaults * def, int dnum, 
     171                               struct roar_vio_calls * vio) { 
     172 char * next; 
     173 char * this; 
     174 char * name; 
     175 char * opts; 
     176 char * dst; 
     177 char * c; 
     178 int    inopts; 
     179 int    type; 
     180 
     181 if ( calls == NULL || dstr == NULL ) 
     182  return -1; 
     183 
     184 if ( dnum != 0 && def == NULL ) 
     185  return -1; 
     186 
     187 if ( dnum > 1 ) 
     188  return -1; 
     189 
     190 if ( (dstr = strdup(dstr)) == NULL ) 
     191  return -1; 
     192 
     193 next = dstr; 
     194 
     195 while (next != NULL) { 
     196  this = next; 
     197  next = strstr(next, "##"); 
     198 
     199  if (next != NULL) { 
     200   *next = 0; 
     201   next += 2; 
     202  } 
     203 
     204  // we have the current token in 'this'. 
     205 
     206  opts   = NULL; 
     207  dst    = NULL; 
     208 
     209  if ( strstr(this, ":") != NULL ) { 
     210   name   = this; 
     211   inopts = 0; 
     212   for (c = this; *c != 0; c++) { 
     213    if ( *c == '[' ) { 
     214     *c     = 0; 
     215     opts   = c + 1; 
     216     inopts = 1; 
     217    } else if ( *c == ']' &&  inopts ) { 
     218     *c     = 0; 
     219     inopts = 0; 
     220    } else if ( *c == ':' && !inopts ) { 
     221     *c     = 0; 
     222     dst    = *(c+1) == 0 ? NULL : c + 1; 
     223     break; 
     224    } 
     225   } 
     226  } else { 
     227   // we need to guess that this is here... 
     228   // currently we guess this is a file in all cases 
     229   name = "file"; 
     230   dst  = this; 
     231  } 
     232 
     233  ROAR_WARN("roar_vio_open_dstr_vio(*): name='%s', opts='%s', dst='%s'", name, opts, dst); 
     234 
     235  if ( (type = roar_vio_dstr_get_type(name)) == -1 ) { 
     236   _ret(-1); 
     237  } 
     238 
     239  ROAR_WARN("roar_vio_open_dstr_vio(*): type=0x%.4x(%s)", type, roar_vio_dstr_get_name(type)); 
     240 
     241 } 
     242 
     243 _ret(-1); 
     244} 
     245 
    37246//ll 
Note: See TracChangeset for help on using the changeset viewer.