#include "security-util.h"
#include "sockaddr-util.h"
#include "stream.h"
-#include "version.h"
#ifndef SO_RCVBUF
#undef DUMPER_SOCKET_BUFFERING
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);
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);
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);
}
/*