Most of the code is already there; it's basically just adding a new flag.
Happy to hear your feedback!
---------------
diff --git a/usr.bin/ssh/ssh-agent.1 b/usr.bin/ssh/ssh-agent.1
index 6815eb834d3..731a1cf913d 100644
--- a/usr.bin/ssh/ssh-agent.1
+++ b/usr.bin/ssh/ssh-agent.1
@@ -76,6 +76,10 @@ socket
.Ar bind_address .
The default is
.Pa $TMPDIR/ssh-XXXXXXXXXX/agent.\*(Ltppid\*(Gt .
+.It Fl A Ar bind_address
+Same as the
+.Fl a
+option but overwrites the socket if it already exists.
.It Fl c
Generate C-shell commands on
.Dv stdout .
diff --git a/usr.bin/ssh/ssh-agent.c b/usr.bin/ssh/ssh-agent.c
index 0b2ee971226..5e9c3affec8 100644
--- a/usr.bin/ssh/ssh-agent.c
+++ b/usr.bin/ssh/ssh-agent.c
@@ -2003,7 +2003,7 @@ usage(void)
int
main(int ac, char **av)
{
- int c_flag = 0, d_flag = 0, D_flag = 0, k_flag = 0, s_flag = 0;
+ int c_flag = 0, d_flag = 0, D_flag = 0, k_flag = 0, s_flag =
0, overwrite_agentsocket = 0;
int sock, ch, result, saved_errno;
char *shell, *format, *pidstr, *agentsocket = NULL;
struct rlimit rlim;
@@ -2032,7 +2032,7 @@ main(int ac, char **av)
OpenSSL_add_all_algorithms();
#endif
- while ((ch = getopt(ac, av, "cDdksE:a:O:P:t:")) != -1) {
+ while ((ch = getopt(ac, av, "cDdksE:a:A:O:P:t:")) != -1) {
switch (ch) {
case 'E':
fingerprint_hash = ssh_digest_alg_by_name(optarg);
@@ -2075,6 +2075,8 @@ main(int ac, char **av)
usage();
D_flag++;
break;
+ case 'A':
+ overwrite_agentsocket = 1;
case 'a':
agentsocket = optarg;
break;
@@ -2163,7 +2165,7 @@ main(int ac, char **av)
* the parent.
*/
prev_mask = umask(0177);
- sock = unix_listener(socket_name, SSH_LISTEN_BACKLOG, 0);
+ sock = unix_listener(socket_name, SSH_LISTEN_BACKLOG,
overwrite_agentsocket);
if (sock < 0) {
/* XXX - unix_listener() calls error() not perror() */
*socket_name = '\0'; /* Don't unlink any existing file */