head 1.3; access; symbols pkgsrc-2013Q2:1.3.0.34 pkgsrc-2013Q2-base:1.3 pkgsrc-2012Q4:1.3.0.32 pkgsrc-2012Q4-base:1.3 pkgsrc-2011Q4:1.3.0.30 pkgsrc-2011Q4-base:1.3 pkgsrc-2011Q2:1.3.0.28 pkgsrc-2011Q2-base:1.3 pkgsrc-2009Q4:1.3.0.26 pkgsrc-2009Q4-base:1.3 pkgsrc-2008Q4:1.3.0.24 pkgsrc-2008Q4-base:1.3 pkgsrc-2008Q3:1.3.0.22 pkgsrc-2008Q3-base:1.3 cube-native-xorg:1.3.0.20 cube-native-xorg-base:1.3 pkgsrc-2008Q2:1.3.0.18 pkgsrc-2008Q2-base:1.3 pkgsrc-2008Q1:1.3.0.16 pkgsrc-2008Q1-base:1.3 pkgsrc-2007Q4:1.3.0.14 pkgsrc-2007Q4-base:1.3 pkgsrc-2007Q3:1.3.0.12 pkgsrc-2007Q3-base:1.3 pkgsrc-2007Q2:1.3.0.10 pkgsrc-2007Q2-base:1.3 pkgsrc-2007Q1:1.3.0.8 pkgsrc-2007Q1-base:1.3 pkgsrc-2006Q4:1.3.0.6 pkgsrc-2006Q4-base:1.3 pkgsrc-2006Q3:1.3.0.4 pkgsrc-2006Q3-base:1.3 pkgsrc-2006Q2:1.3.0.2 pkgsrc-2006Q2-base:1.3 pkgsrc-2006Q1:1.2.0.28 pkgsrc-2006Q1-base:1.2 pkgsrc-2005Q4:1.2.0.26 pkgsrc-2005Q4-base:1.2 pkgsrc-2005Q3:1.2.0.24 pkgsrc-2005Q3-base:1.2 pkgsrc-2005Q2:1.2.0.22 pkgsrc-2005Q2-base:1.2 pkgsrc-2005Q1:1.2.0.20 pkgsrc-2005Q1-base:1.2 pkgsrc-2004Q4:1.2.0.18 pkgsrc-2004Q4-base:1.2 pkgsrc-2004Q3:1.2.0.16 pkgsrc-2004Q3-base:1.2 pkgsrc-2004Q2:1.2.0.14 pkgsrc-2004Q2-base:1.2 pkgsrc-2004Q1:1.2.0.12 pkgsrc-2004Q1-base:1.2 pkgsrc-2003Q4:1.2.0.10 pkgsrc-2003Q4-base:1.2 netbsd-1-6-1:1.2.0.6 netbsd-1-6-1-base:1.2 netbsd-1-6:1.2.0.8 netbsd-1-6-RELEASE-base:1.2 pkgviews:1.2.0.4 pkgviews-base:1.2 buildlink2:1.2.0.2 buildlink2-base:1.2 netbsd-1-5-PATCH003:1.2 netbsd-1-5-PATCH001:1.2 netbsd-1-5-RELEASE:1.2 netbsd-1-4-PATCH003:1.2 netbsd-1-4-PATCH002:1.2 comdex-fall-1999:1.2 netbsd-1-4-PATCH001:1.2 netbsd-1-4-RELEASE:1.2 netbsd-1-3-PATCH003:1.2 netbsd-1-3-PATCH002:1.1; locks; strict; comment @# @; 1.3 date 2006.06.30.16.17.27; author tron; state dead; branches; next 1.2; 1.2 date 98.08.07.11.10.38; author agc; state Exp; branches; next 1.1; 1.1 date 98.04.16.16.50.34; author tron; state Exp; branches; next ; desc @@ 1.3 log @Move "bsddip" package to "bsddip" directory. @ text @$NetBSD: patch-ab,v 1.2 1998/08/07 11:10:38 agc Exp $ --- tty.c.orig Sat Jul 1 01:41:05 1995 +++ tty.c Sat Sep 9 08:37:14 1995 @@@@ -140,9 +140,10 @@@@ int tty_lock ( char *path, int mode ) { +#define MAX_LOCK_ATTEMPTS 3 struct passwd *pw; - - int fd; + char number[12], *temp_path; + int fd, i, saved_errno; if ( mode ) /* locking on ? */ @@@@ -152,32 +153,71 @@@@ return 0; /* standard input */ } - if ( saved_path != NULL ) + temp_path = (char*) malloc ( sizeof ( PATH_LOCKD ) + + strlen("TMP..") + 10); /* max PID */ + + (void) sprintf ( number, "%u", (unsigned)getpid() ); + (void) strcpy ( temp_path, PATH_LOCKD ); + (void) strcat ( temp_path, "TMP.." ); + (void) strcat ( temp_path, number ); + + if ( opt_debg ) + printf ( "DIP: tty: trying to create lock temp file %s\n", temp_path ); + if ( ( fd = open ( temp_path, O_CREAT|O_TRUNC|O_WRONLY, 0644 ) ) < 0) { - free ( saved_path ); - saved_path = NULL; + (void) fprintf ( stderr, "DIP: tty: lock: (%s): %s\n", + temp_path, strerror ( errno ) ); + free(temp_path); + return -1; } + /* + * now enter our PID; + * Note: the 10 digits + newline are convention and cannot be changed + */ + (void) sprintf ( number, "%10u\n", getpid() ); + if ( opt_debg ) + printf ( "DIP: tty: writing \"%10u\" into lock temp file\n", getpid() ); + if ( write (fd, number, 11) != 11 ) + { + (void) fprintf ( stderr, "DIP: tty: lock write error: %s\n", + strerror ( errno ) ); + free(temp_path); + return -1; + } + (void) close ( fd ); + + free ( saved_path ); /* just in case [NB: free(NULL) is legal] */ saved_path = (char*) malloc ( sizeof ( PATH_LOCKD ) + - strlen ( path ) + 1 ); + strlen ( path ) + 3 ); (void) strcpy ( saved_path, PATH_LOCKD ); + (void) strcat ( saved_path, ".." ); (void) strcat ( saved_path, path ); - - if ( ( fd = creat ( saved_path, 0644 ) ) < 0) - { - if ( errno != EEXIST ) + if ( opt_debg ) + printf ( "DIP: tty: linking %s to %s\n", temp_path, saved_path ); + for ( i = 0; i < MAX_LOCK_ATTEMPTS; i++ ) { - (void) fprintf ( stderr, "DIP: tty: lock: (%s): %s\n", - saved_path, strerror ( errno ) ); + /* now attempt to actually get the lock */ + if ( link ( temp_path, saved_path ) == 0 ) + break; + sleep(2 * (i + 1)); + } + saved_errno = errno; + (void) unlink ( temp_path ); + free(temp_path); + + if ( i >= MAX_LOCK_ATTEMPTS ) + { + /* did not get it */ + if ( saved_errno != EEXIST ) + (void) fprintf ( stderr, "DIP: tty: lock: (%s): %s\n", + saved_path, strerror ( saved_errno ) ); + else if ( opt_debg ) + printf ( "DIP: tty: lock attempt failed, EEXIST\n" ); + return -1; } - - return -1; - } - - (void) close ( fd ); - /* * Make sure UUCP owns the lockfile. Required by some packages. @@@@ -215,7 +255,26 @@@@ return 0; } +/* + * Enter daemon's PID into the lock file; + * This is icky. + */ +void tty_relock ( void ) +{ + int fd; + char number[12]; + if ( saved_path == NULL ) + return; + + (void) sprintf ( number, "%10u\n", (unsigned)getpid() ); + if ( opt_debg ) + printf ( "DIP: tty: rewriting lock file (PID = %u)\n", getpid() ); + if ( (fd = open ( saved_path, O_WRONLY, 0 )) == -1 ) + return; + (void) write ( fd, number, 11); + (void) close ( fd ); +} /* * Find a serial speed code in the table. @@@@ -965,7 +1024,6 @@@@ char *sp; char path [ MAXPATHLEN ]; - /* * Try opening the TTY device. */ @@@@ -985,8 +1043,10 @@@@ else sp = name; - - if ( ( fd = open ( path, O_RDWR | O_NONBLOCK ) ) < 0 ) + if ( tty_lock ( sp, 1 ) == -1 ) + return -1; + + if ( ( fd = open ( path, O_RDWR | O_NONBLOCK | O_EXCL ) ) < 0 ) { (void) fprintf ( stderr, "DIP: tty: open(%s, RW): %s\n", path, strerror ( errno ) ); @@@@ -1118,10 +1178,4 @@@@ { return 0 ; } - - - /* - * OK, all done. Lock this terminal line. - */ - return tty_lock ( sp, 1 ); } --- daemon.c.orig Sat Jul 1 01:41:05 1995 +++ daemon.c Sat Sep 9 08:20:00 1995 @@@@ -168,6 +168,8 @@@@ openlog ( "DIP", LOG_PID, LOG_DAEMON ); } + /* note the race condition here; ick! */ + tty_relock(); (void) signal ( SIGALRM, sig_catcher ); (void) alarm ( mydip.timeout ); @ 1.2 log @Add NetBSD RCS Ids. @ text @d1 1 a1 1 $NetBSD$ @ 1.1 log @Adapt this package to NetBSD. @ text @d1 2 @