Try to detect and remove stale sockets when dtach -A is used. Be

paranoid about this, and only remove the specified file if connect says
the connection was refused and stat says the file is a socket.

Also dtach -A now only tries to create the socket if the connection was
refused or the socket did not exist, instead of on any random error as
before.
This commit is contained in:
Ned T. Crigler 2006-09-27 23:56:29 +00:00
parent e06f8dfcdf
commit 5dbd8fe920
3 changed files with 27 additions and 2 deletions

View File

@ -60,6 +60,18 @@ connect_socket(char *name)
if (connect(s, (struct sockaddr*)&sockun, sizeof(sockun)) < 0)
{
close(s);
/* ECONNREFUSED is also returned for regular files, so make
** sure we are trying to connect to a socket. */
if (errno == ECONNREFUSED)
{
struct stat st;
if (stat(name, &st) < 0)
return -1;
else if (!S_ISSOCK(st.st_mode) || S_ISREG(st.st_mode))
errno = ENOTSOCK;
}
return -1;
}
return s;

View File

@ -73,6 +73,14 @@
#include <sys/socket.h>
#include <sys/un.h>
#ifndef S_ISREG
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#ifndef S_ISSOCK
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
#endif
extern char *progname, *sockname;
extern int detach_char, no_suspend, redraw_method;
extern struct termios orig_term;

9
main.c
View File

@ -256,8 +256,13 @@ main(int argc, char **argv)
** socket. */
if (attach_main(1) != 0)
{
if (master_main(argv, 1) != 0)
return 1;
if (errno == ECONNREFUSED || errno == ENOENT)
{
if (errno == ECONNREFUSED)
unlink(sockname);
if (master_main(argv, 1) != 0)
return 1;
}
return attach_main(0);
}
}