2 * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
5 * Copyright (c) 2006, Thomas Bernard
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * * The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
36 #include "upnpglobalvars.h"
38 struct option
* ary_options
= NULL
;
42 enum upnpconfigoptions id
;
45 { UPNPIFNAME
, "network_interface" },
47 { UPNPPRESENTATIONURL
, "presentation_url" },
48 { UPNPNOTIFY_INTERVAL
, "notify_interval" },
50 { UPNPSERIAL
, "serial"},
51 { UPNPMODEL_NAME
, "model_name"},
52 { UPNPMODEL_NUMBER
, "model_number"},
53 { UPNPFRIENDLYNAME
, "friendly_name"},
54 { UPNPMEDIADIR
, "media_dir"},
55 { UPNPALBUMART_NAMES
, "album_art_names"},
56 { UPNPINOTIFY
, "inotify" },
57 { UPNPDBDIR
, "db_dir" },
58 { UPNPLOGDIR
, "log_dir" },
59 { UPNPLOGLEVEL
, "log_level" },
60 { UPNPMINISSDPDSOCKET
, "minissdpdsocket"},
61 { ENABLE_TIVO
, "enable_tivo" },
62 { ENABLE_DLNA_STRICT
, "strict_dlna" },
63 { ROOT_CONTAINER
, "root_container" },
64 { USER_ACCOUNT
, "user" },
65 { FORCE_SORT_CRITERIA
, "force_sort_criteria" },
66 { MAX_CONNECTIONS
, "max_connections" },
67 { MERGE_MEDIA_DIRS
, "merge_media_dirs" },
68 { WIDE_LINKS
, "wide_links" },
69 { TIVO_DISCOVERY
, "tivo_discovery" },
70 { ENABLE_SUBTITLES
, "enable_subtitles" },
74 readoptionsfile(const char * fname
)
84 enum upnpconfigoptions id
;
86 if(!fname
|| *fname
== '\0')
89 memset(buffer
, 0, sizeof(buffer
));
92 printf("Reading configuration from file %s\n", fname
);
95 if(!(hfile
= fopen(fname
, "r")))
98 while(fgets(buffer
, sizeof(buffer
), hfile
))
101 t
= strchr(buffer
, '\n');
106 while((t
>= buffer
) && isspace(*t
))
113 /* skip leading whitespaces */
115 while(isspace(*name
))
118 /* check for comments or empty lines */
119 if(name
[0] == '#' || name
[0] == '\0') continue;
121 if(!(equals
= strchr(name
, '=')))
123 fprintf(stderr
, "parsing error file %s line %d : %s\n",
124 fname
, linenum
, name
);
128 /* remove ending whitespaces */
129 for(t
=equals
-1; t
>name
&& isspace(*t
); t
--)
135 /* skip leading whitespaces */
136 while(isspace(*value
))
140 for(i
=0; i
<sizeof(optionids
)/sizeof(optionids
[0]); i
++)
142 /*printf("%2d %2d %s %s\n", i, optionids[i].id, name,
143 optionids[i].name); */
145 if(0 == strcmp(name
, optionids
[i
].name
))
147 id
= optionids
[i
].id
;
152 if(id
== UPNP_INVALID
)
154 if (strcmp(name
, "include") == 0)
155 readoptionsfile(value
);
157 fprintf(stderr
, "parsing error file %s line %d : %s=%s\n",
158 fname
, linenum
, name
, value
);
163 t
= realloc(ary_options
, num_options
* sizeof(struct option
));
166 fprintf(stderr
, "memory allocation error: %s=%s\n",
172 ary_options
= (struct option
*)t
;
174 ary_options
[num_options
-1].id
= id
;
175 strncpyt(ary_options
[num_options
-1].value
, value
, MAX_OPTION_VALUE_LEN
);
188 struct media_dir_s
*media_path
, *last_path
;
189 struct album_art_name_s
*art_names
, *last_name
;
191 media_path
= media_dirs
;
194 free(media_path
->path
);
195 last_path
= media_path
;
196 media_path
= media_path
->next
;
200 art_names
= album_art_names
;
203 free(art_names
->name
);
204 last_name
= art_names
;
205 art_names
= art_names
->next
;