minidlna support now Samsung TV C550/C650 (thx amir909)
[tomato.git] / release / src / router / minidlna / options.c
blob9a6464d18000f5d7e40f03f5402d48965fe86970
1 /* $Id: options.c,v 1.15 2011/06/25 00:39:45 jmaggard Exp $ */
2 /* MiniUPnP project
3 * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
4 * author: Ryan Wagoner
6 * Copyright (c) 2006, Thomas Bernard
7 * All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * * The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
31 #include <stdio.h>
32 #include <string.h>
33 #include <stdlib.h>
34 #include <ctype.h>
35 #include "options.h"
36 #include "upnpglobalvars.h"
38 struct option * ary_options = NULL;
39 int num_options = 0;
41 static const struct {
42 enum upnpconfigoptions id;
43 const char * name;
44 } optionids[] = {
45 { UPNPIFNAME, "network_interface" },
46 { UPNPLISTENING_IP, "listening_ip" },
47 { UPNPPORT, "port" },
48 { UPNPPRESENTATIONURL, "presentation_url" },
49 { UPNPNOTIFY_INTERVAL, "notify_interval" },
50 { UPNPSYSTEM_UPTIME, "system_uptime" },
51 { UPNPUUID, "uuid"},
52 { UPNPSERIAL, "serial"},
53 { UPNPMODEL_NAME, "model_name"},
54 { UPNPMODEL_NUMBER, "model_number"},
55 { UPNPFRIENDLYNAME, "friendly_name"},
56 { UPNPMEDIADIR, "media_dir"},
57 { UPNPALBUMART_NAMES, "album_art_names"},
58 { UPNPINOTIFY, "inotify" },
59 { UPNPDBDIR, "db_dir" },
60 { UPNPLOGDIR, "log_dir" },
61 { ENABLE_TIVO, "enable_tivo" },
62 { ENABLE_DLNA_STRICT, "strict_dlna" },
63 { ROOT_CONTAINER, "root_container" }
66 int
67 readoptionsfile(const char * fname)
69 FILE *hfile = NULL;
70 char buffer[1024];
71 char *equals;
72 char *name;
73 char *value;
74 char *t;
75 int linenum = 0;
76 int i;
77 enum upnpconfigoptions id;
79 if(!fname || (strlen(fname) == 0))
80 return -1;
82 memset(buffer, 0, sizeof(buffer));
84 #ifdef DEBUG
85 printf("Reading configuration from file %s\n", fname);
86 #endif
88 if(!(hfile = fopen(fname, "r")))
89 return -1;
91 if(ary_options != NULL)
93 free(ary_options);
94 num_options = 0;
97 while(fgets(buffer, sizeof(buffer), hfile))
99 linenum++;
100 t = strchr(buffer, '\n');
101 if(t)
103 *t = '\0';
104 t--;
105 while((t >= buffer) && isspace(*t))
107 *t = '\0';
108 t--;
112 /* skip leading whitespaces */
113 name = buffer;
114 while(isspace(*name))
115 name++;
117 /* check for comments or empty lines */
118 if(name[0] == '#' || name[0] == '\0') continue;
120 if(!(equals = strchr(name, '=')))
122 fprintf(stderr, "parsing error file %s line %d : %s\n",
123 fname, linenum, name);
124 continue;
127 /* remove ending whitespaces */
128 for(t=equals-1; t>name && isspace(*t); t--)
129 *t = '\0';
131 *equals = '\0';
132 value = equals+1;
134 /* skip leading whitespaces */
135 while(isspace(*value))
136 value++;
138 id = UPNP_INVALID;
139 for(i=0; i<sizeof(optionids)/sizeof(optionids[0]); i++)
141 /*printf("%2d %2d %s %s\n", i, optionids[i].id, name,
142 optionids[i].name); */
144 if(0 == strcmp(name, optionids[i].name))
146 id = optionids[i].id;
147 break;
151 if(id == UPNP_INVALID)
153 fprintf(stderr, "parsing error file %s line %d : %s=%s\n",
154 fname, linenum, name, value);
156 else
158 num_options += 1;
159 ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option));
161 ary_options[num_options-1].id = id;
162 strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN);
167 fclose(hfile);
169 return 0;
172 void
173 freeoptions(void)
175 if(ary_options)
177 free(ary_options);
178 ary_options = NULL;
179 num_options = 0;