17d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey/*
27d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Copyright (C) 2015 The Android Open Source Project
37d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
47d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
57d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * you may not use this file except in compliance with the License.
67d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * You may obtain a copy of the License at
77d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
87d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
97d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Unless required by applicable law or agreed to in writing, software
117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * See the License for the specific language governing permissions and
147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * limitations under the License.
157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey */
167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypackage com.android.commands.sm;
187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.RemoteException;
207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.ServiceManager;
210d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.SystemProperties;
227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.DiskInfo;
237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.IMountService;
240d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.storage.StorageManager;
257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.VolumeInfo;
267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.util.Log;
277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypublic final class Sm {
297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static final String TAG = "Sm";
307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    IMountService mSm;
327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String[] mArgs;
347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private int mNextArg;
357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String mCurArgData;
367d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public static void main(String[] args) {
387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        boolean success = false;
397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        try {
407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            new Sm().run(args);
417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            success = true;
427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } catch (Exception e) {
437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (e instanceof IllegalArgumentException) {
447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                showUsage();
4582bfca4609244f2b8169bd779765791d6638b448Brian Carlstrom                System.exit(1);
467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
477d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            Log.e(TAG, "Error", e);
487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            System.err.println("Error: " + e);
497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.exit(success ? 0 : 1);
517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void run(String[] args) throws Exception {
547d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (args.length < 1) {
557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
597d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mSm == null) {
607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new RemoteException("Failed to find running mount service");
617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
637d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mArgs = args;
647d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String op = args[0];
657d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg = 1;
667d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
677d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("list-disks".equals(op)) {
687d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListDisks();
697d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("list-volumes".equals(op)) {
707d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListVolumes();
710d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey        } else if ("has-adoptable".equals(op)) {
720d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey            runHasAdoptable();
737d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("get-primary-storage-uuid".equals(op)) {
747d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runGetPrimaryStorageUuid();
754c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        } else if ("set-force-adoptable".equals(op)) {
764c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey            runSetForceAdoptable();
7733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        } else if ("set-sdcardfs".equals(op)) {
7833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            runSetSdcardfs();
797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("partition".equals(op)) {
807d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runPartition();
817d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mount".equals(op)) {
827d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runMount();
837d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("unmount".equals(op)) {
847d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runUnmount();
857d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("format".equals(op)) {
867d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runFormat();
8785ced632680642fce680d141ddd10299ff849233Jeff Sharkey        } else if ("benchmark".equals(op)) {
8885ced632680642fce680d141ddd10299ff849233Jeff Sharkey            runBenchmark();
897d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("forget".equals(op)) {
907d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runForget();
91f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        } else if ("set-emulate-fbe".equals(op)) {
92f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey            runSetEmulateFbe();
93b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else if ("get-fbe-mode".equals(op)) {
94b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            runGetFbeMode();
957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
967d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
977d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1007d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListDisks() throws RemoteException {
10185ced632680642fce680d141ddd10299ff849233Jeff Sharkey        final boolean onlyAdoptable = "adoptable".equals(nextArg());
1027d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final DiskInfo[] disks = mSm.getDisks();
1037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (DiskInfo disk : disks) {
10485ced632680642fce680d141ddd10299ff849233Jeff Sharkey            if (!onlyAdoptable || disk.isAdoptable()) {
10585ced632680642fce680d141ddd10299ff849233Jeff Sharkey                System.out.println(disk.getId());
10685ced632680642fce680d141ddd10299ff849233Jeff Sharkey            }
1077d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListVolumes() throws RemoteException {
1117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String filter = nextArg();
1127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final int filterType;
1137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(filter)) {
1147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PUBLIC;
1157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(filter)) {
1167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PRIVATE;
1177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("emulated".equals(filter)) {
1187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_EMULATED;
1197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = -1;
1217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final VolumeInfo[] vols = mSm.getVolumes(0);
1247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (VolumeInfo vol : vols) {
1257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (filterType == -1 || filterType == vol.getType()) {
1267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
1277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                System.out.println(vol.getId() + " " + envState + " " + vol.getFsUuid());
1287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
1297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1320d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    public void runHasAdoptable() {
1334c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        System.out.println(SystemProperties.getBoolean(StorageManager.PROP_HAS_ADOPTABLE, false));
1340d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    }
1350d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey
1360d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    public void runGetPrimaryStorageUuid() throws RemoteException {
1377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.out.println(mSm.getPrimaryStorageUuid());
1387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1404c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey    public void runSetForceAdoptable() throws RemoteException {
1414c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        final boolean forceAdoptable = Boolean.parseBoolean(nextArg());
1424c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        mSm.setDebugFlags(forceAdoptable ? StorageManager.DEBUG_FORCE_ADOPTABLE : 0,
1434c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey                StorageManager.DEBUG_FORCE_ADOPTABLE);
1444c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey    }
14533dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey
14633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey    public void runSetSdcardfs() throws RemoteException {
14733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        final int mask = StorageManager.DEBUG_SDCARDFS_FORCE_ON
14833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                | StorageManager.DEBUG_SDCARDFS_FORCE_OFF;
14933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        switch (nextArg()) {
15033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "on":
15133dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_ON, mask);
15233dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
15333dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "off":
15433dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_OFF, mask);
15533dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
15633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "default":
15733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(0, mask);
15833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
15933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        }
16033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey    }
1614c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey
162f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey    public void runSetEmulateFbe() throws RemoteException {
163f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        final boolean emulateFbe = Boolean.parseBoolean(nextArg());
164f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        mSm.setDebugFlags(emulateFbe ? StorageManager.DEBUG_EMULATE_FBE : 0,
165f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey                StorageManager.DEBUG_EMULATE_FBE);
166f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey    }
167f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey
168b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey    public void runGetFbeMode() {
169b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        if (StorageManager.isFileEncryptedNativeOnly()) {
170b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("native");
171b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else if (StorageManager.isFileEncryptedEmulatedOnly()) {
172b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("emulated");
173b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else {
174b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("none");
175b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        }
176b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey    }
177b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey
1787d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runPartition() throws RemoteException {
1797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String diskId = nextArg();
1807d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String type = nextArg();
1817d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(type)) {
1827d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPublic(diskId);
1837d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(type)) {
1847d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPrivate(diskId);
1857d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mixed".equals(type)) {
1867d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            final int ratio = Integer.parseInt(nextArg());
1877d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionMixed(diskId, ratio);
1887d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1897d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException("Unsupported partition type " + type);
1907d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1917d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runMount() throws RemoteException {
1947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
1957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.mount(volId);
1967d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1977d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runUnmount() throws RemoteException {
1997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
2007d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.unmount(volId);
2017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2027d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runFormat() throws RemoteException {
2047d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
2057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.format(volId);
2067d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2077d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
20885ced632680642fce680d141ddd10299ff849233Jeff Sharkey    public void runBenchmark() throws RemoteException {
20985ced632680642fce680d141ddd10299ff849233Jeff Sharkey        final String volId = nextArg();
21085ced632680642fce680d141ddd10299ff849233Jeff Sharkey        mSm.benchmark(volId);
21185ced632680642fce680d141ddd10299ff849233Jeff Sharkey    }
21285ced632680642fce680d141ddd10299ff849233Jeff Sharkey
2137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runForget() throws RemoteException{
2147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String fsUuid = nextArg();
2157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("all".equals(fsUuid)) {
2167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetAllVolumes();
2177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
2187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetVolume(fsUuid);
2197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
2207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String nextArg() {
2237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mNextArg >= mArgs.length) {
2247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            return null;
2257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
2267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String arg = mArgs[mNextArg];
2277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg++;
2287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return arg;
2297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static int showUsage() {
23285ced632680642fce680d141ddd10299ff849233Jeff Sharkey        System.err.println("usage: sm list-disks [adoptable]");
2337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm list-volumes [public|private|emulated|all]");
2340d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey        System.err.println("       sm has-adoptable");
2357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm get-primary-storage-uuid");
2364c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        System.err.println("       sm set-force-adoptable [true|false]");
2377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
2387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm partition DISK [public|private|mixed] [ratio]");
2397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm mount VOLUME");
2407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm unmount VOLUME");
2417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm format VOLUME");
24285ced632680642fce680d141ddd10299ff849233Jeff Sharkey        System.err.println("       sm benchmark VOLUME");
2437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
2447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm forget [UUID|all]");
2457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
246f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        System.err.println("       sm set-emulate-fbe [true|false]");
247f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        System.err.println("");
2487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return 1;
2497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey}
251