19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/IMountService.h>
180795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/BpBinder.h>
190795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <time.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<IMountService> gMountService;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void init() {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IServiceManager> sm = defaultServiceManager();
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IBinder> binder = sm->getService(String16("mount"));
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gMountService = interface_cast<IMountService>(binder);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gMountService == 0) {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "could not get MountService\n");
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        exit(1);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool isMounted(const char* mountPoint) {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char s[2000];
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FILE *f = fopen("/proc/mounts", "r");
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mounted = false;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (fgets(s, sizeof(s), f))
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char *c, *path = NULL;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (c = s; *c; c++)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (*c == ' ')
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                *c = 0;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                path = c + 1;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (c = path; *c; c++)
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (*c == ' ')
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                *c = '\0';
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (strcmp(mountPoint, path) == 0) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mounted = true;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fclose(f);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mounted;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void millisecondSleep(int milliseconds) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	struct timespec reqt, remt;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	reqt.tv_sec = milliseconds / 1000;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	reqt.tv_nsec = 1000000 * (milliseconds % 1000);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	nanosleep(&reqt, &remt) ;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int mount(const char* path) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 string(path);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gMountService->mountMedia(string);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919b0a5e57db8d3b701919d64d26269a9fa656e3beSan Mehat    for (int i = 0; i < 60; i++) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isMounted(path)) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        millisecondSleep(500);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr, "failed to mount %s\n", path);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int unmount(const char* path) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 string(path);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gMountService->unmountMedia(string);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069b0a5e57db8d3b701919d64d26269a9fa656e3beSan Mehat    for (int i = 0; i < 20; i++) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isMounted(path)) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        millisecondSleep(500);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr, "failed to unmount %s\n", path);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int format(const char* path) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 string(path);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (isMounted(path))
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -EBUSY;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gMountService->formatMedia(string);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int umsEnable(bool enable) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gMountService->setMassStorageEnabled(enable);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char **argv)
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* command = (argc > 1 ? argv[1] : "");
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* argument = (argc > 2 ? argv[2] : "");
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(command, "mount") == 0) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        android::init();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return android::mount(argument);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(command, "format") == 0) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        android::init();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return android::format(argument);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(command, "unmount") == 0) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        android::init();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return android::unmount(argument);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(command, "ums") == 0) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (strcmp(argument, "enable") == 0) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android::init();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return android::umsEnable(true);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (strcmp(argument, "disable") == 0) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android::init();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return android::umsEnable(false);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr, "usage:\n"
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "    sdutil mount <mount path>          - mounts the SD card at the given mount point\n"
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "    sdutil unmount <mount path>        - unmounts the SD card at the given mount point\n"
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "    sdutil format <mount path>         - formats the SD card at the given mount point\n"
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "    sdutil ums enable                  - enables USB mass storage\n"
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "    sdutil ums disable                 - disnables USB mass storage\n"
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    );
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
167