No AF_UNIX on Windows and no SIGPIPE and SIGXCPU
This commit is contained in:

committed by
Love Hornquist Astrand

parent
246e60891c
commit
d84119813e
@@ -53,6 +53,8 @@ set_funcs(kadm5_server_context *c)
|
||||
SET(c, rename_principal);
|
||||
}
|
||||
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
|
||||
static void
|
||||
set_socket_name(krb5_context context, struct sockaddr_un *un)
|
||||
{
|
||||
@@ -61,7 +63,17 @@ set_socket_name(krb5_context context, struct sockaddr_un *un)
|
||||
memset(un, 0, sizeof(*un));
|
||||
un->sun_family = AF_UNIX;
|
||||
strlcpy (un->sun_path, fn, sizeof(un->sun_path));
|
||||
|
||||
}
|
||||
#else
|
||||
|
||||
static void
|
||||
set_socket_info(krb5_context context, struct addrinfo **info)
|
||||
{
|
||||
kadm5_log_signal_socket_info(context, 0, info);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static kadm5_ret_t
|
||||
find_db_spec(kadm5_server_context *ctx)
|
||||
@@ -115,7 +127,11 @@ find_db_spec(kadm5_server_context *ctx)
|
||||
if (ctx->log_context.log_file == NULL)
|
||||
asprintf(&ctx->log_context.log_file, "%s/log", hdb_db_dir(context));
|
||||
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
set_socket_name(context, &ctx->log_context.socket_name);
|
||||
#else
|
||||
set_socket_info(context, &ctx->log_context.socket_info);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -56,7 +56,13 @@ static void
|
||||
destroy_kadm5_log_context (kadm5_log_context *c)
|
||||
{
|
||||
free (c->log_file);
|
||||
close (c->socket_fd);
|
||||
closesocket (c->socket_fd);
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
if (c->socket_info) {
|
||||
freeaddrinfo(c->socket_info);
|
||||
c->socket_info = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -55,7 +55,11 @@ kadm5_s_init_with_context(krb5_context context,
|
||||
assert(ctx->config.stash_file != NULL);
|
||||
assert(ctx->config.acl_file != NULL);
|
||||
assert(ctx->log_context.log_file != NULL);
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
assert(ctx->log_context.socket_name.sun_path[0] != '\0');
|
||||
#else
|
||||
assert(ctx->log_context.socket_info != NULL);
|
||||
#endif
|
||||
|
||||
ret = hdb_create(ctx->context, &ctx->db, ctx->config.dbname);
|
||||
if(ret)
|
||||
@@ -67,7 +71,13 @@ kadm5_s_init_with_context(krb5_context context,
|
||||
|
||||
ctx->log_context.log_fd = -1;
|
||||
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
ctx->log_context.socket_fd = socket (AF_UNIX, SOCK_DGRAM, 0);
|
||||
#else
|
||||
ctx->log_context.socket_fd = socket (ctx->log_context.socket_info->ai_family,
|
||||
ctx->log_context.socket_info->ai_socktype,
|
||||
ctx->log_context.socket_info->ai_protocol);
|
||||
#endif
|
||||
|
||||
ret = krb5_parse_name(ctx->context, client_name, &ctx->caller);
|
||||
if(ret)
|
||||
|
@@ -63,7 +63,11 @@ setup_signal(void)
|
||||
#else
|
||||
signal(SIGINT, sigterm);
|
||||
signal(SIGTERM, sigterm);
|
||||
#ifndef NO_SIGXCPU
|
||||
signal(SIGXCPU, sigterm);
|
||||
#endif
|
||||
#ifndef NO_SIGPIPE
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
@@ -45,12 +45,13 @@ static int time_before_gone;
|
||||
|
||||
const char *master_hostname;
|
||||
|
||||
static int
|
||||
static SOCKET
|
||||
make_signal_socket (krb5_context context)
|
||||
{
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
struct sockaddr_un addr;
|
||||
const char *fn;
|
||||
int fd;
|
||||
SOCKET fd;
|
||||
|
||||
fn = kadm5_log_signal_socket(context);
|
||||
|
||||
@@ -64,18 +65,32 @@ make_signal_socket (krb5_context context)
|
||||
if (bind (fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
krb5_err (context, 1, errno, "bind %s", addr.sun_path);
|
||||
return fd;
|
||||
#else
|
||||
struct addrinfo *ai = NULL;
|
||||
SOCKET fd;
|
||||
|
||||
kadm5_log_signal_socket_info(context, 1, &ai);
|
||||
|
||||
fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||
if (IS_BAD_SOCKET(fd))
|
||||
krb5_err (context, 1, SOCK_ERRNO, "socket AF=%d", ai->ai_family);
|
||||
|
||||
if (IS_SOCKET_ERROR( bind (fd, ai->ai_addr, ai->ai_addrlen) ))
|
||||
krb5_err (context, 1, SOCK_ERRNO, "bind");
|
||||
return fd;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
static SOCKET
|
||||
make_listen_socket (krb5_context context, const char *port_str)
|
||||
{
|
||||
int fd;
|
||||
SOCKET fd;
|
||||
int one = 1;
|
||||
struct sockaddr_in addr;
|
||||
|
||||
fd = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (fd < 0)
|
||||
krb5_err (context, 1, errno, "socket AF_INET");
|
||||
if (IS_BAD_SOCKET(fd))
|
||||
krb5_err (context, 1, SOCK_ERRNO, "socket AF_INET");
|
||||
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
|
||||
memset (&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
@@ -105,7 +120,7 @@ make_listen_socket (krb5_context context, const char *port_str)
|
||||
}
|
||||
|
||||
struct slave {
|
||||
int fd;
|
||||
SOCKET fd;
|
||||
struct sockaddr_in addr;
|
||||
char *name;
|
||||
krb5_auth_context ac;
|
||||
@@ -180,9 +195,9 @@ slave_dead(krb5_context context, slave *s)
|
||||
{
|
||||
krb5_warnx(context, "slave %s dead", s->name);
|
||||
|
||||
if (s->fd >= 0) {
|
||||
close (s->fd);
|
||||
s->fd = -1;
|
||||
if (!IS_BAD_SOCKET(s->fd)) {
|
||||
closesocket (s->fd);
|
||||
s->fd = INVALID_SOCKET;
|
||||
}
|
||||
s->flags |= SLAVE_F_DEAD;
|
||||
slave_seen(s);
|
||||
@@ -193,8 +208,8 @@ remove_slave (krb5_context context, slave *s, slave **root)
|
||||
{
|
||||
slave **p;
|
||||
|
||||
if (s->fd >= 0)
|
||||
close (s->fd);
|
||||
if (!IS_BAD_SOCKET(s->fd))
|
||||
closesocket (s->fd);
|
||||
if (s->name)
|
||||
free (s->name);
|
||||
if (s->ac)
|
||||
@@ -209,7 +224,7 @@ remove_slave (krb5_context context, slave *s, slave **root)
|
||||
}
|
||||
|
||||
static void
|
||||
add_slave (krb5_context context, krb5_keytab keytab, slave **root, int fd)
|
||||
add_slave (krb5_context context, krb5_keytab keytab, slave **root, SOCKET fd)
|
||||
{
|
||||
krb5_principal server;
|
||||
krb5_error_code ret;
|
||||
@@ -228,7 +243,7 @@ add_slave (krb5_context context, krb5_keytab keytab, slave **root, int fd)
|
||||
|
||||
addr_len = sizeof(s->addr);
|
||||
s->fd = accept (fd, (struct sockaddr *)&s->addr, &addr_len);
|
||||
if (s->fd < 0) {
|
||||
if (IS_BAD_SOCKET(s->fd)) {
|
||||
krb5_warn (context, errno, "accept");
|
||||
goto error;
|
||||
}
|
||||
@@ -294,7 +309,7 @@ error:
|
||||
|
||||
struct prop_context {
|
||||
krb5_auth_context auth_context;
|
||||
int fd;
|
||||
SOCKET fd;
|
||||
};
|
||||
|
||||
static int
|
||||
@@ -744,7 +759,7 @@ main(int argc, char **argv)
|
||||
void *kadm_handle;
|
||||
kadm5_server_context *server_context;
|
||||
kadm5_config_params conf;
|
||||
int signal_fd, listen_fd;
|
||||
SOCKET signal_fd, listen_fd;
|
||||
int log_fd;
|
||||
slave *slaves = NULL;
|
||||
uint32_t current_version = 0, old_version = 0;
|
||||
@@ -880,7 +895,11 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (ret && FD_ISSET(signal_fd, &readset)) {
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
struct sockaddr_un peer_addr;
|
||||
#else
|
||||
struct sockaddr_storage peer_addr;
|
||||
#endif
|
||||
socklen_t peer_len = sizeof(peer_addr);
|
||||
|
||||
if(recvfrom(signal_fd, (void *)&vers, sizeof(vers), 0,
|
||||
@@ -931,8 +950,11 @@ main(int argc, char **argv)
|
||||
write_stats(context, slaves, current_version);
|
||||
}
|
||||
|
||||
if(exit_flag == SIGXCPU)
|
||||
if (0) ;
|
||||
#ifndef NO_SIGXCPU
|
||||
else if(exit_flag == SIGXCPU)
|
||||
krb5_warnx(context, "%s CPU time limit exceeded", getprogname());
|
||||
#endif
|
||||
else if(exit_flag == SIGINT || exit_flag == SIGTERM)
|
||||
krb5_warnx(context, "%s terminated", getprogname());
|
||||
else
|
||||
|
@@ -730,8 +730,11 @@ main(int argc, char **argv)
|
||||
reconnect = reconnect_max;
|
||||
}
|
||||
|
||||
if(exit_flag == SIGXCPU)
|
||||
if (0);
|
||||
#ifndef NO_SIGXCPU
|
||||
else if(exit_flag == SIGXCPU)
|
||||
krb5_warnx(context, "%s CPU time limit exceeded", getprogname());
|
||||
#endif
|
||||
else if(exit_flag == SIGINT || exit_flag == SIGTERM)
|
||||
krb5_warnx(context, "%s terminated", getprogname());
|
||||
else
|
||||
|
@@ -206,15 +206,25 @@ kadm5_log_flush (kadm5_log_context *log_context,
|
||||
krb5_data_free(&data);
|
||||
return errno;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to send a signal to any running `ipropd-master'
|
||||
*/
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
sendto (log_context->socket_fd,
|
||||
(void *)&log_context->version,
|
||||
sizeof(log_context->version),
|
||||
0,
|
||||
(struct sockaddr *)&log_context->socket_name,
|
||||
sizeof(log_context->socket_name));
|
||||
#else
|
||||
sendto (log_context->socket_fd,
|
||||
(void *)&log_context->version,
|
||||
sizeof(log_context->version),
|
||||
0,
|
||||
log_context->socket_info->ai_addr,
|
||||
log_context->socket_info->ai_addrlen);
|
||||
#endif
|
||||
|
||||
krb5_data_free(&data);
|
||||
return 0;
|
||||
@@ -970,6 +980,8 @@ kadm5_log_truncate (kadm5_server_context *server_context)
|
||||
|
||||
}
|
||||
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
|
||||
static char *default_signal = NULL;
|
||||
static HEIMDAL_MUTEX signal_mutex = HEIMDAL_MUTEX_INITIALIZER;
|
||||
|
||||
@@ -988,3 +1000,55 @@ kadm5_log_signal_socket(krb5_context context)
|
||||
"signal_socket",
|
||||
NULL);
|
||||
}
|
||||
|
||||
#else /* NO_UNIX_SOCKETS */
|
||||
|
||||
#define SIGNAL_SOCKET_HOST "127.0.0.1"
|
||||
#define SIGNAL_SOCKET_PORT "12701"
|
||||
|
||||
kadm5_ret_t
|
||||
kadm5_log_signal_socket_info(krb5_context context,
|
||||
int server_end,
|
||||
struct addrinfo **ret_addrs)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *addrs = NULL;
|
||||
kadm5_ret_t ret = KADM5_FAILURE;
|
||||
int wsret;
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
if (server_end)
|
||||
hints.ai_flags |= AI_PASSIVE;
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
|
||||
wsret = getaddrinfo(SIGNAL_SOCKET_HOST,
|
||||
SIGNAL_SOCKET_PORT,
|
||||
&hints, &addrs);
|
||||
|
||||
if (wsret != 0) {
|
||||
krb5_set_error_message(context, KADM5_FAILURE,
|
||||
"%s", gai_strerror(wsret));
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (addrs == NULL) {
|
||||
krb5_set_error_message(context, KADM5_FAILURE,
|
||||
"getaddrinfo() failed to return address list");
|
||||
goto done;
|
||||
}
|
||||
|
||||
*ret_addrs = addrs;
|
||||
addrs = NULL;
|
||||
ret = 0;
|
||||
|
||||
done:
|
||||
if (addrs)
|
||||
freeaddrinfo(addrs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -74,8 +74,12 @@ typedef struct kadm5_log_context {
|
||||
char *log_file;
|
||||
int log_fd;
|
||||
uint32_t version;
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
struct sockaddr_un socket_name;
|
||||
int socket_fd;
|
||||
#else
|
||||
struct addrinfo *socket_info;
|
||||
#endif
|
||||
SOCKET socket_fd;
|
||||
} kadm5_log_context;
|
||||
|
||||
typedef struct kadm5_server_context {
|
||||
|
Reference in New Issue
Block a user