1 /* Copyright (C) 2009 Pierre-Marc Fournier
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include <sys/types.h>
23 #include <urcu/list.h>
25 #include <ust/kcompat/kcompat.h>
27 #define SOCK_DIR "/tmp/ust-app-socks"
30 struct cds_list_head list
;
35 struct ustcomm_header
{
42 #define USTCOMM_BUFFER_SIZE ((1 << 12) - sizeof(struct ustcomm_header))
44 /* Specify a sata size that leaves margin at the end of a buffer
45 * in order to make sure that we never have more data than
46 * will fit in the buffer AND that the last chars (due to a
47 * pre-receive memset) will always be 0, terminating any string
49 #define USTCOMM_DATA_SIZE (USTCOMM_BUFFER_SIZE - 20 * sizeof(void *))
51 enum tracectl_commands
{
60 GET_BUF_SHMID_PIPE_FD
,
81 struct ustcomm_trace_info
{
83 char data
[USTCOMM_DATA_SIZE
];
86 struct ustcomm_channel_info
{
89 unsigned int subbuf_size
;
90 unsigned int subbuf_num
;
91 char data
[USTCOMM_DATA_SIZE
];
94 struct ustcomm_buffer_info
{
100 int buf_struct_shmid
;
102 char data
[USTCOMM_DATA_SIZE
];
105 struct ustcomm_marker_info
{
109 char data
[USTCOMM_DATA_SIZE
];
112 struct ustcomm_sock_path
{
114 char data
[USTCOMM_DATA_SIZE
];
117 struct ustcomm_pidunique
{
121 struct ustcomm_notify_buf_mapped
{
122 char data
[USTCOMM_DATA_SIZE
];
125 /* Ensure directory existence, usefull for unix sockets */
126 extern int ensure_dir_exists(const char *dir
);
128 /* Create and delete sockets */
129 extern struct ustcomm_sock
* ustcomm_init_sock(int fd
, int epoll_fd
,
130 struct cds_list_head
*list
);
131 extern void ustcomm_del_sock(struct ustcomm_sock
*sock
, int keep_in_epoll
);
133 /* Create and delete named sockets */
134 extern struct ustcomm_sock
* ustcomm_init_named_socket(const char *name
,
136 extern void ustcomm_del_named_sock(struct ustcomm_sock
*sock
,
137 int keep_socket_file
);
139 /* Send and receive functions for file descriptors */
140 extern int ustcomm_send_fd(int sock
, const struct ustcomm_header
*header
,
141 const char *data
, int *fd
);
142 extern int ustcomm_recv_fd(int sock
, struct ustcomm_header
*header
,
143 char *data
, int *fd
);
145 /* Normal send and receive functions */
146 extern int ustcomm_send(int sock
, const struct ustcomm_header
*header
,
148 extern int ustcomm_recv(int sock
, struct ustcomm_header
*header
,
151 /* Receive and allocate data, not to be used inside libust */
152 extern int ustcomm_recv_alloc(int sock
,
153 struct ustcomm_header
*header
,
156 /* Request function, send and receive */
157 extern int ustcomm_req(int sock
,
158 const struct ustcomm_header
*req_header
,
159 const char *req_data
,
160 struct ustcomm_header
*res_header
,
163 extern int ustcomm_request_consumer(pid_t pid
, const char *channel
);
164 extern int ustcomm_connect_app(pid_t pid
, int *app_fd
);
165 extern int ustcomm_connect_path(const char *path
, int *connection_fd
);
167 extern int nth_token_is(const char *str
, const char *token
, int tok_no
);
169 extern char *nth_token(const char *str
, int tok_no
);
171 /* String serialising functions, printf straight into a buffer */
172 #define USTCOMM_POISON_PTR (void *)0x19831018
174 extern char * ustcomm_print_data(char *data_field
, int field_size
,
175 int *offset
, const char *format
, ...);
176 extern char * ustcomm_restore_ptr(char *ptr
, char *data_field
,
177 int data_field_size
);
179 #define COMPUTE_MSG_SIZE(struct_ptr, offset) \
180 (size_t) (long)(struct_ptr)->data - (long)(struct_ptr) + (offset)
182 /* Packing and unpacking functions, making life easier */
183 extern int ustcomm_pack_trace_info(struct ustcomm_header
*header
,
184 struct ustcomm_trace_info
*trace_inf
,
187 extern int ustcomm_unpack_trace_info(struct ustcomm_trace_info
*trace_inf
);
189 extern int ustcomm_pack_channel_info(struct ustcomm_header
*header
,
190 struct ustcomm_channel_info
*ch_inf
,
192 const char *channel
);
194 extern int ustcomm_unpack_channel_info(struct ustcomm_channel_info
*ch_inf
);
196 extern int ustcomm_pack_buffer_info(struct ustcomm_header
*header
,
197 struct ustcomm_buffer_info
*buf_inf
,
202 extern int ustcomm_unpack_buffer_info(struct ustcomm_buffer_info
*buf_inf
);
204 extern int ustcomm_pack_marker_info(struct ustcomm_header
*header
,
205 struct ustcomm_marker_info
*marker_inf
,
210 extern int ustcomm_unpack_marker_info(struct ustcomm_marker_info
*marker_inf
);
213 extern int ustcomm_pack_sock_path(struct ustcomm_header
*header
,
214 struct ustcomm_sock_path
*sock_path_inf
,
215 const char *socket_path
);
217 extern int ustcomm_unpack_sock_path(struct ustcomm_sock_path
*sock_path_inf
);
219 #endif /* USTCOMM_H */