]> rtime.felk.cvut.cz Git - frescor/frsh-forb.git/blob - src/frsh/fres/sharedobj/fres_sharedobj.c
0536894bb5cc9770bc515c8a0b3c0475ea6adf58
[frescor/frsh-forb.git] / src / frsh / fres / sharedobj / fres_sharedobj.c
1 /**
2  * @file   fres_sharedobj.c
3  * @author Dario Faggioli <faggioli@gandalf.sssup.it>
4  * 
5  * @brief  Implementation of shared objects functions.
6  * 
7  * 
8  */
9 #include <frsh_forb.h>
10 #include <fres_sharedobj.h>
11 #include <string.h>
12 #include <stdio.h>
13 #include <fcntl.h>
14 #include <sys/mman.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17
18 /** 
19  * Allocates new fres_sharedobj structure. Use fres_sharedobj_destroy to
20  * deallocate the shared object.
21  *
22  * @return The new object on succes, NULL on error.
23  */
24 struct fres_sharedobj* fres_sharedobj_new(const char *label, int kind)
25 {
26         struct fres_sharedobj *s;
27         char shm_path[108];
28         int ret, shm_fd;
29
30         snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
31
32         shm_fd = shm_open(shm_path, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG);
33         if (shm_fd < 0) goto err;
34         ret = ftruncate(shm_fd, sizeof(*s));
35         if (ret) goto unlink_err;
36
37         s = mmap(NULL, sizeof(*s),
38                  PROT_READ|PROT_WRITE, MAP_SHARED,
39                  shm_fd, 0);
40         if (s == MAP_FAILED) goto unlink_err;
41
42         memcpy(s->label, label, sizeof(s->label));
43         memcpy(s->path, shm_path, sizeof(shm_path));
44         fosa_mutex_init(&s->mutex, 0);
45         s->kind = kind;
46
47         return s;
48
49 unlink_err:
50         shm_unlink(shm_path);
51 err:
52         return NULL;
53 }
54
55 struct fres_sharedobj* fres_sharedobj_get_path(const char *sharedobj_path)
56 {
57         struct fres_sharedobj *s = NULL;
58         int shm_fd;
59
60         shm_fd = shm_open(sharedobj_path, O_RDWR, S_IRWXU|S_IRWXG);
61         if (shm_fd < 0) goto out;
62
63         s = mmap(NULL, sizeof(*s),
64                  PROT_READ|PROT_WRITE, MAP_SHARED,
65                  shm_fd, 0);
66         if (s == MAP_FAILED) goto out;
67
68 out:
69         return s;
70 }
71
72 struct fres_sharedobj* fres_sharedobj_get_label(const char *label)
73 {
74         char shm_path[108];
75
76         snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
77
78         return fres_sharedobj_get_path(shm_path);
79 }
80
81 int fres_sharedobj_put(struct fres_sharedobj *s)
82 {
83         return munmap((void*) s, sizeof(*s));
84 }
85
86 int fres_sharedobj_destroy(struct fres_sharedobj *s)
87 {
88         int ret = 0;
89
90         if (!s) return EINVAL;
91
92         /* Since now no new task can mmap the object. */
93         ret = shm_unlink(s->path);
94         if (ret) goto out;
95
96         ret = fres_sharedobj_put(s);
97         if (ret) goto out;
98
99 out:
100         return ret;
101 }
102
103 int
104 fres_sharedobj_to_string(char *dest,
105                          size_t size,
106                          const struct fres_sharedobj *s)
107 {
108         int ret;
109
110         if (!s) return 0;
111
112         ret = snprintf(dest, size, "label: %s\n"
113                        "path: %s\n"
114                        "kind: %d\n",
115                        s->label, s->path, s->kind);
116
117         return ret;
118 }
119
120 void
121 fres_sharedobj_print(char *prefix, const struct fres_sharedobj *s)
122 {
123         char sharedobj[1000];
124
125         fres_sharedobj_to_string(sharedobj, sizeof(sharedobj)-1, s);
126         sharedobj[sizeof(sharedobj)-1] = 0;
127         printf("%s %s", prefix, sharedobj);
128 }
129