1
0
mirror of https://gitlab.xiph.org/xiph/ezstream.git synced 2024-11-03 04:17:18 -05:00

Relocate config file check

* Stop supporting systems without stat(2) while here
* Remove some additional configure checks for ubiquitous functions (>=C99)
This commit is contained in:
Moritz Grimm 2015-05-06 17:00:23 +00:00
parent 05c7e32997
commit 33eb55ae34
6 changed files with 33 additions and 46 deletions

View File

@ -239,11 +239,7 @@ AC_CHECK_FUNCS([ \
popen \ popen \
random \ random \
setlocale \ setlocale \
snprintf \
srandomdev \ srandomdev \
stat \
strncasecmp \
strtoll \
]) ])
AC_REPLACE_FUNCS([ \ AC_REPLACE_FUNCS([ \

View File

@ -20,8 +20,12 @@
#include "compat.h" #include "compat.h"
#include <sys/stat.h>
#include <errno.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "cfg_private.h" #include "cfg_private.h"
#include "cfg_xmlfile.h" #include "cfg_xmlfile.h"
@ -161,6 +165,29 @@ cfg_stream_fmt2str(enum cfg_stream_format fmt)
} }
} }
int
cfg_file_check(const char *file)
{
struct stat st;
if (0 > stat(file, &st)) {
log_error("%s: %s", file, strerror(errno));
return (-1);
}
if (st.st_mode & S_IROTH)
log_warning("%s: world readable", file);
else if (st.st_mode & S_IRGRP)
log_notice("%s: group readable", file);
if (st.st_mode & S_IWOTH) {
log_error("%s: world writeable", file);
return (-1);
}
return (0);
}
int int
cfg_set_program_name(const char *progname, const char **errstrp) cfg_set_program_name(const char *progname, const char **errstrp)
{ {

View File

@ -69,6 +69,8 @@ int cfg_stream_str2fmt(const char *, enum cfg_stream_format *);
const char * const char *
cfg_stream_fmt2str(enum cfg_stream_format); cfg_stream_fmt2str(enum cfg_stream_format);
int cfg_file_check(const char *);
int cfg_set_program_name(const char *, const char **); int cfg_set_program_name(const char *, const char **);
int cfg_set_program_config_type(enum cfg_config_type, const char **); int cfg_set_program_config_type(enum cfg_config_type, const char **);
int cfg_set_program_config_file(const char *, const char **); int cfg_set_program_config_file(const char *, const char **);

View File

@ -319,6 +319,9 @@ cfg_xmlfile_parse(const char *config_file)
xmlLineNumbersDefault(1); xmlLineNumbersDefault(1);
if (0 > cfg_file_check(config_file))
goto error;
doc = xmlParseFile(config_file); doc = xmlParseFile(config_file);
if (!doc) { if (!doc) {
log_error("%s: not well-formed XML", config_file); log_error("%s: not well-formed XML", config_file);

View File

@ -1014,47 +1014,9 @@ main(int argc, char *argv[])
0 > cfg_encoder_init() || 0 > cfg_encoder_init() ||
0 > playlist_init() || 0 > playlist_init() ||
0 > cfg_reload()) 0 > cfg_reload())
return (ret); return (ez_shutdown(ret));
shout_init(); shout_init();
{
/*
* Attempt to open configFile here for a more meaningful error
* message. Where possible, do it with stat() and check for
* safe config file permissions.
*/
#ifdef HAVE_STAT
struct stat st;
if (stat(cfg_get_program_config_file(), &st) == -1) {
log_error("%s: %s", cfg_get_program_config_file(),
strerror(errno));
return (ez_shutdown(2));
}
if (cfg_get_program_verbosity() && (st.st_mode & (S_IRGRP | S_IROTH)))
log_warning("%s: group and/or world readable",
cfg_get_program_config_file());
if (st.st_mode & (S_IWGRP | S_IWOTH)) {
log_error("%s: group and/or world writeable",
cfg_get_program_config_file());
return (ez_shutdown(2));
}
#else
FILE *tmp;
if ((tmp = fopen(cfg_get_program_config_file(), "r")) == NULL) {
log_error("%s: %s", cfg_get_program_config_file(),
strerror(errno));
usage();
return (ez_shutdown(2));
}
fclose(tmp);
#endif /* HAVE_STAT */
}
if (0 > cfg_reload())
return (ez_shutdown(2));
if (!cfg_get_server_hostname() || if (!cfg_get_server_hostname() ||
!cfg_get_server_port()){ !cfg_get_server_port()){
log_error("%s: missing server configuration", log_error("%s: missing server configuration",

View File

@ -28,9 +28,6 @@
# include <sys/time.h> # include <sys/time.h>
#endif /* HAVE_SYS_TIME_H */ #endif /* HAVE_SYS_TIME_H */
#include <time.h> #include <time.h>
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif /* HAVE_SYS_STAT_H */
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>