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
90b34f8e
Commit
90b34f8e
authored
Jan 18, 2009
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
main: moved code to daemon.c
Moved changeToUser(), cleanUpPidFile(), killFromPidFile() to daemon.c. These are daemonization functions.
parent
1f0dfb44
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
119 additions
and
98 deletions
+119
-98
daemon.c
src/daemon.c
+97
-0
daemon.h
src/daemon.h
+19
-0
main.c
src/main.c
+3
-98
No files found.
src/daemon.c
View file @
90b34f8e
...
@@ -28,6 +28,46 @@
...
@@ -28,6 +28,46 @@
#include <sys/stat.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fcntl.h>
#ifndef WIN32
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#endif
void
daemonize_kill
(
void
)
{
#ifndef WIN32
FILE
*
fp
;
struct
config_param
*
param
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
int
pid
,
ret
;
if
(
param
==
NULL
)
g_error
(
"no pid_file specified in the config file"
);
fp
=
fopen
(
param
->
value
,
"r"
);
if
(
fp
==
NULL
)
g_error
(
"unable to open %s
\"
%s
\"
: %s"
,
CONF_PID_FILE
,
param
->
value
,
g_strerror
(
errno
));
if
(
fscanf
(
fp
,
"%i"
,
&
pid
)
!=
1
)
{
g_error
(
"unable to read the pid from file
\"
%s
\"
"
,
param
->
value
);
}
fclose
(
fp
);
ret
=
kill
(
pid
,
SIGTERM
);
if
(
ret
<
0
)
g_error
(
"unable to kill proccess %i: %s"
,
pid
,
g_strerror
(
errno
));
exit
(
EXIT_SUCCESS
);
#else
g_error
(
"--kill is not available on WIN32"
);
#endif
}
void
void
daemonize_close_stdin
(
void
)
daemonize_close_stdin
(
void
)
{
{
...
@@ -42,6 +82,50 @@ daemonize_close_stdin(void)
...
@@ -42,6 +82,50 @@ daemonize_close_stdin(void)
}
}
void
void
daemonize_set_user
(
void
)
{
#ifndef WIN32
struct
config_param
*
param
=
config_get_param
(
CONF_USER
);
if
(
param
&&
strlen
(
param
->
value
))
{
/* get uid */
struct
passwd
*
userpwd
;
if
((
userpwd
=
getpwnam
(
param
->
value
))
==
NULL
)
{
g_error
(
"no such user
\"
%s
\"
at line %i"
,
param
->
value
,
param
->
line
);
}
if
(
setgid
(
userpwd
->
pw_gid
)
==
-
1
)
{
g_error
(
"cannot setgid for user
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
#ifdef _BSD_SOURCE
/* init suplementary groups
* (must be done before we change our uid)
*/
if
(
initgroups
(
param
->
value
,
userpwd
->
pw_gid
)
==
-
1
)
{
g_warning
(
"cannot init supplementary groups "
"of user
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
#endif
/* set uid */
if
(
setuid
(
userpwd
->
pw_uid
)
==
-
1
)
{
g_error
(
"cannot change to uid of user "
"
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
/* this is needed by libs such as arts */
if
(
userpwd
->
pw_dir
)
{
g_setenv
(
"HOME"
,
userpwd
->
pw_dir
,
true
);
}
}
#endif
}
void
daemonize
(
Options
*
options
)
daemonize
(
Options
*
options
)
{
{
#ifndef WIN32
#ifndef WIN32
...
@@ -91,3 +175,16 @@ daemonize(Options *options)
...
@@ -91,3 +175,16 @@ daemonize(Options *options)
(
void
)
options
;
(
void
)
options
;
#endif
#endif
}
}
void
daemonize_delete_pidfile
(
void
)
{
struct
config_param
*
param
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
if
(
param
==
NULL
)
return
;
g_debug
(
"cleaning up pid file"
);
unlink
(
param
->
value
);
}
src/daemon.h
View file @
90b34f8e
...
@@ -22,12 +22,31 @@
...
@@ -22,12 +22,31 @@
#include "cmdline.h"
#include "cmdline.h"
/**
/**
* Kill the MPD which is currently running, pid determined from the
* pid file.
*/
void
daemonize_kill
(
void
);
/**
* Close stdin (fd 0) and re-open it as /dev/null.
* Close stdin (fd 0) and re-open it as /dev/null.
*/
*/
void
void
daemonize_close_stdin
(
void
);
daemonize_close_stdin
(
void
);
/**
* Change to the configured Unix user.
*/
void
daemonize_set_user
(
void
);
void
void
daemonize
(
Options
*
options
);
daemonize
(
Options
*
options
);
/**
* Deletes the pidfile which was created when MPD started.
*/
void
daemonize_delete_pidfile
(
void
);
#endif
#endif
src/main.c
View file @
90b34f8e
...
@@ -63,15 +63,9 @@
...
@@ -63,15 +63,9 @@
#include <unistd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <errno.h>
#include <string.h>
#include <string.h>
#ifndef WIN32
#include <pwd.h>
#include <grp.h>
#endif
#ifdef HAVE_LOCALE_H
#ifdef HAVE_LOCALE_H
#include <locale.h>
#include <locale.h>
#endif
#endif
...
@@ -81,49 +75,6 @@ GMainLoop *main_loop;
...
@@ -81,49 +75,6 @@ GMainLoop *main_loop;
struct
notify
main_notify
;
struct
notify
main_notify
;
static
void
changeToUser
(
void
)
{
#ifndef WIN32
struct
config_param
*
param
=
config_get_param
(
CONF_USER
);
if
(
param
&&
strlen
(
param
->
value
))
{
/* get uid */
struct
passwd
*
userpwd
;
if
((
userpwd
=
getpwnam
(
param
->
value
))
==
NULL
)
{
g_error
(
"no such user
\"
%s
\"
at line %i"
,
param
->
value
,
param
->
line
);
}
if
(
setgid
(
userpwd
->
pw_gid
)
==
-
1
)
{
g_error
(
"cannot setgid for user
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
#ifdef _BSD_SOURCE
/* init suplementary groups
* (must be done before we change our uid)
*/
if
(
initgroups
(
param
->
value
,
userpwd
->
pw_gid
)
==
-
1
)
{
g_warning
(
"cannot init supplementary groups "
"of user
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
#endif
/* set uid */
if
(
setuid
(
userpwd
->
pw_uid
)
==
-
1
)
{
g_error
(
"cannot change to uid of user "
"
\"
%s
\"
at line %i: %s"
,
param
->
value
,
param
->
line
,
strerror
(
errno
));
}
/* this is needed by libs such as arts */
if
(
userpwd
->
pw_dir
)
{
g_setenv
(
"HOME"
,
userpwd
->
pw_dir
,
true
);
}
}
#endif
}
static
void
openDB
(
Options
*
options
,
char
*
argv0
)
static
void
openDB
(
Options
*
options
,
char
*
argv0
)
{
{
struct
config_param
*
param
;
struct
config_param
*
param
;
...
@@ -160,52 +111,6 @@ static void openDB(Options * options, char *argv0)
...
@@ -160,52 +111,6 @@ static void openDB(Options * options, char *argv0)
}
}
}
}
static
void
cleanUpPidFile
(
void
)
{
struct
config_param
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
if
(
!
pidFileParam
)
return
;
g_debug
(
"cleaning up pid file"
);
unlink
(
pidFileParam
->
value
);
}
static
void
killFromPidFile
(
void
)
{
#ifndef WIN32
FILE
*
fp
;
struct
config_param
*
pidFileParam
=
parseConfigFilePath
(
CONF_PID_FILE
,
0
);
int
pid
;
if
(
!
pidFileParam
)
{
g_error
(
"no pid_file specified in the config file"
);
}
fp
=
fopen
(
pidFileParam
->
value
,
"r"
);
if
(
!
fp
)
{
g_error
(
"unable to open %s
\"
%s
\"
: %s"
,
CONF_PID_FILE
,
pidFileParam
->
value
,
strerror
(
errno
));
}
if
(
fscanf
(
fp
,
"%i"
,
&
pid
)
!=
1
)
{
g_error
(
"unable to read the pid from file
\"
%s
\"
"
,
pidFileParam
->
value
);
}
fclose
(
fp
);
if
(
kill
(
pid
,
SIGTERM
))
{
g_error
(
"unable to kill proccess %i: %s"
,
pid
,
strerror
(
errno
));
}
exit
(
EXIT_SUCCESS
);
#else
g_error
(
"--kill is not available on WIN32"
);
#endif
}
static
gboolean
static
gboolean
timer_save_state_file
(
G_GNUC_UNUSED
gpointer
data
)
timer_save_state_file
(
G_GNUC_UNUSED
gpointer
data
)
{
{
...
@@ -253,7 +158,7 @@ int main(int argc, char *argv[])
...
@@ -253,7 +158,7 @@ int main(int argc, char *argv[])
parseOptions
(
argc
,
argv
,
&
options
);
parseOptions
(
argc
,
argv
,
&
options
);
if
(
options
.
kill
)
if
(
options
.
kill
)
killFromPidFile
();
daemonize_kill
();
stats_global_init
();
stats_global_init
();
tag_lib_init
();
tag_lib_init
();
...
@@ -261,7 +166,7 @@ int main(int argc, char *argv[])
...
@@ -261,7 +166,7 @@ int main(int argc, char *argv[])
listenOnPort
();
listenOnPort
();
changeToU
ser
();
daemonize_set_u
ser
();
main_task
=
g_thread_self
();
main_task
=
g_thread_self
();
main_loop
=
g_main_loop_new
(
NULL
,
FALSE
);
main_loop
=
g_main_loop_new
(
NULL
,
FALSE
);
...
@@ -356,7 +261,7 @@ int main(int argc, char *argv[])
...
@@ -356,7 +261,7 @@ int main(int argc, char *argv[])
archive_plugin_deinit_all
();
archive_plugin_deinit_all
();
#endif
#endif
music_pipe_free
();
music_pipe_free
();
cleanUpPidF
ile
();
daemonize_delete_pidf
ile
();
config_global_finish
();
config_global_finish
();
tag_pool_deinit
();
tag_pool_deinit
();
songvec_deinit
();
songvec_deinit
();
...
...
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