Date: Wed, 13 Jan 2010 03:40:02 GMT From: Rob Farmer <rfarmer@predatorlabs.net> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/142763: [PATCH] misc/dtach Make socket executable if client attached, take maintainership Message-ID: <201001130340.o0D3e2G8037820@www.freebsd.org> Resent-Message-ID: <201001130350.o0D3o0cH097473@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 142763 >Category: ports >Synopsis: [PATCH] misc/dtach Make socket executable if client attached, take maintainership >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Wed Jan 13 03:50:00 UTC 2010 >Closed-Date: >Last-Modified: >Originator: Rob Farmer >Release: 9.0-CURRENT >Organization: >Environment: FreeBSD amethyst.predatorlabs.net 9.0-CURRENT FreeBSD 9.0-CURRENT #0 r202069: Mon Jan 11 00:32:29 PST 2010 rfarmer@amethyst.predatorlabs.net:/usr/obj/usr/src/sys/AMETHYST i386 >Description: * Make socket executable if client attached (useful for scripts), obtained from upstream issue tracker * Take maintainership >How-To-Repeat: >Fix: Patch attached with submission follows: diff -ruN dtach.old/Makefile dtach/Makefile --- dtach.old/Makefile 2010-01-12 10:30:00.000000000 -0800 +++ dtach/Makefile 2010-01-12 10:33:02.000000000 -0800 @@ -7,10 +7,11 @@ PORTNAME= dtach PORTVERSION= 0.8 +PORTREVISION= 1 CATEGORIES= misc MASTER_SITES= SF -MAINTAINER= ports@FreeBSD.org +MAINTAINER= rfarmer@predatorlabs.net COMMENT= Emulates the detach feature of screen GNU_CONFIGURE= yes diff -ruN dtach.old/files/patch-master.c dtach/files/patch-master.c --- dtach.old/files/patch-master.c 1969-12-31 16:00:00.000000000 -0800 +++ dtach/files/patch-master.c 2010-01-12 10:32:10.000000000 -0800 @@ -0,0 +1,65 @@ +--- master.c.orig 2008-01-30 21:59:54.000000000 -0800 ++++ master.c 2010-01-12 10:30:56.000000000 -0800 +@@ -53,6 +53,8 @@ + static struct client *clients; + /* The pseudo-terminal created for the child process. */ + static struct pty the_pty; ++/* The mode of the socket */ ++static mode_t socket_mode; + + #ifndef HAVE_FORKPTY + pid_t forkpty(int *amaster, char *name, struct termios *termp, +@@ -66,6 +68,19 @@ + unlink(sockname); + } + ++/* Check the actual mode of the socket */ ++static void ++check_socket_mode(int has_attached_client) ++{ ++ if (has_attached_client && ((socket_mode & 0100) != 0100)) { ++ socket_mode |= 0100; ++ chmod(sockname, socket_mode); ++ } else if (!has_attached_client && ((socket_mode & 0100) == 0100)) { ++ socket_mode &= ~0100; ++ chmod(sockname, socket_mode); ++ } ++} ++ + /* Signal */ + static RETSIGTYPE + die(int sig) +@@ -206,7 +221,8 @@ + return -1; + } + /* chmod it to prevent any suprises */ +- if (chmod(name, 0600) < 0) ++ socket_mode = 0600; ++ if (chmod(name, socket_mode) < 0) + { + close(s); + return -1; +@@ -454,6 +470,8 @@ + /* Loop forever. */ + while (1) + { ++ int has_attached_client = 0; ++ + /* Re-initialize the file descriptor set for select. */ + FD_ZERO(&readfds); + FD_SET(s, &readfds); +@@ -480,8 +498,14 @@ + FD_SET(p->fd, &readfds); + if (p->fd > highest_fd) + highest_fd = p->fd; ++ ++ if (p->attached) { ++ has_attached_client = 1; ++ } + } + ++ check_socket_mode(has_attached_client); ++ + /* Wait for something to happen. */ + if (select(highest_fd + 1, &readfds, NULL, NULL, NULL) < 0) + { >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001130340.o0D3e2G8037820>