Print backtraces when we do a warn()
[akaros.git] / tests / bind.c
1 #define _LARGEFILE64_SOURCE /* needed to use lseek64 */
2
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <parlib/arch/arch.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <dirent.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <ros/syscall.h>
14
15 /* The naming for the args in bind is messy historically.  We do:
16  *              bind src_path onto_path
17  * plan9 says bind NEW OLD, where new is *src*, and old is *onto*.
18  * Linux says mount --bind OLD NEW, where OLD is *src* and NEW is *onto*. */
19 int main(int argc, char *argv[])
20 {
21         int ret;
22         int flag = 0;
23         char *src_path, *onto_path;
24
25         /* crap arg handling for now. */
26         argc--, argv++;
27         while (argc > 2) {
28                 switch (argv[0][1]) {
29                 case 'b':
30                         flag |= 1;
31                         break;
32                 case 'a':
33                         flag |= 2;
34                         break;
35                 case 'c':
36                         flag |= 4;
37                         break;
38                 default:
39                         printf("-a or -b and/or -c for now\n");
40                         exit(0);
41                 }
42                 argc--, argv++;
43         }
44
45         if (argc < 2) {
46                 fprintf(stderr, "usage: bind [-a|-b] src_path onto_path\n");
47                 exit(1);
48         }
49         src_path = argv[0];
50         onto_path = argv[1];
51         printf("bind %s -> %s flag %d\n", src_path, onto_path, flag);
52         ret = syscall(SYS_nbind, src_path, strlen(src_path), onto_path,
53                       strlen(onto_path), flag);
54         if (ret < 0)
55                 perror("Bind failed");
56         return ret;
57 }