summaryrefslogtreecommitdiff
path: root/attach.c
diff options
context:
space:
mode:
authorNed T. Crigler <crigler@users.sourceforge.net>2006-09-27 23:56:29 +0000
committerNed T. Crigler <crigler@users.sourceforge.net>2006-09-27 23:56:29 +0000
commit5dbd8fe920992ff576b89fe0ff7bd104a6b05191 (patch)
tree74b0ce012d45b5e57102b7b3e114094825a3fc84 /attach.c
parente06f8dfcdf1dbf8ac6d12075c5da9f94a894f6a9 (diff)
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.
Diffstat (limited to 'attach.c')
-rw-r--r--attach.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/attach.c b/attach.c
index ece56db..9db3882 100644
--- a/attach.c
+++ b/attach.c
@@ -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;