From 4248a1d7f87624369b1d64eea620532d101b578d Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 7 Nov 2002 02:19:52 +0000 Subject: [PATCH] * include/cygwin/version.h: Bump API minor number for below export. * 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. --- winsup/cygwin/ChangeLog | 15 ++++++++++ winsup/cygwin/cygwin.din | 2 ++ winsup/cygwin/include/cygwin/version.h | 3 +- winsup/cygwin/syscalls.cc | 38 ++++++++++++++++---------- winsup/cygwin/tty.cc | 1 + 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 + + * include/cygwin/version.h: Bump API minor number for below export. + +2002-11-06 Sergey Okhapkin + + * 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 * 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); }