| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <asm/unistd.h> |
| |
| void usage(const char *comm) { |
| fprintf(stderr, "Usage: %s <access mode>\n", comm); |
| fprintf(stderr, "\tAccess mode: 0-O_RDONLY, 1-O_WRONLY, 2-O_RDWR\n"); |
| return; |
| } |
| |
| int main(int argc, char **argv) { |
| if (argc < 2) { |
| usage(argv[0]); |
| return 1; |
| } |
| |
| unsigned int access_mode = strtoul(argv[1], NULL, 0); |
| if (access_mode < 0 || access_mode > 2) { |
| usage(argv[0]); |
| return 1; |
| } |
| |
| char *path; |
| int flags; |
| |
| switch (access_mode) { |
| case 0: |
| path = "/dev/zero"; |
| flags = O_RDONLY; |
| break; |
| case 1: |
| path = "/dev/null"; |
| flags = O_WRONLY; |
| break; |
| case 2: |
| path = "/dev/null"; |
| flags = O_RDWR; |
| break; |
| default: |
| usage(argv[0]); |
| return 1; |
| } |
| |
| int fd = syscall(__NR_openat, AT_FDCWD, path, flags); |
| syscall(__NR_close, fd); |
| syscall(__NR_exit, 0); |
| } |