~ubuntu-branches/ubuntu/quantal/lxc/quantal-201205292108

« back to all changes in this revision

Viewing changes to src/lxc/lxc_restart.c

  • Committer: Bazaar Package Importer
  • Author(s): Guido Trotter
  • Date: 2010-06-28 10:15:48 UTC
  • mto: (1.1.4 upstream) (3.1.5 sid)
  • mto: This revision was merged to the branch mainline in revision 7.
  • Revision ID: james.westby@ubuntu.com-20100628101548-vexhggdo6x9cpwtk
ImportĀ upstreamĀ versionĀ 0.7.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <unistd.h>
28
28
#include <errno.h>
29
29
#include <sys/types.h>
 
30
#include <fcntl.h>
30
31
 
31
32
#include "log.h"
32
33
#include "lxc.h"
41
42
 
42
43
static int my_checker(const struct lxc_arguments* args)
43
44
{
44
 
        if (!args->statefile) {
 
45
        if ((!args->statefile) && (args->statefd == -1)) {
45
46
                lxc_error(args, "no statefile specified");
46
47
                return -1;
47
48
        }
48
49
 
 
50
        if ((args->statefile) && (args->statefd != -1)) {
 
51
                lxc_error(args, "--statefile AND --statefd abnormally set");
 
52
                return -1;
 
53
        }
 
54
 
49
55
        return 0;
50
56
}
51
57
 
52
58
static int my_parser(struct lxc_arguments* args, int c, char* arg)
53
59
{
54
60
        switch (c) {
55
 
        case 'd': args->statefile = arg; break;
 
61
        case 'S': args->statefile = arg; break;
56
62
        case 'f': args->rcfile = arg; break;
57
63
        case 'p': args->flags = LXC_FLAG_PAUSE; break;
58
64
        case 's': return lxc_config_define_add(&defines, arg);
 
65
        case 'd': {
 
66
                        int fd;
 
67
                        fd = lxc_arguments_str_to_int(args, arg);
 
68
                        if (fd < 0)
 
69
                                return -1;
 
70
 
 
71
                        args->statefd = fd;
 
72
                        break;
 
73
                }
59
74
        }
60
75
 
61
76
        return 0;
62
77
}
63
78
 
64
79
static const struct option my_longopts[] = {
65
 
        {"directory", required_argument, 0, 'd'},
 
80
        {"statefile", required_argument, 0, 'S'},
 
81
        {"statefd", required_argument, 0, 'd'},
66
82
        {"rcfile", required_argument, 0, 'f'},
67
83
        {"pause", no_argument, 0, 'p'},
68
84
        {"define", required_argument, 0, 's'},
72
88
static struct lxc_arguments my_args = {
73
89
        .progname = "lxc-restart",
74
90
        .help     = "\
75
 
--name=NAME --directory STATEFILE\n\
 
91
--name=NAME --statefile FILE\n\
76
92
\n\
77
 
lxc-restart restarts from STATEFILE the NAME container\n\
 
93
lxc-restart restarts from FILE the NAME container\n\
78
94
\n\
79
95
Options :\n\
80
96
  -n, --name=NAME      NAME for name of the container\n\
81
 
  -p, --pause          do not release the container after the restart\n\
82
 
  -d, --directory=STATEFILE for name of statefile\n\
 
97
  -p, --pause          do not unfreeze the container after the restart\n\
 
98
  -S, --statefile=FILE read the container state from this file, or\n\
 
99
  -d, --statefd=FD read the container state from this file descriptor\n\
83
100
  -f, --rcfile=FILE Load configuration file FILE\n\
84
101
  -s, --define KEY=VAL Assign VAL to configuration variable KEY\n",
85
102
        .options  = my_longopts,
86
103
        .parser   = my_parser,
87
104
        .checker  = my_checker,
 
105
 
 
106
        .statefd  = -1,
88
107
};
89
108
 
90
109
int main(int argc, char *argv[])
91
110
{
 
111
        int sfd = -1;
 
112
        int ret;
92
113
        char *rcfile = NULL;
93
114
        struct lxc_conf *conf;
94
115
 
105
126
        if (my_args.rcfile)
106
127
                rcfile = (char *)my_args.rcfile;
107
128
        else {
108
 
                if (!asprintf(&rcfile, LXCPATH "/%s/config", my_args.name)) {
 
129
                int rc;
 
130
 
 
131
                rc = asprintf(&rcfile, LXCPATH "/%s/config", my_args.name);
 
132
                if (rc == -1) {
109
133
                        SYSERROR("failed to allocate memory");
110
134
                        return -1;
111
135
                }
131
155
        if (lxc_config_define_load(&defines, conf))
132
156
                return -1;
133
157
 
134
 
        return lxc_restart(my_args.name, my_args.statefile, conf,
135
 
                           my_args.flags);
 
158
        if (my_args.statefd != -1)
 
159
                sfd = my_args.statefd;
 
160
 
 
161
#define OPEN_READ_MODE O_RDONLY | O_CLOEXEC | O_LARGEFILE
 
162
        if (my_args.statefile) {
 
163
                sfd = open(my_args.statefile, OPEN_READ_MODE, 0);
 
164
                if (sfd < 0) {
 
165
                        ERROR("'%s' open failure : %m", my_args.statefile);
 
166
                        return sfd;
 
167
                }
 
168
        }
 
169
 
 
170
        ret = lxc_restart(my_args.name, sfd, conf, my_args.flags);
 
171
 
 
172
        if (my_args.statefile)
 
173
                close(sfd);
 
174
        return ret;
136
175
}