exec-remount.c (3145B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2008 Daniel Hokka Zakrisson 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include "util.h" 24 25 #include <vserver.h> 26 27 #include <getopt.h> 28 #include <stdio.h> 29 #include <stdlib.h> 30 #include <unistd.h> 31 #include <sys/mount.h> 32 #include <errno.h> 33 34 #define ENSC_WRAPPERS_PREFIX "exec-remount: " 35 #define ENSC_WRAPPERS_MOUNT 1 36 #define ENSC_WRAPPERS_UNISTD 1 37 #include <wrappers.h> 38 39 #define CMD_HELP 0x1000 40 #define CMD_VERSION 0x1001 41 #define CMD_MTAB 0x2001 42 43 #ifndef MNT_DETACH 44 #define MNT_DETACH 0x0002 45 #endif 46 47 static struct option const 48 CMDLINE_OPTIONS[] = { 49 { "help", no_argument, 0, CMD_HELP }, 50 { "version", no_argument, 0, CMD_VERSION }, 51 { "mtab", required_argument, 0, CMD_MTAB }, 52 { NULL, 0, 0, 0 } 53 }; 54 55 int wrapper_exit_code = 255; 56 57 static void 58 showHelp(int fd, char const *cmd, int res) 59 { 60 WRITE_MSG(fd, "Usage:\n "); 61 WRITE_STR(fd, cmd); 62 WRITE_MSG(fd, " [--mtab <file>] <mount points>* -- <command> <args>*\n"); 63 WRITE_MSG(fd, "\n" 64 "Please report bugs to " PACKAGE_BUGREPORT "\n"); 65 exit(res); 66 } 67 68 static void 69 showVersion(void) 70 { 71 WRITE_MSG(1, 72 "exec-remount " VERSION " -- remounts specified mount points and executes a program\n" 73 "This program is part of " PACKAGE_STRING "\n\n" 74 "Copyright (c) 2008 Daniel Hokka Zakrisson\n" 75 VERSION_COPYRIGHT_DISCLAIMER); 76 exit(0); 77 } 78 79 static void 80 do_remount(char const *mount) 81 { 82 /* FIXME: Read this from mtab */ 83 if (strcmp(mount, "/proc") == 0) 84 Emount("proc", "proc", "proc", 0, NULL); 85 else if (strcmp(mount, "/sys") == 0) 86 Emount("sysfs", "sys", "sysfs", 0, NULL); 87 else { 88 WRITE_MSG(2, ENSC_WRAPPERS_PREFIX "unknown mount point: "); 89 WRITE_STR(2, mount); 90 WRITE_MSG(2, "\n"); 91 } 92 } 93 94 int main(int argc, char *argv[]) 95 { 96 int i; 97 char const *mtab = "/etc/mtab"; 98 99 while (1) { 100 int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); 101 if (c==-1) break; 102 103 switch (c) { 104 case CMD_HELP : showHelp(1, argv[0], 0); 105 case CMD_VERSION : showVersion(); 106 case CMD_MTAB : mtab = optarg; break; 107 default : showHelp(2, argv[0], 1); 108 } 109 } 110 111 for (i = optind; argv[i] != NULL && strcmp(argv[i], "--") != 0; i++) { 112 if (vc_isSupported(vcFEATURE_PIDSPACE)) { 113 /* + 1 to strip the leading / */ 114 if (umount2(argv[i] + 1, MNT_DETACH) == 0) 115 do_remount(argv[i]); 116 } 117 } 118 119 if (argv[i] == NULL) 120 showHelp(2, argv[0], 1); 121 122 i++; 123 EexecvpD(argv[i], argv+i); 124 /* NOTREACHED */ 125 return 1; 126 }