source: roaraudio/roard/meta.c @ 107:4586e930769b

Last change on this file since 107:4586e930769b was 107:4586e930769b, checked in by phi, 16 years ago

fixed overflow bugs

File size: 2.1 KB
Line 
1//meta.c:
2
3#include "roard.h"
4
5int stream_meta_set   (int id, int type, char * name, char * val) {
6 int i;
7 struct roar_stream_server * s = g_streams[id];
8
9 if ( s == NULL )
10  return -1;
11
12 for (i = 0; i < ROAR_META_MAX_PER_STREAM; i++)
13  if ( s->meta[i].type == type ) {
14   s->meta[i].type = ROAR_META_TYPE_NONE;
15   if ( s->meta[i].value )
16    free(s->meta[i].value);
17   s->meta[i].value = NULL;
18  }
19
20 return stream_meta_add(id, type, name, val);
21}
22
23int stream_meta_add   (int id, int type, char * name, char * val) {
24 int i;
25 char * c;
26 struct roar_stream_server * s = g_streams[id];
27
28 if ( s == NULL )
29  return -1;
30
31 for (i = 0; i < ROAR_META_MAX_PER_STREAM; i++) {
32  if ( s->meta[i].type == ROAR_META_TYPE_NONE ) {
33   s->meta[i].type = type;
34
35   if ( name == NULL ) {
36    s->meta[i].key[0] = 0;
37   } else {
38    strncpy(s->meta[i].key, name, ROAR_META_MAX_NAMELEN);
39   }
40
41   if ( (c = malloc(strlen(val)+1)) == NULL ) {
42    s->meta[i].type = ROAR_META_TYPE_NONE;
43    s->meta[i].key[0] = 0;
44    return -1;
45   }
46
47   strcpy(c, val);
48   s->meta[i].value = c;
49
50   ROAR_DBG("stream_meta_add(id=%i, type=%i, name='%s', val='%s') = 0", id, type, name, val);
51
52   return 0;
53  }
54 }
55
56 return -1;
57}
58
59int stream_meta_get   (int id, int type, char * name, char * val, size_t len) {
60 int i, vallen;
61 struct roar_stream_server * s = g_streams[id];
62
63 if ( s == NULL )
64  return -1;
65
66 for (i = 0; i < ROAR_META_MAX_PER_STREAM; i++) {
67  if ( s->meta[i].type == type ) {
68   if ( name != NULL )
69    if ( strncmp(s->meta[i].key, name, ROAR_META_MAX_NAMELEN) != 0 )
70     continue;
71
72   if ( (vallen = strlen(s->meta[i].value)) > (len - 1) ) {
73    ROAR_DBG("stream_meta_get(*): val too small: need %i have %i", vallen, len);
74    return -1;
75   }
76
77   strncpy(val, s->meta[i].value, vallen);
78   val[vallen] = 0;
79
80   return 0;
81  }
82 }
83
84 return -1;
85}
86
87int stream_meta_clear (int id) {
88 int i;
89 struct roar_stream_server * s = g_streams[id];
90
91 if ( s == NULL )
92  return -1;
93
94 for (i = 0; i < ROAR_META_MAX_PER_STREAM; i++) {
95  s->meta[i].type   = ROAR_META_TYPE_NONE;
96  if ( s->meta[i].value )
97   free(s->meta[i].value);
98  s->meta[i].value  = NULL;
99  s->meta[i].key[0] = 0;
100 }
101
102 return 0;
103}
104
105//ll
Note: See TracBrowser for help on using the repository browser.