diff options
Diffstat (limited to 'tests/storage')
-rw-r--r-- | tests/storage/Android.mk | 17 | ||||
-rw-r--r-- | tests/storage/opentest.c | 95 | ||||
-rw-r--r-- | tests/storage/wipe_blkdev.c | 131 |
3 files changed, 243 insertions, 0 deletions
diff --git a/tests/storage/Android.mk b/tests/storage/Android.mk new file mode 100644 index 00000000..462ebef6 --- /dev/null +++ b/tests/storage/Android.mk @@ -0,0 +1,17 @@ +# Copyright 2013 The Android Open Source Project + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := opentest.c +LOCAL_MODULE := opentest +LOCAL_MODULE_TAGS := optional +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := wipe_blkdev.c +LOCAL_MODULE := wipe_blkdev +LOCAL_MODULE_TAGS := optional +include $(BUILD_EXECUTABLE) + diff --git a/tests/storage/opentest.c b/tests/storage/opentest.c new file mode 100644 index 00000000..05d55869 --- /dev/null +++ b/tests/storage/opentest.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2012 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 <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/resource.h> + +int main(int argc, char *argv[]) +{ + int i; + int nfiles; + int *fds; + char *dir; + struct stat statbuf; + char name[16]; + struct rlimit rlim; + + if (argc != 3) { + fprintf(stderr, "Usage: opentest <directory> <num_files>\n"); + exit(1); + } + + dir = argv[1]; + + nfiles = atoi(argv[2]); + if ((nfiles <= 0) || (nfiles > 65536)) { + fprintf(stderr, "num_files must be between 1 and 65536\n"); + exit(1); + } + + if (stat(dir, &statbuf)) { + fprintf(stderr, "Cannot stat %s\n", dir); + exit(1); + } + + if (! S_ISDIR(statbuf.st_mode)) { + fprintf(stderr, "%s is not a directory!\n", dir); + exit(1); + } + + if (access(dir, R_OK | W_OK)) { + fprintf(stderr, "No access to %s\n", dir); + exit(1); + } + + fds = malloc(nfiles * sizeof(int)); + if (fds == 0) { + fprintf(stderr, "Unable to malloc array of %d fds\n", nfiles); + exit(1); + } + + if (chdir(dir)) { + fprintf(stderr, "Cannot chdir to %s\n", dir); + exit(1); + } + + rlim.rlim_cur = nfiles + 10; + rlim.rlim_max = nfiles + 10; + if (setrlimit(RLIMIT_NOFILE, &rlim)) { + fprintf(stderr, "Unable to raise RLIMIT_NOFILE to %ld\n", rlim.rlim_cur); + exit(1); + } + + for (i = 0; i < nfiles; i++) { + snprintf(name, sizeof(name), "%d", i); + fds[i] = open(name, O_WRONLY | O_CREAT, 0666); + if (fds[i] < 0) { + fprintf(stderr, "Unable to open %d fd\n", i); + exit(1); + } + } + + /* Rely upon exit to cleanup! */ + exit(0); +} + + diff --git a/tests/storage/wipe_blkdev.c b/tests/storage/wipe_blkdev.c new file mode 100644 index 00000000..43b630b9 --- /dev/null +++ b/tests/storage/wipe_blkdev.c @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2011, 2012 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 <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <linux/fs.h> +#include <errno.h> + +typedef unsigned long long u64; + +#ifndef BLKDISCARD +#define BLKDISCARD _IO(0x12,119) +#endif + +#ifndef BLKSECDISCARD +#define BLKSECDISCARD _IO(0x12,125) +#endif + +static u64 get_block_device_size(int fd) +{ + u64 size = 0; + int ret; + + ret = ioctl(fd, BLKGETSIZE64, &size); + + if (ret) + return 0; + + return size; +} + +static int wipe_block_device(int fd, u64 len, int secure) +{ + u64 range[2]; + int ret; + int req; + + range[0] = 0; + range[1] = len; + if (secure) { + req = BLKSECDISCARD; + } else { + req = BLKDISCARD; + } + + ret = ioctl(fd, req, &range); + if (ret < 0) { + fprintf(stderr, "%s discard failed, errno = %d\n", + secure ? "Secure" : "Nonsecure", errno); + } + + return ret; +} + +static void usage(void) +{ + fprintf(stderr, "Usage: wipe_blkdev [-s] <partition>\n"); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int secure = 0; + char *devname; + int fd; + u64 len; + struct stat statbuf; + int ret; + + if ((argc != 2) && (argc != 3)) { + usage(); + } + + if (argc == 3) { + if (!strcmp(argv[1], "-s")) { + secure = 1; + devname = argv[2]; + } else { + usage(); + } + } else { + devname = argv[1]; + } + + fd = open(devname, O_RDWR); + if (fd < 0) { + fprintf(stderr, "Cannot open device %s\n", devname); + exit(1); + } + + if (fstat(fd, &statbuf) < 0) { + fprintf(stderr, "Cannot stat %s\n", devname); + exit(1); + } + + if (!S_ISBLK(statbuf.st_mode)) { + fprintf(stderr, "%s is not a block device\n", devname); + exit(1); + } + + len = get_block_device_size(fd); + + if (! len) { + fprintf(stderr, "Cannot get size of block device %s\n", devname); + exit(1); + } + + ret = wipe_block_device(fd, len, secure); + + close(fd); + + return ret; +} |