25 debugs(54, 5,
'[' <<
this <<
"] pathAddr=" << pathAddr);
30 debugs(54, 5,
'[' <<
this <<
']');
46 unlink(address.sun_path);
75 assert(pathAddr.size() != 0);
77 memset(&unixAddr, 0,
sizeof(unixAddr));
111 setTimeout(timeout,
"Ipc::UdsSender::noteTimeout");
125 Comm::Write(conn(), message.raw(), message.size(), writeHandler,
nullptr);
131 debugs(54, 5, params.
conn <<
" flag " << params.
flag <<
" retries " <<
retries <<
" [" <<
this <<
']');
145 eventAdd(
"Ipc::UdsSender::DelayedRetry",
147 new Pointer(
this), 1, 0,
false);
156 debugs(54, 9,
"stops sleeping");
167 CallJobHere(54, 4, us, UdsSender, delayedRetry);
186 mustStop(
"timedout");
197 struct sockaddr_storage addr;
199 if (
xgetsockname(conn->
fd,
reinterpret_cast<sockaddr*
>(&addr), &len) == 0) {
201 struct addrinfo* addr_info =
nullptr;
203 addr_info->ai_socktype = socktype;
204 addr_info->ai_protocol = protocol;
RefCount< AsyncCallT< Dialer > > asyncCall(int aDebugSection, int aDebugLevel, const char *aName, const Dialer &aDialer)
#define JobCallback(dbgSection, dbgLevel, Dialer, job, method)
Convenience macro to create a Dialer-based job callback.
void CallBack(const CodeContext::Pointer &callbackContext, Fun &&callback)
#define CBDATA_NAMESPACED_CLASS_INIT(namespace, type)
static void Start(const Pointer &job)
virtual bool doneAll() const
whether positive goal has been reached
virtual void start()
called by AsyncStart; do not call directly
Comm::Flag flag
comm layer result status.
Comm::ConnectionPointer conn
static void FreeAddr(struct addrinfo *&ai)
void getAddrInfo(struct addrinfo *&ai, int force=AF_UNSPEC) const
struct msghdr with a known type, fixed-size I/O and control buffers
void address(const struct sockaddr_un &addr)
sets [dest.] address
void setTimeout(time_t seconds, const char *handlerName)
call timedout() if no UDS messages in a given number of seconds
void noteTimeout(const CommTimeoutCbParams &p)
Comm timeout callback; calls timedout()
UdsOp(const String &pathAddr)
void setOptions(int newOptions)
changes socket options
void clearTimeout()
remove previously set timeout, if any
Comm::ConnectionPointer & conn()
creates if needed and returns raw UDS socket descriptor
struct sockaddr_un address
UDS address from path; treat as read-only.
attempts to send an IPC message a few times, with a timeout
void cancelSleep()
stop sleeping (or do nothing if we were not)
void start() override
called by AsyncStart; do not call directly
static void DelayedRetry(void *data)
legacy wrapper for Ipc::UdsSender::delayedRetry()
void delayedRetry()
make another sending attempt after a pause
void startSleep()
pause for a while before resending the message
void wrote(const CommIoCbParams ¶ms)
done writing or error
void timedout() override
called after setTimeout() if timed out
void write()
schedule writing
bool doneAll() const override
whether positive goal has been reached
TypedMsgHdr message
what to send
UdsSender(const String &pathAddr, const TypedMsgHdr &aMessage)
void commUnsetConnTimeout(const Comm::ConnectionPointer &conn)
void commSetConnTimeout(const Comm::ConnectionPointer &conn, time_t timeout, AsyncCall::Pointer &callback)
int comm_open_uds(int sock_type, int proto, struct sockaddr_un *addr, int flags)
Create a unix-domain socket (UDS) that only supports FD_MSGHDR I/O.
void comm_import_opened(const Comm::ConnectionPointer &conn, const char *note, struct addrinfo *AI)
update Comm state after getting a comm_open() FD from another process
#define debugs(SECTION, LEVEL, CONTENT)
void eventAdd(const char *name, EVH *func, void *arg, double when, int weight, bool cbdata)
bool IsConnOpen(const Comm::ConnectionPointer &conn)
void Write(const Comm::ConnectionPointer &conn, const char *buf, int size, AsyncCall::Pointer &callback, FREE *free_func)
FdNoteId
We cannot send char* FD notes to other processes. Pass int IDs and convert.
void SendMessage(const String &toAddress, const TypedMsgHdr &message)
struct sockaddr_un PathToAddress(const String &pathAddr)
converts human-readable filename path into UDS address
const Comm::ConnectionPointer & ImportFdIntoComm(const Comm::ConnectionPointer &conn, int socktype, int protocol, FdNoteId noteId)
import socket fd from another strand into our Comm state
const char * FdNote(int fdNodeId)
converts FdNoteId into a string
int xgetsockname(int socketFd, struct sockaddr *sa, socklen_t *saLength)
POSIX getsockname(2) equivalent.
const char * xstrerr(int error)
char * xstrncpy(char *dst, const char *src, size_t n)