xcache: Add missing licence headers
[archipelago] / xseg / sys / kernel / segtest.c
1 /*
2  * Copyright 2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *   2. Redistributions in binary form must reproduce the above
12  *      copyright notice, this list of conditions and the following
13  *      disclaimer in the documentation and/or other materials
14  *      provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * The views and conclusions contained in the software and
30  * documentation are those of the authors and should not be
31  * interpreted as representing official policies, either expressed
32  * or implied, of GRNET S.A.
33  */
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <sys/mman.h>
38 #include <sys/ioctl.h>
39 #include <sys/types.h>
40 #include <sys/stat.h>
41 #include <fcntl.h>
42 #include <unistd.h>
43
44 #include "segdev.h"
45
46 int fail(const char *msg)
47 {
48         perror(msg);
49         return 1;
50 }
51
52 int main(int argc, char **argv)
53 {
54         int fd;
55         char *segment;
56         unsigned long i;
57         long segsize, oldsize;
58
59         if (argc < 2) {
60                 printf("Usage: ./segtest <segsize in kB>\n");
61                 return 1;
62         }
63
64         segsize = atol(argv[1]) * 1024;
65         if (segsize < 0)
66                 segsize = -segsize;
67
68         fd = open("/dev/segdev", O_RDWR);
69         if (fd < 0)
70                 return fail("/dev/segdev");
71
72         oldsize = ioctl(fd, SEGDEV_IOC_SEGSIZE, 0);
73         if (oldsize < 0) {
74
75                 printf("No segment found. Creating...\n");
76         
77                 if (ioctl(fd, SEGDEV_IOC_CREATESEG, segsize))
78                         return fail("CREATESEG");
79
80         } else if (segsize != oldsize) {
81
82                 printf("Destroying old segment...\n");
83
84                 if (ioctl(fd, SEGDEV_IOC_DESTROYSEG, 0))
85                         return fail("DESTROYSEG");
86
87                 if (ioctl(fd, SEGDEV_IOC_CREATESEG, segsize))
88                         return fail("CREATESEG");
89         }
90
91         segment = mmap( NULL, segsize,
92                         PROT_READ | PROT_WRITE,
93                         MAP_SHARED, fd, 0 );
94         close(fd);
95
96         if (segment == MAP_FAILED)
97                 return fail("mmap");
98
99         for (i = 0; i < segsize; i++)
100                 segment[i] = (char)(i & 0xff);
101
102         for (i = 0; i < segsize; i++)
103                 if (segment[i] != (char)(i & 0xff))
104                         printf("%lu: %d vs %ld\n", i, segment[i], (i & 0xff));
105         return 0;
106 }
107