Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * dhcpcd - DHCP client daemon
      3  * SPDX-License-Identifier: BSD-2-Clause
      4  * Copyright (c) 2006-2025 Roy Marples <roy (at) marples.name>
      5  * All rights reserved
      6 
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #ifndef CONTROL_H
     30 #define CONTROL_H
     31 
     32 #include <sys/socket.h>
     33 
     34 #include <stdbool.h>
     35 
     36 #include "queue.h"
     37 
     38 #if !defined(CTL_FREE_LIST)
     39 #define CTL_FREE_LIST 1
     40 #elif CTL_FREE_LIST == 0
     41 #undef CTL_FREE_LIST
     42 #endif
     43 
     44 /* Maximum number of control socket users */
     45 #define CONTROL_PEER_MAX 10
     46 
     47 /* Limit queue size per fd */
     48 #define CONTROL_QUEUE_MAX 100
     49 
     50 struct fd_data {
     51 	TAILQ_ENTRY(fd_data) next;
     52 	void *data;
     53 	size_t data_size;
     54 	size_t data_len;
     55 	unsigned int data_flags;
     56 #define FD_DATA_SENDLEN 0x01
     57 #ifdef PRIVSEP
     58 	unsigned int data_peer_id;
     59 #endif
     60 };
     61 TAILQ_HEAD(fd_data_head, fd_data);
     62 
     63 struct fd_list {
     64 	TAILQ_ENTRY(fd_list) next;
     65 	struct dhcpcd_ctx *ctx;
     66 	int fd;
     67 	unsigned int flags;
     68 	struct fd_data_head queue;
     69 #ifdef CTL_FREE_LIST
     70 	struct fd_data_head free_queue;
     71 #endif
     72 #ifdef PRIVSEP
     73 	unsigned int id;
     74 	unsigned int peer_id;
     75 #endif
     76 };
     77 TAILQ_HEAD(fd_list_head, fd_list);
     78 
     79 #define FD_READ	   0x01U
     80 #define FD_CONTROL 0x02U
     81 #define FD_COMMAND 0x04U
     82 #define FD_LISTEN  0x08U
     83 
     84 int control_start(struct dhcpcd_ctx *, const char *, sa_family_t);
     85 int control_stop(struct dhcpcd_ctx *);
     86 int control_open(const char *, sa_family_t);
     87 ssize_t control_send(struct dhcpcd_ctx *, int, char *const *);
     88 struct fd_list *control_find(struct dhcpcd_ctx *, int);
     89 struct fd_list *control_new(struct dhcpcd_ctx *, int, unsigned int);
     90 void control_free(struct fd_list *);
     91 void control_delete(struct fd_list *);
     92 ssize_t control_queuef(struct fd_list *, const void *, size_t, unsigned int);
     93 ssize_t control_queue(struct fd_list *, const void *, size_t);
     94 int control_recvmsg(struct fd_list *, struct msghdr *, size_t);
     95 int control_user_ingroup(uid_t, gid_t, gid_t);
     96 ssize_t control_handle_listen(struct fd_list *);
     97 #endif
     98