From 172980bdb7ec1bad4ae0b59f971ee30e120f1dc9 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 30 Jan 2018 01:19:17 +0100 Subject: [PATCH] Add support for device nodes --- src/copy.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/copy.c b/src/copy.c index 5016b02..2af4f00 100644 --- a/src/copy.c +++ b/src/copy.c @@ -340,6 +340,8 @@ static gboolean _copy_idle_first(gpointer data) static int _single_dir(Copy * copy, char const * src, char const * dst, mode_t mode); static int _single_fifo(Copy * copy, char const * dst, mode_t mode); +static int _single_nod(Copy * copy, char const * src, char const * dst, + mode_t mode, dev_t rdev); static int _single_symlink(Copy * copy, char const * src, char const * dst); static int _single_regular(Copy * copy, char const * src, char const * dst, mode_t mode); @@ -392,6 +394,8 @@ static int _copy_single(Copy * copy, char const * src, char const * dst) ret = _single_dir(copy, src, dst, st.st_mode & 0777); else if(S_ISFIFO(st.st_mode)) ret = _single_fifo(copy, dst, st.st_mode & 0666); + else if(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) + ret = _single_nod(copy, src, dst, st.st_mode, st.st_rdev); else if(S_ISLNK(st.st_mode)) ret = _single_symlink(copy, src, dst); else @@ -479,6 +483,16 @@ static int _single_fifo(Copy * copy, char const * dst, mode_t mode) return 0; } +static int _single_nod(Copy * copy, char const * src, char const * dst, + mode_t mode, dev_t rdev) +{ + if(mknod(dst, mode, rdev) != 0) + return _copy_error(copy, dst, 1); + if(unlink(src) != 0) + _copy_error(copy, src, 0); + return 0; +} + static int _single_symlink(Copy * copy, char const * src, char const * dst) { char buf[PATH_MAX];