Branch data Line data Source code
1 : : #include <unistd.h>
2 : : #include <stdio.h>
3 : : #include <stdlib.h>
4 : : #include <errno.h>
5 : : #include <fcntl.h>
6 : : #include <stdlib.h>
7 : : #include <string.h>
8 : : #include <limits.h>
9 : : #include <sys/stat.h>
10 : : #include <sys/statfs.h>
11 : : #include <sys/types.h>
12 : : #include <sys/ioctl.h>
13 : : #include <sys/eventfd.h>
14 : :
15 : : #include "compiler.h"
16 : : #include "types.h"
17 : : #include "eventfd.h"
18 : : #include "proc_parse.h"
19 : : #include "crtools.h"
20 : : #include "image.h"
21 : : #include "util.h"
22 : : #include "log.h"
23 : :
24 : : #include "protobuf.h"
25 : : #include "protobuf/eventfd.pb-c.h"
26 : :
27 : : #undef LOG_PREFIX
28 : : #define LOG_PREFIX "eventfd: "
29 : :
30 : : struct eventfd_file_info {
31 : : EventfdFileEntry *efe;
32 : : struct file_desc d;
33 : : };
34 : :
35 : : /* Checks if file desciptor @lfd is eventfd */
36 : 8 : int is_eventfd_link(int lfd)
37 : : {
38 : 8 : return is_anon_link_type(lfd, "[eventfd]");
39 : : }
40 : :
41 : 5 : static void pr_info_eventfd(char *action, EventfdFileEntry *efe)
42 : : {
43 : 5 : pr_info("%s: id %#08x flags %#04x counter %#016lx\n",
44 : : action, efe->id, efe->flags, efe->counter);
45 : 5 : }
46 : :
47 : 0 : void show_eventfds(int fd, struct cr_options *o)
48 : : {
49 : 0 : pb_show_plain(fd, PB_EVENTFD);
50 : 0 : }
51 : :
52 : : struct eventfd_dump_arg {
53 : : u32 id;
54 : : const struct fd_parms *p;
55 : : bool dumped;
56 : : };
57 : :
58 : 2 : static int dump_eventfd_entry(union fdinfo_entries *e, void *arg)
59 : : {
60 : 2 : struct eventfd_dump_arg *da = arg;
61 : :
62 [ - + ]: 2 : if (da->dumped) {
63 : 0 : pr_err("Several counters in a file?\n");
64 : 0 : return -1;
65 : : }
66 : :
67 : 2 : da->dumped = true;
68 : 2 : e->efd.id = da->id;
69 : 2 : e->efd.flags = da->p->flags;
70 : 2 : e->efd.fown = (FownEntry *)&da->p->fown;
71 : :
72 : 2 : pr_info_eventfd("Dumping ", &e->efd);
73 : 2 : return pb_write_one(fdset_fd(glob_fdset, CR_FD_EVENTFD),
74 : 2 : &e->efd, PB_EVENTFD);
75 : : }
76 : :
77 : 2 : static int dump_one_eventfd(int lfd, u32 id, const struct fd_parms *p)
78 : : {
79 : 2 : struct eventfd_dump_arg da = { .id = id, .p = p, };
80 : 2 : return parse_fdinfo(lfd, FD_TYPES__EVENTFD, dump_eventfd_entry, &da);
81 : : }
82 : :
83 : : static const struct fdtype_ops eventfd_ops = {
84 : : .type = FD_TYPES__EVENTFD,
85 : : .dump = dump_one_eventfd,
86 : : };
87 : :
88 : 2 : int dump_eventfd(struct fd_parms *p, int lfd, const struct cr_fdset *set)
89 : : {
90 : 2 : return do_dump_gen_file(p, lfd, &eventfd_ops, set);
91 : : }
92 : :
93 : 2 : static int eventfd_open(struct file_desc *d)
94 : : {
95 : : struct eventfd_file_info *info;
96 : : int tmp;
97 : :
98 : 2 : info = container_of(d, struct eventfd_file_info, d);
99 : :
100 : 2 : tmp = eventfd(info->efe->counter, 0);
101 [ - + ]: 2 : if (tmp < 0) {
102 : 0 : pr_perror("Can't create eventfd %#08x",
103 : : info->efe->id);
104 : 0 : return -1;
105 : : }
106 : :
107 [ - + ]: 2 : if (rst_file_params(tmp, info->efe->fown, info->efe->flags)) {
108 : 0 : pr_perror("Can't restore params on eventfd %#08x",
109 : : info->efe->id);
110 : : goto err_close;
111 : : }
112 : :
113 : : return tmp;
114 : :
115 : : err_close:
116 : 0 : close(tmp);
117 : 2 : return -1;
118 : : }
119 : :
120 : : static struct file_desc_ops eventfd_desc_ops = {
121 : : .type = FD_TYPES__EVENTFD,
122 : : .open = eventfd_open,
123 : : };
124 : :
125 : 3 : static int collect_one_efd(void *obj, ProtobufCMessage *msg)
126 : : {
127 : 3 : struct eventfd_file_info *info = obj;
128 : :
129 : 3 : info->efe = pb_msg(msg, EventfdFileEntry);
130 : 3 : file_desc_add(&info->d, info->efe->id, &eventfd_desc_ops);
131 : 3 : pr_info_eventfd("Collected ", info->efe);
132 : :
133 : 3 : return 0;
134 : : }
135 : :
136 : 355 : int collect_eventfd(void)
137 : : {
138 : 355 : return collect_image(CR_FD_EVENTFD, PB_EVENTFD,
139 : : sizeof(struct eventfd_file_info), collect_one_efd);
140 : 11 : }
|