8 static char * make_rand_buf(int size) {
14 while (i > sizeof(int)) {
17 memcpy(rval + size - i, &rand, sizeof(int));
24 memcpy(rval + size - i, &rand, i);
30 static gboolean write_whole_file(Device * device) {
36 dumpfile.type = F_DUMPFILE;
37 tmp = get_timestamp_from_time(time(NULL));
38 strcpy(dumpfile.datestamp, tmp);
40 strcpy(dumpfile.name, "localhost");
41 tmp = g_get_current_dir();
42 strcpy(dumpfile.disk, tmp);
44 strcpy(dumpfile.program, "TESTER");
45 strcpy(dumpfile.recover_cmd, "recover_cmd");
47 blocksize = device_write_max_size(device);
49 g_return_val_if_fail(device_start_file(device, &dumpfile), FALSE);
51 for (i = 0; i < 1000; i ++) {
58 buf = make_rand_buf(size);
59 g_return_val_if_fail(device_write_block(device, size, buf, i == 999),
64 g_return_val_if_fail(device->in_file == FALSE, FALSE);
69 static gboolean read_whole_file(Device * device, int fileno) {
71 dumpfile_t * file = device_seek_file(device, fileno + 1);
76 g_assert_not_reached();
80 g_return_val_if_fail(device_seek_block(device, 0), FALSE);
82 g_return_val_if_fail(0 == device_read_block(device, NULL, &size),
84 g_assert(size >= blocksize);
86 for (i = 0; i < 1000; i ++) {
94 buf = make_rand_buf(size);
96 g_return_val_if_fail(device_read_block(device, buf2, &size2),
98 g_assert(size2 == size || size2 == blocksize);
99 g_assert(memcmp(buf, buf2, size) == 0);
104 buf = malloc(blocksize);
105 g_assert(-1 == device_read_block(device, &buf, &size));
106 g_return_val_if_fail(device->is_eof, FALSE);
112 static MediaAccessMode get_medium_type(Device * device) {
114 MediaAccessMode rval;
116 bzero(&value, sizeof(value));
118 g_return_val_if_fail(device_property_get(device, PROPERTY_MEDIUM_TYPE,
121 rval = g_value_get_enum(&value);
122 g_value_unset(&value);
126 int main(int argc, char ** argv) {
129 MediaAccessMode medium_type;
131 g_return_val_if_fail(argc == 2, 1);
135 device = device_open(argv[1]);
136 g_return_val_if_fail(device != NULL, 2);
138 medium_type = get_medium_type(device);
140 if (device->volume_label) {
141 printf("Last header: %s %s\n", device->volume_label,
142 device->volume_time);
145 if (medium_type != MEDIA_ACCESS_MODE_READ_ONLY) {
146 g_return_val_if_fail(device_start(device, ACCESS_WRITE,
150 for (h = 0; h < 10; h ++) {
153 g_return_val_if_fail(write_whole_file(device), 3);
155 bzero(&value, sizeof(value));
156 g_return_val_if_fail(device_property_get(device,
159 appendable = g_value_get_boolean(&value);
160 g_value_unset(&value);
162 if (appendable && h == 5) {
163 g_object_unref(device);
165 device = device_open(argv[1]);
166 g_return_val_if_fail(device != NULL, 6);
168 g_return_val_if_fail(device_start(device, ACCESS_APPEND,
174 g_object_unref(device);
176 device = device_open(argv[1]);
177 g_return_val_if_fail(device != NULL, 6);
180 /* Fixme: check for readable access mode. */
181 if (medium_type != MEDIA_ACCESS_MODE_WRITE_ONLY) {
182 g_return_val_if_fail(device->volume_label, 7);
183 printf("This header: %s %s\n", device->volume_label,
184 device->volume_time);
186 g_return_val_if_fail(device_start(device, ACCESS_READ,
190 for (h = 0; h < 10; h ++) {
191 g_return_val_if_fail(read_whole_file(device, h), 8);
195 g_object_unref(device);