140
int checked_mount(const char *source, const char *target,
141
const char *filesystemtype, unsigned long mountflags,
144
int result = mount(source, target, filesystemtype, mountflags, data);
147
syslog(LOG_ERR, "could not mount %s on %s\n", source, target);
148
perror("could not mount");
156
140
/* Find the path of the user components of a jail, given a mountpoint. */
157
char *jail_src(const char *jail_src_base, const char *jail_base,
158
const char *jailpath)
141
char *jail_src(const char* jailpath)
164
147
srclen = strlen(jail_src_base);
165
148
dstlen = strlen(jail_base);
167
150
src = die_if_null(malloc(strlen(jailpath) + (srclen - dstlen) + 1));
168
151
strcpy(src, jail_src_base);
169
152
strcat(src, jailpath+dstlen);
174
157
/* Check for the validity of a jail in the given path, mounting it if it looks
176
159
* TODO: Updating /etc/mtab would be nice. */
177
void mount_if_needed(const char *jail_src_base, const char *jail_base,
178
const char *jail_system, const char *jailpath)
160
void mount_if_needed(const char* jailpath)
185
166
/* Check if there is something useful in the jail. If not, it's probably
186
167
* not mounted. */
201
182
syslog(LOG_NOTICE, "created mountpoint %s\n", jailpath);
204
jailsrc = jail_src(jail_src_base, jail_base, jailpath);
205
checked_mount(jail_system, jailpath, NULL, MS_BIND | MS_RDONLY, NULL);
207
source_bits = die_if_null(malloc(strlen(jailsrc) + 5 + 1));
208
target_bits = die_if_null(malloc(strlen(jailpath) + 5 + 1));
209
sprintf(source_bits, "%s/home", jailsrc);
210
sprintf(target_bits, "%s/home", jailpath);
212
checked_mount(source_bits, target_bits, NULL, MS_BIND, NULL);
214
sprintf(source_bits, "%s/tmp", jailsrc);
215
sprintf(target_bits, "%s/tmp", jailpath);
217
checked_mount(source_bits, target_bits, NULL, MS_BIND, NULL);
185
jailsrc = jail_src(jailpath);
186
mountdata = die_if_null(malloc(3 + strlen(jailsrc) + 4 + strlen(jail_system) + 3 + 1));
187
sprintf(mountdata, "br:%s=rw:%s=ro", jailsrc, jail_system);
188
if (mount("none", jailpath, "aufs", 0, mountdata))
190
syslog(LOG_ERR, "could not mount %s\n", jailpath);
191
perror("could not mount");
219
195
syslog(LOG_INFO, "mounted %s\n", jailpath);
290
262
uid = atoi(argv[arg_num++]);
291
jail_base = argv[arg_num++];
292
jail_src_base = argv[arg_num++];
293
jail_system = argv[arg_num++];
294
263
jailpath = argv[arg_num++];
295
264
work_dir = argv[arg_num++];
296
265
prog = argv[arg_num];
320
289
openlog("trampoline", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
322
291
#ifdef IVLE_AUFS_JAILS
323
mount_if_needed(jail_src_base, jail_base, jail_system, canonical_jailpath);
292
mount_if_needed(canonical_jailpath);
324
293
#endif /* IVLE_AUFS_JAILS */
326
295
/* chroot into the jail.