#include #include #include #include #include #include #include #include "fdpass.h" unsigned int rcvbuf = 16*1024*1024; unsigned int arg_length = 128; unsigned int mountflags = MS_NODEV | MS_NOSUID; void receive_argument(int control_channel_fd, char *source) { int received; received=recv(control_channel_fd, source, arg_length, 0); if (received 1023) { printf ("Got control_channel_fd = %d\n", control_channel_fd); exit(1); } receive_argument(control_channel_fd, source); receive_argument(control_channel_fd, target); receive_argument(control_channel_fd, filesystemtype); receive_argument(control_channel_fd, data); magic_fd = get_magic_fd (data); if (magic_fd < 3) { printf("Got fd %d in fusemount\n",magic_fd); exit(1); } mount_fd = receive_fd (control_channel_fd); if (mount_fd != magic_fd) { printf("mount_fd (%d) != magic_fd (%d)\n", mount_fd, magic_fd); exit(1); } check_source(source); check_target(target); check_fstype(filesystemtype); sprintf(slice_target,"/vservers/%s/%s", target); if (!mount(source, slice_target, filesystemtype, mountflags, data)) { send_fd(control_channel_fd, magic_fd); } }