-/* $OpenBSD: ssh-agent.c,v 1.25 2000/01/02 21:51:03 markus Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.31 2000/04/29 18:11:52 markus Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
*/
#include "includes.h"
-RCSID("$OpenBSD: ssh-agent.c,v 1.25 2000/01/02 21:51:03 markus Exp $");
+RCSID("$OpenBSD: ssh-agent.c,v 1.31 2000/04/29 18:11:52 markus Exp $");
#include "ssh.h"
#include "rsa.h"
#include "getput.h"
#include "mpaux.h"
-#ifdef HAVE_OPENSSL
#include <openssl/md5.h>
-#endif
-#ifdef HAVE_SSL
-#include <ssl/md5.h>
-#endif
typedef struct {
int fd;
int max_fd = 0;
/* pid of shell == parent of agent */
-int parent_pid = -1;
+pid_t parent_pid = -1;
/* pathname and directory for AUTH_SOCKET */
char socket_name[1024];
#ifdef HAVE___PROGNAME
extern char *__progname;
#else /* HAVE___PROGNAME */
-const char *__progname = "ssh-agent";
+static const char *__progname = "ssh-agent";
#endif /* HAVE___PROGNAME */
void
buffer_get_bignum(&e->input, n);
if (bits != BN_num_bits(n))
- error("Warning: identity keysize mismatch: actual %d, announced %d",
+ log("Warning: identity keysize mismatch: actual %d, announced %d",
BN_num_bits(n), bits);
/* Check if we have the key. */
}
}
-void
+void
after_select(fd_set *readset, fd_set *writeset)
{
unsigned int i;
int len, sock;
+ socklen_t slen;
char buf[1024];
struct sockaddr_un sunaddr;
break;
case AUTH_SOCKET:
if (FD_ISSET(sockets[i].fd, readset)) {
- len = sizeof(sunaddr);
- sock = accept(sockets[i].fd, (struct sockaddr *) & sunaddr, &len);
+ slen = sizeof(sunaddr);
+ sock = accept(sockets[i].fd, (struct sockaddr *) & sunaddr, &slen);
if (sock < 0) {
perror("accept from AUTH_SOCKET");
break;
shutdown(sockets[i].fd, SHUT_RDWR);
close(sockets[i].fd);
sockets[i].type = AUTH_UNUSED;
+ buffer_free(&sockets[i].input);
+ buffer_free(&sockets[i].output);
break;
}
buffer_consume(&sockets[i].output, len);
shutdown(sockets[i].fd, SHUT_RDWR);
close(sockets[i].fd);
sockets[i].type = AUTH_UNUSED;
+ buffer_free(&sockets[i].input);
+ buffer_free(&sockets[i].output);
break;
}
buffer_append(&sockets[i].input, buf, len);
void
check_parent_exists(int sig)
{
- if (kill(parent_pid, 0) < 0) {
+ if (parent_pid != -1 && kill(parent_pid, 0) < 0) {
/* printf("Parent has died - Authentication agent exiting.\n"); */
exit(1);
}
struct sockaddr_un sunaddr;
pid_t pid;
char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid];
+ extern int optind;
/* check if RSA support exists */
if (rsa_alive() == 0) {
__progname);
exit(1);
}
+#ifdef __GNU_LIBRARY__
+ while ((ch = getopt(ac, av, "+cks")) != -1) {
+#else /* __GNU_LIBRARY__ */
while ((ch = getopt(ac, av, "cks")) != -1) {
+#endif /* __GNU_LIBRARY__ */
switch (ch) {
case 'c':
if (s_flag)
}
pid = atoi(pidstr);
if (pid < 1) { /* XXX PID_MAX check too */
+ /* Yes, PID_MAX check please */
fprintf(stderr, "%s=\"%s\", which is not a good PID\n",
SSH_AGENTPID_ENV_NAME, pidstr);
exit(1);
}
signal(SIGINT, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, cleanup_exit);
- signal(SIGTERM, cleanup_exit);
+ signal(SIGHUP, cleanup_exit);
+ signal(SIGTERM, cleanup_exit);
while (1) {
FD_ZERO(&readset);
FD_ZERO(&writeset);