Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
578a00ff
Unverified
Commit
578a00ff
authored
Jun 29, 2017
by
Christian Brauner
Committed by
Stéphane Graber
Jul 16, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lxccontainer: non-functional changes
Signed-off-by:
Christian Brauner
<
christian.brauner@ubuntu.com
>
parent
cf605ce7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
91 additions
and
55 deletions
+91
-55
lxccontainer.c
src/lxc/lxccontainer.c
+91
-55
No files found.
src/lxc/lxccontainer.c
View file @
578a00ff
...
...
@@ -781,31 +781,32 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
};
char
**
init_cmd
=
NULL
;
/* container
exists
*/
/* container
does exist
*/
if
(
!
c
)
return
false
;
/* If anything fails before we set error_num, we want an error in there */
/* If anything fails before we set error_num, we want an error in there.
*/
c
->
error_num
=
1
;
/*
container has not been setup
*/
/*
Container has not been setup.
*/
if
(
!
c
->
lxc_conf
)
return
false
;
ret
=
ongoing_create
(
c
);
if
(
ret
<
0
)
{
ERROR
(
"
Error checking for incomplete
creation"
);
ERROR
(
"
Failed checking for incomplete container
creation"
);
return
false
;
}
else
if
(
ret
==
1
)
{
ERROR
(
"
Error: creation of %s is ongoing"
,
c
->
name
);
ERROR
(
"
Ongoing container creation detected"
);
return
false
;
}
else
if
(
ret
==
2
)
{
ERROR
(
"
Error: %s creation was not completed"
,
c
->
name
);
ERROR
(
"
Failed to create container"
);
do_lxcapi_destroy
(
c
);
return
false
;
}
/*
i
s this app meant to be run through lxcinit, as in lxc-execute? */
/*
I
s this app meant to be run through lxcinit, as in lxc-execute? */
if
(
useinit
&&
!
argv
)
return
false
;
...
...
@@ -825,24 +826,27 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
ret
=
lxc_execute
(
c
->
name
,
argv
,
1
,
handler
,
c
->
config_path
,
daemonize
);
c
->
error_num
=
ret
;
return
ret
==
0
?
true
:
false
;
if
(
ret
!=
0
)
return
false
;
return
true
;
}
/* if no argv was passed in, use lxc.init_cmd if provided in
* configuration */
/* If no argv was passed in, use lxc.init_cmd if provided in the
* configuration
*/
if
(
!
argv
)
argv
=
init_cmd
=
split_init_cmd
(
conf
->
init_cmd
);
/* ...
and otherwise use default_args
*/
/* ...
otherwise use default_args.
*/
if
(
!
argv
)
argv
=
default_args
;
/*
* say, I'm not sure - what locks do we want here? Any?
* Is liblxc's locking enough here to protect the on disk
* container? We don't want to exclude things like lxc_info
* while container is running...
*/
/* I'm not sure what locks we want here.Any? Is liblxc's locking enough
* here to protect the on disk container? We don't want to exclude
* things like lxc_info while the container is running.
*/
if
(
daemonize
)
{
bool
started
;
char
title
[
2048
];
...
...
@@ -855,12 +859,16 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
return
false
;
}
/* first parent */
if
(
pid
!=
0
)
{
/* Set to NULL because we don't want father unlink
* the PID file, child will do the free and unlink.
*/
c
->
pidfile
=
NULL
;
/* Wait for container to tell us whether it started
* successfully.
*/
started
=
wait_on_daemonized_start
(
handler
,
pid
);
free_init_cmd
(
init_cmd
);
...
...
@@ -868,42 +876,61 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
return
started
;
}
/* first child */
/* We don't really care if this doesn't print all the
* characters
; a
ll that it means is that the proctitle will be
* ugly. Similarly, we also don't care if setproctitle()
*
fails.
*/
* characters
. A
ll that it means is that the proctitle will be
* ugly. Similarly, we also don't care if setproctitle()
fails.
* */
snprintf
(
title
,
sizeof
(
title
),
"[lxc monitor] %s %s"
,
c
->
config_path
,
c
->
name
);
INFO
(
"Attempting to set proc title to %s"
,
title
);
setproctitle
(
title
);
/* second fork to be reparented by init */
/* We fork() a second time to be reparented to init. Like
* POSIX's daemon() function we change to "/" and redirect
* std{in,out,err} to /dev/null.
*/
pid
=
fork
();
if
(
pid
<
0
)
{
SYSERROR
(
"
Error doing dual-fork
"
);
exit
(
1
);
SYSERROR
(
"
Failed to fork first child process
"
);
exit
(
EXIT_FAILURE
);
}
/* second parent */
if
(
pid
!=
0
)
{
free_init_cmd
(
init_cmd
);
lxc_free_handler
(
handler
);
exit
(
0
);
exit
(
EXIT_SUCCESS
);
}
/* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */
if
(
chdir
(
"/"
))
{
SYSERROR
(
"Error chdir()ing to /."
);
exit
(
1
);
/* second child */
/* change to / directory */
ret
=
chdir
(
"/"
);
if
(
ret
<
0
)
{
SYSERROR
(
"Failed to change to
\"
/
\"
directory"
);
exit
(
EXIT_FAILURE
);
}
lxc_check_inherited
(
conf
,
true
,
(
int
[]){
handler
->
conf
->
maincmd_fd
,
handler
->
state_socket_pair
[
0
],
handler
->
state_socket_pair
[
1
]},
ret
=
lxc_check_inherited
(
conf
,
true
,
(
int
[]){
handler
->
conf
->
maincmd_fd
,
handler
->
state_socket_pair
[
0
],
handler
->
state_socket_pair
[
1
]},
3
);
if
(
null_stdfds
()
<
0
)
{
ERROR
(
"failed to close fds"
);
exit
(
1
);
if
(
ret
<
0
)
exit
(
EXIT_FAILURE
);
/* redirect std{in,out,err} to /dev/null */
ret
=
null_stdfds
();
if
(
ret
<
0
)
{
ERROR
(
"Failed to redirect std{in,out,err} to /dev/null"
);
exit
(
EXIT_FAILURE
);
}
setsid
();
/* become session leader */
ret
=
setsid
();
if
(
ret
<
0
)
TRACE
(
"Process %d is already process group leader"
,
getpid
());
}
else
{
if
(
!
am_single_threaded
())
{
ERROR
(
"Cannot start non-daemonized container when threaded"
);
...
...
@@ -924,7 +951,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
free_init_cmd
(
init_cmd
);
lxc_free_handler
(
handler
);
if
(
daemonize
)
exit
(
1
);
exit
(
EXIT_FAILURE
);
return
false
;
}
...
...
@@ -935,7 +962,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
free_init_cmd
(
init_cmd
);
lxc_free_handler
(
handler
);
if
(
daemonize
)
exit
(
1
);
exit
(
EXIT_FAILURE
);
return
false
;
}
...
...
@@ -947,17 +974,20 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
/* Unshare the mount namespace if requested */
if
(
conf
->
monitor_unshare
)
{
if
(
unshare
(
CLONE_NEWNS
))
{
ret
=
unshare
(
CLONE_NEWNS
);
if
(
ret
<
0
)
{
SYSERROR
(
"failed to unshare mount namespace"
);
lxc_free_handler
(
handler
);
ret
=
1
;
goto
o
ut
;
goto
o
n_error
;
}
if
(
mount
(
NULL
,
"/"
,
NULL
,
MS_SLAVE
|
MS_REC
,
NULL
))
{
ret
=
mount
(
NULL
,
"/"
,
NULL
,
MS_SLAVE
|
MS_REC
,
NULL
);
if
(
ret
<
0
)
{
SYSERROR
(
"Failed to make / rslave at startup"
);
lxc_free_handler
(
handler
);
ret
=
1
;
goto
o
ut
;
goto
o
n_error
;
}
}
...
...
@@ -967,31 +997,31 @@ reboot:
handler
=
lxc_init_handler
(
c
->
name
,
conf
,
c
->
config_path
,
daemonize
);
if
(
!
handler
)
{
ret
=
1
;
goto
o
ut
;
goto
o
n_error
;
}
}
if
(
lxc_check_inherited
(
conf
,
daemonize
,
(
int
[]){
handler
->
conf
->
maincmd_fd
,
handler
->
state_socket_pair
[
0
],
handler
->
state_socket_pair
[
1
]},
3
))
{
ERROR
(
"Inherited fds found"
);
ret
=
lxc_check_inherited
(
conf
,
daemonize
,
(
int
[]){
handler
->
conf
->
maincmd_fd
,
handler
->
state_socket_pair
[
0
],
handler
->
state_socket_pair
[
1
]},
3
);
if
(
ret
<
0
)
{
lxc_free_handler
(
handler
);
ret
=
1
;
goto
o
ut
;
goto
o
n_error
;
}
ret
=
lxc_start
(
c
->
name
,
argv
,
handler
,
c
->
config_path
,
daemonize
);
c
->
error_num
=
ret
;
if
(
conf
->
reboot
==
1
)
{
INFO
(
"
c
ontainer requested reboot"
);
INFO
(
"
C
ontainer requested reboot"
);
conf
->
reboot
=
2
;
goto
reboot
;
}
o
ut
:
o
n_error
:
if
(
c
->
pidfile
)
{
unlink
(
c
->
pidfile
);
free
(
c
->
pidfile
);
...
...
@@ -999,9 +1029,15 @@ out:
}
free_init_cmd
(
init_cmd
);
if
(
daemonize
)
exit
(
ret
==
0
?
true
:
false
);
return
(
ret
==
0
?
true
:
false
);
if
(
daemonize
&&
ret
!=
0
)
exit
(
EXIT_FAILURE
);
else
if
(
daemonize
)
exit
(
EXIT_SUCCESS
);
if
(
ret
!=
0
)
return
false
;
return
true
;
}
static
bool
lxcapi_start
(
struct
lxc_container
*
c
,
int
useinit
,
char
*
const
argv
[])
...
...
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