Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
09056300
Commit
09056300
authored
Jul 19, 2006
by
Avuton Olrich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix whitespace->tabs in main.c, it was afu
git-svn-id:
https://svn.musicpd.org/mpd/trunk@4405
09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent
3187eb30
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
362 additions
and
383 deletions
+362
-383
main.c
src/main.c
+362
-383
No files found.
src/main.c
View file @
09056300
...
@@ -62,9 +62,9 @@ volatile int mainPid = 0;
...
@@ -62,9 +62,9 @@ volatile int mainPid = 0;
typedef
struct
_Options
{
typedef
struct
_Options
{
int
kill
;
int
kill
;
int
daemon
;
int
daemon
;
int
stdOutput
;
int
stdOutput
;
int
createDB
;
int
createDB
;
int
updateDB
;
int
updateDB
;
}
Options
;
}
Options
;
...
@@ -78,17 +78,20 @@ static int setenv(const char *name, const char *value, int replace)
...
@@ -78,17 +78,20 @@ static int setenv(const char *name, const char *value, int replace)
size_t
namelen
,
valuelen
;
size_t
namelen
,
valuelen
;
char
*
envstr
;
char
*
envstr
;
if
(
!
name
||
!
value
)
return
-
1
;
if
(
!
name
||
!
value
)
return
-
1
;
if
(
!
replace
)
{
if
(
!
replace
)
{
char
*
oldval
=
NULL
;
char
*
oldval
=
NULL
;
oldval
=
getenv
(
name
);
oldval
=
getenv
(
name
);
if
(
oldval
)
return
0
;
if
(
oldval
)
return
0
;
}
}
namelen
=
strlen
(
name
);
namelen
=
strlen
(
name
);
valuelen
=
strlen
(
value
);
valuelen
=
strlen
(
value
);
envstr
=
malloc
((
namelen
+
valuelen
+
2
));
envstr
=
malloc
((
namelen
+
valuelen
+
2
));
if
(
!
envstr
)
return
-
1
;
if
(
!
envstr
)
return
-
1
;
memcpy
(
envstr
,
name
,
namelen
);
memcpy
(
envstr
,
name
,
namelen
);
envstr
[
namelen
]
=
'='
;
envstr
[
namelen
]
=
'='
;
...
@@ -104,327 +107,328 @@ static int setenv(const char *name, const char *value, int replace)
...
@@ -104,327 +107,328 @@ static int setenv(const char *name, const char *value, int replace)
return
out
;
return
out
;
}
}
#endif
/* HAVE_SETENV */
#endif
/* HAVE_SETENV */
static
void
usage
(
char
*
argv
[])
{
static
void
usage
(
char
*
argv
[])
ERROR
(
"usage:
\n
"
);
{
ERROR
(
" %s [options] <conf file>
\n
"
,
argv
[
0
]);
ERROR
(
"usage:
\n
"
);
ERROR
(
" %s [options] (searches for ~%s then %s)
\n
"
,
ERROR
(
" %s [options] <conf file>
\n
"
,
argv
[
0
]);
argv
[
0
],
USER_CONFIG_FILE_LOCATION
,
ERROR
(
" %s [options] (searches for ~%s then %s)
\n
"
,
SYSTEM_CONFIG_FILE_LOCATION
);
argv
[
0
],
USER_CONFIG_FILE_LOCATION
,
SYSTEM_CONFIG_FILE_LOCATION
);
ERROR
(
"
\n
"
);
ERROR
(
"
\n
"
);
ERROR
(
"options:
\n
"
);
ERROR
(
"options:
\n
"
);
ERROR
(
" --help this usage statement
\n
"
);
ERROR
(
" --help this usage statement
\n
"
);
ERROR
(
" --kill kill the currently running mpd session
\n
"
);
ERROR
(
" --kill kill the currently running mpd session
\n
"
);
ERROR
(
" --create-db force (re)creation of database and exit
\n
"
);
ERROR
ERROR
(
" --no-create-db don't create database, even if it doesn't exist
\n
"
);
(
" --create-db force (re)creation of database and exit
\n
"
);
ERROR
(
" --no-daemon don't detach from console
\n
"
);
ERROR
ERROR
(
" --stdout print messages to stdout and stderr
\n
"
);
(
" --no-create-db don't create database, even if it doesn't exist
\n
"
);
/*ERROR(" --update-db create database and exit\n");*/
ERROR
(
" --no-daemon don't detach from console
\n
"
);
ERROR
(
" --verbose verbose logging
\n
"
);
ERROR
(
" --stdout print messages to stdout and stderr
\n
"
);
ERROR
(
" --version prints version information
\n
"
);
/*ERROR(" --update-db create database and exit\n"); */
ERROR
(
" --verbose verbose logging
\n
"
);
ERROR
(
" --version prints version information
\n
"
);
}
}
static
void
version
(
void
)
{
static
void
version
(
void
)
LOG
(
"mpd (MPD: Music Player Daemon) %s
\n
"
,
VERSION
);
{
LOG
(
"
\n
"
);
LOG
(
"mpd (MPD: Music Player Daemon) %s
\n
"
,
VERSION
);
LOG
(
"Copyright (C) 2003-2006 Warren Dukes <warren.dukes@gmail.com>
\n
"
);
LOG
(
"
\n
"
);
LOG
(
"This is free software; see the source for copying conditions. There is NO
\n
"
);
LOG
(
"Copyright (C) 2003-2006 Warren Dukes <warren.dukes@gmail.com>
\n
"
);
LOG
(
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\n
"
);
LOG
(
"This is free software; see the source for copying conditions. There is NO
\n
"
);
LOG
(
"
\n
"
);
LOG
(
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\n
"
);
LOG
(
"Supported formats:
\n
"
);
LOG
(
"
\n
"
);
LOG
(
"Supported formats:
\n
"
);
initInputPlugins
();
printAllInputPluginSuffixes
(
stdout
);
initInputPlugins
();
printAllInputPluginSuffixes
(
stdout
);
LOG
(
"
\n
"
);
LOG
(
"Supported outputs:
\n
"
);
LOG
(
"
\n
"
);
loadAudioDrivers
();
LOG
(
"Supported outputs:
\n
"
);
printAllOutputPluginTypes
(
stdout
);
loadAudioDrivers
();
printAllOutputPluginTypes
(
stdout
);
}
}
static
void
parseOptions
(
int
argc
,
char
**
argv
,
Options
*
options
)
{
static
void
parseOptions
(
int
argc
,
char
**
argv
,
Options
*
options
)
int
argcLeft
=
argc
;
{
int
argcLeft
=
argc
;
options
->
daemon
=
1
;
options
->
daemon
=
1
;
options
->
stdOutput
=
0
;
options
->
stdOutput
=
0
;
options
->
createDB
=
0
;
options
->
createDB
=
0
;
options
->
updateDB
=
0
;
options
->
updateDB
=
0
;
options
->
kill
=
0
;
options
->
kill
=
0
;
if
(
argc
>
1
)
{
if
(
argc
>
1
)
{
int
i
=
1
;
int
i
=
1
;
while
(
i
<
argc
)
{
while
(
i
<
argc
)
{
if
(
strncmp
(
argv
[
i
],
"--"
,
2
)
==
0
)
{
if
(
strncmp
(
argv
[
i
],
"--"
,
2
)
==
0
)
{
if
(
strcmp
(
argv
[
i
],
"--help"
)
==
0
)
{
if
(
strcmp
(
argv
[
i
],
"--help"
)
==
0
)
{
usage
(
argv
);
usage
(
argv
);
exit
(
EXIT_SUCCESS
);
exit
(
EXIT_SUCCESS
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"--kill"
)
==
0
)
{
else
if
(
strcmp
(
argv
[
i
],
"--kill"
)
==
0
)
{
options
->
kill
++
;
options
->
kill
++
;
argcLeft
--
;
argcLeft
--
;
}
else
if
(
strcmp
(
argv
[
i
],
"--no-daemon"
)
==
0
)
{
}
options
->
daemon
=
0
;
else
if
(
strcmp
(
argv
[
i
],
"--no-daemon"
)
==
0
)
{
argcLeft
--
;
options
->
daemon
=
0
;
}
else
if
(
strcmp
(
argv
[
i
],
"--stdout"
)
==
0
)
{
argcLeft
--
;
options
->
stdOutput
=
1
;
}
argcLeft
--
;
else
if
(
strcmp
(
argv
[
i
],
"--stdout"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"--create-db"
)
==
0
)
{
options
->
stdOutput
=
1
;
options
->
stdOutput
=
1
;
argcLeft
--
;
options
->
createDB
=
1
;
}
argcLeft
--
;
else
if
(
strcmp
(
argv
[
i
],
"--create-db"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"--no-create-db"
)
==
options
->
stdOutput
=
1
;
0
)
{
options
->
createDB
=
1
;
options
->
createDB
=
-
1
;
argcLeft
--
;
argcLeft
--
;
}
}
else
if
(
strcmp
(
argv
[
i
],
"--verbose"
)
==
0
)
{
/*else if(strcmp(argv[i],"--update-db")==0) {
logLevel
=
LOG_LEVEL_DEBUG
;
options->stdOutput = 1;
argcLeft
--
;
options->updateDB = 1;
}
else
if
(
strcmp
(
argv
[
i
],
"--version"
)
==
0
)
{
argcLeft--;
version
();
}*/
exit
(
EXIT_SUCCESS
);
else
if
(
strcmp
(
argv
[
i
],
"--no-create-db"
)
==
0
)
{
}
else
{
options
->
createDB
=
-
1
;
myfprintf
(
stderr
,
argcLeft
--
;
"unknown command line option: %s
\n
"
,
}
argv
[
i
]);
else
if
(
strcmp
(
argv
[
i
],
"--verbose"
)
==
0
)
{
exit
(
EXIT_FAILURE
);
logLevel
=
LOG_LEVEL_DEBUG
;
}
argcLeft
--
;
}
else
}
break
;
else
if
(
strcmp
(
argv
[
i
],
"--version"
)
==
0
)
{
i
++
;
version
();
exit
(
EXIT_SUCCESS
);
}
else
{
myfprintf
(
stderr
,
"unknown command line option: %s
\n
"
,
argv
[
i
]);
exit
(
EXIT_FAILURE
);
}
}
else
break
;
i
++
;
}
}
if
(
argcLeft
<=
2
)
{
if
(
argcLeft
==
2
)
{
readConf
(
argv
[
argc
-
1
]);
return
;
}
}
else
if
(
argcLeft
==
1
)
{
}
if
(
argcLeft
<=
2
)
{
if
(
argcLeft
==
2
)
{
readConf
(
argv
[
argc
-
1
]);
return
;
}
else
if
(
argcLeft
==
1
)
{
struct
stat
st
;
struct
stat
st
;
char
*
homedir
=
getenv
(
"HOME"
);
char
*
homedir
=
getenv
(
"HOME"
);
char
userfile
[
MAXPATHLEN
+
1
]
=
""
;
char
userfile
[
MAXPATHLEN
+
1
]
=
""
;
if
(
homedir
&&
(
strlen
(
homedir
)
+
if
(
homedir
&&
(
strlen
(
homedir
)
+
strlen
(
USER_CONFIG_FILE_LOCATION
))
<
strlen
(
USER_CONFIG_FILE_LOCATION
))
<
MAXPATHLEN
)
{
MAXPATHLEN
)
{
strcpy
(
userfile
,
homedir
);
strcpy
(
userfile
,
homedir
);
strcat
(
userfile
,
USER_CONFIG_FILE_LOCATION
);
strcat
(
userfile
,
USER_CONFIG_FILE_LOCATION
);
}
}
if
(
strlen
(
userfile
)
&&
(
0
==
stat
(
userfile
,
&
st
)))
{
if
(
strlen
(
userfile
)
&&
(
0
==
stat
(
userfile
,
&
st
)))
{
readConf
(
userfile
);
readConf
(
userfile
);
return
;
return
;
}
}
else
if
(
0
==
stat
(
SYSTEM_CONFIG_FILE_LOCATION
,
&
st
))
{
else
if
(
0
==
stat
(
SYSTEM_CONFIG_FILE_LOCATION
,
&
st
))
{
readConf
(
SYSTEM_CONFIG_FILE_LOCATION
);
readConf
(
SYSTEM_CONFIG_FILE_LOCATION
);
return
;
return
;
}
}
}
}
}
}
usage
(
argv
);
usage
(
argv
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
static
void
closeAllFDs
(
void
)
{
static
void
closeAllFDs
(
void
)
int
i
;
{
int
i
;
int
fds
=
getdtablesize
();
int
fds
=
getdtablesize
();
for
(
i
=
3
;
i
<
fds
;
i
++
)
close
(
i
);
for
(
i
=
3
;
i
<
fds
;
i
++
)
close
(
i
);
}
}
static
void
changeToUser
(
void
)
{
static
void
changeToUser
(
void
)
ConfigParam
*
param
=
getConfigParam
(
CONF_USER
);
{
ConfigParam
*
param
=
getConfigParam
(
CONF_USER
);
if
(
param
&&
strlen
(
param
->
value
))
{
/* get uid */
if
(
param
&&
strlen
(
param
->
value
))
{
struct
passwd
*
userpwd
;
/* get uid */
if
((
userpwd
=
getpwnam
(
param
->
value
))
==
NULL
)
{
struct
passwd
*
userpwd
;
ERROR
(
"no such user
\"
%s
\"
at line %i
\n
"
,
param
->
value
,
if
((
userpwd
=
getpwnam
(
param
->
value
))
==
NULL
)
{
param
->
line
);
ERROR
(
"no such user
\"
%s
\"
at line %i
\n
"
,
param
->
value
,
exit
(
EXIT_FAILURE
);
param
->
line
);
}
exit
(
EXIT_FAILURE
);
}
if
(
setgid
(
userpwd
->
pw_gid
)
==
-
1
)
{
ERROR
(
"cannot setgid for user
\"
%s
\"
at line %i: %s
\n
"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
}
if
(
setgid
(
userpwd
->
pw_gid
)
==
-
1
)
{
ERROR
(
"cannot setgid for user
\"
%s
\"
at line %i: %s
\n
"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
}
#ifdef _BSD_SOURCE
#ifdef _BSD_SOURCE
/* init suplementary groups
/* init suplementary groups
* (must be done before we change our uid)
* (must be done before we change our uid)
*/
*/
if
(
initgroups
(
param
->
value
,
userpwd
->
pw_gid
)
==
-
1
)
{
if
(
initgroups
(
param
->
value
,
userpwd
->
pw_gid
)
==
-
1
)
{
WARNING
(
"cannot init supplementary groups "
WARNING
(
"cannot init supplementary groups "
"of user
\"
%s
\"
at line %i: %s
\n
"
,
"of user
\"
%s
\"
at line %i: %s
\n
"
,
param
->
value
,
param
->
line
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
strerror
(
errno
));
}
}
#endif
#endif
/* set uid */
/* set uid */
if
(
setuid
(
userpwd
->
pw_uid
)
==
-
1
)
{
if
(
setuid
(
userpwd
->
pw_uid
)
==
-
1
)
{
ERROR
(
"cannot change to uid of user "
ERROR
(
"cannot change to uid of user "
"
\"
%s
\"
at line %i: %s
\n
"
,
"
\"
%s
\"
at line %i: %s
\n
"
,
param
->
value
,
param
->
line
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
/* this is needed by libs such as arts */
/* this is needed by libs such as arts */
if
(
userpwd
->
pw_dir
)
{
if
(
userpwd
->
pw_dir
)
{
setenv
(
"HOME"
,
userpwd
->
pw_dir
,
1
);
setenv
(
"HOME"
,
userpwd
->
pw_dir
,
1
);
}
}
}
}
}
}
static
void
openLogFiles
(
Options
*
options
,
FILE
**
out
,
FILE
**
err
)
{
static
void
openLogFiles
(
Options
*
options
,
FILE
**
out
,
FILE
**
err
)
ConfigParam
*
logParam
=
parseConfigFilePath
(
CONF_LOG_FILE
,
1
);
{
ConfigParam
*
errorParam
=
parseConfigFilePath
(
CONF_ERROR
_FILE
,
1
);
ConfigParam
*
logParam
=
parseConfigFilePath
(
CONF_LOG
_FILE
,
1
);
ConfigParam
*
errorParam
=
parseConfigFilePath
(
CONF_ERROR_FILE
,
1
);
mode_t
prev
;
mode_t
prev
;
if
(
options
->
stdOutput
)
{
flushWarningLog
();
if
(
options
->
stdOutput
)
{
return
;
flushWarningLog
()
;
}
return
;
}
/* be sure to create log files w/ rw permissions*/
prev
=
umask
(
0066
);
/* be sure to create log files w/ rw permissions */
prev
=
umask
(
0066
);
if
(
NULL
==
(
*
out
=
fopen
(
logParam
->
value
,
"a"
)))
{
ERROR
(
"problem opening log file
\"
%s
\"
(config line %i) for "
if
(
NULL
==
(
*
out
=
fopen
(
logParam
->
value
,
"a"
)))
{
"writing
\n
"
,
logParam
->
value
,
logParam
->
line
);
ERROR
(
"problem opening log file
\"
%s
\"
(config line %i) for "
exit
(
EXIT_FAILURE
);
"writing
\n
"
,
logParam
->
value
,
logParam
->
line
);
}
exit
(
EXIT_FAILURE
);
}
if
(
NULL
==
(
*
err
=
fopen
(
errorParam
->
value
,
"a"
)))
{
ERROR
(
"problem opening error file
\"
%s
\"
(config line %i) for "
if
(
NULL
==
(
*
err
=
fopen
(
errorParam
->
value
,
"a"
)))
{
"writing
\n
"
,
errorParam
->
value
,
ERROR
(
"problem opening error file
\"
%s
\"
(config line %i) for "
errorParam
->
line
);
"writing
\n
"
,
errorParam
->
value
,
errorParam
->
line
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
umask
(
prev
);
umask
(
prev
);
}
}
static
void
openDB
(
Options
*
options
,
char
*
argv0
)
{
static
void
openDB
(
Options
*
options
,
char
*
argv0
)
if
(
options
->
createDB
>
0
||
readDirectoryDB
()
<
0
)
{
{
if
(
options
->
createDB
<
0
)
{
if
(
options
->
createDB
>
0
||
readDirectoryDB
()
<
0
)
{
ERROR
(
"can't open db file and using
\"
--no-create-db
\"
"
if
(
options
->
createDB
<
0
)
{
" command line option
\n
"
);
ERROR
(
"can't open db file and using
\"
--no-create-db
\"
"
" command line option
\n
"
);
ERROR
(
"try running
\"
%s --create-db
\"\n
"
,
argv0
);
ERROR
(
"try running
\"
%s --create-db
\"\n
"
,
argv0
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
flushWarningLog
();
flushWarningLog
();
if
(
checkDirectoryDB
()
<
0
)
exit
(
EXIT_FAILURE
);
if
(
checkDirectoryDB
()
<
0
)
initMp3Directory
();
exit
(
EXIT_FAILURE
);
if
(
writeDirectoryDB
()
<
0
)
exit
(
EXIT_FAILURE
);
initMp3Directory
();
if
(
options
->
createDB
)
exit
(
EXIT_SUCCESS
);
if
(
writeDirectoryDB
()
<
0
)
}
exit
(
EXIT_FAILURE
);
if
(
options
->
updateDB
)
{
if
(
options
->
createDB
)
flushWarningLog
();
exit
(
EXIT_SUCCESS
);
}
if
(
options
->
updateDB
)
{
flushWarningLog
();
updateMp3Directory
();
updateMp3Directory
();
exit
(
EXIT_SUCCESS
);
exit
(
EXIT_SUCCESS
);
}
}
}
}
static
void
startMainProcess
(
void
)
{
static
void
startMainProcess
(
void
)
{
int
pid
;
int
pid
;
fflush
(
0
);
fflush
(
0
);
pid
=
fork
();
pid
=
fork
();
if
(
pid
>
0
)
{
if
(
pid
>
0
)
{
initInputStream
();
initInputStream
();
initReplayGainState
();
initReplayGainState
();
readAudioDevicesState
();
readAudioDevicesState
();
/* free stuff we don't need */
/* free stuff we don't need */
freeAllListenSockets
();
freeAllListenSockets
();
mainPid
=
pid
;
mainPid
=
pid
;
masterInitSigHandlers
();
masterInitSigHandlers
();
kill
(
mainPid
,
SIGUSR1
);
kill
(
mainPid
,
SIGUSR1
);
while
(
masterHandlePendingSignals
()
!=
COMMAND_RETURN_KILL
)
while
(
masterHandlePendingSignals
()
!=
COMMAND_RETURN_KILL
)
waitOnSignals
();
waitOnSignals
();
/* we're killed */
/* we're killed */
playerKill
();
playerKill
();
finishAudioConfig
();
finishAudioConfig
();
finishAudioDriver
();
finishAudioDriver
();
finishPaths
();
finishPaths
();
kill
(
mainPid
,
SIGTERM
);
kill
(
mainPid
,
SIGTERM
);
waitpid
(
mainPid
,
NULL
,
0
);
waitpid
(
mainPid
,
NULL
,
0
);
finishConf
();
finishConf
();
myfprintfCloseLogFile
();
myfprintfCloseLogFile
();
exit
(
EXIT_SUCCESS
);
exit
(
EXIT_SUCCESS
);
}
else
if
(
pid
<
0
)
{
}
else
if
(
pid
<
0
)
{
ERROR
(
"problems fork'ing main process!
\n
"
);
ERROR
(
"problems fork'ing main process!
\n
"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
DEBUG
(
"main process started!
\n
"
);
DEBUG
(
"main process started!
\n
"
);
}
}
static
void
daemonize
(
Options
*
options
)
{
static
void
daemonize
(
Options
*
options
)
FILE
*
fp
=
NULL
;
{
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
FILE
*
fp
=
NULL
;
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
if
(
pidFileParam
)
{
if
(
pidFileParam
)
{
/* do this before daemon'izing so we can fail gracefully if we can't
/* do this before daemon'izing so we can fail gracefully if we can't
* write to the pid file */
* write to the pid file */
DEBUG
(
"opening pid file
\n
"
);
DEBUG
(
"opening pid file
\n
"
);
fp
=
fopen
(
pidFileParam
->
value
,
"w+"
);
fp
=
fopen
(
pidFileParam
->
value
,
"w+"
);
if
(
!
fp
)
{
if
(
!
fp
)
{
ERROR
(
"could not open %s
\"
%s
\"
(at line %i) for writing: %s
\n
"
,
ERROR
CONF_PID_FILE
,
pidFileParam
->
value
,
(
"could not open %s
\"
%s
\"
(at line %i) for writing: %s
\n
"
,
pidFileParam
->
line
,
strerror
(
errno
));
CONF_PID_FILE
,
pidFileParam
->
value
,
pidFileParam
->
line
,
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
}
}
if
(
options
->
daemon
)
{
if
(
options
->
daemon
)
{
int
pid
;
int
pid
;
fflush
(
NULL
);
fflush
(
NULL
);
pid
=
fork
();
pid
=
fork
();
if
(
pid
>
0
)
_exit
(
EXIT_SUCCESS
);
if
(
pid
>
0
)
else
if
(
pid
<
0
)
{
_exit
(
EXIT_SUCCESS
);
ERROR
(
"problems fork'ing for daemon!
\n
"
);
else
if
(
pid
<
0
)
{
exit
(
EXIT_FAILURE
);
ERROR
(
"problems fork'ing for daemon!
\n
"
);
}
exit
(
EXIT_FAILURE
);
}
if
(
chdir
(
"/"
)
<
0
)
{
ERROR
(
"problems changing to root directory
\n
"
);
if
(
chdir
(
"/"
)
<
0
)
{
exit
(
EXIT_FAILURE
);
ERROR
(
"problems changing to root directory
\n
"
);
}
exit
(
EXIT_FAILURE
);
}
if
(
setsid
()
<
0
)
{
ERROR
(
"problems setsid'ing
\n
"
);
if
(
setsid
()
<
0
)
{
exit
(
EXIT_FAILURE
);
ERROR
(
"problems setsid'ing
\n
"
);
}
exit
(
EXIT_FAILURE
);
}
fflush
(
NULL
);
pid
=
fork
();
fflush
(
NULL
);
if
(
pid
>
0
)
_exit
(
EXIT_SUCCESS
);
pid
=
fork
();
else
if
(
pid
<
0
)
{
if
(
pid
>
0
)
ERROR
(
"problems fork'ing for daemon!
\n
"
);
_exit
(
EXIT_SUCCESS
);
exit
(
EXIT_FAILURE
);
else
if
(
pid
<
0
)
{
ERROR
(
"problems fork'ing for daemon!
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
DEBUG
(
"daemonized!
\n
"
);
DEBUG
(
"daemonized!
\n
"
);
}
}
if
(
pidFileParam
)
{
if
(
pidFileParam
)
{
DEBUG
(
"writing pid file
\n
"
);
DEBUG
(
"writing pid file
\n
"
);
...
@@ -434,58 +438,59 @@ static void daemonize(Options * options) {
...
@@ -434,58 +438,59 @@ static void daemonize(Options * options) {
}
}
}
}
static
void
setupLogOutput
(
Options
*
options
,
FILE
*
out
,
FILE
*
err
)
{
static
void
setupLogOutput
(
Options
*
options
,
FILE
*
out
,
FILE
*
err
)
if
(
!
options
->
stdOutput
)
{
{
fflush
(
NULL
);
if
(
!
options
->
stdOutput
)
{
fflush
(
NULL
);
if
(
dup2
(
fileno
(
out
),
STDOUT_FILENO
)
<
0
)
{
myfprintf
(
err
,
"problems dup2 stdout : %s
\n
"
,
if
(
dup2
(
fileno
(
out
),
STDOUT_FILENO
)
<
0
)
{
strerror
(
errno
));
myfprintf
(
err
,
"problems dup2 stdout : %s
\n
"
,
exit
(
EXIT_FAILURE
);
strerror
(
errno
));
}
exit
(
EXIT_FAILURE
);
}
if
(
dup2
(
fileno
(
err
),
STDERR_FILENO
)
<
0
)
{
myfprintf
(
err
,
"problems dup2 stderr : %s
\n
"
,
if
(
dup2
(
fileno
(
err
),
STDERR_FILENO
)
<
0
)
{
strerror
(
errno
));
myfprintf
(
err
,
"problems dup2 stderr : %s
\n
"
,
exit
(
EXIT_FAILURE
);
strerror
(
errno
));
}
exit
(
EXIT_FAILURE
);
}
myfprintfStdLogMode
(
out
,
err
);
}
myfprintfStdLogMode
(
out
,
err
);
flushWarningLog
();
}
flushWarningLog
();
/* lets redirect stdin to dev null as a work around for libao bug */
{
/* lets redirect stdin to dev null as a work around for libao bug */
int
fd
=
open
(
"/dev/null"
,
O_RDONLY
);
{
if
(
fd
<
0
)
{
int
fd
=
open
(
"/dev/null"
,
O_RDONLY
);
ERROR
(
"not able to open /dev/null to redirect stdin: "
if
(
fd
<
0
)
{
"%s
\n
"
,
strerror
(
errno
));
ERROR
(
"not able to open /dev/null to redirect stdin: "
exit
(
EXIT_FAILURE
);
"%s
\n
"
,
strerror
(
errno
));
}
exit
(
EXIT_FAILURE
);
if
(
dup2
(
fd
,
STDIN_FILENO
)
<
0
)
{
}
ERROR
(
"problems dup2's stdin for redirection: "
if
(
dup2
(
fd
,
STDIN_FILENO
)
<
0
)
{
"%s
\n
"
,
strerror
(
errno
));
ERROR
(
"problems dup2's stdin for redirection: "
exit
(
EXIT_FAILURE
);
"%s
\n
"
,
strerror
(
errno
));
}
exit
(
EXIT_FAILURE
);
}
}
}
}
}
static
void
cleanUpPidFile
(
void
)
{
static
void
cleanUpPidFile
(
void
)
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
{
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
if
(
!
pidFileParam
)
return
;
if
(
!
pidFileParam
)
return
;
DEBUG
(
"cleaning up pid file
\n
"
);
DEBUG
(
"cleaning up pid file
\n
"
);
unlink
(
pidFileParam
->
value
);
unlink
(
pidFileParam
->
value
);
}
}
static
void
killFromPidFile
(
char
*
cmd
,
int
killOption
)
{
static
void
killFromPidFile
(
char
*
cmd
,
int
killOption
)
/*char buf[32];
{
struct stat st_cmd;
FILE
*
fp
;
struct stat st_exe;*/
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
FILE
*
fp
;
ConfigParam
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
int
pid
;
int
pid
;
if
(
!
pidFileParam
)
{
if
(
!
pidFileParam
)
{
...
@@ -493,145 +498,119 @@ static void killFromPidFile(char * cmd, int killOption) {
...
@@ -493,145 +498,119 @@ static void killFromPidFile(char * cmd, int killOption) {
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
fp
=
fopen
(
pidFileParam
->
value
,
"r"
);
fp
=
fopen
(
pidFileParam
->
value
,
"r"
);
if
(
!
fp
)
{
if
(
!
fp
)
{
ERROR
(
"unable to open %s
\"
%s
\"
: %s
\n
"
,
ERROR
(
"unable to open %s
\"
%s
\"
: %s
\n
"
,
CONF_PID_FILE
,
pidFileParam
->
value
,
CONF_PID_FILE
,
pidFileParam
->
value
,
strerror
(
errno
));
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
if
(
fscanf
(
fp
,
"%i"
,
&
pid
)
!=
1
)
{
if
(
fscanf
(
fp
,
"%i"
,
&
pid
)
!=
1
)
{
ERROR
(
"unable to read the pid from file
\"
%s
\"\n
"
,
ERROR
(
"unable to read the pid from file
\"
%s
\"\n
"
,
pidFileParam
->
value
);
pidFileParam
->
value
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
fclose
(
fp
);
fclose
(
fp
);
/*memset(buf, 0, 32);
if
(
kill
(
pid
,
SIGTERM
))
{
snprintf(buf, 31, "/proc/%i/exe", pid);
if(killOption == 1) {
if(stat(cmd, &st_cmd)) {
ERROR("unable to stat file \"%s\"\n", cmd);
ERROR("execute \"%s --kill -kill\" to kill pid %i\n",
cmd, pid);
exit(EXIT_FAILURE);
}
if(stat(buf, &st_exe)) {
ERROR("unable to kill proccess %i (%s: %s)\n", pid, buf,
strerror(errno));
ERROR("execute \"%s --kill -kill\" to kill pid %i\n",
cmd, pid);
exit(EXIT_FAILURE);
}
if(st_exe.st_dev != st_cmd.st_dev || st_exe.st_ino != st_cmd.st_ino) {
ERROR("%s doesn't appear to be running as pid %i\n",
cmd, pid);
ERROR("execute \"%s --kill -kill\" to kill pid %i\n",
cmd, pid);
exit(EXIT_FAILURE);
}
}*/
if
(
kill
(
pid
,
SIGTERM
))
{
ERROR
(
"unable to kill proccess %i: %s
\n
"
,
pid
,
strerror
(
errno
));
ERROR
(
"unable to kill proccess %i: %s
\n
"
,
pid
,
strerror
(
errno
));
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
exit
(
EXIT_SUCCESS
);
exit
(
EXIT_SUCCESS
);
}
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
FILE
*
out
=
NULL
;
{
FILE
*
err
=
NULL
;
FILE
*
out
=
NULL
;
Options
options
;
FILE
*
err
=
NULL
;
Options
options
;
closeAllFDs
();
closeAllFDs
();
initConf
();
initConf
();
parseOptions
(
argc
,
argv
,
&
options
);
parseOptions
(
argc
,
argv
,
&
options
);
if
(
options
.
kill
)
killFromPidFile
(
argv
[
0
],
options
.
kill
);
if
(
options
.
kill
)
killFromPidFile
(
argv
[
0
],
options
.
kill
);
initStats
();
initStats
();
initTagConfig
();
initTagConfig
();
initLog
();
initLog
();
if
(
options
.
createDB
<=
0
&&
!
options
.
updateDB
)
listenOnPort
();
changeToUser
();
if
(
options
.
createDB
<=
0
&&
!
options
.
updateDB
)
listenOnPort
(
);
openLogFiles
(
&
options
,
&
out
,
&
err
);
changeToUser
();
initPlayerData
();
openLogFiles
(
&
options
,
&
out
,
&
err
);
initPlayerData
();
daemonize
(
&
options
);
daemonize
(
&
options
);
initInputPlugins
();
initInputPlugins
();
initPaths
();
initPaths
();
initAudioConfig
();
initAudioConfig
();
initAudioDriver
();
initAudioDriver
();
initSigHandlers
();
initSigHandlers
();
setupLogOutput
(
&
options
,
out
,
err
);
setupLogOutput
(
&
options
,
out
,
err
);
startMainProcess
();
startMainProcess
();
/* This is the main process which has
/* This is the main process which has
* been forked from the master process.
* been forked from the master process.
*/
*/
initPermissions
();
initPermissions
();
initPlaylist
();
initPlaylist
();
openDB
(
&
options
,
argv
[
0
]);
openDB
(
&
options
,
argv
[
0
]);
initCommands
();
initCommands
();
initVolume
();
initVolume
();
initInterfaces
();
initInterfaces
();
printMemorySavedByTagTracker
();
printMemorySavedByTagTracker
();
printSavedMemoryFromFilenames
();
printSavedMemoryFromFilenames
();
/* wait for the master process to get ready so we can start
/* wait for the master process to get ready so we can start
* playing if readPlaylistState thinks we should*/
* playing if readPlaylistState thinks we should*/
while
(
COMMAND_MASTER_READY
!=
handlePendingSignals
())
while
(
COMMAND_MASTER_READY
!=
handlePendingSignals
())
my_usleep
(
1
);
my_usleep
(
1
);
openVolumeDevice
();
openVolumeDevice
();
readPlaylistState
();
readPlaylistState
();
while
(
COMMAND_RETURN_KILL
!=
doIOForInterfaces
())
{
while
(
COMMAND_RETURN_KILL
!=
doIOForInterfaces
())
{
if
(
COMMAND_RETURN_KILL
==
handlePendingSignals
())
break
;
if
(
COMMAND_RETURN_KILL
==
handlePendingSignals
())
syncPlayerAndPlaylist
();
break
;
closeOldInterfaces
();
syncPlayerAndPlaylist
();
closeOldInterfaces
();
readDirectoryDBIfUpdateIsFinished
();
readDirectoryDBIfUpdateIsFinished
();
}
}
savePlaylistState
();
savePlaylistState
();
saveAudioDevicesState
();
saveAudioDevicesState
();
freeAllInterfaces
();
freeAllInterfaces
();
closeAllListenSockets
();
closeAllListenSockets
();
/* This slows shutdown immensely, and doesn't really accomplish
/* This slows shutdown immensely, and doesn't really accomplish
* anything. Uncomment when we rewrite tagTracker to use a tree. */
* anything. Uncomment when we rewrite tagTracker to use a tree. */
/*closeMp3Directory();
*/
/*closeMp3Directory();
*/
finishPlaylist
();
finishPlaylist
();
freePlayerData
();
freePlayerData
();
finishAudioDriver
();
finishAudioDriver
();
finishAudioConfig
();
finishAudioConfig
();
finishVolume
();
finishVolume
();
finishPaths
();
finishPaths
();
finishPermissions
();
finishPermissions
();
finishCommands
();
finishCommands
();
finishInputPlugins
();
finishInputPlugins
();
cleanUpPidFile
();
cleanUpPidFile
();
finishConf
();
finishConf
();
myfprintfCloseLogFile
();
myfprintfCloseLogFile
();
return
EXIT_SUCCESS
;
return
EXIT_SUCCESS
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment