diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53 (patch) | |
tree | 54fd1b2695a591d2306d41264df67c53077b752c /adb/remount_service.c | |
download | system_core-4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53.zip system_core-4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53.tar.gz system_core-4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53.tar.bz2 |
Initial Contribution
Diffstat (limited to 'adb/remount_service.c')
-rw-r--r-- | adb/remount_service.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/adb/remount_service.c b/adb/remount_service.c new file mode 100644 index 0000000..26bc841 --- /dev/null +++ b/adb/remount_service.c @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <sys/mount.h> +#include <errno.h> + +#include "sysdeps.h" + +#define TRACE_TAG TRACE_ADB +#include "adb.h" + + +static int system_ro = 1; + +/* Returns the mount number of the requested partition from /proc/mtd */ +static int find_mount(const char *findme) +{ + int fd; + int res; + int size; + char *token = NULL; + const char delims[] = "\n"; + char buf[1024]; + + fd = unix_open("/proc/mtd", O_RDONLY); + if (fd < 0) + return -errno; + + buf[sizeof(buf) - 1] = '\0'; + size = adb_read(fd, buf, sizeof(buf) - 1); + adb_close(fd); + + token = strtok(buf, delims); + + while (token) { + char mtdname[16]; + int mtdnum, mtdsize, mtderasesize; + + res = sscanf(token, "mtd%d: %x %x %15s", + &mtdnum, &mtdsize, &mtderasesize, mtdname); + + if (res == 4 && !strcmp(mtdname, findme)) + return mtdnum; + + token = strtok(NULL, delims); + } + return -1; +} + +/* Init mounts /system as read only, remount to enable writes. */ +static int remount_system() +{ + int num; + char source[64]; + if (system_ro == 0) { + return 0; + } + if ((num = find_mount("\"system\"")) < 0) + return -1; + + snprintf(source, sizeof source, "/dev/block/mtdblock%d", num); + system_ro = mount(source, "/system", "yaffs2", MS_REMOUNT, NULL); + return system_ro; +} + +static void write_string(int fd, const char* str) +{ + writex(fd, str, strlen(str)); +} + +void remount_service(int fd, void *cookie) +{ + int ret = remount_system(); + + if (!ret) + write_string(fd, "remount succeeded\n"); + else { + char buffer[200]; + snprintf(buffer, sizeof(buffer), "remount failed: %s\n", strerror(errno)); + write_string(fd, buffer); + } + + adb_close(fd); +} + |