~ubuntu-branches/ubuntu/quantal/lxc/quantal-201208301614

« back to all changes in this revision

Viewing changes to src/lxc/cgroup.c

  • Committer: Bazaar Package Importer
  • Author(s): Guido Trotter, Stéphane Graber, Guido Trotter
  • Date: 2010-01-10 10:40:21 UTC
  • mfrom: (1.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20100110104021-25cm8w09ccmw5w2z
[ Stéphane Graber ]
* Upgrade standards-version to 3.8.3
* Drop the copy of etc/* from rules as "etc" is no longer in the tarball

[ Guido Trotter ]
* New Upstream Version
* Update libcap2-dev dependency to libcap-dev
* Install upstream-built man pages via debian/lxc.manpages
* Drop unneeded docbook-utils build dependency

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include <net/if.h>
38
38
 
39
39
#include "error.h"
 
40
#include "config.h"
40
41
 
41
 
#include <lxc/lxc.h>
42
42
#include <lxc/log.h>
 
43
#include <lxc/cgroup.h>
 
44
#include <lxc/start.h>
43
45
 
44
46
lxc_log_define(lxc_cgroup, lxc);
45
47
 
46
48
#define MTAB "/etc/mtab"
47
49
 
 
50
static char nsgroup_path[MAXPATHLEN];
 
51
 
48
52
static int get_cgroup_mount(const char *mtab, char *mnt)
49
53
{
50
54
        struct mntent *mntent;
81
85
        return err;
82
86
}
83
87
 
84
 
int lxc_rename_nsgroup(const char *name, pid_t pid)
 
88
int lxc_rename_nsgroup(const char *name, struct lxc_handler *handler)
85
89
{
86
90
        char oldname[MAXPATHLEN];
87
 
        char newname[MAXPATHLEN];
 
91
        char *newname = handler->nsgroup;
88
92
        char cgroup[MAXPATHLEN];
89
93
        int ret;
90
94
 
93
97
                return -1;
94
98
        }
95
99
 
96
 
        snprintf(oldname, MAXPATHLEN, "%s/%d", cgroup, pid);
 
100
        snprintf(oldname, MAXPATHLEN, "%s/%d", cgroup, handler->pid);
97
101
        snprintf(newname, MAXPATHLEN, "%s/%s", cgroup, name);
98
102
 
99
103
        /* there is a previous cgroup, assume it is empty, otherwise
113
117
        else
114
118
                DEBUG("'%s' renamed to '%s'", oldname, newname);
115
119
 
 
120
 
116
121
        return ret;
117
122
}
118
123
 
119
 
int lxc_link_nsgroup(const char *name)
 
124
int lxc_unlink_nsgroup(const char *name)
120
125
{
121
 
        char lxc[MAXPATHLEN];
122
126
        char nsgroup[MAXPATHLEN];
123
127
        char cgroup[MAXPATHLEN];
124
128
        int ret;
128
132
                return -1;
129
133
        }
130
134
 
131
 
        snprintf(lxc, MAXPATHLEN, LXCPATH "/%s/nsgroup", name);
132
135
        snprintf(nsgroup, MAXPATHLEN, "%s/%s", cgroup, name);
133
 
 
134
 
        unlink(lxc);
135
 
        ret = symlink(nsgroup, lxc);
 
136
        ret = rmdir(nsgroup);
136
137
        if (ret)
137
 
                SYSERROR("failed to create symlink %s->%s", nsgroup, lxc);
 
138
                SYSERROR("failed to remove cgroup '%s'", nsgroup);
138
139
        else
139
 
                DEBUG("'%s' linked to '%s'", nsgroup, lxc);
 
140
                DEBUG("'%s' unlinked", nsgroup);
140
141
 
141
142
        return ret;
142
143
}
143
144
 
144
 
int lxc_unlink_nsgroup(const char *name)
 
145
int lxc_cgroup_path_get(char **path, const char *name)
145
146
{
146
 
        char nsgroup[MAXPATHLEN];
147
 
        char path[MAXPATHLEN];
148
 
        ssize_t len;
149
 
 
150
 
        snprintf(nsgroup, MAXPATHLEN, LXCPATH "/%s/nsgroup", name);
151
 
        
152
 
        len = readlink(nsgroup, path, MAXPATHLEN-1);
153
 
        if (len >  0) {
154
 
                path[len] = '\0';
155
 
                rmdir(path);
 
147
        char cgroup[MAXPATHLEN];
 
148
 
 
149
        *path = &nsgroup_path[0];
 
150
 
 
151
        /*
 
152
         * report nsgroup_path string if already set
 
153
         */
 
154
        if (**path != 0)
 
155
                return 0;
 
156
 
 
157
        if (get_cgroup_mount(MTAB, cgroup)) {
 
158
                ERROR("cgroup is not mounted");
 
159
                return -1;
156
160
        }
157
161
 
158
 
        DEBUG("unlinking '%s'", nsgroup);
159
 
 
160
 
        return unlink(nsgroup);
 
162
        snprintf(nsgroup_path, MAXPATHLEN, "%s/%s", cgroup, name);
 
163
        return 0;
161
164
}
162
165
 
163
166
int lxc_cgroup_set(const char *name, const char *subsystem, const char *value)
164
167
{
165
168
        int fd, ret = -1;
 
169
        char *nsgroup;
166
170
        char path[MAXPATHLEN];
167
171
 
168
 
        snprintf(path, MAXPATHLEN, LXCPATH "/%s/nsgroup/%s", name, subsystem);
 
172
        ret = lxc_cgroup_path_get(&nsgroup, name);
 
173
        if (ret)
 
174
                return -1;
 
175
 
 
176
        snprintf(path, MAXPATHLEN, "%s/%s", nsgroup, subsystem);
169
177
 
170
178
        fd = open(path, O_WRONLY);
171
179
        if (fd < 0) {
188
196
                   char *value, size_t len)
189
197
{
190
198
        int fd, ret = -1;
 
199
        char *nsgroup;
191
200
        char path[MAXPATHLEN];
192
201
 
193
 
        snprintf(path, MAXPATHLEN, LXCPATH "/%s/nsgroup/%s", name, subsystem);
 
202
        ret = lxc_cgroup_path_get(&nsgroup, name);
 
203
        if (ret)
 
204
                return -1;
 
205
 
 
206
        snprintf(path, MAXPATHLEN, "%s/%s", nsgroup, subsystem);
194
207
 
195
208
        fd = open(path, O_RDONLY);
196
209
        if (fd < 0) {
198
211
                return -1;
199
212
        }
200
213
 
201
 
        if (read(fd, value, len) < 0) {
 
214
        ret = read(fd, value, len);
 
215
        if (ret < 0)
202
216
                ERROR("read %s : %s", path, strerror(errno));
203
 
                goto out;
204
 
        }
205
 
        
206
 
        ret = 0;
207
 
out:
 
217
 
208
218
        close(fd);
209
219
        return ret;
210
220
}