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
a63bb845
Unverified
Commit
a63bb845
authored
Jun 07, 2017
by
Christian Brauner
Committed by
Stéphane Graber
Jul 16, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
start: add lxc_init_handler()
Signed-off-by:
Christian Brauner
<
christian.brauner@ubuntu.com
>
parent
bad6582c
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
121 additions
and
92 deletions
+121
-92
criu.c
src/lxc/criu.c
+4
-1
execute.c
src/lxc/execute.c
+7
-8
lxc.h
src/lxc/lxc.h
+5
-3
lxccontainer.c
src/lxc/lxccontainer.c
+25
-9
start.c
src/lxc/start.c
+41
-23
start.h
src/lxc/start.h
+6
-3
state.c
src/lxc/state.c
+10
-10
lxc_execute.c
src/lxc/tools/lxc_execute.c
+23
-35
No files found.
src/lxc/criu.c
View file @
a63bb845
...
@@ -796,10 +796,13 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
...
@@ -796,10 +796,13 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
close
(
fd
);
close
(
fd
);
}
}
handler
=
lxc_init
(
c
->
name
,
c
->
lxc_conf
,
c
->
config_path
);
handler
=
lxc_init
_handler
(
c
->
name
,
c
->
lxc_conf
,
c
->
config_path
);
if
(
!
handler
)
if
(
!
handler
)
goto
out
;
goto
out
;
if
(
lxc_init
(
c
->
name
,
handler
)
<
0
)
goto
out
;
if
(
!
cgroup_init
(
handler
))
{
if
(
!
cgroup_init
(
handler
))
{
ERROR
(
"failed initing cgroups"
);
ERROR
(
"failed initing cgroups"
);
goto
out_fini_handler
;
goto
out_fini_handler
;
...
...
src/lxc/execute.c
View file @
a63bb845
...
@@ -111,16 +111,15 @@ static struct lxc_operations execute_start_ops = {
...
@@ -111,16 +111,15 @@ static struct lxc_operations execute_start_ops = {
};
};
int
lxc_execute
(
const
char
*
name
,
char
*
const
argv
[],
int
quiet
,
int
lxc_execute
(
const
char
*
name
,
char
*
const
argv
[],
int
quiet
,
struct
lxc_conf
*
conf
,
const
char
*
lxcpath
,
bool
backgrounded
)
struct
lxc_handler
*
handler
,
const
char
*
lxcpath
,
bool
backgrounded
)
{
{
struct
execute_args
args
=
{
struct
execute_args
args
=
{.
argv
=
argv
,
.
quiet
=
quiet
};
.
argv
=
argv
,
.
quiet
=
quiet
};
if
(
lxc_check_inherited
(
conf
,
false
,
-
1
))
if
(
lxc_check_inherited
(
handler
->
conf
,
false
,
handler
->
conf
->
maincmd_fd
))
return
-
1
;
return
-
1
;
conf
->
is_execute
=
1
;
handler
->
conf
->
is_execute
=
1
;
return
__lxc_start
(
name
,
conf
,
&
execute_start_ops
,
&
args
,
lxcpath
,
backgrounded
);
return
__lxc_start
(
name
,
handler
,
&
execute_start_ops
,
&
args
,
lxcpath
,
backgrounded
);
}
}
src/lxc/lxc.h
View file @
a63bb845
...
@@ -36,6 +36,7 @@ extern "C" {
...
@@ -36,6 +36,7 @@ extern "C" {
struct
lxc_msg
;
struct
lxc_msg
;
struct
lxc_conf
;
struct
lxc_conf
;
struct
lxc_arguments
;
struct
lxc_arguments
;
struct
lxc_handler
;
/**
/**
Following code is for liblxc.
Following code is for liblxc.
...
@@ -51,8 +52,9 @@ struct lxc_arguments;
...
@@ -51,8 +52,9 @@ struct lxc_arguments;
* @backgrounded : whether or not the container is daemonized
* @backgrounded : whether or not the container is daemonized
* Returns 0 on success, < 0 otherwise
* Returns 0 on success, < 0 otherwise
*/
*/
extern
int
lxc_start
(
const
char
*
name
,
char
*
const
argv
[],
struct
lxc_conf
*
conf
,
extern
int
lxc_start
(
const
char
*
name
,
char
*
const
argv
[],
const
char
*
lxcpath
,
bool
backgrounded
);
struct
lxc_handler
*
handler
,
const
char
*
lxcpath
,
bool
backgrounded
);
/*
/*
* Start the specified command inside an application container
* Start the specified command inside an application container
...
@@ -64,7 +66,7 @@ extern int lxc_start(const char *name, char *const argv[], struct lxc_conf *conf
...
@@ -64,7 +66,7 @@ extern int lxc_start(const char *name, char *const argv[], struct lxc_conf *conf
* Returns 0 on success, < 0 otherwise
* Returns 0 on success, < 0 otherwise
*/
*/
extern
int
lxc_execute
(
const
char
*
name
,
char
*
const
argv
[],
int
quiet
,
extern
int
lxc_execute
(
const
char
*
name
,
char
*
const
argv
[],
int
quiet
,
struct
lxc_
conf
*
conf
,
const
char
*
lxcpath
,
struct
lxc_
handler
*
handler
,
const
char
*
lxcpath
,
bool
backgrounded
);
bool
backgrounded
);
/*
/*
...
...
src/lxc/lxccontainer.c
View file @
a63bb845
...
@@ -57,6 +57,7 @@
...
@@ -57,6 +57,7 @@
#include "namespace.h"
#include "namespace.h"
#include "network.h"
#include "network.h"
#include "sync.h"
#include "sync.h"
#include "start.h"
#include "state.h"
#include "state.h"
#include "utils.h"
#include "utils.h"
#include "version.h"
#include "version.h"
...
@@ -715,6 +716,7 @@ static void free_init_cmd(char **argv)
...
@@ -715,6 +716,7 @@ static void free_init_cmd(char **argv)
static
bool
do_lxcapi_start
(
struct
lxc_container
*
c
,
int
useinit
,
char
*
const
argv
[])
static
bool
do_lxcapi_start
(
struct
lxc_container
*
c
,
int
useinit
,
char
*
const
argv
[])
{
{
int
ret
;
int
ret
;
struct
lxc_handler
*
handler
;
struct
lxc_conf
*
conf
;
struct
lxc_conf
*
conf
;
bool
daemonize
=
false
;
bool
daemonize
=
false
;
FILE
*
pid_fp
=
NULL
;
FILE
*
pid_fp
=
NULL
;
...
@@ -731,7 +733,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -731,7 +733,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
/* 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
;
c
->
error_num
=
1
;
/* container has been setup */
/* container has
not
been setup */
if
(
!
c
->
lxc_conf
)
if
(
!
c
->
lxc_conf
)
return
false
;
return
false
;
...
@@ -758,8 +760,16 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -758,8 +760,16 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
daemonize
=
c
->
daemonize
;
daemonize
=
c
->
daemonize
;
container_mem_unlock
(
c
);
container_mem_unlock
(
c
);
/* initialize handler */
handler
=
lxc_init_handler
(
c
->
name
,
conf
,
c
->
config_path
);
if
(
!
handler
)
return
false
;
if
(
useinit
)
{
if
(
useinit
)
{
ret
=
lxc_execute
(
c
->
name
,
argv
,
1
,
conf
,
c
->
config_path
,
daemonize
);
TRACE
(
"calling
\"
lxc_execute
\"
"
);
ret
=
lxc_execute
(
c
->
name
,
argv
,
1
,
handler
,
c
->
config_path
,
daemonize
);
c
->
error_num
=
ret
;
return
ret
==
0
?
true
:
false
;
return
ret
==
0
?
true
:
false
;
}
}
...
@@ -791,6 +801,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -791,6 +801,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
* the PID file, child will do the free and unlink.
* the PID file, child will do the free and unlink.
*/
*/
c
->
pidfile
=
NULL
;
c
->
pidfile
=
NULL
;
close
(
c
->
lxc_conf
->
maincmd_fd
);
return
wait_on_daemonized_start
(
c
,
pid
);
return
wait_on_daemonized_start
(
c
,
pid
);
}
}
...
@@ -815,7 +826,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -815,7 +826,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
SYSERROR
(
"Error chdir()ing to /."
);
SYSERROR
(
"Error chdir()ing to /."
);
exit
(
1
);
exit
(
1
);
}
}
lxc_check_inherited
(
conf
,
true
,
-
1
);
lxc_check_inherited
(
conf
,
true
,
handler
->
conf
->
maincmd_fd
);
if
(
null_stdfds
()
<
0
)
{
if
(
null_stdfds
()
<
0
)
{
ERROR
(
"failed to close fds"
);
ERROR
(
"failed to close fds"
);
exit
(
1
);
exit
(
1
);
...
@@ -828,7 +839,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -828,7 +839,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
}
}
}
}
/* We need to write PID file after daem
i
nize, so we always
/* We need to write PID file after daem
o
nize, so we always
* write the right PID.
* write the right PID.
*/
*/
if
(
c
->
pidfile
)
{
if
(
c
->
pidfile
)
{
...
@@ -869,13 +880,20 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
...
@@ -869,13 +880,20 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
}
}
reboot
:
reboot
:
if
(
lxc_check_inherited
(
conf
,
daemonize
,
-
1
))
{
if
(
conf
->
reboot
==
2
)
{
/* initialize handler */
handler
=
lxc_init_handler
(
c
->
name
,
conf
,
c
->
config_path
);
if
(
!
handler
)
goto
out
;
}
if
(
lxc_check_inherited
(
conf
,
daemonize
,
handler
->
conf
->
maincmd_fd
))
{
ERROR
(
"Inherited fds found"
);
ERROR
(
"Inherited fds found"
);
ret
=
1
;
ret
=
1
;
goto
out
;
goto
out
;
}
}
ret
=
lxc_start
(
c
->
name
,
argv
,
conf
,
c
->
config_path
,
daemonize
);
ret
=
lxc_start
(
c
->
name
,
argv
,
handler
,
c
->
config_path
,
daemonize
);
c
->
error_num
=
ret
;
c
->
error_num
=
ret
;
if
(
conf
->
reboot
==
1
)
{
if
(
conf
->
reboot
==
1
)
{
...
@@ -890,12 +908,10 @@ out:
...
@@ -890,12 +908,10 @@ out:
free
(
c
->
pidfile
);
free
(
c
->
pidfile
);
c
->
pidfile
=
NULL
;
c
->
pidfile
=
NULL
;
}
}
free_init_cmd
(
init_cmd
);
free_init_cmd
(
init_cmd
);
if
(
daemonize
)
if
(
daemonize
)
exit
(
ret
==
0
?
true
:
false
);
exit
(
ret
==
0
?
true
:
false
);
else
return
(
ret
==
0
?
true
:
false
);
return
(
ret
==
0
?
true
:
false
);
}
}
...
...
src/lxc/start.c
View file @
a63bb845
...
@@ -382,14 +382,17 @@ out_sigfd:
...
@@ -382,14 +382,17 @@ out_sigfd:
return
-
1
;
return
-
1
;
}
}
struct
lxc_handler
*
lxc_init
(
const
char
*
name
,
struct
lxc_conf
*
conf
,
const
char
*
lxcpath
)
struct
lxc_handler
*
lxc_init_handler
(
const
char
*
name
,
struct
lxc_conf
*
conf
,
const
char
*
lxcpath
)
{
{
int
i
;
int
i
;
struct
lxc_handler
*
handler
;
struct
lxc_handler
*
handler
;
handler
=
malloc
(
sizeof
(
*
handler
));
handler
=
malloc
(
sizeof
(
*
handler
));
if
(
!
handler
)
if
(
!
handler
)
{
ERROR
(
"failed to allocate memory"
);
return
NULL
;
return
NULL
;
}
memset
(
handler
,
0
,
sizeof
(
*
handler
));
memset
(
handler
,
0
,
sizeof
(
*
handler
));
...
@@ -401,16 +404,37 @@ struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char
...
@@ -401,16 +404,37 @@ struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char
for
(
i
=
0
;
i
<
LXC_NS_MAX
;
i
++
)
for
(
i
=
0
;
i
<
LXC_NS_MAX
;
i
++
)
handler
->
nsfd
[
i
]
=
-
1
;
handler
->
nsfd
[
i
]
=
-
1
;
lsm_init
();
handler
->
name
=
strdup
(
name
);
handler
->
name
=
strdup
(
name
);
if
(
!
handler
->
name
)
{
if
(
!
handler
->
name
)
{
ERROR
(
"
Failed to allocate memory.
"
);
ERROR
(
"
failed to allocate memory
"
);
goto
out_free
;
goto
do_partial_cleanup
;
}
}
if
(
lxc_cmd_init
(
name
,
handler
,
lxcpath
))
if
(
lxc_cmd_init
(
name
,
handler
,
lxcpath
))
{
goto
out_free_name
;
ERROR
(
"failed to set up command socket"
);
goto
do_full_cleanup
;
}
TRACE
(
"unix domain socket %d for command server is ready"
,
handler
->
conf
->
maincmd_fd
);
return
handler
;
do_full_cleanup:
free
(
handler
->
name
);
do_partial_cleanup:
free
(
handler
);
return
NULL
;
}
int
lxc_init
(
const
char
*
name
,
struct
lxc_handler
*
handler
)
{
struct
lxc_conf
*
conf
=
handler
->
conf
;
lsm_init
();
TRACE
(
"initialized LSM"
);
if
(
lxc_read_seccomp_config
(
conf
)
!=
0
)
{
if
(
lxc_read_seccomp_config
(
conf
)
!=
0
)
{
ERROR
(
"Failed loading seccomp policy."
);
ERROR
(
"Failed loading seccomp policy."
);
...
@@ -473,7 +497,7 @@ struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char
...
@@ -473,7 +497,7 @@ struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char
}
}
INFO
(
"Container
\"
%s
\"
is initialized."
,
name
);
INFO
(
"Container
\"
%s
\"
is initialized."
,
name
);
return
handler
;
return
0
;
out_restore_sigmask:
out_restore_sigmask:
sigprocmask
(
SIG_SETMASK
,
&
handler
->
oldmask
,
NULL
);
sigprocmask
(
SIG_SETMASK
,
&
handler
->
oldmask
,
NULL
);
...
@@ -484,12 +508,7 @@ out_aborting:
...
@@ -484,12 +508,7 @@ out_aborting:
out_close_maincmd_fd:
out_close_maincmd_fd:
close
(
conf
->
maincmd_fd
);
close
(
conf
->
maincmd_fd
);
conf
->
maincmd_fd
=
-
1
;
conf
->
maincmd_fd
=
-
1
;
out_free_name:
return
-
1
;
free
(
handler
->
name
);
handler
->
name
=
NULL
;
out_free:
free
(
handler
);
return
NULL
;
}
}
void
lxc_fini
(
const
char
*
name
,
struct
lxc_handler
*
handler
)
void
lxc_fini
(
const
char
*
name
,
struct
lxc_handler
*
handler
)
...
@@ -1307,17 +1326,16 @@ out_abort:
...
@@ -1307,17 +1326,16 @@ out_abort:
return
-
1
;
return
-
1
;
}
}
int
__lxc_start
(
const
char
*
name
,
struct
lxc_
conf
*
conf
,
int
__lxc_start
(
const
char
*
name
,
struct
lxc_
handler
*
handler
,
struct
lxc_operations
*
ops
,
void
*
data
,
const
char
*
lxcpath
,
struct
lxc_operations
*
ops
,
void
*
data
,
const
char
*
lxcpath
,
bool
backgrounded
)
bool
backgrounded
)
{
{
struct
lxc_handler
*
handler
;
int
err
=
-
1
;
int
status
;
int
status
;
int
err
=
-
1
;
bool
removed_all_netdevs
=
true
;
bool
removed_all_netdevs
=
true
;
struct
lxc_conf
*
conf
=
handler
->
conf
;
handler
=
lxc_init
(
name
,
conf
,
lxcpath
);
if
(
lxc_init
(
name
,
handler
)
<
0
)
{
if
(
!
handler
)
{
ERROR
(
"Failed to initialize container
\"
%s
\"
."
,
name
);
ERROR
(
"Failed to initialize container
\"
%s
\"
."
,
name
);
return
-
1
;
return
-
1
;
}
}
...
@@ -1464,15 +1482,15 @@ static struct lxc_operations start_ops = {
...
@@ -1464,15 +1482,15 @@ static struct lxc_operations start_ops = {
.
post_start
=
post_start
.
post_start
=
post_start
};
};
int
lxc_start
(
const
char
*
name
,
char
*
const
argv
[],
struct
lxc_
conf
*
conf
,
int
lxc_start
(
const
char
*
name
,
char
*
const
argv
[],
struct
lxc_
handler
*
handler
,
const
char
*
lxcpath
,
bool
backgrounded
)
const
char
*
lxcpath
,
bool
backgrounded
)
{
{
struct
start_args
start_arg
=
{
struct
start_args
start_arg
=
{
.
argv
=
argv
,
.
argv
=
argv
,
};
};
conf
->
need_utmp_watch
=
1
;
handler
->
conf
->
need_utmp_watch
=
1
;
return
__lxc_start
(
name
,
conf
,
&
start_ops
,
&
start_arg
,
lxcpath
,
backgrounded
);
return
__lxc_start
(
name
,
handler
,
&
start_ops
,
&
start_arg
,
lxcpath
,
backgrounded
);
}
}
static
void
lxc_destroy_container_on_signal
(
struct
lxc_handler
*
handler
,
static
void
lxc_destroy_container_on_signal
(
struct
lxc_handler
*
handler
,
...
...
src/lxc/start.h
View file @
a63bb845
...
@@ -27,11 +27,11 @@
...
@@ -27,11 +27,11 @@
#include <sys/param.h>
#include <sys/param.h>
#include <stdbool.h>
#include <stdbool.h>
#include "conf.h"
#include "config.h"
#include "config.h"
#include "state.h"
#include "state.h"
#include "namespace.h"
#include "namespace.h"
struct
lxc_conf
;
struct
lxc_handler
;
struct
lxc_handler
;
...
@@ -66,11 +66,14 @@ struct lxc_handler {
...
@@ -66,11 +66,14 @@ struct lxc_handler {
extern
int
lxc_poll
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
int
lxc_poll
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
int
lxc_set_state
(
const
char
*
name
,
struct
lxc_handler
*
handler
,
lxc_state_t
state
);
extern
int
lxc_set_state
(
const
char
*
name
,
struct
lxc_handler
*
handler
,
lxc_state_t
state
);
extern
void
lxc_abort
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
void
lxc_abort
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
struct
lxc_handler
*
lxc_init
(
const
char
*
name
,
struct
lxc_conf
*
,
const
char
*
);
extern
struct
lxc_handler
*
lxc_init_handler
(
const
char
*
name
,
struct
lxc_conf
*
conf
,
const
char
*
lxcpath
);
extern
int
lxc_init
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
void
lxc_fini
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
void
lxc_fini
(
const
char
*
name
,
struct
lxc_handler
*
handler
);
extern
int
lxc_check_inherited
(
struct
lxc_conf
*
conf
,
bool
closeall
,
int
fd_to_ignore
);
extern
int
lxc_check_inherited
(
struct
lxc_conf
*
conf
,
bool
closeall
,
int
fd_to_ignore
);
int
__lxc_start
(
const
char
*
,
struct
lxc_
conf
*
,
struct
lxc_operations
*
,
int
__lxc_start
(
const
char
*
,
struct
lxc_
handler
*
,
struct
lxc_operations
*
,
void
*
,
const
char
*
,
bool
);
void
*
,
const
char
*
,
bool
);
extern
void
resolve_clone_flags
(
struct
lxc_handler
*
handler
);
extern
void
resolve_clone_flags
(
struct
lxc_handler
*
handler
);
...
...
src/lxc/state.c
View file @
a63bb845
...
@@ -109,24 +109,16 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
...
@@ -109,24 +109,16 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
const
char
*
lxcpath
)
const
char
*
lxcpath
)
{
{
struct
lxc_msg
msg
;
struct
lxc_msg
msg
;
int
state
,
ret
;
int
state
;
int
s
[
MAX_STATE
]
=
{
0
},
fd
;
int
s
[
MAX_STATE
]
=
{
0
},
fd
=
-
1
,
ret
=
-
1
;
if
(
fillwaitedstates
(
states
,
s
))
if
(
fillwaitedstates
(
states
,
s
))
return
-
1
;
return
-
1
;
if
(
lxc_monitord_spawn
(
lxcpath
))
return
-
1
;
fd
=
lxc_monitor_open
(
lxcpath
);
if
(
fd
<
0
)
return
-
1
;
/*
/*
* if container present,
* if container present,
* then check if already in requested state
* then check if already in requested state
*/
*/
ret
=
-
1
;
state
=
lxc_getstate
(
lxcname
,
lxcpath
);
state
=
lxc_getstate
(
lxcname
,
lxcpath
);
if
(
state
<
0
)
{
if
(
state
<
0
)
{
goto
out_close
;
goto
out_close
;
...
@@ -135,6 +127,13 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
...
@@ -135,6 +127,13 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
goto
out_close
;
goto
out_close
;
}
}
if
(
lxc_monitord_spawn
(
lxcpath
))
return
-
1
;
fd
=
lxc_monitor_open
(
lxcpath
);
if
(
fd
<
0
)
return
-
1
;
for
(;;)
{
for
(;;)
{
int64_t
elapsed_time
,
curtime
=
0
;
int64_t
elapsed_time
,
curtime
=
0
;
struct
timespec
tspec
;
struct
timespec
tspec
;
...
@@ -192,6 +191,7 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
...
@@ -192,6 +191,7 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout,
}
}
out_close:
out_close:
if
(
fd
>=
0
)
lxc_monitor_close
(
fd
);
lxc_monitor_close
(
fd
);
return
ret
;
return
ret
;
}
}
src/lxc/tools/lxc_execute.c
View file @
a63bb845
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include <libgen.h>
#include <libgen.h>
#include <string.h>
#include <string.h>
#include <unistd.h>
#include <unistd.h>
#include <lxc/lxccontainer.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/param.h>
...
@@ -40,7 +41,6 @@
...
@@ -40,7 +41,6 @@
#include "config.h"
#include "config.h"
#include "start.h"
#include "start.h"
#include "utils.h"
#include "utils.h"
#include "lxccontainer.h"
lxc_log_define
(
lxc_execute_ui
,
lxc
);
lxc_log_define
(
lxc_execute_ui
,
lxc
);
...
@@ -105,10 +105,10 @@ Options :\n\
...
@@ -105,10 +105,10 @@ Options :\n\
int
main
(
int
argc
,
char
*
argv
[])
int
main
(
int
argc
,
char
*
argv
[])
{
{
char
*
rcfile
;
struct
lxc_container
*
c
;
struct
lxc_conf
*
conf
;
struct
lxc_log
log
;
struct
lxc_log
log
;
int
ret
;
int
ret
;
bool
bret
;
lxc_list_init
(
&
defines
);
lxc_list_init
(
&
defines
);
...
@@ -129,50 +129,38 @@ int main(int argc, char *argv[])
...
@@ -129,50 +129,38 @@ int main(int argc, char *argv[])
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
lxc_log_options_no_override
();
lxc_log_options_no_override
();
/* rcfile is specified in the cli option */
c
=
lxc_container_new
(
my_args
.
name
,
my_args
.
lxcpath
[
0
]);
if
(
my_args
.
rcfile
)
if
(
!
c
)
{
rcfile
=
(
char
*
)
my_args
.
rcfile
;
ERROR
(
"Failed to create lxc_container"
);
else
{
int
rc
;
rc
=
asprintf
(
&
rcfile
,
"%s/%s/config"
,
my_args
.
lxcpath
[
0
],
my_args
.
name
);
if
(
rc
==
-
1
)
{
SYSERROR
(
"failed to allocate memory"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
/* container configuration does not exist */
if
(
my_args
.
rcfile
)
{
if
(
access
(
rcfile
,
F_OK
))
{
c
->
clear_config
(
c
);
free
(
rcfile
);
if
(
!
c
->
load_config
(
c
,
my_args
.
rcfile
))
{
rcfile
=
NULL
;
ERROR
(
"Failed to load rcfile"
);
}
lxc_container_put
(
c
);
}
conf
=
lxc_conf_init
();
if
(
!
conf
)
{
ERROR
(
"failed to initialize configuration"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
c
->
configfile
=
strdup
(
my_args
.
rcfile
);
if
(
rcfile
&&
lxc_config_read
(
rcfile
,
conf
,
NULL
))
{
if
(
!
c
->
configfile
)
{
ERROR
(
"failed to read configuration file"
);
ERROR
(
"Out of memory setting new config filename"
);
lxc_container_put
(
c
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
}
if
(
lxc_config_define_load
(
&
defines
,
conf
))
exit
(
EXIT_FAILURE
);
if
(
my_args
.
uid
)
if
(
my_args
.
uid
)
conf
->
init_uid
=
my_args
.
uid
;
c
->
lxc_c
onf
->
init_uid
=
my_args
.
uid
;
if
(
my_args
.
gid
)
if
(
my_args
.
gid
)
conf
->
init_gid
=
my_args
.
gid
;
c
->
lxc_conf
->
init_gid
=
my_args
.
gid
;
ret
=
lxc_execute
(
my_args
.
name
,
my_args
.
argv
,
my_args
.
quiet
,
conf
,
my_args
.
lxcpath
[
0
],
false
);
lxc_conf_free
(
conf
);
if
(
ret
<
0
)
c
->
daemonize
=
false
;
bret
=
c
->
start
(
c
,
1
,
my_args
.
argv
);
ret
=
c
->
error_num
;
lxc_container_put
(
c
);
if
(
!
bret
)
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
exit
(
ret
);
exit
(
ret
);
}
}
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