#include "security-util.h"
#include "sockaddr-util.h"
#include "stream.h"
-#include "version.h"
#ifndef SO_RCVBUF
#undef DUMPER_SOCKET_BUFFERING
"BSD",
bsd_connect,
bsd_accept,
+ sec_get_authenticated_peer_name_hostname,
bsd_close,
udpbsd_sendpkt,
udp_recvpkt,
void * datap)
{
struct sec_handle *bh;
- struct servent *se;
in_port_t port = 0;
struct timeval sequence_time;
int sequence;
struct addrinfo *res, *res_addr;
char *canonname;
int result_bind;
+ char *service;
assert(hostname != NULL);
(void)conf_fn; /* Quiet unused parameter warning */
(void)datap; /* Quiet unused parameter warning */
- bh = alloc(SIZEOF(*bh));
+ bh = g_new0(struct sec_handle, 1);
bh->proto_handle=NULL;
security_handleinit(&bh->sech, &bsd_security_driver);
* Only init the IPv6 socket once
*/
if (res_addr->ai_addr->sa_family == AF_INET6 && not_init6 == 1) {
- uid_t euid;
dgram_zero(&netfd6.dgram);
- euid = geteuid();
set_root_privs(1);
result_bind = dgram_bind(&netfd6.dgram,
res_addr->ai_addr->sa_family, &port);
* Only init the IPv4 socket once
*/
if (res_addr->ai_addr->sa_family == AF_INET && not_init4 == 1) {
- uid_t euid;
dgram_zero(&netfd4.dgram);
- euid = geteuid();
set_root_privs(1);
result_bind = dgram_bind(&netfd4.dgram,
res_addr->ai_addr->sa_family, &port);
bh->udp = &netfd4;
auth_debug(1, _("Resolved hostname=%s\n"), canonname);
- if ((se = getservbyname(AMANDA_SERVICE_NAME, "udp")) == NULL)
- port = AMANDA_SERVICE_DEFAULT;
- else
- port = (in_port_t)ntohs(se->s_port);
+
+ if (conf_fn) {
+ service = conf_fn("client_port", datap);
+ if (!service || strlen(service) <= 1)
+ service = "amanda";
+ } else {
+ service = "amanda";
+ }
+ port = find_port_for_service(service, "udp");
+ if (port == 0) {
+ security_seterror(&bh->sech, _("%s/udp unknown protocol"), service);
+ (*fn)(arg, &bh->sech, S_ERROR);
+ amfree(canonname);
+ return;
+ }
+
amanda_gettimeofday(&sequence_time);
sequence = (int)sequence_time.tv_sec ^ (int)sequence_time.tv_usec;
handle=alloc(15);
void (*fn)(security_handle_t *, pkt_t *),
void *datap)
{
+ struct stat sbuf;
assert(in >= 0 && out >= 0);
assert(fn != NULL);
netfd4.prefix_packet = &bsd_prefix_packet;
netfd4.driver = &bsd_security_driver;
- udp_addref(&netfd4, &udp_netfd_read_callback);
+ /* check if in is a socket */
+ fstat(in, &sbuf);
+ if (S_ISSOCK(sbuf.st_mode)) {
+ udp_addref(&netfd4, &udp_netfd_read_callback);
+ } else {
+ g_warning("input file descriptor is not a socket; cannot use BSD auth");
+ }
}
/*
assert(bh != NULL);
- bs = alloc(SIZEOF(*bs));
+ bs = g_new0(struct sec_stream, 1);
security_streaminit(&bs->secstr, &bsd_security_driver);
bs->socket = stream_server(SU_GET_FAMILY(&bh->udp->peer), &bs->port,
(size_t)STREAM_BUFSIZE, (size_t)STREAM_BUFSIZE,
assert(bh != NULL);
- bs = alloc(SIZEOF(*bs));
+ bs = g_new0(struct sec_stream, 1);
security_streaminit(&bs->secstr, &bsd_security_driver);
bs->fd = stream_client(bh->hostname, (in_port_t)id,
STREAM_BUFSIZE, STREAM_BUFSIZE, &bs->port, 0);
bs->arg = arg;
}
+/* buffer for bsd_stream_read_sync function */
+static ssize_t sync_pktlen;
+static void *sync_pkt;
+
/*
* Read a chunk of data to a stream. Blocks until completion.
*/
if(bs->ev_read != NULL) {
return -1;
}
+ sync_pktlen = 0;
+ sync_pkt = NULL;
bs->ev_read = event_register((event_id_t)bs->fd, EV_READFD,
stream_read_sync_callback, bs);
event_wait(bs->ev_read);
- *buf = bs->databuf;
- return (bs->len);
+ *buf = sync_pkt;
+ return (sync_pktlen);
}
if (n < 0)
security_stream_seterror(&bs->secstr, "%s", strerror(errno));
bs->len = n;
+ sync_pktlen = bs->len;
+ sync_pkt = malloc(sync_pktlen);
+ memcpy(sync_pkt, bs->databuf, sync_pktlen);
}
/*