1 /* 2 * Copyright (c) 2013-2016 Cyril Hrubis <chrubis (at) suse.cz> 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 2 of the License, or 7 * (at your option) any later version. 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, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include "test.h" 19 #include "ltp_priv.h" 20 #include "tst_mkfs.h" 21 #include "tst_device.h" 22 23 #define OPTS_MAX 32 24 25 void tst_mkfs_(const char *file, const int lineno, void (cleanup_fn)(void), 26 const char *dev, const char *fs_type, 27 const char *const fs_opts[], const char *const extra_opts[]) 28 { 29 int i, pos = 1, ret; 30 char mkfs[64]; 31 const char *argv[OPTS_MAX] = {mkfs}; 32 char fs_opts_str[1024] = ""; 33 char extra_opts_str[1024] = ""; 34 35 if (!dev) { 36 tst_brkm(TBROK, cleanup_fn, 37 "%s:%d: No device specified", file, lineno); 38 return; 39 } 40 41 if (!fs_type) { 42 tst_brkm(TBROK, cleanup_fn, 43 "%s:%d: No fs_type specified", file, lineno); 44 return; 45 } 46 47 snprintf(mkfs, sizeof(mkfs), "mkfs.%s", fs_type); 48 49 if (fs_opts) { 50 for (i = 0; fs_opts[i]; i++) { 51 argv[pos++] = fs_opts[i]; 52 53 if (pos + 2 > OPTS_MAX) { 54 tst_brkm(TBROK, cleanup_fn, 55 "%s:%d: Too much mkfs options", 56 file, lineno); 57 return; 58 } 59 60 if (i) 61 strcat(fs_opts_str, " "); 62 strcat(fs_opts_str, fs_opts[i]); 63 } 64 } 65 66 argv[pos++] = dev; 67 68 if (extra_opts) { 69 for (i = 0; extra_opts[i]; i++) { 70 argv[pos++] = extra_opts[i]; 71 72 if (pos + 1 > OPTS_MAX) { 73 tst_brkm(TBROK, cleanup_fn, 74 "%s:%d: Too much mkfs options", file, lineno); 75 return; 76 } 77 78 if (i) 79 strcat(extra_opts_str, " "); 80 strcat(extra_opts_str, extra_opts[i]); 81 } 82 } 83 84 argv[pos] = NULL; 85 86 if (tst_clear_device(dev)) 87 tst_brkm(TBROK, cleanup_fn, "tst_clear_device() failed"); 88 89 tst_resm(TINFO, "Formatting %s with %s opts='%s' extra opts='%s'", 90 dev, fs_type, fs_opts_str, extra_opts_str); 91 ret = tst_run_cmd(cleanup_fn, argv, "/dev/null", NULL, 1); 92 93 switch (ret) { 94 case 0: 95 break; 96 case 255: 97 tst_brkm(TCONF, cleanup_fn, 98 "%s:%d: %s not found in $PATH", file, lineno, mkfs); 99 default: 100 tst_brkm(TBROK, cleanup_fn, 101 "%s:%d: %s failed with %i", mkfs, ret, file, lineno); 102 } 103 } 104 105 const char *tst_dev_fs_type(void) 106 { 107 const char *fs_type; 108 109 fs_type = getenv("LTP_DEV_FS_TYPE"); 110 111 if (fs_type) 112 return fs_type; 113 114 return DEFAULT_FS_TYPE; 115 } 116