2
* Copyright (c) 2008 Jakub Jermar
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
#include <sys/types.h>
40
#include "../tester.h"
42
#define FS_TYPE "tmpfs"
43
#define MOUNT_POINT "/tmp"
47
#define TEST_DIRECTORY MOUNT_POINT "/testdir"
48
#define TEST_FILE TEST_DIRECTORY "/testfile"
49
#define TEST_FILE2 TEST_DIRECTORY "/nextfile"
51
#define MAX_DEVICE_NAME 32
54
static char text[] = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
56
static char *read_root(void)
58
TPRINTF("Opening the root directory...");
60
DIR *dirp = opendir("/");
63
return "opendir() failed";
68
while ((dp = readdir(dirp)))
69
TPRINTF(" node \"%s\"\n", dp->d_name);
77
if (mkdir(MOUNT_POINT, 0) != 0)
78
return "mkdir() failed";
79
TPRINTF("Created directory %s\n", MOUNT_POINT);
81
char null[MAX_DEVICE_NAME];
82
int null_id = devmap_null_create();
85
return "Unable to create null device";
87
snprintf(null, MAX_DEVICE_NAME, "null%d", null_id);
88
int rc = mount(FS_TYPE, MOUNT_POINT, null, OPTIONS, FLAGS);
91
TPRINTF("Mounted /dev/%s as %s on %s\n", null, FS_TYPE, MOUNT_POINT);
94
TPRINTF("(INFO) Filesystem already mounted on %s\n", MOUNT_POINT);
97
TPRINTF("(ERR) IPC returned errno %d (is tmpfs loaded?)\n", rc);
98
return "mount() failed";
101
if (mkdir(TEST_DIRECTORY, 0) != 0)
102
return "mkdir() failed";
103
TPRINTF("Created directory %s\n", TEST_DIRECTORY);
105
int fd0 = open(TEST_FILE, O_CREAT);
107
return "open() failed";
108
TPRINTF("Created file %s (fd=%d)\n", TEST_FILE, fd0);
110
size_t size = sizeof(text);
111
ssize_t cnt = write(fd0, text, size);
113
return "write() failed";
114
TPRINTF("Written %d bytes\n", cnt);
116
if (lseek(fd0, 0, SEEK_SET) != 0)
117
return "lseek() failed";
118
TPRINTF("Sought to position 0\n");
121
while ((cnt = read(fd0, buf, BUF_SIZE))) {
123
return "read() failed";
125
TPRINTF("Read %d bytes: \".*s\"\n", cnt, cnt, buf);
130
char *rv = read_root();
134
if (rename(TEST_FILE, TEST_FILE2))
135
return "rename() failed";
136
TPRINTF("Renamed %s to %s\n", TEST_FILE, TEST_FILE2);
138
if (unlink(TEST_FILE2))
139
return "unlink() failed";
140
TPRINTF("Unlinked %s\n", TEST_FILE2);
142
if (rmdir(TEST_DIRECTORY))
143
return "rmdir() failed";
144
TPRINTF("Removed directory %s\n", TEST_DIRECTORY);