1.29 2026-04-23 Todd Rinaldo Bug Fixes: * GH #87, PR #88 - Fix configure-time function detection probes being broken by compiler optimization. The probes stored function pointers in local variables which -O2/-Os (added to probe flags in PR #81) eliminated as dead stores, so the linker never saw the function reference. On systems where openpty() lives in -lutil (older glibc, BSDs), the probe falsely succeeded without -lutil, producing "undefined symbol: openpty" at runtime. Fixed by storing the function pointer in a file-scope global variable which the optimizer cannot eliminate. Maintenance: * PR #89 - Add Ubuntu LTS version matrix (20.04, 22.04, 24.04) to the GitHub Actions test suite. Exercises the system perl on each current Ubuntu LTS release via Docker containers, running after the main ubuntu job. 1.28 2026-04-23 Todd Rinaldo Bug Fixes: * PR #69 - Fix make_slave_controlling_terminal() on Solaris/HP-UX to use _open_tty() instead of IO::Tty->open(), ensuring STREAMS modules (ptem, ldterm, ttcompat) are pushed via I_PUSH when the slave is opened for controlling terminal setup. Parallel fix to the slave() method fix in 1.24. * PR #74 - Fix Perl 5.40+ "Possible memory corruption: ioctl overflowed 3rd argument" warning in clone_winsize_from() and get_winsize(). Use pack_winsize(0,0,0,0) to pre-allocate the ioctl buffer with SvCUR matching sizeof(struct winsize) instead of an empty string. * PR #76, PR #79 - Fix diagnostic warnings being silently suppressed when callers use lexical "use warnings" (the modern standard since Perl 5.6). $^W and PL_dowarn only fire under perl -w; replaced with warnings::enabled() in IO::Tty and IO::Pty (PR #76) and ckWARN(WARN_IO) in Tty.xs (PR #79). * PR #77 - Fix file descriptor leak in IO::Pty when new_from_fd() fails after pty_allocate() or _open_tty() returns raw C-level fds. Added POSIX::close() calls on the raw fds before croaking at three sites in new() and slave(). * PR #78 - Fix openpty() detection on Alpine Linux and other musl-based systems where openpty() has moved from libutil into libc (glibc 2.34+). Probe libc first before falling back to -lutil. * PR #80 - Fix -Wsign-compare compiler warnings: change namebuflen parameter type from int to size_t in open_slave() and allocate_pty() to match the return type of strlcpy() and the size argument of snprintf(). * PR #81 - Fix spurious "_FORTIFY_SOURCE requires compiling with optimization" warnings during configure probes when $Config{optimize} (e.g. -Os) is separate from $Config{ccflags}. Include optimize flags in all configure probe compilations. * PR #84 - Fix header probes in Makefile.PL missing platform extension defines (_GNU_SOURCE, _BSD_VISIBLE, etc.) that function probes already included. Bare #includes could cause HAVE_PTY_H and similar to be unset on strict POSIX systems even when the header exists. Improvements: * PR #86 - Use L<> instead of C<> for cross-module POD references in Tty.pm and Pty.pm so MetaCPAN renders IO::Pty, IO::Handle, and IO::Stty as clickable links. Maintenance: * PR #70 - Modernize POD in Tty.pm and Pty.pm: remove stale platform version references (FreeBSD 4.4, OpenBSD 2.8, HPUX 10.20, Solaris 2.6), replace defunct SourceForge/mailing list URLs with GitHub issue tracker. * PR #73 - Modernize the try example script: add strict/warnings, my declarations, 3-arg open, and lexical filehandles. The script is shipped to CPAN and referenced in POD as the canonical usage example. * PR #75 - Strengthen test coverage for set_raw() and winsize: verify all termios flags set by cfmakeraw (iflag, oflag, PARENB, CSIZE, CS8, VMIN, VTIME) and add a test for the unpack_winsize() length-validation croak. * PR #85 - Update GitHub Actions to Node.js 24 versions: actions/checkout v6, cross-platform-actions/action v1, perl-actions/install-with-cpm v2. Required before GitHub forces Node.js 24 in June 2026. 1.27 2026-04-03 Todd Rinaldo Bug Fixes: * GH #68, PR #68 - Fix build on OpenBSD by including termios.h to detect openpty reliably and setting _BSD_SOURCE to find strlcpy in includes. (Alexander Bluhm) 1.26 2026-04-02 Todd Rinaldo Bug Fixes: * PR #67 - Fix strlcpy detection on DragonFly BSD to avoid static/non-static declaration conflict. Added __DragonFly__ guard to the function test (paralleling __FreeBSD__) and added a belt-and-suspenders check for perl's own HAS_STRLCPY in Tty.xs. Maintenance: * PR #66 - Add 5-minute timeout to all CI test steps to prevent hung tests from consuming CI resources indefinitely. 1.25 2026-04-01 Todd Rinaldo Bug Fixes: * GH #62, PR #64 - Fix IO::Pty DESTROY force-closing the slave pty. The DESTROY method (added in 1.21) explicitly closed the cached slave handle, breaking consumers like IPC::Run that hold a reference to the slave via $pty->slave() and expect it to survive master destruction. Now just deletes the internal reference and lets Perl's refcounting handle fd closure correctly. Maintenance: * PR #61 - Simplify version variables to a single source of truth. Extract version from Tty.pm in Makefile.PL using MM->parse_version() instead of hardcoding it, use VERSION_FROM in WriteMakefile, and remove $XS_VERSION from Tty.pm. 1.24 2026-03-27 Todd Rinaldo Bug Fixes: * GH #54, PR #55 - Fix slave pty reopening on Solaris/illumos. After close_slave(), reopening with plain Perl open() skipped pushing STREAMS modules (ptem, ldterm, ttcompat), causing isatty() to return false. Added _open_tty() XS function that opens the device and pushes STREAMS modules on platforms that support I_PUSH. * GH #56, PR #58 - Fix undef warnings on Perl 5.8.8 by removing the undef operator on localized $SIG{__DIE__}, and fix XS ttyname() on older Perls by avoiding the InOutStream typemap which can return NULL for filehandles created via new_from_fd. * GH #57, PR #59 - Add __BSD_VISIBLE for FreeBSD in function probes. The _XOPEN_SOURCE definition hid BSD extensions like strlcpy, causing probe failures and subsequent compile errors from conflicting static/non-static declarations. Maintenance: * PR #60 - Modernize Makefile.PL: replace BUILD_REQUIRES with TEST_REQUIRES (EUMM 6.64+), add CONFIGURE_REQUIRES, upgrade META_MERGE to meta-spec v2, modernize generated Constant.pm to use 'our' instead of 'use vars', and remove dead PPD postamble. 1.23 2026-03-24 Todd Rinaldo Bug Fixes: * PR #52 - Replace deprecated indirect object syntax (e.g. `new IO::Pty`) with direct method calls (`IO::Pty->new`). Perl 5.36+ disables indirect object calls, so this fixes forward compatibility. Improvements: * PR #53 - Add clone_winsize_from() test coverage (7 new tests) covering basic clone between slave ttys, non-tty master fast path, croak on non-tty source, and pixel dimension preservation. Maintenance: * PR #52 - Regenerate README from POD to fix stale version. * PR #53 - Modernize `use vars` to `our` declarations in Tty.pm and Pty.pm. Add missing `use warnings` to Pty.pm. * Add AI_POLICY.md for transparency on AI-assisted contributions. * Convert README to Markdown and update MANIFEST. 1.22 2026-03-24 Todd Rinaldo Bug Fixes: * GH #47, PR #48 - Fix function detection on Solaris by adding __EXTENSIONS__ to expose BSD extensions (like strlcpy) that are hidden when _XOPEN_SOURCE is defined. * PR #49 - Fix file descriptor leaks in open_slave() error paths. The master pty fd was not closed on several early-return error paths, causing fd leaks when falling through multiple pty allocation methods. Improvements: * PR #50 - Add unit tests for ttyname(), slave()/close_slave() lifecycle, set_winsize()/get_winsize() round-trips, pack_winsize/unpack_winsize, and constant importing (28 new tests). * PR #51 - Replace DynaLoader with XSLoader and bump minimum perl version to 5.8.8. XSLoader is simpler and has been in core since perl 5.6. Maintenance: * PR #44 - Fix stale POD versions, add Perl 5.38/5.40 to CI, and update repository URLs from toddr/IO-Tty to cpan-authors/IO-Tty. * PR #45 - Remove dead Perl 5.003 compatibility code, modernize XS (Nullch to NULL, perl_get_sv to get_sv, sprintf to snprintf). * PR #46 - Modernize CI with dynamic perl version discovery via perl-actions/perl-versions and add a disttest job. 1.21 2026-03-22 Todd Rinaldo Bug Fixes: * GH #14, PR #39 - Fix slave fd leak on IO::Pty destruction. The slave pty file descriptor was not closed when the IO::Pty object was destroyed, leaking file descriptors until process exit. * GH #12, PR #40 - Fix set_raw() to modify cflag for proper raw mode on BSD/macOS. set_raw() was not clearing CSIZE|PARENB or setting CS8 in cflag, causing incomplete raw mode on macOS, OpenBSD, and NetBSD. * GH #38, PR #41 - Modernize function detection to use proper system headers instead of fragile K&R-style forward declarations. The old approach conflicted with real prototypes on modern compilers (especially FreeBSD/Clang), causing all function checks to fail. Improvements: * PR #42 - Add BSD CI testing for FreeBSD, OpenBSD, and NetBSD via cross-platform-actions. Also bumps actions/checkout from v2 to v4. 1.20 2023-12-28 Todd Rinaldo * #32 - Skip t/pty_get_winsize.t tests on AIX * #27 - Fix patchlevel check for util.h 1.19 2023-12-28 Todd Rinaldo * #37 - Remove --no-undefined from compiler test which is not compatible with all platforms. 1.18 2023-11-27 Todd Rinaldo * #35 - Address Freebsd build issue: Make function checks more robust within shared lib 1.17 2022-11-11 Todd Rinaldo * Switch changelog entries to metacpan friendly format * #29 - Fix printf format conversion specifiers in croak to support size_t on all platforms * #11,#30 - Tty.pm: pre-allocate buffer for ioctl but leave it length 0 * #28 - Use $arg to match @ARGV in Makefile.PL 1.16 2021-01-2 Todd Rinaldo * Switch to github for issue tracker. * Switch to testsuite CI workflow. * Tidy 1.15 2020-10-03 Todd Rinaldo * Skip winsize test on Solaris and QNX NTO * Make function tests more robust * Work around a header name collission on util.h. This is breaking on recent OSX 1.15 2020-01-18 Todd Rinaldo * Add strict/warnings to Tty.pm * Fix pod errors * Typo: s/dependend/dependent/ * Prevent spurious warning from get_winsize() * Fix usage of setsid * Github actions testing. Windows is off of course. * Make README.md 1.13_01 2014-12-14 Todd Rinaldo * RT 91590 - Remove MAP_TARGET from Makefile.PL * RT 88271 - Fix for Solaris setuid when root running as other user 1.12 2014-09-12 Todd Rinaldo * Merge pull request from Chris Williams (bingos) to fix "redefinition of typedef" errors with v5.19.4 and above 1.11 2014-05-05 Todd Rinaldo * Release 1.11 to CPAN with explicit dropping of support for Win32 (we never supported it) - RT 77813 * Bump version to a devel release 1.11_01 for experimental work. * Fix typo in compilter - RT 75649 * Add support for PERL_MM_OPT 1.10 2010-10-11 Todd Rinaldo * CPAN testers clean. Bumping to release version 1.10 1.09_01 2010-10-04 Todd Rinaldo * RT 60788 - Better error reporting on Operating Systems that can't set a controlling terminal e.g. BeOS * Bump to 1.09_01 1.09 2010-10-04 Todd Rinaldo * CPAN testers looks clean. Internal testing done on perl 5.6 * Bump version to 1.09 and release to CPAN 1.08_03 2010-10-02 Todd Rinaldo * RT 61642 - Fix file number test to work without hang on cygwin * Bump to 1.08_03 1.08_02 2010-09-10 Todd Rinaldo * Update all versions to the new version. bump to 1.08_02 1.08_01 2010-09-10 Todd Rinaldo * RT 45008 - only try TIOCSCTTY if we don't have a ctty * RT 53883 - IO::Tty detection on BeOS w/fix * RT 60014 - better META.yml by modernizing Makefile.PL * RT 44771 - Add _ to list of escape characters for compiler so it'll compile on windows This is experimental pending a successful dev release v1.08 2009-02-05 Roland Giersig * Makefile.PL, Tty.xs: added support for posix_openpt(), thanks to Ed Schouten for providing a patch v1.07 2006-07-18 Roland Giersig * Tty.xs: added some more letter to BSD allocation v1.06 2006-07-15 Roland Giersig * Tty.pm: pre-allocate buffer for ioctl v1.05 2006-06-06 Roland Giersig * Tty.xs: added includes and v1.04 2006-05-28 Roland Giersig * Tty.xs: added handling for z/OS (uses /dev/ptyp0000) * Makefile.PL: added (for HPUX) v1.03 2006-04-25 Roland Giersig * Tty.c: changed newCONSTSUB to use newSV(0) instead of PL_sv_undef, now undef'd constants work * Makefile.PL: made ccflags handling meta-char safe, added ldflags; enhanced error msg * Makefile.PL: added v1.02 2002-04-02 Roland Giersig * Tty.pm, Pty.pm: v1.02; disable warning for non-existant die handler v1.01 2002-03-18 Roland Giersig * Makefile.PL: remove cpp, test-compile instead * Tty.pm, Pty.pm: disable die handler when requiring Stty v0.97_04 2002-03-06 Roland Giersig * v0.97_04, final pre-release version v0.97_03 2002-03-04 Roland Giersig * Pty.pm: v0.97_03 * Makefile.PL: order of include files is preserved; added test for working cpp. * Tty.pm (clone_winsize_from): v0.97_03; added function. * Tty.xs (allocate_pty): fixed typo in close for _getpty; changed order of termios.h and termio.h includes 2002-02-26 Roland Giersig * test.pl: replaced Test.pm * Tty.pm (set_raw): v0.97_01; moved set_raw() from test to method * Tty.xs: got rid of snprintf; don't try openpty() and getpt() if ptsname is not there. * Pty.pm: v0.97_01; updated docs * Makefile.PL: v0.97_01; auto-create IO::Tty::Constant 2002-01-31 Roland Giersig * Pty.pm: add IO::Stty to @ISA, master pty is sometimes a tty. * Tty.pm: v0.95_01 2002-01-30 Roland Giersig * Tty.pm, Pty.pm: v0.94_05 * Tty.xs (allocate_pty): moved getpt() and openpty() before muxes * test.pl: if master isatty, set it also to raw; seems to be needed. * Makefile.PL: fixed checks; test problematic constants with a compile. 2002-01-23 Roland Giersig * Tty.pm: v0.94_03 * test.pl: changed test to probe for maximum chunk the pty can handle; also, the /dev/tty test probes if an EOF is correctly reported from the child to the parent. * Tty.xs: finally made debug printfs optional via $IO::Tty::DEBUG. 2002-01-18 Roland Giersig * Tty.pm: v0.94_02 * Tty.xs: added #include termio.h 2002-01-07 Roland Giersig * Pty.pm: adapted to new interface (close_slave): added for keeping open filecount straight (make_slave_controlling_terminal): created anew (slave): reverted from open_slave() * Tty.pm: v0.94_01 * test.pl: adapted to new interface * Tty.xs: reverted to opening slave at creation time; added debug printfs (open_slave): use ptsname_r if there, forget about erroneous ttyname. (allocate_pty): added name param on openpty (doesn't take NULL for name) 2001-11-28 Roland Giersig * Tty.pm: v0.92_04 * Tty.xs (BOOT): use perl_get_sv for backward compat * Makefile.PL: added analysis of configuration 2001-11-27 Roland Giersig * Tty.pm: v0.92_03 * Tty.xs (BOOT): removed export_fail, undefined constants are now undef instead of not exportable; added CONFIG variable. * Makefile.PL: added setting of CONFIG var * test.pl: added printing of CONFIG var * Pty.pm (spawn): fixed bug with $^W handling 2001-11-17 Roland Giersig * Tty.xs (pty_allocate): complete rewrite, based on ideas from openssh and Xemacs. Tries all ways detected by Makefile.PL in order, so in theory it should work everywhere (modulo system quirks). First tries the high-level openpty() before getpt(), then various clone devices and finally BSD-style ptys. * Tty.xs (open_slave): moved master init stuff here, must be done before opening the slave. The Stream module pushes are now tried on all systems but only generate warnings on systems that we know need them. * Makefile.PL: added tests for all kinds of functions and clone devices. 2001-11-14 Roland Giersig * Tty.xs (MODULE): stole creation code from openssh * test.pl: added test for controlling terminal * Pty.pm (spawn): rearranged setsid() and added a fresh open of the slave pty so the pty becomes the controlling terminal for the process. 2001-10-25 Roland Giersig * Pty.pm (spawn): copied spawning process from Tcl/Expect (thanks, Don!); should set the controlling tty so ssh and other password requesting programs should be OK; also now returns exec errors. (slave_pid): added method to get at PID of spawned process. * Makefile.PL: added TIOCCONS. * try: adapted to use spawn(). * test.pl: adapted to use spawn(); added test for exec errors. 2001-10-16 Roland Giersig * Pty.pm (new): fixed bad my() line * automatically add IO::Stty to ISA if it exists. 2001-07-16 Roland Giersig * test.pl: finally some tests! Spawns a perl mini-script that echoes back all characters from STDIN, but inverted. * Pty.pm (slave): slave now is set to be a controlling tty if possible; it also remembers it's name now. * Makefile.PL: - on SCO, the slave pts* are in the /dev dir, not /dev/pts - added test for libutil.h, util.h, pty.h and openpty() - added symbol TIOCSCTTY * Tty.xs: - some SVR4 only define __SVR4; fixed. - OSF machines need termio.h for various macros - AIX doesn't define VOIDSIG; fixed. - Cygwin can use /dev/ptmx even though that file doesn't exist. - added openpty() version for FreeBSD and others that have no good method for creating ptys; untested. * Tty.pm: - moved docu over from Pty.pm to lessen confusion Pty <-> Tty - added verified systems list Change 588 on 2000/09/04 by (Graham Barr) Check for /dev/ptmx and /dev/pts instead of testing defined(SVR4) Change 587 on 2000/09/04 by (Graham Barr) Make ttyname just warn when it is not implemented instead of croak Change 586 on 2000/09/04 by (Graham Barr) Include for HPUX Change 585 on 2000/09/04 by (Graham Barr) Makefile.PL - Fix to how cc is called Change 461 on 2000/03/29 by (Graham Barr) Release 0.03 Change 460 on 2000/03/29 by (Graham Barr) General cleanup and added PPD stuff into Makefile.PL Change 310 on 1999/05/10 by (Graham Barr) - Removed the need for Configure by implementing a test in Makefile.PL - The existance of constants are now checked at import time, so @EXPORT had to be renamed to @EXPORT_OK. ie noting is imported by default