44 #include <sys/socket.h>
45 #include <netinet/in.h>
46 #include <arpa/inet.h>
76 const char *myname =
"qmqpd_peer_init";
77 struct sockaddr_storage ss;
82 sa = (
struct sockaddr *) &ss;
83 sa_length =
sizeof(ss);
95 if (errno != 0 && errno != ENOTSOCK) {
112 && (sa->sa_family == AF_INET
114 || sa->sa_family == AF_INET6
126 if (strchr((
char *) proto_info->
sa_family_list, sa->sa_family) == 0)
127 msg_fatal(
"cannot handle socket type %s with \"%s = %s\"",
129 sa->sa_family == AF_INET6 ?
"AF_INET6" :
131 sa->sa_family == AF_INET ?
"AF_INET" :
139 msg_error(
"incorrect QMQP server privileges: uid=%lu euid=%lu",
140 (
unsigned long) getuid(), (
unsigned long) geteuid());
141 msg_fatal(
"the Postfix QMQP server must run with $%s privileges",
149 &client_port, 0)) != 0)
150 msg_fatal(
"%s: cannot convert client address/port to string: %s",
159 if (strchr(client_addr.
buf,
'%') != 0)
160 msg_panic(
"%s: address %s has datalink suffix",
161 myname, client_addr.
buf);
171 if (sa->sa_family == AF_INET6) {
173 && IN6_IS_ADDR_V4MAPPED(&SOCK_ADDR_IN6_ADDR(sa))
174 && (colonp = strrchr(client_addr.
buf,
':')) != 0) {
175 struct addrinfo *res0;
178 msg_info(
"%s: rewriting V4-mapped address \"%s\" to \"%s\"",
179 myname, client_addr.
buf, colonp + 1);
186 msg_fatal(
"%s: cannot convert %s from string to binary: %s",
188 sa_length = res0->ai_addrlen;
189 if (sa_length >
sizeof(ss))
190 sa_length =
sizeof(ss);
191 memcpy((
void *) sa, res0->ai_addr, sa_length);
231 #define REJECT_PEER_NAME(state) { \
232 myfree(state->name); \
233 state->name = mystrdup(CLIENT_NAME_UNKNOWN); \
240 struct addrinfo *res0;
241 struct addrinfo *res;
249 (
char *) 0, 0, &res0);
251 msg_warn(
"hostname %s does not resolve to address %s: %s",
255 for (res = res0; ; res = res->ai_next) {
257 msg_warn(
"hostname %s does not resolve to address %s",
262 if (strchr((
char *) proto_info->
sa_family_list, res->ai_family) == 0) {
263 msg_info(
"skipping address family %d for host %s",
264 res->ai_family, state->
name);
293 state->
port, (
char *) 0);
#define REJECT_PEER_NAME(state)
void msg_error(const char *fmt,...)
void qmqpd_peer_reset(QMQPD_STATE *state)
void freeaddrinfo(struct addrinfo *ai)
char * mystrdup(const char *str)
int sock_addr_cmp_addr(const struct sockaddr *sa, const struct sockaddr *sb)
NORETURN msg_panic(const char *fmt,...)
#define inet_proto_info()
bool var_qmqpd_client_port_log
int hostaddr_to_sockaddr(const char *hostaddr, const char *service, int socktype, struct addrinfo **res)
int sockaddr_to_hostaddr(const struct sockaddr *sa, SOCKADDR_SIZE salen, MAI_HOSTADDR_STR *hostaddr, MAI_SERVPORT_STR *portnum, int unused_socktype)
char buf[MAI_HOSTADDR_STRSIZE]
int hostname_to_sockaddr_pf(const char *hostname, int pf, const char *service, int socktype, struct addrinfo **res)
void msg_warn(const char *fmt,...)
unsigned char * sa_family_list
#define VAR_INET_PROTOCOLS
void qmqpd_peer_init(QMQPD_STATE *state)
NORETURN msg_fatal(const char *fmt,...)
#define CLIENT_NAME_UNKNOWN
char * concatenate(const char *arg0,...)
char buf[MAI_HOSTNAME_STRSIZE]
#define CLIENT_ADDR_UNKNOWN
#define vstream_fileno(vp)
char * var_inet_protocols
char buf[MAI_SERVPORT_STRSIZE]
#define CLIENT_PORT_UNKNOWN
int sockaddr_to_hostname(const struct sockaddr *sa, SOCKADDR_SIZE salen, MAI_HOSTNAME_STR *hostname, MAI_SERVNAME_STR *service, int socktype)
void msg_info(const char *fmt,...)