⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wipe.c

📁 Android 一些工具
💻 C
字号:
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <dirent.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/reboot.h>#include <sys/stat.h>#ifndef PATH_MAX#define PATH_MAX 4096#endif/* Directories created by init defined in system/rootdir/init.rc */static char *INIT_DIRS[] = {    "/system/etc/ppp",    "/data/misc",    "/data/local",    "/data/local/tmp",    "/data/data",    "/data/app_private",    "/data/app",    NULL};static void wipe (const char *path);static int usage(){    fprintf(stderr, "wipe <system|data|all>\n\n"                    "system means '/system'\n"                    "data means '/data'\n");    return -1;}int wipe_main (int argc, char *argv[]){    char *whatToWipe;    if (argc != 2) return usage();    whatToWipe = argv[1];    if (0 == strcmp (whatToWipe, "system")) {        fprintf(stdout, "Wiping /system\n");        wipe ("/system");        fprintf(stdout, "Done wiping /android\n");    } else if (0 == strcmp (whatToWipe, "data")) {        fprintf(stdout, "Wiping /data\n");        wipe ("/data");        fprintf(stdout, "Done wiping /data\n");    } else if (0 == strcmp (whatToWipe, "all")) {        fprintf(stdout, "Wiping /system and /data\n");        wipe ("/system");        wipe ("/data");        fprintf(stdout, "Done wiping /system and /data\n");    } else if (0 == strcmp(whatToWipe, "nuke")) {		int ret;		fprintf(stdout, "Nuking the device...\n");		wipe ("/system");        wipe ("/data");		fprintf(stdout, "Device nuked! Rebooting...\n");		ret = reboot(RB_AUTOBOOT);	    if (ret < 0) {	        fprintf(stderr, "Reboot failed, %s\n", strerror(errno));	        return 1;	    }	} else {        return usage();    }    return 0;}static char nameBuffer[PATH_MAX];static struct stat statBuffer;static void wipe (const char *path) {    DIR *dir;    struct dirent *de;    int ret;    dir = opendir(path);    if (dir == NULL) {        fprintf (stderr, "Error opendir'ing %s '%s'\n",                    path, strerror(errno));        return;    }    char *filenameOffset;    strcpy(nameBuffer, path);    strcat(nameBuffer, "/");    filenameOffset = nameBuffer + strlen(nameBuffer);    for (;;) {        de = readdir(dir);        if (de == NULL) {            break;        }        if (0 == strcmp(de->d_name, ".")                || 0 == strcmp(de->d_name, "..")                || 0 == strcmp(de->d_name, "lost+found")        ) {            continue;        }        strcpy(filenameOffset, de->d_name);        ret = lstat (nameBuffer, &statBuffer);        if (ret != 0) {            fprintf(stderr, "stat() error on '%s' '%s'\n",                     nameBuffer, strerror(errno));        }        if(S_ISDIR(statBuffer.st_mode)) {            int i;            char *newpath;#if 0            closedir(dir);#endif            newpath = strdup(nameBuffer);            wipe(newpath);            /* Leave directories created by init, they have special permissions. */            for (i = 0; INIT_DIRS[i]; i++) {                if (strcmp(INIT_DIRS[i], newpath) == 0) {                    break;                }            }            if (INIT_DIRS[i] == NULL) {                ret = rmdir(newpath);                if (ret != 0) {                    fprintf(stderr, "rmdir() error on '%s' '%s'\n",                         newpath, strerror(errno));                }            }            free(newpath);#if 0            dir = opendir(path);            if (dir == NULL) {                fprintf (stderr, "Error opendir'ing %s '%s'\n",                            path, strerror(errno));                return;            }#endif            strcpy(nameBuffer, path);            strcat(nameBuffer, "/");        } else {            ret = unlink(nameBuffer);            if (ret != 0) {                fprintf(stderr, "unlink() error on '%s' '%s'\n",                     nameBuffer, strerror(errno));            }        }    }    closedir(dir);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -