diff options
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | daemon/Makefile.am | 2 | ||||
-rw-r--r-- | daemon/mknod.c | 69 | ||||
-rw-r--r-- | daemon/umask.c | 46 | ||||
-rwxr-xr-x | src/generator.ml | 70 |
5 files changed, 187 insertions, 2 deletions
@@ -121,10 +121,8 @@ Extra commands / functionality: grep (do it locally using pipe?) dd (?) ln / ln -s - mknod readlink utime / utimes / futimes / futimens / l.. - mkfifo more mk*temp calls readdir / readdir-and-stat some sort of alloc/fallocate/posix_fallocate call to create empty space diff --git a/daemon/Makefile.am b/daemon/Makefile.am index d69f8999..8884c6b2 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -46,6 +46,7 @@ guestfsd_SOURCES = \ initrd.c \ ls.c \ lvm.c \ + mknod.c \ mount.c \ ntfs.c \ pingdaemon.c \ @@ -59,6 +60,7 @@ guestfsd_SOURCES = \ swap.c \ sync.c \ tar.c \ + umask.c \ upload.c \ wc.c \ zero.c \ diff --git a/daemon/mknod.c b/daemon/mknod.c new file mode 100644 index 00000000..5af791fc --- /dev/null +++ b/daemon/mknod.c @@ -0,0 +1,69 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +int +do_mknod (int mode, int devmajor, int devminor, char *path) +{ + int r; + + NEED_ROOT (-1); + ABS_PATH (path, -1); + + CHROOT_IN; + r = mknod (path, mode, makedev (devmajor, devminor)); + CHROOT_OUT; + + if (r == -1) { + reply_with_perror ("mknod: %s", path); + return -1; + } + + return 0; +} + +int +do_mkfifo (int mode, char *path) +{ + return do_mknod (mode | S_IFIFO, 0, 0, path); +} + +int +do_mknod_b (int mode, int devmajor, int devminor, char *path) +{ + return do_mknod (mode | S_IFBLK, devmajor, devminor, path); +} + +int +do_mknod_c (int mode, int devmajor, int devminor, char *path) +{ + return do_mknod (mode | S_IFCHR, devmajor, devminor, path); +} diff --git a/daemon/umask.c b/daemon/umask.c new file mode 100644 index 00000000..ad8573d7 --- /dev/null +++ b/daemon/umask.c @@ -0,0 +1,46 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +int +do_umask (int mask) +{ + int r; + + r = umask (mask); + + if (r == -1) { + reply_with_perror ("umask"); + return -1; + } + + return r; +} diff --git a/src/generator.ml b/src/generator.ml index 1a844ee5..960973da 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -2676,6 +2676,76 @@ Create a swap partition on C<device> with label C<label>."); "\ Create a swap partition on C<device> with UUID C<uuid>."); + ("mknod", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 133, [], + [InitBasicFS, Always, TestOutputStruct ( + [["mknod"; "0o10777"; "0"; "0"; "/node"]; + (* NB: default umask 022 means 0777 -> 0755 in these tests *) + ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)]); + InitBasicFS, Always, TestOutputStruct ( + [["mknod"; "0o60777"; "66"; "99"; "/node"]; + ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])], + "make block, character or FIFO devices", + "\ +This call creates block or character special devices, or +named pipes (FIFOs). + +The C<mode> parameter should be the mode, using the standard +constants. C<devmajor> and C<devminor> are the +device major and minor numbers, only used when creating block +and character special devices."); + + ("mkfifo", (RErr, [Int "mode"; String "path"]), 134, [], + [InitBasicFS, Always, TestOutputStruct ( + [["mkfifo"; "0o777"; "/node"]; + ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)])], + "make FIFO (named pipe)", + "\ +This call creates a FIFO (named pipe) called C<path> with +mode C<mode>. It is just a convenient wrapper around +C<guestfs_mknod>."); + + ("mknod_b", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 135, [], + [InitBasicFS, Always, TestOutputStruct ( + [["mknod_b"; "0o777"; "99"; "66"; "/node"]; + ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])], + "make block device node", + "\ +This call creates a block device node called C<path> with +mode C<mode> and device major/minor C<devmajor> and C<devminor>. +It is just a convenient wrapper around C<guestfs_mknod>."); + + ("mknod_c", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 136, [], + [InitBasicFS, Always, TestOutputStruct ( + [["mknod_c"; "0o777"; "99"; "66"; "/node"]; + ["stat"; "/node"]], [CompareWithInt ("mode", 0o20755)])], + "make char device node", + "\ +This call creates a char device node called C<path> with +mode C<mode> and device major/minor C<devmajor> and C<devminor>. +It is just a convenient wrapper around C<guestfs_mknod>."); + + ("umask", (RInt "oldmask", [Int "mask"]), 137, [], + [], (* XXX umask is one of those stateful things that we should + * reset between each test. + *) + "set file mode creation mask (umask)", + "\ +This function sets the mask used for creating new files and +device nodes to C<mask & 0777>. + +Typical umask values would be C<022> which creates new files +with permissions like \"-rw-r--r--\" or \"-rwxr-xr-x\", and +C<002> which creates new files with permissions like +\"-rw-rw-r--\" or \"-rwxrwxr-x\". + +The default umask is C<022>. This is important because it +means that directories and device nodes will be created with +C<0644> or C<0755> mode even if you specify C<0777>. + +See also L<umask(2)>, C<guestfs_mknod>, C<guestfs_mkdir>. + +This call returns the previous umask."); + ] let all_functions = non_daemon_functions @ daemon_functions |