This was made necessary by changes to the overlay driver.
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Adrian Reber <areber@redhat.com>
* root is privileged with respect to hostuid/hostgid X, allowing
* him to do the chown.
*/
-int chown_mapped_root(char *path, struct lxc_conf *conf)
+int chown_mapped_root(const char *path, struct lxc_conf *conf)
{
uid_t rootuid, rootgid;
unsigned long val;
struct stat sb;
char map1[100], map2[100], map3[100], map4[100], map5[100];
char ugid[100];
- char *args1[] = {"lxc-usernsexec",
+ const char *args1[] = {"lxc-usernsexec",
"-m", map1,
"-m", map2,
"-m", map3,
"-m", map5,
"--", "chown", ugid, path,
NULL};
- char *args2[] = {"lxc-usernsexec",
+ const char *args2[] = {"lxc-usernsexec",
"-m", map1,
"-m", map2,
"-m", map3,
extern int find_unmapped_nsid(struct lxc_conf *conf, enum idtype idtype);
extern int mapped_hostid(unsigned id, struct lxc_conf *conf,
enum idtype idtype);
-extern int chown_mapped_root(char *path, struct lxc_conf *conf);
+extern int chown_mapped_root(const char *path, struct lxc_conf *conf);
extern int lxc_ttys_shift_ids(struct lxc_conf *c);
extern int userns_exec_1(struct lxc_conf *conf, int (*fn)(void *), void *data,
const char *fn_name);
}
}
} else { /* TODO come up with a better way here! */
- char *src;
+ const char *src;
free(bdev->dest);
src = lxc_storage_get_path(bdev->src, bdev->type);
bdev->dest = strdup(src);
int btrfs_mount(struct lxc_storage *bdev)
{
unsigned long mntflags;
- char *mntdata, *src;
+ char *mntdata;
+ const char *src;
int ret;
if (strcmp(bdev->type, "btrfs"))
int btrfs_snapshot_wrapper(void *data)
{
- char *src;
+ const char *src;
struct rsync_data_char *arg = data;
if (setgid(0) < 0) {
const char *oldpath, const char *lxcpath, int snap,
uint64_t newsize, struct lxc_conf *conf)
{
- char *src;
+ const char *src;
if (!orig->dest || !orig->src)
return -1;
int btrfs_destroy(struct lxc_storage *orig)
{
- char *src;
+ const char *src;
src = lxc_storage_get_path(orig->src, "btrfs");
const char *lxcpath, int snap, uint64_t newsize,
struct lxc_conf *conf)
{
- char *src_no_prefix;
+ const char *src_no_prefix;
int ret;
size_t len;
int dir_destroy(struct lxc_storage *orig)
{
int ret;
- char *src;
+ const char *src;
src = lxc_storage_get_path(orig->src, orig->src);
{
int ret;
unsigned long mflags, mntflags;
- char *src, *mntdata;
+ char *mntdata;
+ const char *src;
if (strcmp(bdev->type, "dir"))
return -22;
{
int ret, loopfd;
char loname[MAXPATHLEN];
- char *src;
+ const char *src;
if (strcmp(bdev->type, "loop"))
return -22;
int lvm_mount(struct lxc_storage *bdev)
{
- char *src;
+ const char *src;
if (strcmp(bdev->type, "lvm"))
return -22;
static int lvm_snapshot(struct lxc_storage *orig, const char *path, uint64_t size)
{
int ret;
- char *origsrc, *pathdup, *lv;
+ char *lv, *pathdup;
char sz[24];
char fstype[100];
char cmd_output[MAXPATHLEN];
char repairchar;
+ const char *origsrc;
struct lvcreate_args cmd_args = {0};
ret = snprintf(sz, 24, "%" PRIu64 "b", size);
(const char *[]){"lvm:", "dev", vg, cname, NULL},
false);
} else {
- char *dup, *slider, *src;
+ const char *src;
+ char *dup, *slider;
src = lxc_storage_get_path(orig->src, orig->type);
bool lvm_create_clone(struct lxc_conf *conf, struct lxc_storage *orig,
struct lxc_storage *new, uint64_t newsize)
{
- char *src;
- const char *thinpool;
int ret;
+ const char *src;
+ const char *thinpool;
struct rsync_data data;
- char *cmd_args[2];
+ const char *cmd_args[2];
char cmd_output[MAXPATHLEN] = {0};
char fstype[100] = "ext4";
uint64_t size = newsize;
struct lxc_storage *new, uint64_t newsize)
{
int ret;
- char *newsrc;
+ const char *newsrc;
uint64_t size = newsize;
if (is_blktype(orig)) {
int nbd_mount(struct lxc_storage *bdev)
{
int ret = -1, partition;
- char *src;
+ const char *src;
char path[50];
if (strcmp(bdev->type, "nbd"))
int snap, uint64_t newsize, struct lxc_conf *conf)
{
int ret;
- char *src;
+ const char *src;
if (!snap) {
ERROR("The overlay storage driver can only be used for "
return ret;
}
-char *ovl_get_lower(const char *rootfs_path)
+const char *ovl_get_lower(const char *rootfs_path)
{
- char *s1;
+ const char *s1 = rootfs_path;
- s1 = strstr(rootfs_path, ":/");
- if (!s1)
- return NULL;
- s1++;
+ if (strncmp(rootfs_path, "overlay:", 8) == 0)
+ s1 += 8;
+ else if (strncmp(rootfs_path, "overlayfs:", 10) == 0)
+ s1 += 10;
s1 = strstr(s1, ":/");
if (!s1)
if (!s1)
return NULL;
- s2 = strstr(s1, ":/");
- if (s2) {
- s2 = s2 + 1;
- if ((s3 = strstr(s2, ":/")))
- *s3 = '\0';
- rootfsdir = strdup(s2);
- if (!rootfsdir) {
- free(s1);
- return NULL;
- }
+ s2 = s1;
+ if (strncmp(rootfs_path, "overlay:", 8) == 0)
+ s2 += 8;
+ else if (strncmp(rootfs_path, "overlayfs:", 10) == 0)
+ s2 += 10;
+
+ s3 = strstr(s2, ":/");
+ if (s3)
+ *s3 = '\0';
+
+ rootfsdir = strdup(s2);
+ if (!rootfsdir) {
+ free(s1);
+ return NULL;
}
if (!rootfsdir)
/* To be called from functions in lxccontainer.c: Get lower directory for
* overlay rootfs.
*/
-extern char *ovl_get_lower(const char *rootfs_path);
+extern const char *ovl_get_lower(const char *rootfs_path);
/* Get rootfs path for overlay backed containers. Allocated memory must be freed
* by caller.
int rbd_destroy(struct lxc_storage *orig)
{
int ret;
- char *src;
+ const char *src;
char *rbdfullname;
char cmd_output[MAXPATHLEN];
struct rbd_args args = {0};
int rbd_mount(struct lxc_storage *bdev)
{
- char *src;
+ const char *src;
if (strcmp(bdev->type, "rbd"))
return -22;
int lxc_rsync(struct rsync_data *data)
{
int ret;
- char *dest, *src;
+ const char *dest, *src;
struct lxc_storage *orig = data->orig, *new = data->new;
ret = unshare(CLONE_NEWNS);
uint64_t newsize, bool *needs_rdep)
{
int ret;
- char *src_no_prefix;
+ const char *src_no_prefix;
struct lxc_storage *new, *orig;
bool snap = (flags & LXC_CLONE_SNAPSHOT);
bool maybe_snap = (flags & LXC_CLONE_MAYBE_SNAPSHOT);
return false;
}
-char *lxc_storage_get_path(char *src, const char *prefix)
+const char *lxc_storage_get_path(char *src, const char *prefix)
{
size_t prefix_len;
extern void storage_put(struct lxc_storage *bdev);
extern bool storage_destroy(struct lxc_conf *conf);
extern bool rootfs_is_blockdev(struct lxc_conf *conf);
-extern char *lxc_storage_get_path(char *src, const char *prefix);
+extern const char *lxc_storage_get_path(char *src, const char *prefix);
#endif /* #define __LXC_STORAGE_H */
int blk_getsize(struct lxc_storage *bdev, uint64_t *size)
{
int fd, ret;
- char *src;
+ const char *src;
src = lxc_storage_get_path(bdev->src, bdev->type);
fd = open(src, O_RDONLY);
*/
int detect_fs(struct lxc_storage *bdev, char *type, int len)
{
- int p[2], ret;
+ int ret;
+ int p[2];
size_t linelen;
pid_t pid;
FILE *f;
- char *sp1, *sp2, *sp3, *srcdev, *line = NULL;
+ char *sp1, *sp2, *sp3;
+ const char *l, *srcdev;
+ char devpath[MAXPATHLEN];
+ char *line = NULL;
if (!bdev || !bdev->src || !bdev->dest)
return -1;
exit(1);
}
- /* if symlink, get the real dev name */
- char devpath[MAXPATHLEN];
- char *l = linkderef(srcdev, devpath);
+ l = linkderef(srcdev, devpath);
if (!l)
exit(1);
f = fopen("/proc/self/mounts", "r");
return 1;
}
-char *linkderef(char *path, char *dest)
+const char *linkderef(const char *path, char *dest)
{
struct stat sbuf;
ssize_t ret;
extern int mount_unknown_fs(const char *rootfs, const char *target,
const char *options);
extern int find_fstype_cb(char *buffer, void *data);
-extern char *linkderef(char *path, char *dest);
+extern const char *linkderef(const char *path, char *dest);
extern bool unpriv_snap_allowed(struct lxc_storage *b, const char *t, bool snap,
bool maybesnap);
extern bool is_valid_storage_type(const char *type);
{
int ret;
size_t oldlen, newlen, totallen;
- char *mntdata, *src, *tmp;
+ char *mntdata, *tmp;
+ const char *src;
unsigned long mntflags;
char cmd_output[MAXPATHLEN] = {0};
char cmd_output[MAXPATHLEN], option[MAXPATHLEN];
struct rsync_data data = {0, 0};
struct zfs_args cmd_args = {0};
- char *argv[] = {"zfs", /* 0 */
- "create", /* 1 */
- "-o", "", /* 2, 3 */
- "-o", "canmount=noauto", /* 4, 5 */
- "-p", /* 6 */
- "", /* 7 */
- NULL};
+ const char *argv[] = {"zfs", /* 0 */
+ "create", /* 1 */
+ "-o", "", /* 2, 3 */
+ "-o", "canmount=noauto", /* 4, 5 */
+ "-p", /* 6 */
+ "", /* 7 */
+ NULL};
/* mountpoint */
ret = snprintf(option, MAXPATHLEN, "mountpoint=%s", new->dest);
{
int ret;
size_t snapshot_len, len;
- char *orig_src, *tmp, *snap_name, *snapshot;
+ char *tmp, *snap_name, *snapshot;
+ const char *orig_src;
struct zfs_args cmd_args = {0};
char cmd_output[MAXPATHLEN] = {0}, option[MAXPATHLEN];
const char *lxcpath, int snap, uint64_t newsize,
struct lxc_conf *conf)
{
- char *dataset, *orig_src, *tmp;
int ret;
+ char *dataset, *tmp;
+ const char *orig_src;
size_t dataset_len, len;
char cmd_output[MAXPATHLEN] = {0};
int zfs_destroy(struct lxc_storage *orig)
{
int ret;
- char *dataset, *src, *tmp;
+ char *dataset, *tmp;
+ const char *src;
bool found;
char *parent_snapshot = NULL;
struct zfs_args cmd_args = {0};
size_t len;
struct zfs_args cmd_args = {0};
char cmd_output[MAXPATHLEN], option[MAXPATHLEN];
- char *argv[] = {"zfs", /* 0 */
- "create", /* 1 */
- "-o", "", /* 2, 3 */
- "-o", "canmount=noauto", /* 4, 5 */
- "-p", /* 6 */
- "", /* 7 */
- NULL};
+ const char *argv[] = {"zfs", /* 0 */
+ "create", /* 1 */
+ "-o", "", /* 2, 3 */
+ "-o", "canmount=noauto", /* 4, 5 */
+ "-p", /* 6 */
+ "", /* 7 */
+ NULL};
if (!specs || !specs->zfs.zfsroot)
zfsroot = lxc_global_config_value("lxc.bdev.zfs.root");
*/
extern bool btrfs_try_remove_subvol(const char *path);
-static int _recursive_rmdir(char *dirname, dev_t pdev,
+static int _recursive_rmdir(const char *dirname, dev_t pdev,
const char *exclude, int level, bool onedev)
{
struct dirent *direntp;
}
/* returns 0 on success, -1 if there were any failures */
-extern int lxc_rmdir_onedev(char *path, const char *exclude)
+extern int lxc_rmdir_onedev(const char *path, const char *exclude)
{
struct stat mystat;
bool onedev = true;
- if (is_native_overlayfs(path)) {
+ if (is_native_overlayfs(path))
onedev = false;
- }
if (lstat(path, &mystat) < 0) {
if (errno == ENOENT)
return 0;
+
ERROR("Failed to stat %s", path);
return -1;
}
#define LXC_IDMAPLEN 4096
/* returns 1 on success, 0 if there were any failures */
-extern int lxc_rmdir_onedev(char *path, const char *exclude);
+extern int lxc_rmdir_onedev(const char *path, const char *exclude);
extern int get_u16(unsigned short *val, const char *arg, int base);
extern int mkdir_p(const char *dir, mode_t mode);
extern char *get_rundir(void);