summaryrefslogtreecommitdiff
path: root/net/dip/patches/patch-b
diff options
context:
space:
mode:
Diffstat (limited to 'net/dip/patches/patch-b')
-rw-r--r--net/dip/patches/patch-b173
1 files changed, 173 insertions, 0 deletions
diff --git a/net/dip/patches/patch-b b/net/dip/patches/patch-b
new file mode 100644
index 00000000000..e736f6ddf2a
--- /dev/null
+++ b/net/dip/patches/patch-b
@@ -0,0 +1,173 @@
+--- 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 );