summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog15
-rw-r--r--winsup/cygwin/cygwin.din2
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/syscalls.cc38
-rw-r--r--winsup/cygwin/tty.cc1
5 files changed, 44 insertions, 15 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index e27ca804c..aeb882ff8 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,18 @@
+2002-11-06 Christopher Faylor <cgf@redhat.com>
+
+ * include/cygwin/version.h: Bump API minor number for below export.
+
+2002-11-06 Sergey Okhapkin <sos@prospect.com.ru>
+
+ * cygwin.din (pututline): New exported function.
+ * syscalls.cc (login): Use pututiline().
+ (setutent): Open utmp as read/write.
+ (endutent): Check if utmp file is open.
+ (utmpname): call endutent() to close current utmp file.
+ (getutid): Enable all cases, use strncmp() to compare ut_id fields.
+ (pututline): New.
+ * tty.cc (create_tty_master): Set ut_pid to current pid.
+
2002-11-05 Christopher Faylor <cgf@redhat.com>
* fhandler_serial.cc (fhandler_serial::ioctl): Don't try to figure out
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
index a9c009afc..58158f9fa 100644
--- a/winsup/cygwin/cygwin.din
+++ b/winsup/cygwin/cygwin.din
@@ -621,6 +621,8 @@ putchar_unlocked
_putchar_unlocked = putchar_unlocked
puts
_puts = puts
+pututline
+_pututline = pututline
putw
_putw = putw
qsort
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
index 35f64eb10..34590f440 100644
--- a/winsup/cygwin/include/cygwin/version.h
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -160,12 +160,13 @@ details. */
61: Export getc_unlocked, getchar_unlocked, putc_unlocked,
putchar_unlocked
62: Erroneously bumped.
+ 63: Export pututline.
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 62
+#define CYGWIN_VERSION_API_MINOR 63
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index fd571ebd9..24638606f 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -2427,15 +2427,8 @@ login (struct utmp *ut)
{
sigframe thisframe (mainthread);
register int fd;
- int currtty = ttyslot ();
- if (currtty >= 0 && (fd = open (_PATH_UTMP, O_WRONLY | O_CREAT | O_BINARY,
- 0644)) >= 0)
- {
- (void) lseek (fd, (long) (currtty * sizeof (struct utmp)), SEEK_SET);
- (void) write (fd, (char *) ut, sizeof (struct utmp));
- (void) close (fd);
- }
+ pututline (ut);
if ((fd = open (_PATH_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0)) >= 0)
{
(void) write (fd, (char *) ut, sizeof (struct utmp));
@@ -2516,7 +2509,7 @@ setutent ()
sigframe thisframe (mainthread);
if (utmp_fd == -2)
{
- utmp_fd = open (utmp_file, O_RDONLY);
+ utmp_fd = open (utmp_file, O_RDWR);
}
lseek (utmp_fd, 0, SEEK_SET);
}
@@ -2525,8 +2518,11 @@ extern "C" void
endutent ()
{
sigframe thisframe (mainthread);
- close (utmp_fd);
- utmp_fd = -2;
+ if (utmp_fd != -2)
+ {
+ close (utmp_fd);
+ utmp_fd = -2;
+ }
}
extern "C" void
@@ -2538,6 +2534,7 @@ utmpname (_CONST char *file)
debug_printf ("Invalid file");
return;
}
+ endutent ();
utmp_file = strdup (file);
debug_printf ("New UTMP file: %s", utmp_file);
}
@@ -2563,7 +2560,6 @@ getutid (struct utmp *id)
{
switch (id->ut_type)
{
-#if 0 /* Not available in Cygwin. */
case RUN_LVL:
case BOOT_TIME:
case OLD_TIME:
@@ -2571,12 +2567,11 @@ getutid (struct utmp *id)
if (id->ut_type == utmp_data.ut_type)
return &utmp_data;
break;
-#endif
case INIT_PROCESS:
case LOGIN_PROCESS:
case USER_PROCESS:
case DEAD_PROCESS:
- if (id->ut_id == utmp_data.ut_id)
+ if (strncmp (id->ut_id, utmp_data.ut_id, 2) == 0)
return &utmp_data;
break;
default:
@@ -2602,3 +2597,18 @@ getutline (struct utmp *line)
}
return NULL;
}
+
+extern "C" void
+pututline (struct utmp *ut)
+{
+ sigframe thisframe (mainthread);
+ if (check_null_invalid_struct (ut))
+ return;
+ setutent ();
+ struct utmp *u;
+ if ((u = getutid (ut)))
+ lseek (utmp_fd, -sizeof(struct utmp), SEEK_CUR);
+ else
+ lseek (utmp_fd, 0, SEEK_END);
+ (void) write (utmp_fd, (char *) ut, sizeof (struct utmp));
+}
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
index 80465ea5d..9a295244f 100644
--- a/winsup/cygwin/tty.cc
+++ b/winsup/cygwin/tty.cc
@@ -88,6 +88,7 @@ create_tty_master (int ttynum)
cygwin_gethostname (our_utmp.ut_host, sizeof (our_utmp.ut_host));
__small_sprintf (our_utmp.ut_line, "tty%d", ttynum);
our_utmp.ut_type = USER_PROCESS;
+ our_utmp.ut_pid = myself->pid;
myself->ctty = ttynum;
login (&our_utmp);
}