2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-31 22:35:33 +00:00

files: Add pb_ helpers

To not spread opencoded copying of PB entries and image structures
we add a few pb_ helpers to be used until PB code completely merged.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Cyrill Gorcunov
2012-07-17 07:24:51 +04:00
committed by Pavel Emelyanov
parent 98acfbec28
commit 7c44757683
2 changed files with 72 additions and 0 deletions

67
files.c
View File

@@ -101,6 +101,7 @@ void show_saved_files(void)
}
}
/* FIXME Drop it after PB merged */
int restore_fown(int fd, fown_t *fown)
{
struct f_owner_ex owner;
@@ -145,6 +146,51 @@ int restore_fown(int fd, fown_t *fown)
return 0;
}
int pb_restore_fown(int fd, FownEntry *fown)
{
struct f_owner_ex owner;
uid_t uids[3];
pid_t pid = getpid();
if (fown->signum) {
if (fcntl(fd, F_SETSIG, fown->signum)) {
pr_perror("%d: Can't set signal", pid);
return -1;
}
}
/* May be untouched */
if (!fown->pid)
return 0;
if (getresuid(&uids[0], &uids[1], &uids[2])) {
pr_perror("%d: Can't get current UIDs", pid);
return -1;
}
if (setresuid(fown->uid, fown->euid, uids[2])) {
pr_perror("%d: Can't set UIDs", pid);
return -1;
}
owner.type = fown->pid_type;
owner.pid = fown->pid;
if (fcntl(fd, F_SETOWN_EX, &owner)) {
pr_perror("%d: Can't setup %d file owner pid",
pid, fd);
return -1;
}
if (setresuid(uids[0], uids[1], uids[2])) {
pr_perror("%d: Can't revert UIDs back", pid);
return -1;
}
return 0;
}
/* FIXME Drop it after PB merged */
int rst_file_params(int fd, fown_t *fown, int flags)
{
if (set_fd_flags(fd, flags) < 0)
@@ -154,6 +200,27 @@ int rst_file_params(int fd, fown_t *fown, int flags)
return 0;
}
/* FIXME Drop once PB merged */
void pb_prep_fown(FownEntry *dst, const fown_t *src)
{
fown_entry__init(dst);
dst->uid = src->uid;
dst->euid = src->euid;
dst->signum = src->signum;
dst->pid_type = src->pid_type;
dst->pid = src->pid;
}
int pb_rst_file_params(int fd, FownEntry *fown, int flags)
{
if (set_fd_flags(fd, flags) < 0)
return -1;
if (pb_restore_fown(fd, fown) < 0)
return -1;
return 0;
}
static int collect_fd(int pid, FdinfoEntry *e, struct rst_info *rst_info)
{
struct fdinfo_list_entry *l, *le = &fdinfo_list[nr_fdinfo_list];

View File

@@ -8,6 +8,7 @@
#include "image.h"
#include "../protobuf/fdinfo.pb-c.h"
#include "../protobuf/fown.pb-c.h"
struct pstree_item;
struct file_desc;
@@ -75,6 +76,10 @@ extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int transport)
extern int restore_fown(int fd, fown_t *fown);
extern int rst_file_params(int fd, fown_t *fown, int flags);
extern int pb_restore_fown(int fd, FownEntry *fown);
extern int pb_rst_file_params(int fd, FownEntry *fown, int flags);
extern void pb_prep_fown(FownEntry *dst, const fown_t *src);
extern void show_saved_files(void);
extern int prepare_fds(struct pstree_item *me);