#include "util.h"
#include "event.h"
#include "packet.h"
-#include "queue.h"
#include "security.h"
#include "security-util.h"
#include "stream.h"
-#include "version.h"
#include "sockaddr-util.h"
/*
/*
* This is a queue of open connections
*/
-struct connq_s connq = {
- TAILQ_HEAD_INITIALIZER(connq.tailq), 0
-};
+GSList *connq = NULL;
static int newhandle = 1;
static int newevent = 1;
rs->arg = arg;
}
+/* buffer for tcpm_stream_read_sync function */
+static ssize_t sync_pktlen;
+static void *sync_pkt;
+
/*
* Write a chunk of data to a stream. Blocks until completion.
*/
if (rs->ev_read != NULL) {
return -1;
}
+ sync_pktlen = 0;
+ sync_pkt = NULL;
rs->ev_read = event_register((event_id_t)rs->rc->event_id, EV_WAIT,
stream_read_sync_callback, rs);
sec_tcp_conn_read(rs->rc);
event_wait(rs->ev_read);
- *buf = rs->rc->pkt;
- return (rs->rc->pktlen);
+ /* Can't use rs or rc, they can be freed */
+ *buf = sync_pkt;
+ return (sync_pktlen);
}
/*
int rval;
char *encbuf;
ssize_t encsize;
+ int save_errno;
assert(SIZEOF(netlength) == 4);
}
rval = full_writev(fd, iov, nb_iov);
+ save_errno = errno;
if (len != 0 && rc->driver->data_encrypt != NULL && buf != encbuf) {
amfree(encbuf);
}
if (rval < 0) {
if (errmsg)
*errmsg = newvstrallocf(*errmsg, _("write error to: %s"),
- strerror(errno));
+ strerror(save_errno));
return (-1);
}
return (0);
if (pkt->type != P_REQ)
return "";
- if ((pwd = getpwuid(getuid())) == NULL) {
+ if ((pwd = getpwuid(geteuid())) == NULL) {
security_seterror(&rh->sech,
_("can't get login name for my uid %ld"),
- (long)getuid());
+ (long)geteuid());
return "";
}
buf = alloc(16+strlen(pwd->pw_name));
const char *hostname,
int want_new)
{
- struct tcp_conn *rc;
+ GSList *iter;
+ struct tcp_conn *rc = NULL;
auth_debug(1, _("sec_tcp_conn_get: %s\n"), hostname);
if (want_new == 0) {
- for (rc = connq_first(); rc != NULL; rc = connq_next(rc)) {
+ for (iter = connq; iter != NULL; iter = iter->next) {
+ rc = (struct tcp_conn *)iter->data;
if (strcasecmp(hostname, rc->hostname) == 0)
break;
}
- if (rc != NULL) {
+ if (iter != NULL) {
rc->refcnt++;
auth_debug(1,
_("sec_tcp_conn_get: exists, refcnt to %s is now %d\n"),
rc->conf_fn = NULL;
rc->datap = NULL;
rc->event_id = newevent++;
- connq_append(rc);
+ connq = g_slist_append(connq, rc);
return (rc);
}
event_release(rc->ev_read);
if (rc->errmsg != NULL)
amfree(rc->errmsg);
- connq_remove(rc);
+ connq = g_slist_remove(connq, rc);
amfree(rc->pkt);
if(!rc->donotclose) {
/* amfree(rc) */
*/
tcpm_stream_read_cancel(rs);
+ sync_pktlen = rs->rc->pktlen;
+ sync_pkt = malloc(sync_pktlen);
+ memcpy(sync_pkt, rs->rc->pkt, sync_pktlen);
+
if (rs->rc->pktlen <= 0) {
auth_debug(1, _("sec: stream_read_sync_callback: %s\n"), rs->rc->errmsg);
security_stream_seterror(&rs->secstr, "%s", rs->rc->errmsg);
amfree(canonname);
return -1;
}
+
+in_port_t
+find_port_for_service(
+ char *service,
+ char *proto)
+{
+ in_port_t port;
+ char *s;
+ int all_numeric = 1;
+
+ for (s=service; *s != '\0'; s++) {
+ if (!isdigit((int)*s)) {
+ all_numeric = 0;
+ }
+ }
+
+ if (all_numeric == 1) {
+ port = atoi(service);
+ } else {
+ struct servent *sp;
+
+ if ((sp = getservbyname(service, proto)) == NULL) {
+ port = 0;
+ } else {
+ port = (in_port_t)(ntohs((in_port_t)sp->s_port));
+ }
+ }
+
+ return port;
+}