]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/TypedMsgHdr.h
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / ipc / TypedMsgHdr.h
CommitLineData
98d9bd29 1/*
77b1029d 2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
98d9bd29 3 *
bbc27441
AJ
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
98d9bd29
AR
7 */
8
bbc27441
AJ
9/* DEBUG: section 54 Interprocess Communication */
10
98d9bd29
AR
11#ifndef SQUID_IPC_TYPED_MSG_HDR_H
12#define SQUID_IPC_TYPED_MSG_HDR_H
13
5a7908bb 14#include "compat/cmsg.h"
9614899c 15#if HAVE_SYS_SOCKET_H
98d9bd29 16#include <sys/socket.h>
9614899c
AJ
17#endif
18#if HAVE_SYS_UIO_H
19#include <sys/uio.h>
20#endif
98d9bd29
AR
21#if HAVE_SYS_UN_H
22#include <sys/un.h>
23#endif
24
8822ebee
AR
25class String;
26
98d9bd29
AR
27namespace Ipc
28{
29
30/// struct msghdr with a known type, fixed-size I/O and control buffers
31class TypedMsgHdr: public msghdr
32{
8822ebee
AR
33public:
34 enum {maxSize = 4096};
35
98d9bd29
AR
36public:
37 TypedMsgHdr();
38 TypedMsgHdr(const TypedMsgHdr &tmh);
39 TypedMsgHdr &operator =(const TypedMsgHdr &tmh);
40
8822ebee
AR
41 void address(const struct sockaddr_un &addr); ///< sets [dest.] address
42
43 /* message type manipulation; these must be called before put/get*() */
44 void setType(int aType); ///< sets message type; use MessageType enum
45 void checkType(int aType) const; ///< throws if stored type is not aType
98d9bd29 46 int type() const; ///< returns stored type or zero if none
8822ebee
AR
47
48 /* access for Plain Old Data (POD)-based message parts */
49 template <class Pod>
50 void getPod(Pod &pod) const { getFixed(&pod, sizeof(pod)); } ///< load POD
51 template <class Pod>
52 void putPod(const Pod &pod) { putFixed(&pod, sizeof(pod)); } ///< store POD
53
54 /* access to message parts for selected commonly-used part types */
55 void getString(String &s) const; ///< load variable-length string
56 void putString(const String &s); ///< store variable-length string
57 int getInt() const; ///< load an integer
58 void putInt(int n); ///< store an integer
59 void getFixed(void *raw, size_t size) const; ///< always load size bytes
60 void putFixed(const void *raw, size_t size); ///< always store size bytes
61
62 /// returns true if there is data to extract; handy for optional parts
63 bool hasMoreData() const { return offset < data.size; }
64
65 /* access to a "file" descriptor that can be passed between processes */
5667a628 66 void putFd(int aFd); ///< stores descriptor
9b440559
CT
67 int getFd() const; ///< returns stored descriptor
68 bool hasFd() const; ///< whether the message has a descriptor stored
98d9bd29 69
8822ebee 70 /* raw, type-independent access for I/O */
5667a628
AR
71 void prepForReading(); ///< reset and provide all buffers
72 char *raw() { return reinterpret_cast<char*>(this); }
73 const char *raw() const { return reinterpret_cast<const char*>(this); }
98d9bd29
AR
74 size_t size() const { return sizeof(*this); } ///< not true message size
75
76private:
b56b37cf 77 void clear();
5667a628
AR
78 void sync();
79 void allocData();
80 void allocName();
81 void allocControl();
98d9bd29 82
8822ebee
AR
83 /* raw, type-independent manipulation used by type-specific methods */
84 void getRaw(void *raw, size_t size) const;
85 void putRaw(const void *raw, size_t size);
86
98d9bd29 87private:
5667a628 88 struct sockaddr_un name; ///< same as .msg_name
98d9bd29 89
5667a628 90 struct iovec ios[1]; ///< same as .msg_iov[]
98d9bd29 91
5667a628 92 struct DataBuffer {
b56b37cf
AJ
93 DataBuffer() { memset(raw, 0, sizeof(raw)); }
94
95 int type_ = 0; ///< Message kind, uses MessageType values
96 size_t size = 0; ///< actual raw data size (for sanity checks)
8822ebee 97 char raw[maxSize]; ///< buffer with type-specific data
5667a628 98 } data; ///< same as .msg_iov[0].iov_base
98d9bd29 99
5667a628 100 struct CtrlBuffer {
b56b37cf
AJ
101 CtrlBuffer() { memset(raw, 0, sizeof(raw)); }
102
14c0d3ab
DK
103 /// control buffer space for one fd
104 char raw[SQUID_CMSG_SPACE(sizeof(int))];
5667a628 105 } ctrl; ///< same as .msg_control
8822ebee
AR
106
107 /// data offset for the next get/put*() to start with
b56b37cf 108 mutable unsigned int offset = 0;
98d9bd29
AR
109};
110
111} // namespace Ipc
112
113#endif /* SQUID_IPC_TYPED_MSG_HDR_H */
f53969cc 114