Lines Matching +full:ctrl +full:- +full:b

3 /*-
80 # define BL_INIT(b) pthread_mutex_init(&b->b_mutex, NULL) argument
81 # define BL_LOCK(b) pthread_mutex_lock(&b->b_mutex) argument
82 # define BL_UNLOCK(b) pthread_mutex_unlock(&b->b_mutex) argument
84 # define BL_INIT(b) do {} while(/*CONSTCOND*/0)
85 # define BL_LOCK(b) BL_INIT(b)
86 # define BL_UNLOCK(b) BL_INIT(b)
99 bl_isconnected(bl_t b) in bl_isconnected() argument
101 return b->b_connected == 0; in bl_isconnected()
105 bl_getfd(bl_t b) in bl_getfd() argument
107 return b->b_fd; in bl_getfd()
111 bl_reset(bl_t b, bool locked) in bl_reset() argument
115 BL_LOCK(b); in bl_reset()
116 close(b->b_fd); in bl_reset()
118 b->b_fd = -1; in bl_reset()
119 b->b_connected = -1; in bl_reset()
121 BL_UNLOCK(b); in bl_reset()
125 bl_log(bl_t b, int level, const char *fmt, ...) in bl_log() argument
130 if (b->b_fun == NULL) in bl_log()
134 (*b->b_fun)(level, &b->b_syslog_data, fmt, ap); in bl_log()
140 bl_init(bl_t b, bool srv) in bl_init() argument
146 struct sockaddr_un *sun = &b->b_sun; in bl_init()
158 BL_LOCK(b); in bl_init()
160 if (b->b_fd == -1) { in bl_init()
161 b->b_fd = socket(PF_LOCAL, in bl_init()
163 if (b->b_fd == -1) { in bl_init()
164 bl_log(b, LOG_ERR, "%s: socket failed (%s)", in bl_init()
166 BL_UNLOCK(b); in bl_init()
167 return -1; in bl_init()
170 fcntl(b->b_fd, F_SETFD, FD_CLOEXEC); in bl_init()
173 fcntl(b->b_fd, F_SETFL, fcntl(b->b_fd, F_GETFL) | O_NONBLOCK); in bl_init()
178 setsockopt(b->b_fd, SOL_SOCKET, SO_NOSIGPIPE, &o, sizeof(o)); in bl_init()
185 if (bl_isconnected(b)) { in bl_init()
186 BL_UNLOCK(b); in bl_init()
195 rv = connect(b->b_fd, (const void *)sun, (socklen_t)sizeof(*sun)); in bl_init()
198 bl_log(b, LOG_ERR, in bl_init()
200 __func__, sun->sun_path); in bl_init()
210 if (b->b_connected != 1) { in bl_init()
211 bl_log(b, LOG_DEBUG, in bl_init()
213 __func__, sun->sun_path, strerror(errno)); in bl_init()
214 b->b_connected = 1; in bl_init()
216 BL_UNLOCK(b); in bl_init()
217 return -1; in bl_init()
219 bl_log(b, LOG_DEBUG, "Connected to blacklist server", __func__); in bl_init()
223 (void)unlink(sun->sun_path); in bl_init()
225 rv = bind(b->b_fd, (const void *)sun, (socklen_t)sizeof(*sun)); in bl_init()
229 if (rv == -1) { in bl_init()
230 bl_log(b, LOG_ERR, "%s: bind failed for `%s' (%s)", in bl_init()
231 __func__, sun->sun_path, strerror(errno)); in bl_init()
236 b->b_connected = 0; in bl_init()
241 #define CRED_SC_UID(x) (x)->sc_euid in bl_init()
242 #define CRED_SC_GID(x) (x)->sc_egid in bl_init()
250 #define CRED_SC_UID(x) (x)->uid in bl_init()
251 #define CRED_SC_GID(x) (x)->gid in bl_init()
276 if (setsockopt(b->b_fd, CRED_LEVEL, CRED_NAME, in bl_init()
277 &one, (socklen_t)sizeof(one)) == -1) { in bl_init()
278 bl_log(b, LOG_ERR, "%s: setsockopt %s " in bl_init()
285 BL_UNLOCK(b); in bl_init()
288 bl_reset(b, true); in bl_init()
289 BL_UNLOCK(b); in bl_init()
290 return -1; in bl_init()
298 bl_t b = calloc(1, sizeof(*b)); in bl_create() local
299 if (b == NULL) in bl_create()
301 b->b_fun = fun; in bl_create()
302 b->b_syslog_data = sd; in bl_create()
303 b->b_fd = -1; in bl_create()
304 b->b_connected = -1; in bl_create()
305 BL_INIT(b); in bl_create()
307 memset(&b->b_sun, 0, sizeof(b->b_sun)); in bl_create()
308 b->b_sun.sun_family = AF_LOCAL; in bl_create()
310 b->b_sun.sun_len = sizeof(b->b_sun); in bl_create()
312 strlcpy(b->b_sun.sun_path, in bl_create()
313 path ? path : _PATH_BLSOCK, sizeof(b->b_sun.sun_path)); in bl_create()
315 bl_init(b, srv); in bl_create()
316 return b; in bl_create()
320 bl_destroy(bl_t b) in bl_destroy() argument
322 bl_reset(b, false); in bl_destroy()
323 free(b); in bl_destroy()
327 bl_getsock(bl_t b, struct sockaddr_storage *ss, const struct sockaddr *sa, in bl_getsock() argument
344 bl_log(b, LOG_ERR, "%s: invalid socket len %u (%s)", in bl_getsock()
347 return -1; in bl_getsock()
352 if (ss->ss_family != family) { in bl_getsock()
353 bl_log(b, LOG_INFO, in bl_getsock()
355 __func__, ss->ss_family, family, ctx); in bl_getsock()
356 ss->ss_family = family; in bl_getsock()
360 if (ss->ss_len != slen) { in bl_getsock()
361 bl_log(b, LOG_INFO, in bl_getsock()
363 __func__, ss->ss_len, (unsigned)slen, ctx); in bl_getsock()
364 ss->ss_len = (uint8_t)slen; in bl_getsock()
371 bl_send(bl_t b, bl_type_t e, int pfd, const struct sockaddr *sa, in bl_send() argument
377 char ctrl[CMSG_SPACE(sizeof(int))]; in bl_send() member
398 if (bl_getsock(b, &ub.bl.bl_ss, sa, slen, ctx) == -1) in bl_send()
399 return -1; in bl_send()
411 msg.msg_control = ua.ctrl; in bl_send()
412 msg.msg_controllen = sizeof(ua.ctrl); in bl_send()
415 cmsg->cmsg_len = CMSG_LEN(sizeof(int)); in bl_send()
416 cmsg->cmsg_level = SOL_SOCKET; in bl_send()
417 cmsg->cmsg_type = SCM_RIGHTS; in bl_send()
423 if (bl_init(b, false) == -1) in bl_send()
424 return -1; in bl_send()
426 if ((sendmsg(b->b_fd, &msg, 0) == -1) && tried++ < NTRIES) { in bl_send()
427 bl_reset(b, false); in bl_send()
430 return tried >= NTRIES ? -1 : 0; in bl_send()
434 bl_recv(bl_t b) in bl_recv() argument
439 char ctrl[CMSG_SPACE(sizeof(int)) + CMSG_SPACE(CRED_SIZE)]; in bl_recv() member
453 bl_info_t *bi = &b->b_info; in bl_recv()
467 msg.msg_control = ua.ctrl; in bl_recv()
468 msg.msg_controllen = sizeof(ua.ctrl); in bl_recv()
470 rlen = recvmsg(b->b_fd, &msg, 0); in bl_recv()
471 if (rlen == -1) { in bl_recv()
472 bl_log(b, LOG_ERR, "%s: recvmsg failed (%s)", __func__, in bl_recv()
478 if (cmsg->cmsg_level != SOL_SOCKET) { in bl_recv()
479 bl_log(b, LOG_ERR, in bl_recv()
481 __func__, cmsg->cmsg_level); in bl_recv()
484 switch (cmsg->cmsg_type) { in bl_recv()
486 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { in bl_recv()
488 size_t len = cmsg->cmsg_len / sizeof(int); in bl_recv()
489 bl_log(b, LOG_ERR, in bl_recv()
491 __func__, cmsg->cmsg_len, in bl_recv()
498 memcpy(&bi->bi_fd, CMSG_DATA(cmsg), sizeof(bi->bi_fd)); in bl_recv()
504 bi->bi_uid = CRED_SC_UID(sc); in bl_recv()
505 bi->bi_gid = CRED_SC_GID(sc); in bl_recv()
510 bl_log(b, LOG_ERR, in bl_recv()
512 __func__, cmsg->cmsg_type); in bl_recv()
519 bl_log(b, LOG_ERR, "message missing %s %s", in bl_recv()
529 bl_log(b, LOG_ERR, "message too short %zd", rlen); in bl_recv()
532 rem -= sizeof(ub.bl); in bl_recv()
535 bl_log(b, LOG_ERR, "bad version %d", ub.bl.bl_version); in bl_recv()
539 bi->bi_type = ub.bl.bl_type; in bl_recv()
540 bi->bi_slen = ub.bl.bl_salen; in bl_recv()
541 bi->bi_ss = ub.bl.bl_ss; in bl_recv()
543 bi->bi_uid = -1; in bl_recv()
544 bi->bi_gid = -1; in bl_recv()
547 bi->bi_msg[0] = '\0'; in bl_recv()
549 rem = MIN(sizeof(bi->bi_msg) - 1, rem); in bl_recv()
550 memcpy(bi->bi_msg, ub.bl.bl_data, rem); in bl_recv()
551 bi->bi_msg[rem] = '\0'; in bl_recv()