summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjnweiger <jnweiger>2005-12-16 14:34:48 +0000
committerjnweiger <jnweiger>2005-12-16 14:34:48 +0000
commit30f597b9f18d355253b9484bb2f4a1fa5e2e3fb8 (patch)
treeb1a4294758cee774101d18c45d20cf9fa0efec52 /src
parent64434f463765093be5bc53f313848a897ef49c66 (diff)
downloadscreen-30f597b9f18d355253b9484bb2f4a1fa5e2e3fb8.tar.gz
go to ATTIC now.
Diffstat (limited to 'src')
-rw-r--r--src/COPYING339
-rw-r--r--src/ChangeLog409
-rw-r--r--src/FAQ253
-rw-r--r--src/INSTALL110
-rw-r--r--src/Makefile.in331
-rw-r--r--src/NEWS14
-rw-r--r--src/NEWS.3.5119
-rw-r--r--src/NEWS.3.648
-rw-r--r--src/NEWS.3.739
-rw-r--r--src/NEWS.3.9205
-rw-r--r--src/TODO7
-rw-r--r--src/acls.c1135
-rw-r--r--src/acls.h93
-rw-r--r--src/ansi.h170
-rw-r--r--src/attacher.c959
-rw-r--r--src/braille.c945
-rw-r--r--src/braille.h83
-rw-r--r--src/braille_tsi.c320
-rw-r--r--src/comm.c327
-rw-r--r--src/comm.h.dist227
-rw-r--r--src/comm.sh89
-rw-r--r--src/config.h.in663
-rwxr-xr-xsrc/configure9194
-rw-r--r--src/configure.in1307
-rw-r--r--src/display.c3922
-rw-r--r--src/display.h345
-rw-r--r--src/encoding.c1708
-rw-r--r--src/extern.h492
-rw-r--r--src/fileio.c836
-rw-r--r--src/help.c1628
-rw-r--r--src/image.h163
-rw-r--r--src/input.c402
-rwxr-xr-xsrc/install.sh119
-rw-r--r--src/kmapdef.c.dist144
-rw-r--r--src/layer.c1114
-rw-r--r--src/layer.h105
-rw-r--r--src/loadav.c351
-rw-r--r--src/logfile.c294
-rw-r--r--src/logfile.h82
-rw-r--r--src/mark.c1379
-rw-r--r--src/mark.h49
-rw-r--r--src/misc.c798
-rw-r--r--src/nethack.c133
-rw-r--r--src/os.h533
-rw-r--r--src/osdef.h.in201
-rw-r--r--src/osdef.sh71
-rw-r--r--src/patchlevel.h529
-rw-r--r--src/process.c6220
-rw-r--r--src/pty.c387
-rw-r--r--src/putenv.c211
-rw-r--r--src/resize.c1104
-rw-r--r--src/sched.c285
-rw-r--r--src/sched.h43
-rw-r--r--src/search.c373
-rw-r--r--src/socket.c1426
-rw-r--r--src/teln.c564
-rw-r--r--src/term.c284
-rw-r--r--src/term.h.dist252
-rw-r--r--src/term.sh169
-rw-r--r--src/termcap.c1509
-rw-r--r--src/tty.c.dist1887
-rw-r--r--src/tty.sh1563
-rw-r--r--src/utmp.c878
-rw-r--r--src/window.c2179
-rw-r--r--src/window.h317
65 files changed, 0 insertions, 52435 deletions
diff --git a/src/COPYING b/src/COPYING
deleted file mode 100644
index 55d2947..0000000
--- a/src/COPYING
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/src/ChangeLog b/src/ChangeLog
deleted file mode 100644
index 2256d80..0000000
--- a/src/ChangeLog
+++ /dev/null
@@ -1,409 +0,0 @@
-30.10.94
-
-This is a quick overview of screen's life story. But it is not up
-to date. You'll find more details about the revision history in
-patchlevel.h and newer changes are only documented there.
-
-31.7.93 -- 3.5.1
-================
-
-* writelock, number, paste with arg, at, zombie and wall commands added.
-
-* Access Control Lists and more multi-user support added.
-
-* select and setenv commands enhanced.
-
-* socket.c: motorola bugfix.
-
-* configure.in: --srcdir support.
-
-* configure.in: recognize alpha and SUNOS3 correctly.
-
-* doc/screen.texinfo: Documentation by Jason Merrill.
-
-13.05.93 -- 3.3.3
-=================
-
-* defautonuke, silence commands added.
-
-* exec command added.
-
-* hardcopydir, logdir commands added.
-
-* Made a superb configure script.
-
-* BROKEN_PIPE, SOCK_NOT_IN_FS added for braindamaged systems.
-
-* multi display, multi user support.
-
-* process command. CS, CE switch cursorkeycap in application mode.
-
-* lockprg pow_detaches on SIGHUP
-
-* ins_reg copy_reg commands.
-
-* new screenrc syntax.
-
-* split up screen.c and ansi.c
-
-21.10.92 -- 3.2.9
-================
-
-* ChangeLog: replaces CHANGES and is in GNUish format.
-
-* Makefile (CFLAGS, M_CFLAGS, LIBS, OPTIONS): moved user config here,
- merged all Makefiles, GNUified
-
-* socket.c (FindSocket): ignoring bad files in $SCREENDIR
-
-* config/config.linux: ported.
-
-* utmp.c, exec.c, loadav.c: split apart from screen.c/fileio.c
-
-15.07.92 -- 3.2.8
-=================
-
-* ansi.c (WriteString): automatic character set switching for 8bit support
-
-3.2.3-3.2.7
-===========
-
-* concept changes: Display structure, Multi attacher
-
-...
-
-3.2.2
-=====
-
-* screen.c (main): -m option, "_M_ake always new session", ignore $STY
-
-* screen.c (main): -Ssessionname
-* fileio.c (RcLine): ^A:sessionname give your session a nicer name.
-
-* screen.c (main): supporting detached startup via screen -d -m -Ssockname
-
-* fileio.c (stripdev): moved, could not compile
-
-* overlay.h: "stackable overlay concept"
-
-* search.c: vi-like / and ? search AND emacs-like ^S and ^R incremental search
- in scrollback
-
-* mark.c: I meant BSDI not BSD
-
-* concept change: struct display and struct newwin introduced.
-
-* screen.c (main): -v option prints version.
-
-* screen.c (MakeWindow): ^A:screen /dev/ttya opens a character device
- instead of forking ShellProg with a pty pair.
-
-3.2.0
-=====
-
-Ultrix port
-
-Irix 3.3 SGI port
-
-shadow password suite supported
-
-data loss on stdin overflow fixed
-
-"refresh off" keyword added.
-
-3.1.1
-------
-
-Screen is now under the GNU copyleft license. See file COPYING.
-
-command line option -A. $LINES, $COLUMNS improved.
-
-C-A : vbellwait <sec>
-
-XENIX support (Ronald Khoo)
-
-SYSV has uname() instead of gethostname().
-
-hpux has setresuid.
-
-ClearScreen now saves image to scrollback buffer.
-
-mips has setenv.
-
-numerous bugfixes.
-
-3.1 finally released version.
-=============================
-
-3.0.99: last minute changes:
-----------------------------
-
-MIPS support (J{rvinen Markku)
-
-SVR4 support (Marc Boucher)
-
-secopen() secfopen() calls replace stat/access/open.
-C-a : echo improved.
-'register int'
-
-Changes up to Screen 3.0 Patchlevel 7
-=====================================
-
-Better terminfo support: Screen now checks if a termcap/info
-entry which the name "screen.$TERM" does exist. Look in the
-"VIRTUAL TERMINAL" section of the manual for more details.
-
-Many security improvements.
-
-ScrollRegion() bug fixed which caused slow scrolling if AL
-or DL was used.
-
-Pyramid and Ultrix support added. (Tim and Larry)
-
-ENVIRONMENT support.
- /local/etc/screenrc checks for $SYSSCREENRC
- $HOME/.screenrc checks for $ISCREENRC and $SCREENRC
- /local/screens checks for $ISCREENDIR and $SCREENDIR
- .screenrc understands ${VAR} and $VAR .
-
-screen 3.0 Patchlevel 6
-=======================
-
-.screenrc:
- screen now only opens the windows you explicitly ask for. if you
- specify none, you still get one window, of course.
-
-screen 3.0. Patchlevel 5
-========================
-
-Ansi prototyping by Christos.
-
-copy mode: CTRL-U / CTRL-D exchanged. code cleanup.
-
-changes to screen 3.0 patchlevel 4
-==================================
-
-markkeys "string"
- allows to rebind the keys used in copy/history mode.
- string is made up of pairs "<oldchar>=<newchar>" which are separated
- by a colon. Oldchar and newchar are either single ascii characters,
- or the two character sequence ^x, where x is an ascii character, or
- a 3 digit octal value prepended with '\'. the string "\040=.:^M=q"
- rebinds '.' to set marks, and the return rey will abort copy mode.
-
-set scrollback 100
- resizes the scrollback history buffer to 100 lines. a default of 50
- is installed.
-
-A Howard Chu like scrollback history is installed. Many vi-like keys
- are added to the copy mode. The '?' key reports on cursor position.
-
-screen 3.0 Patchlevel 3
-=======================
-
-WriteString fixed, it did kill the display variable.
-
-Yet another LP bugfix.
-
-non vt100 semi-graphics character support.
-
-waynes patch fixed
-
-screen 3.0 Patchlevel 2
-=======================
-
-wayne patches cursor motion outside scrollregions.
-
-.screenrc
- monitor on|off
-
-changes in Screen 3.0 Patchlevel 1
-==================================
-
-screen -wipe
-
-^A : set vbell_msg "Wuff Wuff"
-
-Thousand enhancements: help resizible, copy'n'paste in main
- socket loop, and no more '\0' hackin'. :WS=\E8;%d;%dt:
-
-screen can now resize windows under sunview.
-
-^A : set crlf on|off
- effects markroutine join.
-
-screen learned about sized windows under X
-
-screen -ls (-d) -q
- quiet option. We count the number of detached (attached) sessions and set
- a return value of 10+n. The -q option inhibits all startup
- warnings/messages. i.e. screen -R -q may return with code 12 or higher
- or start a new/old session.
-
-pow_detach_msg "text string"
- new command, allows messages, terminal reset, etc. on logout caused
- by pow_detach.
-
-^A : learned a new keyword "set":
- commands like "login on" , "vbell off", ... affect the default for
- windows to be created. But commands like "set login off" affect
- the actual setting of this window. and not the default.
- such commands may be bound to keys. example:
- bind 'O' set login off
- is valid in your .screenrc as well as typed at the ':' prompt.
- a bonus is ":set all" which is synonym to ":help".
- At the Colon prompt also KeyNames can be entered, alothough that makes
- not always sense.
-
-^A x uses a builtin lockprg, if
- a) we don't find our lockprg, or
- b) user supplies us with the environmet variable LOCKPRG set to "builtin"
- the builtin locks until your login password is typed. on systems using
- "shadow password files" you are prompted for a password.
-
-markroutine can append joined.
-
-screen removes the "controlling tty" from utmp while ptys are attached.
-
-markroutine performs CR+NL when '\n' is pressed
-
-screen may die quietly, when no TERMCAP entry for "screen" is
-found, and screen is run under X-windows
-
-_SEQUENT_ marks sequent386_ptx
-
-screen runs now under SunOS4.1.1 (we need setsid()!).
-
-bug in SetForeWindow fixed.
-
-rare markroutine bug fixed.
-
-we dont open every file the attacher tells us.
-
-we have now our wonderful "Wuff, Wuff" visual_bell
-
-we have now the interprocess-communication-buffer. secure version.
-
-'^A =' removes the interprocess-communication-buffer.
-
-markroutine as in 2.1
-
-markroutine: 'a' toggles append mode,
- '>' like ' ', but immediately WriteFile(DUMP_EXCHANGE) then.
- 'A' like ' ', but first switch to append mode.
-
-.screenrc understands "screen 2:faui09 rlogin faui09 -l jnweiger"
- and "password none"
- and "vbell [on|off]"
-
-'^A :' allows .screenrc commands "online".
-
-screen now receives new $TERM from attacher, when it is reattached
-
-MakeClientSocket() fifo version does now test for access.
-
-.screenrc learns "hardstatus {on|off}"
-
-termcap's VB is used for vbell if available.
-
-Attach() code rewritten:
- screen now lists socket directory, if it does not find a suitable socket
- screen -d [host.tty] detaches a running screen.
-
-screen -[ls|list]
- list all sockets that we find in our sockdir
-
-when the socket has been removed, send a SIGCHLD to the poor SCREEN
-process and it will try to recover. then try a 'screen -r' again.
-all the socket stuff lives now in an extra file.
-
-Major changes in version 2.4:
-=============================
-
-* Test version that presents the erlangen extensions from 2.0 in a 2.3
- screen.
-
-* window resize support
-
-* screen locking C-a x
-
-* support for SYSV
-
-* password protection
-
-* copy & paste across screens
-
-* remote detach and power detach
-
-Major changes in version 2.3:
-
-* Terminal emulation has been significantly enhanced and bugfixed.
-
-* We now fully update the last character on the screen for true auto-
- margin terminals, though there may be some delay before the character
- can be safely added to the screen. If your terminal has character
- insert it will be used to shorten the delay.
-
-* Added the "termcap" .screenrc command to tweak your terminal's termcap
- entry AND to customize the termcap generated for the virtual terminals.
- See also the -L and -O command-line options, and the SCREENCAP environ-
- ment variable.
-
-* Fixed screen's character handling when detached or suspended to NOT block
- the child processes in their windows -- output continues to be processed
- in the background.
-
-* Added a.k.a.s (window-name aliases) that allow you to customize the
- window-information line, including being able to change the name on-
- the-fly to reflect what's currently running in the window (see the
- -k option, shellaka command, and ALSO KNOWN AS discussion in the doc).
-
-* Added the ability to log the output of a window to a file (see the
- "C-a H" (log) command).
-
-* Flow-control can now be set for each window and switched interactively
- (see the "flow" command, -f option, and FLOW CONTROL discussion).
-
-* Individual windows can be included or excluded from mention in the
- /etc/utmp file (see the "login" command and -l option).
-
-* Added an activity monitor, which allows you to have a window watched for
- the start of any output and alert you when it occurs (see the "C-a M"
- (monitor) command).
-
-* Enhanced the information in the window-information line to keep track of
- windows that have: logging turned on '(L)'; beeped in the background '!';
- became active while being monitored '@' (see the "C-a w" (windows) command).
-
-* Added an on-line help display that lists all the commands and their
- key bindings (see the "C-a ?" (help) command).
-
-* Extended handling of the beep message (and also the new activity message)
- to allow '~' to specify a literal beep (see the "beep" and "activity"
- .screenrc commands).
-
-* You can now set the default action on receipt of a hangup signal: detach
- or terminate (see the "autodetach" .screenrc command).
-
-* Routing of characters to their virtual terminals has been enhanced to
- not drop characters nor (in rare circumstances) hang up screen.
-
-* The NFS compatibility has been enhanced.
-
-Major changes in version 2.0a:
-
-* Screen allows you to `detach' the "screen" session from the physical
- terminal and resume it at a later point in time (possibly on a
- different terminal or in a different login session).
-
- To get an impression of this functionality do the following:
-
- - call "screen" and create a couple of windows
- - type Control-A Control-D (screen terminates; you are back
- in the shell)
- - call "screen -r" to resume the detached screen
-
-* Screen supports multiple character sets and the ISO 2022 control
- functions to designate and switch between character sets.
- This allows you, for instance, to make use of the VT100 graphics
- character set or national character sets.
diff --git a/src/FAQ b/src/FAQ
deleted file mode 100644
index 6c9c8af..0000000
--- a/src/FAQ
+++ /dev/null
@@ -1,253 +0,0 @@
- jw 21.10.93
- 05.05.94
-
- screen: frequently asked questions -- known problems -- unimplemented bugs
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-
-Q: Why is it impossible to download a file with Kermit/sz/rz when
- screen is running? Do I need to set some special variables?
-
-A: Screen always interprets control-sequences sent by the
- applications and translates/optimizes them for the current
- terminal type. Screen always parses the user input for its
- escape character (CTRL-A). Both are basic screen features and
- cannot be switched off. Even if it were possible to switch
- screen into a completely transparent mode, you could never switch
- between windows, while kermit/sz/rz is downloading a file. You
- must wait til the end as kermit/sz/rz will not transmit your
- input during a file transfer and as kermit/sz/rz would be very
- confused if screen switched away the window containing the
- other kermit/sz/rz. Simply detach your screen session for each
- file transfer and start the transfer program only from the shell
- where you started screen.
-
-Q: I am using screen with a YYY terminal, which supports the XXX
- graphic language. I am very happy with it, except one thing: I
- cannot render graphics into screen windows.
-
-A: You are out of luck there. Screen provides a fixed set of escape
- sequences in order to make it possible to switch terminal types.
- Screen has to know exactly what the escape sequences do to the
- terminal because it must hold an image in memory. Otherwise
- screen could not restore the image if you switch to another
- window. Because of this you have to change screens escape
- sequence parser (ansi.c) to pass the XXX graphics sequences to
- the terminal. Of course the graphics will be lost if you switch
- to another window. Screen will only honour graphics sequences
- that are demanded by an overwhelming majority.
-
-Q: For some unknown reason, the fifo in /tmp/screens/S-myname is
- gone, and i can't resume my screen session. Is there a way to
- recreate the fifo?
-
-A: Screen checks the fifo/socket whenever it receives a SIGCHLD
- signal. If missing, the fifo/socket is recreated then. If screen
- is running non set-uid the user can issue a 'kill -CHLD
- screenpid' directly (it is -CHILD on some systems). Screenpid is
- the process-id of the screen process found in a 'ps -x' listing.
- But usually this won't work, as screen should be installed set-
- uid root. In this case you will not be able to send it a signal,
- but the kernel will. It does so, whenever a child of screen
- changes its state. Find the process-id (shellpid below) of the
- "least important" shell running inside screen. The try 'kill
- -STOP shellpid'. If the fifo/socket does not reappear, destroy
- the shell process. You sacrify one shell to save the rest. If
- nothing works, please do not forget to remove all processes
- running in the lost screen session.
-
-Q: When you start "screen" a page of text comes up to start you
- off. Is there a way to get rid of this text as a command line
- argument or by using a switch of some sort.
-
-A: Just put the following line in your ~/.screenrc:
- startup_message off
- Many peole ask this, although it is in the man page, too :-)
-
-Q: Start "screen emacs" and run emacs function suspend-emacs
- (ctrl-z). The window containing emacs vanishes.
-
-A: This is a known bug. Unfortunatly there is no easy fix
- because this is specified in the POSIX standard. When a new
- window is created Screen opens up a new session because the
- window has to get the pty as a controlling terminal (a
- session can only have one controlling terminal). With the
- setsid() call the process also creates a new process
- group. This process group is orphaned, because there is no
- process in the session which is not in the process
- group. Now if the process group leader (i.e. your program)
- gets a TTIN/TTOU/TSTP, POSIX states that the kernel must
- send a KILL signal to the process group because there is no
- one left to continue the process. Even if screen would
- try to restart the program, that would be after it received the
- KILL signal which cannot be caught or ignored.
-
- tromey@klab.caltech.edu (Tom Tromey): I've noticed this exact
- same problem. I put this in my .emacs file. It seems to work:
-
- ;; If running under screen, disable C-z.
- (if (and (getenv "STY") (not window-system))
- (global-unset-key "\C-z"))
-
-Q: Screen gets the terminal size wrong and messes up.
-
-A: Before you start screen: Check with 'stty -a' what the terminal
- driver thinks about rows and columns. Check the environment
- variables LINES and COLUMNS. Then from within screen check with
- the info command (CTRL-A i) what size screen thinks your terminal
- is. If correcting tty driver setting and environment variables
- does not help, look up the terminal capability definition. First
- the TERMCAP environment variable. If this is not set, look up the
- terminals name as defined in the environment variable TERM in
- /etc/termcap or in the terminfo database with untic or infocmp.
- There may be :li=...: and :co=...: or even :ll=...: entries
- (cols#... and lines#... when it's terminfo) defined incorrectly.
- Either construct your own TERMCAP environment variables with
- correct settings, use screens terminfo/termcap command in your
- .screenrc file or have the database corrected by the system
- administrator.
-
-Q: Screen messes up the terminal output when I use my favourite ap-
- plication. Setting the terminal size does not help.
-
-A: Probably you got the termcap/terminfo entries wrong. Fixing this
- is a three stage procedure. First, find out if terminfo or
- termcap is used. If your system only has /etc/termcap,
- but not /usr/lib/terminfo/... then you are using termcap.
- Easy. But if your system has both, then it depends how the appli-
- cation and how screen were linked. Beware, if your applica-
- tion runs on another host via rlogin, telnet or the like, you
- should check the terminfo/termcap databases there. If you cannot
- tell if terminfo or termcap is used (or you just want to be
- save), the do all steps in stage 3 in parallel for both
- systems (on all envolved hosts). Second: Understand the basic
- rules how screen does its terminal emulation. When screen is
- started or reattached, it relies on the TERM environment variable
- to correctly reflect the terminal type you have physically
- in front of you. And the entry should either exist in the system
- terminfo/termcap database or be specified via the TERMCAP en-
- vironment variable (if screen is using the termcap system). On
- the other end, screen understands one set of control codes. It
- relies on the application using these codes. This means applica-
- tions that run under screen must be able to adapt their con-
- trol codes to screen. The application should use the TERM vari-
- able and termcap or terminfo library to find out how to drive
- its terminal. When running under screen, the terminal is virtual
- and is only defined by the set of control codes that screen
- understands. The TERM variable is automatically set to
- "screen" and the "screen"-entries should exist in the data-
- bases. If your application uses hardcoded control codes rather
- than a database, you are on your own. Hint: The codes under-
- stood by screen are a superset of the very common definition
- named "vt100". Look at the documentation of screen. The
- codes are listed there. Third: Have the entry "screen" in-
- stalled on all hosts or make sure you can live with "vt100".
- Check the codes sent by your application, when the TERM variable
- is set to "screen". Do not try to set the TERM variable inside
- screen to anything other than "screen" or "vt100" or compati-
- ble. Thus your application can drive screen correctly. Also take
- care that a good entry is installed for your physical terminal
- that screen has to drive. Even if the entry was good enough
- for your application to drive the terminal directly, screen may
- find flaws, as it tries to use other capabilities while op-
- timizing the screen output. The screenrc commands
- "termcap" and/or "terminfo" may help to fine-tune capabilities
- without calling the supervisor to change the database.
-
-Q: I cannot configure screen. Sed does not work.
-
-A: The regular expressions used in our configure scrip are too
- complicated for GNU sed version 2.03. In this regard it is bug
- compatible with Ultrix 3.1 "sed": GNU sed version 2.03 dumps
- core with our configure script. Try an older release. E.g. from
- ftp.uni-erlangen.de:/pub/utilities/screen/sed-2.02b.tar.gz
-
-Q: When reattaching a session from a different Workstation, the
- DISPLAY environment variable should be updated. Even ``CTLR-A
- : setenv DISPLAY newhost:0'' does not work as expected.
-
-A: Under unix every process has its own environment. The environ-
- ment of the SCREEN process can be changed with the `setenv' com-
- mand. This however cannot affect the environment of the
- shells or applications already running under screen. Subsequently
- spawned processes will reflect the changes. One should be aware
- of this problem when running applications from very old shells.
- Screen is a means for keeping processes alive.
-
-Q: About once every 5 times I ran the program, rather than getting
- a "screen," I got someone elses IRC output/input.
-
-A: What probably happened is that an IRC process was left running on
- a pseudo tty in such a way that the kernel thought the tty was
- available for reallocation. You can fix this behaviour by
- applying the SunOS 4.1.x tty jumbo patch (100513-04).
-
-Q: Screen compiled on SunOS 5.3 cannot reattach a detached session.
-
-A: You are using /usr/ucb/cc, this compiler is wrong. Actually it
- links with a C-library that mis-interprets dirent. Try again
- with /opt/SUNWspro/bin/cc!
-
-Q: The "talk" command does not work when Screen is active.
-
-A: Talk and several other programs rely on entries in the Utmp-
- Database (/etc/utmp). On some systems this Database is world
- writable, on others it is not. If it is not, screen must be
- installed with the appropriate permissions (user or group s-bit)
- just like any program that uses PTYs (rlogin, xterm, ...). When
- screen cannot write to utmp, you will see messages on you display
- which do not belong to any screen window.
- When screen can update utmp, it is not guaranteed that it does as
- you expect. First this depends on the config.h file defining
- UTMPOK, LOGINDEFAULT, and perhaps CAREFULUTMP. Second it depends
- on the screenrc files (system wide and per user), if utmp entries
- are done. Third, you can control whether windows are logged in
- with screens ``login'' command.
-
-Q: Seteuid() does not work as expected in AIX. Attempting a multi-
- user-attach results in a screen-panic: "seteuid: not owner".
-
-A: This is not a screen problem. According to Kay Nettle
- (pkn@cs.utexas.edu) you need the AIX patch PTF 423674.
-
-Q: When I type cd directory (any directory or just blank) from
- within one of the windows in screen, the whole thing just freezes
- up.
-
-A: You display the current working directory in xterm's title bar,
- This may be caused by hardcoded ESC-sequences in the shell prompt
- or in an cd alias. In Xterm the coding is
- ESC ] n ; string_to_display ^G
- where n = 1, 2, 3 selects the location of the displayed string.
- Screen misinterprets this as the ansi operating system comment
- sequence:
- ESC ] osc_string
- and waits (according to ansi) for the string terminator
- ESC \
- Screen versions after 3.5.12 may provide a workaround.
-
-Q: Mesg or biff cannot be turned on or off while running screen.
-
-A: Screen failed to change the owner of the pty it uses. You need to
- install screen setuid-root. See the file INSTALL for details.
-
-Q: The cursor left key deletes the characters instead of just moving the
- cursor. A redisplay (^Al) brings everything back.
-
-A: Your terminal emulator treats the backspace as "destructive". You
- can probably change this somewhere in the setup. We can't think
- of a reason why anybody would want a destructive backspace, but
- if you really must have it, add the lines
- termcap <TERM> 'bc@:bs@'
- terminfo <TERM> 'bc@:bs@'
- to your ~/.screenrc (replace <TERM> with the terminal type your
- emulator uses).
-
-Q: I have an old SysV OS (like Motorola SysV68) and sometimes screen
- doesn't reset the attributes correctly. A redisplay (^Al) doesn't
- make things better.
-
-A: The libcurses library has a bug if attributes are cleared with
- the special ue/se capabilities. As a workaround (other than upgrading
- your system) modify 'rmul' (and 'rmso'?) in screen's terminfo entry:
- rmul=\E[m, rmso=\E[m
diff --git a/src/INSTALL b/src/INSTALL
deleted file mode 100644
index 17c2212..0000000
--- a/src/INSTALL
+++ /dev/null
@@ -1,110 +0,0 @@
-Installation of screen3.6 jw 9.04.95
-
-
-0.) This instruction is quite lengthy
--------------------------------------
-.. and there are still important items near the end. Start here:
-Unpack. Screen comes as a compressed tar archive. You need gzip to
-uncompress. And... well, you probably already managed that step,
-when you are reading this.
-
-For general documentation on the coding and usage standards this
-distributions follows, see the GNU standards document on
-prep.ai.mit.edu:pub/gnu/standards.*, especially the `Makefile
-Conventions', `Configuration', and `User Interfaces' sections.
-
-
-1.) configure & config.status
------------------------------
-Run configure. This should create a reasonable Makefile and a config.h file
-suited for your machine. Rename config.status to reflect the architecture
-(hostname) where it was built. To reconfigure quickly for that architecture
-just run that config.status file.
-If this process fails, try to find out what configure did do and what it
-should have checked. Mail me.
-Actually the initial Makefile that comes with the distribution just runs
-configure -- thus you can start by typing 'make' right after unpacking.
-You will be prompted to run 'make' again, which will really make screen.
-
-2.) Makefile & config.h
------------------------
-Look through the Makefile & user configuration section in config.h and check
-pathnames. Change them to suit your installation requirements. Usually
-sysadmins discuss the location of SOCKDIR, whether it should be in /tmp or
-not. At least it must be on a filesystem that supports sockets/fifos.
-SOCKDIR must not point into an AFS (Andrew File System) mounted directory.
-If you are uncertain about your NFS implementation, use a UFS directory for
-SOCKDIR. Personally, I favour a users home directory and recommend the the
-/tmp/ area.
-The path for ETCSCREENRC may also need to be adapted.
-
-3.) how to actually compile
----------------------------
-Run 'make'. Screen should compile without too many warnings :)
-The creation of term.h, comm.h, tty.c or osdef.h may fail on some machines
-for some odd reason. (E.g. the sed under SCO-unix is known to be
-case-insensitive and breaks term.h.) If so, please mail a short description
-of the problem to screen@uni-erlangen.de and use the files ending in .dist
-as a replacement (or in case of osdef.h retry with an empty file).
-You can then try 'make install' (if you dare).
-
-4.) where to install
---------------------
-You may well run screen from your private binary directory and with a
-private socket directory like $HOME/.screen. But to have a full featured
-screen and (from a users point of view) more secure pty's you should
-consult a system administrator and discuss installing screen setuid-root
-in some globally accessible directory like /usr/local/bin.
-
-Consider this, when deciding whether you install screen setuid-root:
-- On some machines root privileges are required to open pty's.
-- Pty's should be owned by the user, so that she can do chmod to prevent
- intruder attacks. The PTYs used by screen will remain world read-writable
- if screen is not installed setuid-root.
-- Some commands only work properly when the pty is owned by the user.
- These include mesg and biff.
-- The ^At feature may need to lseek and read the kernel file to retrieve
- the load average.
-- On most machines utmp slots can only be created/manipulated with root
- privileges. Users will appear to be logged on the primary terminal
- instead of the screen windows, if screen is not installed setuid-root.
-- Multi-user screen sessions are only allowed when screen has a root-s-bit.
-- If screen sockets of multiple users are kept in one directory (e.g.
- /tmp/screens), this directory must be world writable when screen is not
- installed setuid-root. Any user can remove or abuse any socket then.
-
-
-5.) doc/screen.1 & doc/screen.texinfo
--------------------------------------
-The man page doc/screen.1 should go to /usr/local/man/man1, or some similar
-directory. It should format nicely with nroff -man. If it does not, then
-try removing extra dots with: sed -e 's/^\.\././' < screen.1 | nroff -man
-The info page doc/screen.texinfo contains basically the same information as
-the man-page, we may have missed one or another thing in one of the files.
-If so, mail me.
-
-6.) etc/screenrc & etc/etcscreenrc
-----------------------------------
-The files screenrc and etc/etcscreenrc are instructive samples that
-demonstrate what can/should be done from your private .screenrc and from
-$ETCSCREENRC -- do not just copy them. Read them. Look through the
-etcscreenrc file for system wide defaults that you like to set. e.g.
-autodetach off, startup_message off, vbell on, ...
-Since version 3.2.15 the screenrc file syntax changed slightly. All rc files
-from previous versions should be run through the 'newsyntax' script that comes
-with this package.
-If and only if you want to install screen as a console multiplexer, look
-at the *.sample files and what 'make cscreen' suggests.
-
-7.) terminfo/screeninfo.src & terminfo/screencap
-------------------------------------------------
-Every now and then we update the termcap/terminfo entries for screen.
-E.g. keycodes were added in 3.6.0 -- thus you check that your termcap/terminfo
-database is up to date. See the README in the terminfo subdirectory.
-
-8.) have fun
-------------
-To get an idea what the basic screen commands are, read the file README.
-Request snail mail address for liquid and solid donations. :-)
-
-Juergen & Michael. (screen@uni-erlangen.de)
diff --git a/src/Makefile.in b/src/Makefile.in
deleted file mode 100644
index db683ac..0000000
--- a/src/Makefile.in
+++ /dev/null
@@ -1,331 +0,0 @@
-#
-# Makefile template for screen
-#
-# See machine dependant config.h for more configuration options.
-#
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-DESTDIR =
-
-# Where to install screen.
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-# don't forget to change mandir and infodir in doc/Makefile.
-bindir = $(exec_prefix)/bin
-
-VERSION = @VERSION@
-SCREEN = screen-$(VERSION)
-
-ETCSCREENRC = `sed < config.h -n -e '/define ETCSCREENRC/s/^.*"\([^"]*\)"/\1/p'`
-SCREENENCODINGS = `sed < config.h -n -e '/define SCREENENCODINGS/s/^.*"\([^"]*\)"/\1/p'`
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-
-CPP=@CPP@
-CPP_DEPEND=$(CC) -MM
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-
-AWK = @AWK@
-
-### Chose some debug configuration options:
-# -DDEBUG
-# Turn on really heavy debug output. This is written to
-# /tmp/debug/{SCREEN,screen}.<pid>. Look at these files and quote
-# questionable sections when sending bug-reports to the author.
-# -DDUMPSHADOW
-# With shadow-pw screen would never dump core. Use this option if
-# you still want to have a core. Use only for debugging.
-OPTIONS=
-#OPTIONS= -DDEBUG
-
-SHELL=/bin/sh
-
-CFILES= screen.c ansi.c fileio.c mark.c misc.c resize.c socket.c \
- search.c tty.c term.c window.c utmp.c loadav.c putenv.c help.c \
- termcap.c input.c attacher.c pty.c process.c display.c comm.c \
- kmapdef.c acls.c braille.c braille_tsi.c logfile.c layer.c \
- sched.c teln.c nethack.c encoding.c
-OFILES= screen.o ansi.o fileio.o mark.o misc.o resize.o socket.o \
- search.o tty.o term.o window.o utmp.o loadav.o putenv.o help.o \
- termcap.o input.o attacher.o pty.o process.o display.o comm.o \
- kmapdef.o acls.o braille.o braille_tsi.o logfile.o layer.o \
- sched.o teln.o nethack.o encoding.o
-
-all: screen
-
-screen: $(OFILES)
- $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS)
-
-.c.o:
- $(CC) -c -I. -I$(srcdir) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $<
-
-install_bin: .version screen
- -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \
- then mv $(DESTDIR)$(bindir)/$(SCREEN) $(DESTDIR)$(bindir)/$(SCREEN).old; fi
- $(INSTALL_PROGRAM) screen $(DESTDIR)$(bindir)/$(SCREEN)
- -chown root $(DESTDIR)$(bindir)/$(SCREEN) && chmod 4755 $(DESTDIR)$(bindir)/$(SCREEN)
-# This doesn't work if $(bindir)/screen is a symlink
- -if [ -f $(DESTDIR)$(bindir)/screen ] && [ ! -f $(DESTDIR)$(bindir)/screen.old ]; then mv $(DESTDIR)$(bindir)/screen $(DESTDIR)$(bindir)/screen.old; fi
- rm -f $(DESTDIR)$(bindir)/screen
- (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen)
- cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS)
-
-###############################################################################
-install: installdirs install_bin
- cd doc ; $(MAKE) install
- -if [ -d /usr/lib/terminfo ]; then \
- PATH="$$PATH:/usr/5bin" tic ${srcdir}/terminfo/screeninfo.src; \
- chmod 644 /usr/lib/terminfo/s/screen*; \
- fi
-# Better do this by hand. E.g. under RCS...
-# cat ${srcdir}/terminfo/screencap >> /etc/termcap
- @echo "termcap entry (${srcdir}/terminfo/screencap) should be installed manually."
- @echo "You may also want to install $(srcdir)/etc/etcscreenrc in" $(ETCSCREENRC)
-
-installdirs:
-# Path leading to ETCSCREENRC and Socketdirectory not checked.
- $(srcdir)/etc/mkinstalldirs $(DESTDIR)$(bindir) $(DESTDIR)$(SCREENENCODINGS)
- cd doc ; $(MAKE) installdirs
-
-uninstall: .version
- rm -f $(DESTDIR)$(bindir)/$(SCREEN)
- rm -f $(DESTDIR)$(bindir)/screen
- -mv $(DESTDIR)$(bindir)/screen.old $(DESTDIR)$(bindir)/screen
- rm -f $(DESTDIR)$(ETCSCREENRC)
- cd doc; $(MAKE) uninstall
-
-shadow:
- mkdir shadow;
- cd shadow; ln -s ../*.[ch] ../*.in ../*.sh ../configure ../doc ../terminfo ../etc .
- rm -f shadow/term.h shadow/tty.c shadow/comm.h shadow/osdef.h
- echo "install all Makefiles and config:" > shadow/Makefile
- echo " rm -f config.cache" >> shadow/Makefile
- echo " sh ./configure" >> shadow/Makefile
-
-term.h: term.c term.sh
- AWK=$(AWK) srcdir=$(srcdir) sh $(srcdir)/term.sh
-
-kmapdef.c: term.h
-
-tty.c: tty.sh
- sh $(srcdir)/tty.sh tty.c
-
-comm.h: comm.c comm.sh config.h
- AWK=$(AWK) CC="$(CC) $(CFLAGS)" srcdir=${srcdir} sh $(srcdir)/comm.sh
-
-osdef.h: osdef.sh config.h osdef.h.in
- CPP="$(CPP) $(CPPFLAGS)" srcdir=${srcdir} sh $(srcdir)/osdef.sh
-
-docs:
- cd doc; $(MAKE) dvi screen.info
-
-dvi info screen.info:
- -cd doc; $(MAKE) $@
-
-mostlyclean:
- rm -f $(OFILES) screen config.cache osdef0.c osdef1.sed osdef2.sed
-
-clean celan: mostlyclean
- rm -f tty.c term.h comm.h osdef.h kmapdef.c core
-
-# Delete all files from the current directory that are created by
-# configuring or building the program.
-# building of term.h/comm.h requires awk. Keep it in the distribution
-# we keep config.h, as this file knows where 'make dist' finds the ETCSCREENRC.
-#distclean: mostlyclean
-# rm -f $(SCREEN).tar $(SCREEN).tar.gz
-# rm -f config.status Makefile
-# rm -f osdef.h doc/Makefile
-
-maintainer-clean:
- @echo "This command is not even intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-
-# Delete everything from the current directory that can be
-# reconstructed with this Makefile.
-realclean: .version mostlyclean
- rm -f $(SCREEN).tar $(SCREEN).tar.gz
- rm -f config.status Makefile doc/Makefile
- rm -f tty.c term.h comm.h osdef.h kmapdef.c
- rm -f config.h
- echo "install all Makefiles and config:" > Makefile
- echo " sh ./configure" >> Makefile
-
-tags TAGS: $(CFILES)
- -ctags *.sh $(CFILES) *.h
- -ctags -e *.sh $(CFILES) *.h
-
-dist: .version $(SCREEN).tar.gz
-
-$(SCREEN).tar: .version term.h comm.h tty.c kmapdef.c
- -rm -rf dist
- mkdir dist
- mkdir dist/$(SCREEN)
- ln acls.h ansi.h display.h extern.h logfile.h mark.h os.h \
- layer.h patchlevel.h screen.h window.h image.h \
- osdef.h.in term.sh tty.sh comm.sh osdef.sh braille.h \
- sched.h \
- $(CFILES) \
- ChangeLog COPYING INSTALL NEWS* TODO install.sh \
- dist/$(SCREEN)
- cd dist/$(SCREEN); mv tty.c tty.c.dist
- cd dist/$(SCREEN); mv kmapdef.c kmapdef.c.dist
- ln configure.in configure dist/$(SCREEN)
- sed -e 's@"/local/screens@"/tmp/screens@' -e 's@"/local@"/usr/local@g' < config.h.in > dist/$(SCREEN)/config.h.in
- sed -e 's@[ ]/local@ /usr/local@g' -e 's/^CFLAGS = -g/CFLAGS = -O/' < Makefile.in > dist/$(SCREEN)/Makefile.in
- ln term.h dist/$(SCREEN)/term.h.dist
- ln comm.h dist/$(SCREEN)/comm.h.dist
- ln README dist/$(SCREEN)/README
- mkdir dist/$(SCREEN)/terminfo
- cd terminfo; ln 8bits README checktc.c screencap \
- screeninfo.src test.txt tetris.c \
- ../dist/$(SCREEN)/terminfo
- mkdir dist/$(SCREEN)/etc
- cd etc; ln * ../dist/$(SCREEN)/etc
- mkdir dist/$(SCREEN)/utf8encodings
- cd utf8encodings; ln * ../dist/$(SCREEN)/utf8encodings
- # sed -e 's/^startup/#startup/' -e 's/^autodetach/#autodetach/' < $(ETCSCREENRC) > dist/$(SCREEN)/etc/etcscreenrc
- cp $(HOME)/.screenrc dist/$(SCREEN)/etc/screenrc
- mkdir dist/$(SCREEN)/doc
- sed -e 's@/local/emacs@/usr/local@g' < doc/Makefile.in > dist/$(SCREEN)/doc/Makefile.in
- cd doc; ln FAQ README.DOTSCREEN screen.1 screen.texinfo fdpat.ps make.help window_to_display.ps \
- ../dist/$(SCREEN)/doc
- cd doc; if test -f screen.info; then ln screen.info* \
- ../dist/$(SCREEN)/doc; fi
- cd dist/$(SCREEN)/doc; ln -s ../install.sh .
- cd dist/$(SCREEN); ln -s doc/FAQ .
- echo "install all Makefiles and config:" > dist/$(SCREEN)/Makefile
- echo " rm -f config.cache" >> dist/$(SCREEN)/Makefile
- echo " sh ./configure" >> dist/$(SCREEN)/Makefile
- cd dist; tar cf ../$(SCREEN).tar $(SCREEN)
- rm -rf dist
-
-$(SCREEN).tar.gz: $(SCREEN).tar
- gzip -nf $(SCREEN).tar || gzip -f $(SCREEN).tar
-
-# Perform self-tests (if any).
-check:
-
-lint:
- lint -I. $(CFILES)
-
-saber:
- #load $(CFLAGS) screen.c ansi.c $(LIBS)
-
-config:
- rm -f config.cache
- sh ./configure
-
-
-###############################################################################
-
-.version:
- @rev=`sed < $(srcdir)/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`; \
- vers=`sed < $(srcdir)/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`; \
- pat=`sed < $(srcdir)/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`; \
- if [ "$${rev}.$${vers}.$${pat}" != "$(VERSION)" ]; then \
- echo "This distribution is screen-$${rev}.$${vers}.$${pat}, but"; \
- echo "the Makefile is from $(VERSION). Please update!"; exit 1; fi
-
-###############################################################################
-
-mdepend: $(CFILES) term.h
- @rm -f DEPEND ; \
- for i in ${CFILES} ; do \
- echo "$$i" ; \
- echo `echo "$$i" | sed -e 's/.c$$/.o/'`": $$i" `\
- cc -E $$i |\
- grep '^# .*"\./.*\.h"' |\
- (sort -t'"' -u -k 2,2 2>/dev/null || sort -t'"' -u +1 -2) |\
- sed -e 's/.*"\.\/\(.*\)".*/\1/'\
- ` >> DEPEND ; \
- done
-
-
-depend: depend.in
- ./config.status || ./configure
-
-depend.in: $(CFILES) term.h
- cp Makefile.in Makefile.in~
- sed -e '/\#\#\# Dependencies/q' < Makefile.in > tmp_make
- for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done
- mv tmp_make Makefile.in
-
-###############################################################################
-
-### Dependencies:
-screen.o: screen.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h braille.h \
- patchlevel.h logfile.h extern.h
-ansi.o: ansi.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h braille.h extern.h \
- logfile.h
-fileio.o: fileio.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-mark.o: mark.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h mark.h extern.h
-misc.o: misc.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-resize.o: resize.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-socket.o: socket.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-search.o: search.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h mark.h extern.h
-tty.o: tty.c config.h screen.h os.h osdef.h ansi.h acls.h comm.h \
- layer.h term.h image.h display.h window.h extern.h
-term.o: term.c term.h
-window.o: window.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h logfile.h
-utmp.o: utmp.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-loadav.o: loadav.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-putenv.o: putenv.c config.h
-help.o: help.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-termcap.o: termcap.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-input.o: input.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-attacher.o: attacher.c config.h screen.h os.h osdef.h ansi.h \
- acls.h comm.h layer.h term.h image.h display.h window.h extern.h
-pty.o: pty.c config.h screen.h os.h osdef.h ansi.h acls.h comm.h \
- layer.h term.h image.h display.h window.h extern.h
-process.o: process.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h logfile.h
-display.o: display.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h braille.h
-comm.o: comm.c config.h acls.h comm.h
-kmapdef.o: kmapdef.c config.h
-acls.o: acls.c config.h screen.h os.h osdef.h ansi.h acls.h comm.h \
- layer.h term.h image.h display.h window.h extern.h
-braille.o: braille.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h braille.h
-braille_tsi.o: braille_tsi.c config.h screen.h os.h osdef.h ansi.h \
- acls.h comm.h layer.h term.h image.h display.h window.h extern.h \
- braille.h
-logfile.o: logfile.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h logfile.h
-layer.o: layer.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-sched.o: sched.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h logfile.h
-teln.o: teln.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-nethack.o: nethack.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
-encoding.o: encoding.c config.h screen.h os.h osdef.h ansi.h acls.h \
- comm.h layer.h term.h image.h display.h window.h extern.h
diff --git a/src/NEWS b/src/NEWS
deleted file mode 100644
index 8f2db9e..0000000
--- a/src/NEWS
+++ /dev/null
@@ -1,14 +0,0 @@
- ------------------------------
- What's new in screen-4.0.0 ?
- ------------------------------
-
-* new screenrc parser, not 100% compatible.
-
-* screenblanker support: new 'idle', 'blanker', 'blankerprg'
- commands.
-
-* zmodem support via the 'zmodem' command.
-
-* nonblock code rewritten, nonblock now understands a timeout.
- new command 'defnonblock'.
-
diff --git a/src/NEWS.3.5 b/src/NEWS.3.5
deleted file mode 100644
index d0d1970..0000000
--- a/src/NEWS.3.5
+++ /dev/null
@@ -1,119 +0,0 @@
-
- ----------------------------
- What's new in screen-3.5 ?
- ----------------------------
-
-
-* Texinfo manpage! Thanks to Jason Merrill.
-
-* Screen now has a very large 'configure' script. If you have
- problems with the resulting configuration please send mail to
- screen@uni-erlangen.de.
-
-* Stackable overlay planes.
- All commands are available even if you work with an overlay. Thus
- you can be in copy/paste mode on several windows!
-
-* Unification of key bindings and screen commands. All keys now generate
- commands.
-
-* Screen now reads/writes only in asyncronous mode.
-
-* Ansi parser speedup code resulting in much faster output of text.
-
-* Changed the rc file syntax. Commands now directly affect the current
- window. The default settings are changed with 'def...' commands.
- The 'set' keyword no longer exists.
- Please run the 'newsyntax' script on your old screenrc files!
-
-* Emacs style isearch added to copy mode. Try ^A ESC ^R screen ^R ^R
- to locate the last three occurences of the word 'screen' in the
- history buffer.
-
-* New command 'silence'. Alarms the user whenever there was inactivity
- for a specified amount of time on a certain window.
- Useful if you want to wait for a compilation to end.
-
-* Much better margin handling:
- Screen now handles autowrapped lines correctly in the redisplay and
- copy/paste functions.
-
-* New commands for pastebuffer management:
- 'copy_reg' copies the pastebuffer to a register,
- 'ins_reg' pastes a register,
- 'register' fills a register with a string,
- 'process' stuffs a register into strings input queue.
-
-* Autonuke feature. Flush the output buffer if the window gets
- cleared. Enable this with 'autonuke on'.
-
-* Modifications to save memory: Empty attribute and font lines don't
- get allocated. This is very useful if you have a lage scrollback.
-
-* Multi display support:
- You can now attach from more than one terminal to a session with
- the '-x' option.
-
-* New option '-S' to specify socket name.
-
-* Experimental multiuser support added:
- You can start screen in multiuser Mode by prepending the socket
- name with a '/' (or by the command 'multiuser on').
- If another user wants to attach to the screen session, he can do
- this by prepending the socketname with 'screenuser/'.
- Of course he must be in the access control list for a successful
- attach (see the acladd/acldel command).
-
-* Extension to the 'screen' command: You can now specify tty lines
- instead of programs. This can be used for console management.
- Added the command 'break' to send a break to the tty line.
- Not really a new feature, but terminal initialisation now works
- on suns.
-
-* Input/output filters added. This has been implemented to allow the
- user to configure an open tty line, but got soon exended to allow
- all sorts of filters. For more information read the explanation
- of the 'exec' command in the man page and check the 'fdpat.ps'
- document.
-
-* Screen can now be started detached (screen -d -m -S sockname).
- This is usefull if you want to start screen in your /etc/rc file
- (e.g. as a console multiplexer)
-
-* Console grabbing added ('console on' command).
-
-* Windows can now be selected by akas, too. (Per default bound to the
- >'< key.)
-
-* New terminal capabiliteise CS/CE for cursorkey control.
-
-* setenv/unsetenv commands added.
-
-* Expansion of environment variables ($VAR) and terminal capabilities
- ($:TC:) in the screenrc files and detach messages.
- Example: pow_detach_msg "Session of \$LOGNAME \$:cr:\$:nl:ended."
-
-* New commands:
- 'hardcopydir' and 'logdir' to change the output directories,
- 'partial' and 'allpartial' to make screen only refresh the line
- containing the cursor if a window is selected (useful for slow
- modem connections).
-
-* Cleanup of the provided termcap/terminfo file. Please install
- the new one!
-
-* The program 'terminfo/checktc.c' does a visual check of a
- termcap/terminfo entry. Please try it before calling screen and
- in a screen session.
-
-* LOTS of bugfixes and code cleanup.
-
-Thanks to all the beta testers who helped porting screen to at least
-the following platforms: Ultrix, SunOS, Solaris, BSD43, linux, NEWSOS,
-Irix, OSF/1, Harris CX/UX, hpux, dynix/ptx, AIX.
-And even more thanks to the brave who attempted to use the 'exec'
-command features.
-
- Donnate patches, bugreports, suggestions, money, beer & pizza to
- screen@uni-erlangen.de
-
diff --git a/src/NEWS.3.6 b/src/NEWS.3.6
deleted file mode 100644
index 6d4360f..0000000
--- a/src/NEWS.3.6
+++ /dev/null
@@ -1,48 +0,0 @@
-
- ----------------------------
- What's new in screen-3.6 ?
- ----------------------------
-
-* Input translation! This makes the vt100 emulation complete.
- As an addition it is now possible to bind any command to any
- (function-) key. See the man page for more details (bindkey
- command).
-
-* Status line support. Each window can have a different status line.
- Use the ANSI APC string to set the status line, i.e.:
- <ESC>_<status string><ESC>\
- (For convenience the xterm sequence is also accepted.)
- You may want to add
- termcap * '' ':hs:ts=\E_:fs=\E\\:ds=\E_\E\\:'
- terminfo * '' ':hs:ts=\E_:fs=\E\\:ds=\E_\E\\:'
- to your ~/.screenrc to make screen advertise the hardstatus
- support.
-
-* Zombie feature added. Windows now may generate a message (with a
- timestamp) if they die and stay around until the user presses
- a key.
-
-* New paste syntax: Paste can now concatenate registers and paste
- either on screen or in anouther register.
- This makes the old "ins_reg", "copy_reg" commands obsolete.
-
-* More architecures supported. Screen now runs on AIX3.2.5,
- Solaris, NeXT and some other exotic platforms.
-
-* Kanji support added. Screen understands JIS, EUC and SJIS coding.
- This is an experimental feature.
-
-* GR charset switching (ISO 2022) implemented. Can be enabled with
- the "gr" command.
-
-* C1 sequences implemented (see the "c1" command).
-
-* Tek support from Xiaoguang Zhang. Apply tek.patch if you want to
- make screen pass tek sequences.
-
-* List of new commands:
- bindkey, c1, command, defc1, defgr, defkanji, gr, kanji, mapdefault,
- mapnotnext, maptimeout, pastefont, printcmd, readreg, stuff, zombie
-
-* Lots of other bugs fixed.
-
diff --git a/src/NEWS.3.7 b/src/NEWS.3.7
deleted file mode 100644
index e398f95..0000000
--- a/src/NEWS.3.7
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
- ----------------------------
- What's new in screen-3.7 ?
- ----------------------------
-
-* Color support. Screen understands the following capabilities:
- AF (setaf) = Set foreground color (ANSI compatible)
- AB (setab) = Set background color (ANSI compatible)
- AX = Does understand ANSI set default fg/bg color
- (\E[39m / \E[49m)
- The tweaks for the color xterm would be:
- termcap xterm 'AF=\E[3%dm:AB=\E[4%dm'
- terminfo xterm 'AF=\E[3%p1%dm:AB=\E[4%p1%dm'
-
-* New 'digraph' command (bound to ^A^V)
- ^A^Va" or ^A^V0344 input an a-umlaut
-
-* activity/bell message strings can now include the window title:
- %t - title
- %n - number (a single % still works)
-
-* 'defhstatus' command to give everey window a default
- hardstatus line. ^E is used as a string escape instead of %
- (see above). Try 'defhstatus "Screen: window ^E (^Et)"'
-
-* Input parser changed to understand '^' (see ^E above).
-
-Note that the linux color xterm has a stupid bug: the characters
-get the color of the cursor, therefore if you change color and move
-the cursor around all the characters will get the new color...
-Here is a patch:
- pub/utilities/screen/color_xterm_patch
-Btw.: rxvt works fine.
-
-* Optional Braille support. If you can read Braille and have one of
- the devices listed in README.DOTSCREEN, please compile with
- -DHAVE_BRAILLE and let us know if this feature is useful.
-
diff --git a/src/NEWS.3.9 b/src/NEWS.3.9
deleted file mode 100644
index 4dc7891..0000000
--- a/src/NEWS.3.9
+++ /dev/null
@@ -1,205 +0,0 @@
- -------------------------------
- What's new in screen-3.9.15 ?
- -------------------------------
-
-* unicode combining character support
-
-* new encoding: chinese GBK
-
-* new 'backtick' command and string escape to embed command
- output into e.g. the hardstatus line
-
-
- -------------------------------
- What's new in screen-3.9.13 ?
- -------------------------------
-
-* altscreen support from Gurusamy Sarathy
-
-* new command "maxwin" to set a limit on the number of windows
-
-* new keys in copy&paste mode: 'B' and 'E'
-
-
- -------------------------------
- What's new in screen-3.9.11 ?
- -------------------------------
-
-* windowlist, bound to ^A"
-
-* support for other encodings, e.g. big5, koi8r, cp1251
- new commands 'encoding', 'defencoding'
- 'register', 'readreg', 'readbuf', 'writebuf' now understand
- an extra encoding parameter
-
-* support for double utf-8 characters
-
-* lots of new string escapes and extensions to existsing ones:
- %LD, %LM, %Lw, %W, %-w, %+w, %H, %f, %F, %l, %=, %<, %>
-
-* new commands: 'source', 'eval', 'deflog', 'ignorecase', 'setsid'
-
-* command key classes: 'bind', 'command' and 'help' understand
- a '-c <class>' parameter. See the man page for examples
-
-* new login state: always - don't remove slot even if screen gets
- detached
-
-* 256 color support (experimental)
-
-* configurable time format string (for ^At)
-
-* config option to use localized month/week names
-
-* new option '-h' for hardcopy: also dump the scrollback buffer
-
-
- ------------------------------
- What's new in screen-3.9.9 ?
- ------------------------------
-
-* new '-X' option to send commands to screen sessions.
-
- screen -X echo Hi...
-
-* added a possibility to change the attributes/color in caption or
- hardstatus strings:
-
- caption always "%3n %{r}%t%{-}%? @%u%?%? %{g}[%h]%{-}%?"
-
-* new 'dinfo' command to show what screen thinks about your terminal.
-
-* new 'attrcolor' command to map attributes to color codes:
- attrcolor u "-u b"
- attrcolor b "r"
-
-* support for UTF-8: new commands 'utf8', 'defutf8' to change the
- encoding of a window, plus a '-U' option to tell screen that
- your terminal sends/receives UTF-8 codes.
-
-* support for 16 colors.
-
-
- ------------------------------
- What's new in screen-3.9.8 ?
- ------------------------------
-
-* new command 'resize' to resize regions (aka split windows), try:
- bind = resize =
- bind + resize +1
- bind - resize -1
- bind _ resize max
-
-* new argument for 'focus': up, down, top, bottom
-
-* X11 mouse tracking support
-
-* Support for the "new color model", aka "background color erase":
- the bce/defbce commands change the color model of the current
- window/new windows.
-
-* experimental rxvt OSC sequence support (used to set a background
- picture or to change the default colors), disabled by default.
-
-
- ----------------------------
- What's new in screen-3.9 ?
- ----------------------------
-
-* real multiuser support
- A window can now be displayed on more than one attached displays.
- Screen does all the necessary clipping if the window size doesn't
- fit the display.
- New command:
- ^AF - fit the window size into the display size.
-
-* split screen support
- A display may now host multiple windows.
- New commands:
- ^AS - split horizontally. This add another region to the display
- ^A<Tab> - move the focus to the next region
- ^AX - kill the current region
- ^AQ - kill all other regions
-
-* hardstatus emulation support
- The last line of the display may now be used as a hardstatus
- line if the terminal doesn't have the 'hs' capability.
- New commands:
- hardstatus [always]lastline
- hardstatus [always]message
- hardstatus [always]ignore
-
-* configurable window seperator and hardstatus strings
- The window (region) seperator and the hardstatus can be set to an
- arbitrary string containing screen's % escape sequences.
- The window's hardstatus is just another escape sequence, '%h'.
- New commands:
- hardstatus string [string]
- caption string [string]
- The default strings are "%h" (hardstatus) and "%3n %t" (caption).
-
-* permanent window seperator
- The window seperator can be set to stay on screen even if
- the display contains only one region
- New commands:
- caption always
- caption splitonly
-
-* many new escapes
- %c - current time HH:MM (*CHANGE*: this was %w in screen-3.7)
- %C - current time HH:MM in 24h format
- %l - the load of the system
- %h - hardstatus of the window
- %w - all window names
- %W - all window names except the current window
- %u - all other users on this window
- %? - the part to the next %? is displayed only if an escape
- expands to an nonempty string.
- %: - "else" part of %?
- Some escapes like %c may be qualified with a '0' (like %0c)
- to make screen use '0' instead of space as a filler.
- Others understand a length qualifier, like %3n.
- If escapes like the current time are used as hardstatus/caption
- string screen will update them so that you can always have
- the current time onscreen.
- *CHANGE* ~ is no longer used as bell character, use ^G instead!
-
-* logfile timestamps and flush timeout
- New commands:
- logfile flush <secs>
- logtstamp [on|off]
- logtstamp string [string]
- logtstamp after [secs]
-
-* configurable breaktype
- You can now choose one of TIOCSBRK, TCSBRK, tcsendbreak.
- New commands:
- breaktype
- defbreaktype
-
-* other new commands:
- hstatus - set the window's hardstatus
- defslowpaste
- defsilence
-
-* optional builtin telnet.
- This is useful if screen is used as frontend to a terminal
- multiplexor. Use //telnet to access the builtin telnet program,
- as in: 'screen //telnet host [port]'
-
-* remote detach and reattach change:
- '-d' is now ignored if the screen is already detached and you
- want to reattach. You can also use '-RR' to make screen use
- the first session found if more than one session is available.
- Thus '-d -RR' or '-x -RR' always gets you a screen.
-
-* support for history compaction
- You can tell screen to suppress trailing blank lines when
- scolling up text into the history buffer. (Wayne Davison)
- New command:
- compacthist
-
-* optional Braille support. If you can read Braille and have one of
- the devices listed in README.DOTSCREEN, please compile with
- -DHAVE_BRAILLE and let us know if this feature is useful.
-
diff --git a/src/TODO b/src/TODO
deleted file mode 100644
index 54b2b9f..0000000
--- a/src/TODO
+++ /dev/null
@@ -1,7 +0,0 @@
-- display size adaption (Activate)
-- process.c cleanup via comm splitting
-- writelocks?
-- partial?
-- type into several windows at once (for cluster admins)
-- configurable digraph table
-- command line options should overwrite config files.
diff --git a/src/acls.c b/src/acls.c
deleted file mode 100644
index 0f98df2..0000000
--- a/src/acls.c
+++ /dev/null
@@ -1,1135 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-
-
-/* XXX: WHY IS THIS HERE?? :XXX */
-
-#ifdef CHECKLOGIN
-# ifdef _SEQUENT_
-# include <stdio.h> /* needed by <pwd.h> */
-# endif /* _SEQUENT_ */
-# include <pwd.h>
-# ifdef SHADOWPW
-# include <shadow.h>
-# endif /* SHADOWPW */
-#endif /* CHECKLOGIN */
-
-#ifndef NOSYSLOG
-# include <syslog.h>
-#endif
-
-#include "screen.h" /* includes acls.h */
-#include "extern.h"
-
-
-/************************************************************************
- * user managing code, this does not really belong into the acl stuff *
- ************************************************************************/
-
-extern struct comm comms[];
-extern struct win *windows, *wtab[];
-extern char NullStr[];
-extern char SockPath[];
-extern struct display *display, *displays;
-struct acluser *users;
-
-#ifdef MULTIUSER
-int maxusercount = 0; /* used in process.c: RC_MONITOR, RC_SILENCE */
-
-/* record given user ids here */
-static AclBits userbits;
-
-/*
- * rights a new unknown user will have on windows and cmds.
- * These are changed by a "umask ?-..." command:
- */
-static char default_w_bit[ACL_BITS_PER_WIN] =
-{
- 1, /* EXEC */
- 1, /* WRITE */
- 1 /* READ */
-};
-
-static char default_c_bit[ACL_BITS_PER_CMD] =
-{
- 0 /* EXEC */
-};
-
-/* rights of all users per newly created window */
-/*
- * are now stored per user (umask)
- * static AclBits default_w_userbits[ACL_BITS_PER_WIN];
- * static AclBits default_c_userbits[ACL_BITS_PER_CMD];
- */
-
-static int GrowBitfield __P((AclBits *, int, int, int));
-static struct aclusergroup **FindGroupPtr __P((struct aclusergroup **, struct acluser *, int));
-static int AclSetPermCmd __P((struct acluser *, char *, struct comm *));
-static int AclSetPermWin __P((struct acluser *, struct acluser *, char *, struct win *));
-static int UserAcl __P((struct acluser *, struct acluser **, int, char **));
-static int UserAclCopy __P((struct acluser **, struct acluser **));
-
-
-static int
-GrowBitfield(bfp, len, delta, defaultbit)
-AclBits *bfp;
-int len, delta, defaultbit;
-{
- AclBits n, o = *bfp;
- int i;
-
- if (!(n = (AclBits)calloc(1, (unsigned long)(&ACLBYTE((char *)0, len + delta + 1)))))
- return -1;
- for (i = 0; i < (len + delta); i++)
- {
- if (((i < len) && (ACLBIT(i) & ACLBYTE(o, i))) ||
- ((i >= len) && (defaultbit)))
- ACLBYTE(n, i) |= ACLBIT(i);
- }
- if (len)
- free((char *)o);
- *bfp = n;
- return 0;
-}
-
-#endif /* MULTIUSER */
-
-/*
- * Returns an nonzero Address. Its contents is either a User-ptr,
- * or NULL which may be replaced by a User-ptr to create the entry.
- */
-struct acluser **
-FindUserPtr(name)
-char *name;
-{
- struct acluser **u;
-
- for (u = &users; *u; u = &(*u)->u_next)
- if (!strcmp((*u)->u_name, name))
- break;
-#ifdef MULTIUSER
- debug3("FindUserPtr %s %sfound, id %d\n", name, (*u)?"":"not ",
- (*u)?(*u)->u_id:-1);
-#else /* MULTIUSER */
- debug2("FindUserPtr %s %sfound\n", name, (*u)?"":"not ");
-#endif /* MULTIUSER */
- return u;
-}
-
-int DefaultEsc = -1; /* initialised by screen.c:main() */
-int DefaultMetaEsc = -1;
-
-/*
- * Add a new user. His password may be NULL or "" if none. His name must not
- * be "none", as this represents the NULL-pointer when dealing with groups.
- * He has default rights, determined by umask.
- */
-int
-UserAdd(name, pass, up)
-char *name, *pass;
-struct acluser **up;
-{
-#ifdef MULTIUSER
- int j;
-#endif
-
- if (!up)
- up = FindUserPtr(name);
- if (*up)
- {
- if (pass)
- (*up)->u_password = SaveStr(pass);
- return 1; /* he is already there */
- }
- if (strcmp("none", name)) /* "none" is a reserved word */
- *up = (struct acluser *)calloc(1, sizeof(struct acluser));
- if (!*up)
- return -1; /* he still does not exist */
-#ifdef COPY_PASTE
- (*up)->u_plop.buf = NULL;
- (*up)->u_plop.len = 0;
-# ifdef ENCODINGS
- (*up)->u_plop.enc = 0;
-# endif
-#endif
- (*up)->u_Esc = DefaultEsc;
- (*up)->u_MetaEsc = DefaultMetaEsc;
- strncpy((*up)->u_name, name, 20);
- (*up)->u_password = NULL;
- if (pass)
- (*up)->u_password = SaveStr(pass);
- if (!(*up)->u_password)
- (*up)->u_password = NullStr;
- (*up)->u_detachwin = -1;
- (*up)->u_detachotherwin = -1;
-
-#ifdef MULTIUSER
- (*up)->u_group = NULL;
- /* now find an unused index */
- for ((*up)->u_id = 0; (*up)->u_id < maxusercount; (*up)->u_id++)
- if (!(ACLBIT((*up)->u_id) & ACLBYTE(userbits, (*up)->u_id)))
- break;
- debug2("UserAdd %s id %d\n", name, (*up)->u_id);
- if ((*up)->u_id == maxusercount)
- {
- int j;
- struct win *w;
- struct acluser *u;
-
- debug2("growing all bitfields %d += %d\n", maxusercount, USER_CHUNK);
- /* the bitfields are full, grow a chunk */
- /* first, the used_uid_indicator: */
- if (GrowBitfield(&userbits, maxusercount, USER_CHUNK, 0))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- /* second, default command bits */
- /* (only if we generate commands dynamically) */
-/*
- for (j = 0; j < ACL_BITS_PER_CMD; j++)
- if (GrowBitfield(&default_c_userbits[j], maxusercount, USER_CHUNK,
- default_c_bit[j]))
- {
- free((char *)*up); *up = NULL; return -1;
- }
-*/
- /* third, the bits for each commands */
- for (j = 0; j <= RC_LAST; j++)
- {
- int i;
-
- for (i = 0; i < ACL_BITS_PER_CMD; i++)
- if (GrowBitfield(&comms[j].userbits[i], maxusercount, USER_CHUNK,
- default_c_bit[i]))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- }
- /* fourth, default window creation bits per user */
- for (u = users; u != *up; u = u->u_next)
- {
- for (j = 0; j < ACL_BITS_PER_WIN; j++)
- {
- if (GrowBitfield(&u->u_umask_w_bits[j], maxusercount, USER_CHUNK,
- default_w_bit[j]))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- }
- }
-
- /* fifth, the bits for each window */
- /* keep these in sync with NewWindowAcl() */
- for (w = windows; w; w = w->w_next)
- {
- /* five a: the access control list */
- for (j = 0; j < ACL_BITS_PER_WIN; j++)
- if (GrowBitfield(&w->w_userbits[j], maxusercount, USER_CHUNK,
- default_w_bit[j]))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- /* five b: the activity notify list */
- /* five c: the silence notify list */
- if (GrowBitfield(&w->w_mon_notify, maxusercount, USER_CHUNK, 0) ||
- GrowBitfield(&w->w_lio_notify, maxusercount, USER_CHUNK, 0))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- }
- maxusercount += USER_CHUNK;
- }
-
- /* mark the user-entry as "in-use" */
- ACLBYTE(userbits, (*up)->u_id) |= ACLBIT((*up)->u_id);
-
- /* user id 0 is the session creator, he has all rights */
- if ((*up)->u_id == 0)
- AclSetPerm(NULL, *up, "+a", "#?");
-
- /* user nobody has a fixed set of rights: */
- if (!strcmp((*up)->u_name, "nobody"))
- {
- AclSetPerm(NULL, *up, "-rwx", "#?");
- AclSetPerm(NULL, *up, "+x", "su");
- AclSetPerm(NULL, *up, "+x", "detach");
- AclSetPerm(NULL, *up, "+x", "displays");
- AclSetPerm(NULL, *up, "+x", "version");
- }
-
- /*
- * Create his umask:
- * Give default_w_bit's for all users,
- * but allow himself everything on "his" windows.
- */
- for (j = 0; j < ACL_BITS_PER_WIN; j++)
- {
- if (GrowBitfield(&(*up)->u_umask_w_bits[j], 0, maxusercount,
- default_w_bit[j]))
- {
- free((char *)*up); *up = NULL; return -1;
- }
- ACLBYTE((*up)->u_umask_w_bits[j], (*up)->u_id) |= ACLBIT((*up)->u_id);
- }
-#else /* MULTIUSER */
- debug1("UserAdd %s\n", name);
-#endif /* MULTIUSER */
- return 0;
-}
-
-#if 0
-/* change user's password */
-int
-UserSetPass(name, pass, up)
-char *name, *pass;
-struct acluser **up;
-{
- if (!up)
- up = FindUserPtr(name);
- if (!*up)
- return UserAdd(name, pass, up);
- if (!strcmp(name, "nobody")) /* he remains without password */
- return -1;
- strncpy((*up)->u_password, pass ? pass : "", 20);
- (*up)->u_password[20] = '\0';
- return 0;
-}
-#endif
-
-/*
- * Remove a user from the list.
- * Destroy all his permissions and completely detach him from the session.
- */
-int
-UserDel(name, up)
-char *name;
-struct acluser **up;
-{
- struct acluser *u;
-#ifdef MULTIUSER
- int i;
-#endif
- struct display *old, *next;
-
- if (!up)
- up = FindUserPtr(name);
- if (!(u = *up))
- return -1; /* he who does not exist cannot be removed */
- old = display;
- for (display = displays; display; display = next)
- {
- next = display->d_next; /* read the next ptr now, Detach may zap it. */
- if (D_user != u)
- continue;
- if (display == old)
- old = NULL;
- Detach(D_REMOTE);
- }
- display = old;
- *up = u->u_next;
-
-#ifdef MULTIUSER
- for (up = &users; *up; up = &(*up)->u_next)
- {
- /* unlink all group references to this user */
- struct aclusergroup **g = &(*up)->u_group;
-
- while (*g)
- {
- if ((*g)->u == u)
- {
- struct aclusergroup *next = (*g)->next;
-
- free((char *)(*g));
- *g = next;
- }
- else
- g = &(*g)->next;
- }
- }
- ACLBYTE(userbits, u->u_id) &= ~ACLBIT(u->u_id);
- /* restore the bits in his slot to default: */
- AclSetPerm(NULL, u, default_w_bit[ACL_READ] ? "+r" : "-r", "#");
- AclSetPerm(NULL, u, default_w_bit[ACL_WRITE]? "+w" : "-w", "#");
- AclSetPerm(NULL, u, default_w_bit[ACL_EXEC] ? "+x" : "-x", "#");
- AclSetPerm(NULL, u, default_c_bit[ACL_EXEC] ? "+x" : "-x", "?");
- for (i = 0; i < ACL_BITS_PER_WIN; i++)
- free((char *)u->u_umask_w_bits[i]);
-#endif /* MULTIUSER */
- debug1("FREEING user structure for %s\n", u->u_name);
-#ifdef COPY_PASTE
- UserFreeCopyBuffer(u);
-#endif
- free((char *)u);
- if (!users)
- {
- debug("Last user deleted. Feierabend.\n");
- Finit(0); /* Destroying whole session. Noone could ever attach again. */
- }
- return 0;
-}
-
-
-#ifdef COPY_PASTE
-
-/*
- * returns 0 if the copy buffer was really deleted.
- * Also removes any references into the users copybuffer
- */
-int
-UserFreeCopyBuffer(u)
-struct acluser *u;
-{
- struct win *w;
- struct paster *pa;
-
- if (!u->u_plop.buf)
- return 1;
- for (w = windows; w; w = w->w_next)
- {
- pa = &w->w_paster;
- if (pa->pa_pasteptr >= u->u_plop.buf &&
- pa->pa_pasteptr - u->u_plop.buf < u->u_plop.len)
- FreePaster(pa);
- }
- free((char *)u->u_plop.buf);
- u->u_plop.len = 0;
- u->u_plop.buf = 0;
- return 0;
-}
-#endif /* COPY_PASTE */
-
-#ifdef MULTIUSER
-/*
- * Traverses group nodes. It searches for a node that references user u.
- * If recursive is true, nodes found in the users are also searched using
- * depth first method. If none of the nodes references u, the address of
- * the last next pointer is returned. This address will contain NULL.
- */
-static struct aclusergroup **
-FindGroupPtr(gp, u, recursive)
-struct aclusergroup **gp;
-struct acluser *u;
-int recursive;
-{
- struct aclusergroup **g;
-
- ASSERT(recursive < 1000); /* Ouch, cycle detection failed */
- while (*gp)
- {
- if ((*gp)->u == u)
- return gp; /* found him here. */
- if (recursive &&
- *(g = FindGroupPtr(&(*gp)->u->u_group, u, recursive + 1)))
- return g; /* found him there. */
- gp = &(*gp)->next;
- }
- return gp; /* *gp is NULL */
-}
-
-/*
- * Returns nonzero if failed or already linked.
- * Both users are created on demand.
- * Cyclic links are prevented.
- */
-int
-AclLinkUser(from, to)
-char *from, *to;
-{
- struct acluser **u1, **u2;
- struct aclusergroup **g;
-
- if (!*(u1 = FindUserPtr(from)) && UserAdd(from, NULL, u1))
- return -1;
- if (!*(u2 = FindUserPtr(to)) && UserAdd(to, NULL, u2))
- return -1; /* hmm, could not find both users. */
-
- if (*FindGroupPtr(&(*u2)->u_group, *u1, 1))
- return 1; /* cyclic link detected! */
- if (*(g = FindGroupPtr(&(*u1)->u_group, *u2, 0)))
- return 2; /* aha, we are already linked! */
-
- if (!(*g = (struct aclusergroup *)malloc(sizeof(struct aclusergroup))))
- return -1; /* Could not alloc link. Poor screen */
- (*g)->u = (*u2);
- (*g)->next = NULL;
- return 0;
-}
-
-/*
- * The user pointer stored at *up will be substituted by a pointer
- * to the named user's structure, if passwords match.
- * returns NULL if successfull, an static error string otherwise
- */
-char *
-DoSu(up, name, pw1, pw2)
-struct acluser **up;
-char *name, *pw1, *pw2;
-{
- struct acluser *u;
- int sorry = 0;
-
- if (!(u = *FindUserPtr(name)))
- sorry++;
- else
- {
-#ifdef CHECKLOGIN
- struct passwd *pp;
-#ifdef SHADOWPW
- struct spwd *ss;
- int t, c;
-#endif
- char *pass = "";
-
- if (!(pp = getpwnam(name)))
- {
- debug1("getpwnam(\"%s\") failed\n", name);
- if (!(pw1 && *pw1 && *pw1 != '\377'))
- {
- debug("no unix account, no screen passwd\n");
- sorry++;
- }
- }
- else
- pass = pp->pw_passwd;
-#ifdef SHADOWPW
- for (t = 0; t < 13; t++)
- {
- c = pass[t];
- if (!(c == '.' || c == '/' ||
- (c >= '0' && c <= '9') ||
- (c >= 'a' && c <= 'z') ||
- (c >= 'A' && c <= 'Z')))
- break;
- }
- if (t < 13)
- {
- if (!(ss = getspnam(name)))
- {
- debug1("getspnam(\"%s\") failed\n", name);
- sorry++;
- }
- else
- pass = ss->sp_pwdp;
- }
-#endif /* SHADOWPW */
-
- if (pw2 && *pw2 && *pw2 != '\377') /* provided a system password */
- {
- if (!*pass || /* but needed none */
- strcmp(crypt(pw2, pass), pass))
- {
- debug("System password mismatch\n");
- sorry++;
- }
- }
- else /* no pasword provided */
- if (*pass) /* but need one */
- sorry++;
-#endif
- if (pw1 && *pw1 && *pw1 != '\377') /* provided a screen password */
- {
- if (!*u->u_password || /* but needed none */
- strcmp(crypt(pw1, u->u_password), u->u_password))
- {
- debug("screen password mismatch\n");
- sorry++;
- }
- }
- else /* no pasword provided */
- if (*u->u_password) /* but need one */
- sorry++;
- }
-
- debug2("syslog(LOG_NOTICE, \"screen %s: \"su %s\" ", SockPath, name);
- debug2("%s for \"%s\"\n", sorry ? "failed" : "succeded", (*up)->u_name);
-#ifndef NOSYSLOG
-# ifdef BSD_42
- openlog("screen", LOG_PID);
-# else
- openlog("screen", LOG_PID, LOG_AUTH);
-# endif /* BSD_42 */
- syslog(LOG_NOTICE, "%s: \"su %s\" %s for \"%s\"", SockPath, name,
- sorry ? "failed" : "succeded", (*up)->u_name);
- closelog();
-#else
- debug("NOT LOGGED.\n");
-#endif /* NOSYSLOG */
-
- if (sorry)
- return "Sorry.";
- else
- *up = u; /* substitute user now */
- return NULL;
-}
-#endif /* MULTIUSER */
-
-/************************************************************************
- * end of user managing code *
- ************************************************************************/
-
-
-#ifdef MULTIUSER
-
-/* This gives the users default rights to the new window w created by u */
-int
-NewWindowAcl(w, u)
-struct win *w;
-struct acluser *u;
-{
- int i, j;
-
- debug2("NewWindowAcl %s's umask_w_bits for window %d\n",
- u ? u->u_name : "everybody", w->w_number);
-
- /* keep these in sync with UserAdd part five. */
- if (GrowBitfield(&w->w_mon_notify, 0, maxusercount, 0) ||
- GrowBitfield(&w->w_lio_notify, 0, maxusercount, 0))
- return -1;
- for (j = 0; j < ACL_BITS_PER_WIN; j++)
- {
- /* we start with len 0 for the new bitfield size and add maxusercount */
- if (GrowBitfield(&w->w_userbits[j], 0, maxusercount, 0))
- {
- while (--j >= 0)
- free((char *)w->w_userbits[j]);
- free((char *)w->w_mon_notify);
- free((char *)w->w_lio_notify);
- return -1;
- }
- for (i = 0; i < maxusercount; i++)
- if (u ? (ACLBIT(i) & ACLBYTE(u->u_umask_w_bits[j], i)) :
- default_w_bit[j])
- ACLBYTE(w->w_userbits[j], i) |= ACLBIT(i);
- }
- return 0;
-}
-
-void
-FreeWindowAcl(w)
-struct win *w;
-{
- int i;
-
- for (i = 0; i < ACL_BITS_PER_WIN; i++)
- free((char *)w->w_userbits[i]);
- free((char *)w->w_mon_notify);
- free((char *)w->w_lio_notify);
-}
-
-
-/* if mode starts with '-' we remove the users exec bit for cmd */
-/*
- * NOTE: before you make this function look the same as
- * AclSetPermWin, try to merge both functions.
- */
-static int
-AclSetPermCmd(u, mode, cmd)
-struct acluser *u;
-char *mode;
-struct comm *cmd;
-{
- int neg = 0;
- char *m = mode;
-
- while (*m)
- {
- switch (*m++)
- {
- case '-':
- neg = 1;
- continue;
- case '+':
- neg = 0;
- continue;
- case 'a':
- case 'e':
- case 'x':
-/* debug3("AclSetPermCmd %s %s %s\n", u->u_name, mode, cmd->name); */
- if (neg)
- ACLBYTE(cmd->userbits[ACL_EXEC], u->u_id) &= ~ACLBIT(u->u_id);
- else
- ACLBYTE(cmd->userbits[ACL_EXEC], u->u_id) |= ACLBIT(u->u_id);
- break;
- case 'r':
- case 'w':
- break;
- default:
- return -1;
- }
- }
- return 0;
-}
-
-/* mode strings of the form +rwx -w+rx r -wx are parsed and evaluated */
-/*
- * aclchg nerd -w+w 2
- * releases a writelock on window 2 held by user nerd.
- * Letter n allows network access on a window.
- * uu should be NULL, except if you want to change his umask.
- */
-static int
-AclSetPermWin(uu, u, mode, win)
-struct acluser *u, *uu;
-char *mode;
-struct win *win;
-{
- int neg = 0;
- int bit, bits;
- AclBits *bitarray;
- char *m = mode;
-
- if (uu)
- {
- debug3("AclSetPermWin %s UMASK %s %s\n", uu->u_name, u->u_name, mode);
- bitarray = uu->u_umask_w_bits;
- }
- else
- {
- ASSERT(win);
- bitarray = win->w_userbits;
- debug3("AclSetPermWin %s %s %d\n", u->u_name, mode, win->w_number);
- }
-
- while (*m)
- {
- switch (*m++)
- {
- case '-':
- neg = 1;
- continue;
- case '+':
- neg = 0;
- continue;
- case 'r':
- bits = (1 << ACL_READ);
- break;
- case 'w':
- bits = (1 << ACL_WRITE);
- break;
- case 'x':
- bits = (1 << ACL_EXEC);
- break;
- case 'a':
- bits = (1 << ACL_BITS_PER_WIN) - 1;
- break;
- default:
- return -1;
- }
- for (bit = 0; bit < ACL_BITS_PER_WIN; bit++)
- {
- if (!(bits & (1 << bit)))
- continue;
- if (neg)
- ACLBYTE(bitarray[bit], u->u_id) &= ~ACLBIT(u->u_id);
- else
- ACLBYTE(bitarray[bit], u->u_id) |= ACLBIT(u->u_id);
- if (!uu && (win->w_wlockuser == u) && neg && (bit == ACL_WRITE))
- {
- debug2("%s lost writelock on win %d\n", u->u_name, win->w_number);
- win->w_wlockuser = NULL;
- if (win->w_wlock == WLOCK_ON)
- win->w_wlock = WLOCK_AUTO;
- }
- }
- }
- if (uu && u->u_name[0] == '?' && u->u_name[1] == '\0')
- {
- /*
- * It is Mr. '?', the unknown user. He deserves special treatment as
- * he defines the defaults. Sorry, this is global, not per user.
- */
- if (win)
- {
- debug1("AclSetPermWin: default_w_bits '%s'.\n", mode);
- for (bit = 0; bit < ACL_BITS_PER_WIN; bit++)
- default_w_bit[bit] =
- (ACLBYTE(bitarray[bit], u->u_id) & ACLBIT(u->u_id)) ? 1 : 0;
- }
- else
- {
- /*
- * Hack. I do not want to duplicate all the above code for
- * AclSetPermCmd. This asumes that there are not more bits
- * per cmd than per win.
- */
- debug1("AclSetPermWin: default_c_bits '%s'.\n", mode);
- for (bit = 0; bit < ACL_BITS_PER_CMD; bit++)
- default_c_bit[bit] =
- (ACLBYTE(bitarray[bit], u->u_id) & ACLBIT(u->u_id)) ? 1 : 0;
- }
- UserDel(u->u_name, NULL);
- }
- return 0;
-}
-
-/*
- * String is broken down into comand and window names, mode applies
- * A command name matches first, so do not use these as window names.
- * uu should be NULL, except if you want to change his umask.
- */
-int
-AclSetPerm(uu, u, mode, s)
-struct acluser *uu, *u;
-char *mode, *s;
-{
- struct win *w;
- int i;
- char *p, ch;
-
- debug3("AclSetPerm(uu, user '%s', mode '%s', object '%s')\n",
- u->u_name, mode, s);
- while (*s)
- {
- switch (*s)
- {
- case '*': /* all windows and all commands */
- return AclSetPerm(uu, u, mode, "#?");
- case '#':
- if (uu) /* window umask or .. */
- AclSetPermWin(uu, u, mode, (struct win *)1);
- else /* .. or all windows */
- for (w = windows; w; w = w->w_next)
- AclSetPermWin((struct acluser *)0, u, mode, w);
- s++;
- break;
- case '?':
- if (uu) /* command umask or .. */
- AclSetPermWin(uu, u, mode, (struct win *)0);
- else /* .. or all commands */
- for (i = 0; i <= RC_LAST; i++)
- AclSetPermCmd(u, mode, &comms[i]);
- s++;
- break;
- default:
- for (p = s; *p && *p != ' ' && *p != '\t' && *p != ','; p++)
- ;
- if ((ch = *p))
- *p++ = '\0';
- if ((i = FindCommnr(s)) != RC_ILLEGAL)
- AclSetPermCmd(u, mode, &comms[i]);
- else if (((i = WindowByNoN(s)) >= 0) && wtab[i])
- AclSetPermWin((struct acluser *)0, u, mode, wtab[i]);
- else
- /* checking group name */
- return -1;
- if (ch)
- p[-1] = ch;
- s = p;
- }
- }
- return 0;
-}
-
-/*
- * Generic ACL Manager:
- *
- * This handles acladd and aclchg identical.
- * With 2 or 4 parameters, the second parameter is a password.
- * With 3 or 4 parameters the last two parameters specify the permissions
- * else user is added with full permissions.
- * With 1 parameter the users permissions are copied from user *argv.
- * Unlike the other cases, u->u_name should not match *argv here.
- * uu should be NULL, except if you want to change his umask.
- */
-static int
-UserAcl(uu, u, argc, argv)
-struct acluser *uu, **u;
-int argc;
-char **argv;
-{
- if ((*u && !strcmp((*u)->u_name, "nobody")) ||
- (argc > 1 && !strcmp(argv[0], "nobody")))
- return -1; /* do not change nobody! */
-
- switch (argc)
- {
- case 1+1+2:
- debug2("UserAcl: user '%s', password '%s':", argv[0], argv[1]);
- return (UserAdd(argv[0], argv[1], u) < 0) ||
- AclSetPerm(uu, *u, argv[2], argv[3]);
- case 1+2:
- debug1("UserAcl: user '%s', no password:", argv[0]);
- return (UserAdd(argv[0], NULL, u) < 0) ||
- AclSetPerm(uu, *u, argv[1], argv[2]);
- case 1+1:
- debug2("UserAcl: user '%s', password '%s'\n", argv[0], argv[1]);
- return UserAdd(argv[0], argv[1], u) < 0;
- case 1:
- debug1("UserAcl: user '%s', no password:", argv[0]);
- return (UserAdd(argv[0], NULL, u) < 0) ||
- AclSetPerm(uu, *u, "+a", "#?");
- default:
- return -1;
- }
-}
-
-static int
-UserAclCopy(to_up, from_up)
-struct acluser **to_up, **from_up;
-{
- struct win *w;
- int i, j, to_id, from_id;
-
- if (!*to_up || !*from_up)
- return -1;
- debug2("UserAclCopy: from user '%s' to user '%s'\n",
- (*from_up)->u_name, (*to_up)->u_name);
- if ((to_id = (*to_up)->u_id) == (from_id = (*from_up)->u_id))
- return -1;
- for (w = windows; w; w = w->w_next)
- {
- for (i = 0; i < ACL_BITS_PER_WIN; i++)
- {
- if (ACLBYTE(w->w_userbits[i], from_id) & ACLBIT(from_id))
- ACLBYTE(w->w_userbits[i], to_id) |= ACLBIT(to_id);
- else
- {
- ACLBYTE(w->w_userbits[i], to_id) &= ~ACLBIT(to_id);
- if ((w->w_wlockuser == *to_up) && (i == ACL_WRITE))
- {
- debug2("%s lost wlock on win %d\n",
- (*to_up)->u_name, w->w_number);
- w->w_wlockuser = NULL;
- if (w->w_wlock == WLOCK_ON)
- w->w_wlock = WLOCK_AUTO;
- }
- }
- }
- }
- for (j = 0; j <= RC_LAST; j++)
- {
- for (i = 0; i < ACL_BITS_PER_CMD; i++)
- {
- if (ACLBYTE(comms[j].userbits[i], from_id) & ACLBIT(from_id))
- ACLBYTE(comms[j].userbits[i], to_id) |= ACLBIT(to_id);
- else
- ACLBYTE(comms[j].userbits[i], to_id) &= ~ACLBIT(to_id);
- }
- }
-
- return 0;
-}
-
-/*
- * Syntax:
- * user [password] [+rwx #?]
- * * [password] [+rwx #?]
- * user1,user2,user3 [password] [+rwx #?]
- * user1,user2,user3=user
- * uu should be NULL, except if you want to change his umask.
- */
-int
-UsersAcl(uu, argc, argv)
-struct acluser *uu;
-int argc;
-char **argv;
-{
- char *s;
- int r;
- struct acluser **cf_u = NULL;
-
- if (argc == 1)
- {
- char *p = NULL;
-
- s = argv[0];
- while (*s)
- if (*s++ == '=') p = s;
- if (p)
- {
- p[-1] = '\0';
- cf_u = FindUserPtr(p);
- }
- }
-
- if (argv[0][0] == '*' && argv[0][1] == '\0')
- {
- struct acluser **u;
-
- debug("all users acls.\n");
- for (u = &users; *u; u = &(*u)->u_next)
- if (strcmp("nobody", (*u)->u_name) &&
- ((cf_u) ?
- ((r = UserAclCopy(u, cf_u)) < 0) :
- ((r = UserAcl(uu, u, argc, argv)) < 0)))
- return -1;
- return 0;
- }
-
- do
- {
- for (s = argv[0]; *s && *s!=' ' && *s!='\t' && *s!=',' && *s!='='; s++)
- ;
- *s ? (*s++ = '\0') : (*s = '\0');
- debug2("UsersAcl(uu, \"%s\", argc=%d)\n", argv[0], argc);
- if ((cf_u) ?
- ((r = UserAclCopy(FindUserPtr(argv[0]), cf_u)) < 0) :
- ((r = UserAcl(uu, FindUserPtr(argv[0]), argc, argv)) < 0))
- return -1;
- } while (*(argv[0] = s));
- return 0;
-}
-
-/*
- * Preprocess argments, so that umask can be set with UsersAcl
- *
- * all current users umask ±rwxn
- * one specific user umask user1±rwxn
- * several users umask user1,user2,...±rwxn
- * default_w_bits umask ?±rwxn
- * default_c_bits umask ??±rwxn
- */
-int
-AclUmask(u, str, errp)
-struct acluser *u;
-char *str;
-char **errp;
-{
- char mode[16];
- char *av[3];
- char *p, c = '\0';
-
- /* split str into user and bits section. */
- for (p = str; *p; p++)
- if ((c = *p) == '+' || c == '-')
- break;
- if (!*p)
- {
- *errp = "Bad argument. Should be ``[user[,user...]{+|-}rwxn''.";
- return -1;
- }
- strncpy(mode, p, 15);
- mode[15] = '\0';
- *p = '\0';
-
- /* construct argument vector */
- if (!strcmp("??", str))
- {
- str++;
- av[2] = "?";
- }
- else
- av[2] = "#";
- av[1] = mode;
- av[0] = *str ? str : "*";
- /* call UsersAcl */
- if (UsersAcl(u, 3, av))
- {
- *errp = "UsersAcl failed. Hmmm.";
- *p = c;
- return -1;
- }
- *p = c;
- return 0;
-}
-
-void
-AclWinSwap(a, b)
-int a, b;
-{
- debug2("AclWinSwap(%d, %d) NOP.\n", a, b);
-}
-
-struct acluser *EffectiveAclUser = NULL; /* hook for AT command permission */
-
-int
-AclCheckPermWin(u, mode, w)
-struct acluser *u;
-int mode;
-struct win *w;
-{
- int ok;
-
- if (mode < 0 || mode >= ACL_BITS_PER_WIN)
- return -1;
- if (EffectiveAclUser)
- {
- debug1("AclCheckPermWin: WARNING user %s overridden!\n", u->u_name);
- u = EffectiveAclUser;
- }
- ok = ACLBYTE(w->w_userbits[mode], u->u_id) & ACLBIT(u->u_id);
- debug3("AclCheckPermWin(%s, %d, %d) = ", u->u_name, mode, w->w_number);
-
- if (!ok)
- {
- struct aclusergroup **g = &u->u_group;
- struct acluser *saved_eff = EffectiveAclUser;
-
- EffectiveAclUser = NULL;
- while (*g)
- {
- if (!AclCheckPermWin((*g)->u, mode, w))
- break;
- g = &(*g)->next;
- }
- EffectiveAclUser = saved_eff;
- if (*g)
- ok = 1;
- }
- debug1("%d\n", !ok);
- return !ok;
-}
-
-int
-AclCheckPermCmd(u, mode, c)
-struct acluser *u;
-int mode;
-struct comm *c;
-{
- int ok;
-
- if (mode < 0 || mode >= ACL_BITS_PER_CMD)
- return -1;
- if (EffectiveAclUser)
- {
- debug1("AclCheckPermCmd: WARNING user %s overridden!\n", u->u_name);
- u = EffectiveAclUser;
- }
- ok = ACLBYTE(c->userbits[mode], u->u_id) & ACLBIT(u->u_id);
- debug3("AclCheckPermCmd(%s %d %s) = ", u->u_name, mode, c->name);
- if (!ok)
- {
- struct aclusergroup **g = &u->u_group;
- struct acluser *saved_eff = EffectiveAclUser;
-
- EffectiveAclUser = NULL;
- while (*g)
- {
- if (!AclCheckPermCmd((*g)->u, mode, c))
- break;
- g = &(*g)->next;
- }
- EffectiveAclUser = saved_eff;
- if (*g)
- ok = 1;
- }
- debug1("%d\n", !ok);
- return !ok;
-}
-
-#endif /* MULTIUSER */
diff --git a/src/acls.h b/src/acls.h
deleted file mode 100644
index c41b714..0000000
--- a/src/acls.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#ifdef MULTIUSER
-
-/* three known bits: */
-#define ACL_EXEC 0
-#define ACL_WRITE 1
-#define ACL_READ 2
-
-#define ACL_BITS_PER_CMD 1 /* for comm.h */
-#define ACL_BITS_PER_WIN 3 /* for window.h */
-
-#define USER_CHUNK 8
-
-#define ACLBYTE(data, w) ((data)[(w) >> 3])
-#define ACLBIT(w) (0x80 >> ((w) & 7))
-
-typedef unsigned char * AclBits;
-
-/*
- * How a user joins a group.
- * Here is the node to construct one list per user.
- */
-struct aclusergroup
-{
- struct acluser *u; /* the user who borrows us his rights */
- struct aclusergroup *next;
-};
-#endif /* MULTIUSER */
-
-/***************
- * ==> user.h
- */
-
-/*
- * a copy buffer
- */
-struct plop
-{
- char *buf;
- int len;
-#ifdef ENCODINGS
- int enc;
-#endif
-};
-
-/*
- * A User has a list of groups, and points to other users.
- * users is the User entry of the session owner (creator)
- * and anchors all other users. Add/Delete users there.
- */
-typedef struct acluser
-{
- struct acluser *u_next; /* continue the main user list */
- char u_name[20+1]; /* login name how he showed up */
- char *u_password; /* his password (may be NullStr). */
- int u_checkpassword; /* nonzero if this u_password is valid */
- int u_detachwin; /* the window where he last detached */
- int u_detachotherwin; /* window that was "other" when he detached */
- int u_Esc, u_MetaEsc; /* the users screen escape character */
-#ifdef COPY_PASTE
- struct plop u_plop;
-#endif
-#ifdef MULTIUSER
- int u_id; /* a uniq index in the bitfields. */
- AclBits u_umask_w_bits[ACL_BITS_PER_WIN]; /* his window create umask */
- struct aclusergroup *u_group; /* linked list of pointers to other users */
-#endif
-} User;
-
-extern int DefaultEsc, DefaultMetaEsc;
-
diff --git a/src/ansi.h b/src/ansi.h
deleted file mode 100644
index 377639e..0000000
--- a/src/ansi.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-#define NATTR 6
-
-#define ATTR_DI 0 /* Dim mode */
-#define ATTR_US 1 /* Underscore mode */
-#define ATTR_BD 2 /* Bold mode */
-#define ATTR_RV 3 /* Reverse mode */
-#define ATTR_SO 4 /* Standout mode */
-#define ATTR_BL 5 /* Blinking */
-
-#define A_DI (1<<ATTR_DI)
-#define A_US (1<<ATTR_US)
-#define A_BD (1<<ATTR_BD)
-#define A_RV (1<<ATTR_RV)
-#define A_SO (1<<ATTR_SO)
-#define A_BL (1<<ATTR_BL)
-#define A_MAX (1<<(NATTR-1))
-
-#define ATYP_M (1<<0)
-#define ATYP_S (1<<1)
-#define ATYP_U (1<<2)
-
-#ifdef COLORS16
-/* pseudo attributes */
-# define ATTR_BFG 6 /* bright foreground */
-# define ATTR_BBG 7 /* bright background */
-# define A_BFG (1<<ATTR_BFG)
-# define A_BBG (1<<ATTR_BBG)
-#endif
-
-/*
- * Parser state
- */
-/* keep state_t and state_t_string in sync! */
-enum state_t
-{
- LIT, /* Literal input */
- ESC, /* Start of escape sequence */
- ASTR, /* Start of control string */
- STRESC, /* ESC seen in control string */
- CSI, /* Reading arguments in "CSI Pn ;...*/
- PRIN, /* Printer mode */
- PRINESC, /* ESC seen in printer mode */
- PRINCSI, /* CSI seen in printer mode */
- PRIN4 /* CSI 4 seen in printer mode */
-};
-
-/* keep string_t and string_t_string in sync! */
-enum string_t
-{
- NONE,
- DCS, /* Device control string */
- OSC, /* Operating system command */
- APC, /* Application program command */
- /* - used for status change */
- PM, /* Privacy message */
- AKA, /* title for current screen */
- GM, /* Global message to every display */
- STATUS /* User hardstatus line */
-};
-
-/*
- * Types of movement used by GotoPos()
- */
-enum move_t {
- M_NONE,
- M_UP,
- M_CUP,
- M_DO,
- M_CDO,
- M_LE,
- M_CLE,
- M_RI,
- M_CRI,
- M_RW,
- M_CR /* CR and rewrite */
-};
-
-#define EXPENSIVE 1000
-
-#define G0 0
-#define G1 1
-#define G2 2
-#define G3 3
-
-#define ASCII 0
-
-#ifdef TOPSTAT
-#define STATLINE (0)
-#else
-#define STATLINE (D_height-1)
-#endif
-
-#ifdef ENCODINGS
-
-#define KANJI ('B' & 037)
-#define KANJI0212 ('D' & 037)
-#define KANA 'I'
-
-#define EUC_JP 1
-#define SJIS 2
-#define EUC_KR 3
-#define EUC_CN 4
-#define BIG5 5
-#define KOI8R 6
-#define CP1251 7
-#define GBK 20
-
-#define EUC EUC_JP
-
-#endif
-
-#ifdef UTF8
-#undef UTF8
-#define UTF8 8
-#endif
-
-#ifdef UTF8
-# define UCS_REPL 0xfffd /* character for illegal codes */
-# define UCS_REPL_DW 0xff1f /* character for illegal codes */
-# define UCS_HIDDEN 0xffff
-#endif
-
-#ifdef DW_CHARS
-# define is_dw_font(f) ((f) && ((f) & 0x60) == 0)
-
-# ifdef UTF8
-# define dw_left(ml, x, enc) ((enc == UTF8) ? \
- (unsigned char)(ml)->font[(x) + 1] == 0xff && (unsigned char)(ml)->image[(x) + 1] == 0xff : \
- ((unsigned char)(ml)->font[x] & 0x1f) != 0 && ((unsigned char)(ml)->font[x] & 0xe0) == 0 \
- )
-# define dw_right(ml, x, enc) ((enc == UTF8) ? \
- (unsigned char)(ml)->font[x] == 0xff && (unsigned char)(ml)->image[x] == 0xff : \
- ((unsigned char)(ml)->font[x] & 0xe0) == 0x80 \
- )
-# else
-# define dw_left(ml, x, enc) ( \
- ((unsigned char)(ml)->font[x] & 0x1f) != 0 && ((unsigned char)(ml)->font[x] & 0xe0) == 0 \
- )
-# define dw_right(ml, x, enc) ( \
- ((unsigned char)(ml)->font[x] & 0xe0) == 0x80 \
- )
-# endif /* UTF8 */
-#else
-# define dw_left(ml, x, enc) 0
-# define dw_right(ml, x, enc) 0
-#endif
diff --git a/src/attacher.c b/src/attacher.c
deleted file mode 100644
index 792ff97..0000000
--- a/src/attacher.c
+++ /dev/null
@@ -1,959 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <signal.h>
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#include <pwd.h>
-
-static int WriteMessage __P((int, struct msg *));
-static sigret_t AttacherSigInt __P(SIGPROTOARG);
-#if defined(SIGWINCH) && defined(TIOCGWINSZ)
-static sigret_t AttacherWinch __P(SIGPROTOARG);
-#endif
-#ifdef LOCK
-static sigret_t DoLock __P(SIGPROTOARG);
-static void LockTerminal __P((void));
-static sigret_t LockHup __P(SIGPROTOARG);
-static void screen_builtin_lck __P((void));
-#endif
-#ifdef DEBUG
-static sigret_t AttacherChld __P(SIGPROTOARG);
-#endif
-#ifdef MULTIUSER
-static sigret_t AttachSigCont __P(SIGPROTOARG);
-#endif
-
-extern int real_uid, real_gid, eff_uid, eff_gid;
-extern char *SockName, *SockMatch, SockPath[];
-extern struct passwd *ppp;
-extern char *attach_tty, *attach_term, *LoginName, *preselect;
-extern int xflag, dflag, rflag, quietflag, adaptflag;
-extern struct mode attach_Mode;
-extern struct NewWindow nwin_options;
-extern int MasterPid;
-
-#ifdef MULTIUSER
-extern char *multi;
-extern int multiattach, multi_uid, own_uid;
-extern int tty_mode, tty_oldmode;
-# ifndef USE_SETEUID
-static int multipipe[2];
-# endif
-#endif
-
-
-#ifdef MULTIUSER
-static int ContinuePlease;
-
-static sigret_t
-AttachSigCont SIGDEFARG
-{
- debug("SigCont()\n");
- ContinuePlease = 1;
- SIGRETURN;
-}
-#endif
-
-
-/*
- * Send message to a screen backend.
- * returns 1 if we could attach one, or 0 if none.
- * Understands MSG_ATTACH, MSG_DETACH, MSG_POW_DETACH
- * MSG_CONT, MSG_WINCH and nothing else!
- */
-
-static int
-WriteMessage(s, m)
-int s;
-struct msg *m;
-{
- int r, l = sizeof(*m);
-
- while(l > 0)
- {
- r = write(s, (char *)m + (sizeof(*m) - l), l);
- if (r == -1 && errno == EINTR)
- continue;
- if (r == -1 || r == 0)
- return -1;
- l -= r;
- }
- return 0;
-}
-
-
-int
-Attach(how)
-int how;
-{
- int n, lasts;
- struct msg m;
- struct stat st;
- char *s;
-
- debug2("Attach: how=%d, tty=%s\n", how, attach_tty);
-#ifdef MULTIUSER
-# ifndef USE_SETEUID
- while ((how == MSG_ATTACH || how == MSG_CONT) && multiattach)
- {
- int ret;
-
- if (pipe(multipipe))
- Panic(errno, "pipe");
- if (chmod(attach_tty, 0666))
- Panic(errno, "chmod %s", attach_tty);
- tty_oldmode = tty_mode;
- eff_uid = -1; /* make UserContext fork */
- real_uid = multi_uid;
- if ((ret = UserContext()) <= 0)
- {
- char dummy;
- eff_uid = 0;
- real_uid = own_uid;
- if (ret < 0)
- Panic(errno, "UserContext");
- close(multipipe[1]);
- read(multipipe[0], &dummy, 1);
- if (tty_oldmode >= 0)
- {
- chmod(attach_tty, tty_oldmode);
- tty_oldmode = -1;
- }
- ret = UserStatus();
-#ifdef LOCK
- if (ret == SIG_LOCK)
- LockTerminal();
- else
-#endif
-#ifdef SIGTSTP
- if (ret == SIG_STOP)
- kill(getpid(), SIGTSTP);
- else
-#endif
- if (ret == SIG_POWER_BYE)
- {
- int ppid;
- setgid(real_gid);
- setuid(real_uid);
- if ((ppid = getppid()) > 1)
- Kill(ppid, SIGHUP);
- exit(0);
- }
- else
- exit(ret);
- dflag = 0;
-#ifdef MULTI
- xflag = 1;
-#endif
- how = MSG_ATTACH;
- continue;
- }
- close(multipipe[0]);
- eff_uid = real_uid;
- break;
- }
-# else /* USE_SETEUID */
- if ((how == MSG_ATTACH || how == MSG_CONT) && multiattach)
- {
- real_uid = multi_uid;
- eff_uid = own_uid;
- xseteuid(multi_uid);
- xseteuid(own_uid);
- if (chmod(attach_tty, 0666))
- Panic(errno, "chmod %s", attach_tty);
- tty_oldmode = tty_mode;
- }
-# endif /* USE_SETEUID */
-#endif /* MULTIUSER */
-
- bzero((char *) &m, sizeof(m));
- m.type = how;
- m.protocol_revision = MSG_REVISION;
- strncpy(m.m_tty, attach_tty, sizeof(m.m_tty) - 1);
- m.m_tty[sizeof(m.m_tty) - 1] = 0;
-
- if (how == MSG_WINCH)
- {
- if ((lasts = MakeClientSocket(0)) >= 0)
- {
- WriteMessage(lasts, &m);
- close(lasts);
- }
- return 0;
- }
-
- if (how == MSG_CONT)
- {
- if ((lasts = MakeClientSocket(0)) < 0)
- {
- Panic(0, "Sorry, cannot contact session \"%s\" again.\r\n",
- SockName);
- }
- }
- else
- {
- n = FindSocket(&lasts, (int *)0, (int *)0, SockMatch);
- switch (n)
- {
- case 0:
- if (rflag && (rflag & 1) == 0)
- return 0;
- if (quietflag)
- eexit(10);
- Panic(0, SockMatch && *SockMatch ? "There is no screen to be %sed matching %s." : "There is no screen to be %sed.",
- xflag ? "attach" :
- dflag ? "detach" :
- "resum", SockMatch);
- /* NOTREACHED */
- case 1:
- break;
- default:
- if (rflag < 3)
- {
- if (quietflag)
- eexit(10 + n);
- Panic(0, "Type \"screen [-d] -r [pid.]tty.host\" to resume one of them.");
- }
- /* NOTREACHED */
- }
- }
- /*
- * Go in UserContext. Advantage is, you can kill your attacher
- * when things go wrong. Any disadvantages? jw.
- * Do this before the attach to prevent races!
- */
-#ifdef MULTIUSER
- if (!multiattach)
-#endif
- setuid(real_uid);
-#if defined(MULTIUSER) && defined(USE_SETEUID)
- else
- {
- /* This call to xsetuid should also set the saved uid */
- xseteuid(real_uid); /* multi_uid, allow backend to send signals */
- }
-#endif
- setgid(real_gid);
- eff_uid = real_uid;
- eff_gid = real_gid;
-
- debug2("Attach: uid %d euid %d\n", (int)getuid(), (int)geteuid());
- MasterPid = 0;
- for (s = SockName; *s; s++)
- {
- if (*s > '9' || *s < '0')
- break;
- MasterPid = 10 * MasterPid + (*s - '0');
- }
- debug1("Attach decided, it is '%s'\n", SockPath);
- debug1("Attach found MasterPid == %d\n", MasterPid);
- if (stat(SockPath, &st) == -1)
- Panic(errno, "stat %s", SockPath);
- if ((st.st_mode & 0600) != 0600)
- Panic(0, "Socket is in wrong mode (%03o)", (int)st.st_mode);
-
- /*
- * Change: if -x or -r ignore failing -d
- */
- if ((xflag || rflag) && dflag && (st.st_mode & 0700) == 0600)
- dflag = 0;
-
- /*
- * Without -x, the mode must match.
- * With -x the mode is irrelevant unless -d.
- */
- if ((dflag || !xflag) && (st.st_mode & 0700) != (dflag ? 0700 : 0600))
- Panic(0, "That screen is %sdetached.", dflag ? "already " : "not ");
-#ifdef REMOTE_DETACH
- if (dflag &&
- (how == MSG_ATTACH || how == MSG_DETACH || how == MSG_POW_DETACH))
- {
- m.m.detach.dpid = getpid();
- strncpy(m.m.detach.duser, LoginName, sizeof(m.m.detach.duser) - 1);
- m.m.detach.duser[sizeof(m.m.detach.duser) - 1] = 0;
-# ifdef POW_DETACH
- if (dflag == 2)
- m.type = MSG_POW_DETACH;
- else
-# endif
- m.type = MSG_DETACH;
- if (WriteMessage(lasts, &m))
- Panic(errno, "WriteMessage");
- close(lasts);
- if (how != MSG_ATTACH)
- return 0; /* we detached it. jw. */
- sleep(1); /* we dont want to overrun our poor backend. jw. */
- if ((lasts = MakeClientSocket(0)) == -1)
- Panic(0, "Cannot contact screen again. Sigh.");
- m.type = how;
- }
-#endif
- ASSERT(how == MSG_ATTACH || how == MSG_CONT);
- strncpy(m.m.attach.envterm, attach_term, sizeof(m.m.attach.envterm) - 1);
- m.m.attach.envterm[sizeof(m.m.attach.envterm) - 1] = 0;
- debug1("attach: sending %d bytes... ", (int)sizeof(m));
-
- strncpy(m.m.attach.auser, LoginName, sizeof(m.m.attach.auser) - 1);
- m.m.attach.auser[sizeof(m.m.attach.auser) - 1] = 0;
- m.m.attach.esc = DefaultEsc;
- m.m.attach.meta_esc = DefaultMetaEsc;
- strncpy(m.m.attach.preselect, preselect ? preselect : "", sizeof(m.m.attach.preselect) - 1);
- m.m.attach.preselect[sizeof(m.m.attach.preselect) - 1] = 0;
- m.m.attach.apid = getpid();
- m.m.attach.adaptflag = adaptflag;
- m.m.attach.lines = m.m.attach.columns = 0;
- if ((s = getenv("LINES")))
- m.m.attach.lines = atoi(s);
- if ((s = getenv("COLUMNS")))
- m.m.attach.columns = atoi(s);
- m.m.attach.encoding = nwin_options.encoding > 0 ? nwin_options.encoding + 1 : 0;
-
-#ifdef MULTIUSER
- /* setup CONT signal handler to repair the terminal mode */
- if (multi && (how == MSG_ATTACH || how == MSG_CONT))
- signal(SIGCONT, AttachSigCont);
-#endif
-
- if (WriteMessage(lasts, &m))
- Panic(errno, "WriteMessage");
- close(lasts);
- debug1("Attach(%d): sent\n", m.type);
-#ifdef MULTIUSER
- if (multi && (how == MSG_ATTACH || how == MSG_CONT))
- {
- while (!ContinuePlease)
- pause(); /* wait for SIGCONT */
- signal(SIGCONT, SIG_DFL);
- ContinuePlease = 0;
-# ifndef USE_SETEUID
- close(multipipe[1]);
-# else
- xseteuid(own_uid);
- if (tty_oldmode >= 0)
- if (chmod(attach_tty, tty_oldmode))
- Panic(errno, "chmod %s", attach_tty);
- tty_oldmode = -1;
- xseteuid(real_uid);
-# endif
- }
-#endif
- rflag = 0;
- return 1;
-}
-
-
-#if defined(DEBUG) || !defined(DO_NOT_POLL_MASTER)
-static int AttacherPanic = 0;
-#endif
-
-#ifdef DEBUG
-static sigret_t
-AttacherChld SIGDEFARG
-{
- AttacherPanic = 1;
- SIGRETURN;
-}
-#endif
-
-static sigret_t
-AttacherSigAlarm SIGDEFARG
-{
-#ifdef DEBUG
- static int tick_cnt = 0;
- if ((tick_cnt = (tick_cnt + 1) % 4) == 0)
- debug("tick\n");
-#endif
- SIGRETURN;
-}
-
-/*
- * the frontend's Interrupt handler
- * we forward SIGINT to the poor backend
- */
-static sigret_t
-AttacherSigInt SIGDEFARG
-{
- signal(SIGINT, AttacherSigInt);
- Kill(MasterPid, SIGINT);
- SIGRETURN;
-}
-
-/*
- * Unfortunatelly this is also the SIGHUP handler, so we have to
- * check if the backend is already detached.
- */
-
-sigret_t
-AttacherFinit SIGDEFARG
-{
- struct stat statb;
- struct msg m;
- int s;
-
- debug("AttacherFinit();\n");
- signal(SIGHUP, SIG_IGN);
- /* Check if signal comes from backend */
- if (stat(SockPath, &statb) == 0 && (statb.st_mode & 0777) != 0600)
- {
- debug("Detaching backend!\n");
- bzero((char *) &m, sizeof(m));
- strncpy(m.m_tty, attach_tty, sizeof(m.m_tty) - 1);
- m.m_tty[sizeof(m.m_tty) - 1] = 0;
- debug1("attach_tty is %s\n", attach_tty);
- m.m.detach.dpid = getpid();
- m.type = MSG_HANGUP;
- m.protocol_revision = MSG_REVISION;
- if ((s = MakeClientSocket(0)) >= 0)
- {
- WriteMessage(s, &m);
- close(s);
- }
- }
-#ifdef MULTIUSER
- if (tty_oldmode >= 0)
- {
- setuid(own_uid);
- chmod(attach_tty, tty_oldmode);
- }
-#endif
- exit(0);
- SIGRETURN;
-}
-
-#ifdef POW_DETACH
-static sigret_t
-AttacherFinitBye SIGDEFARG
-{
- int ppid;
- debug("AttacherFintBye()\n");
-#if defined(MULTIUSER) && !defined(USE_SETEUID)
- if (multiattach)
- exit(SIG_POWER_BYE);
-#endif
- setgid(real_gid);
-#ifdef MULTIUSER
- setuid(own_uid);
-#else
- setuid(real_uid);
-#endif
- /* we don't want to disturb init (even if we were root), eh? jw */
- if ((ppid = getppid()) > 1)
- Kill(ppid, SIGHUP); /* carefully say good bye. jw. */
- exit(0);
- SIGRETURN;
-}
-#endif
-
-#if defined(DEBUG) && defined(SIG_NODEBUG)
-static sigret_t
-AttacherNoDebug SIGDEFARG
-{
- debug("AttacherNoDebug()\n");
- signal(SIG_NODEBUG, AttacherNoDebug);
- if (dfp)
- {
- debug("debug: closing debug file.\n");
- fflush(dfp);
- fclose(dfp);
- dfp = NULL;
- }
- SIGRETURN;
-}
-#endif /* SIG_NODEBUG */
-
-static int SuspendPlease;
-
-static sigret_t
-SigStop SIGDEFARG
-{
- debug("SigStop()\n");
- SuspendPlease = 1;
- SIGRETURN;
-}
-
-#ifdef LOCK
-static int LockPlease;
-
-static sigret_t
-DoLock SIGDEFARG
-{
-# ifdef SYSVSIGS
- signal(SIG_LOCK, DoLock);
-# endif
- debug("DoLock()\n");
- LockPlease = 1;
- SIGRETURN;
-}
-#endif
-
-#if defined(SIGWINCH) && defined(TIOCGWINSZ)
-static int SigWinchPlease;
-
-static sigret_t
-AttacherWinch SIGDEFARG
-{
- debug("AttacherWinch()\n");
- SigWinchPlease = 1;
- SIGRETURN;
-}
-#endif
-
-
-/*
- * Attacher loop - no return
- */
-
-void
-Attacher()
-{
- signal(SIGHUP, AttacherFinit);
- signal(SIG_BYE, AttacherFinit);
-#ifdef POW_DETACH
- signal(SIG_POWER_BYE, AttacherFinitBye);
-#endif
-#if defined(DEBUG) && defined(SIG_NODEBUG)
- signal(SIG_NODEBUG, AttacherNoDebug);
-#endif
-#ifdef LOCK
- signal(SIG_LOCK, DoLock);
-#endif
- signal(SIGINT, AttacherSigInt);
-#ifdef BSDJOBS
- signal(SIG_STOP, SigStop);
-#endif
-#if defined(SIGWINCH) && defined(TIOCGWINSZ)
- signal(SIGWINCH, AttacherWinch);
-#endif
-#ifdef DEBUG
- signal(SIGCHLD, AttacherChld);
-#endif
- debug("attacher: going for a nap.\n");
- dflag = 0;
-#ifdef MULTI
- xflag = 1;
-#endif
- for (;;)
- {
-#ifndef DO_NOT_POLL_MASTER
- signal(SIGALRM, AttacherSigAlarm);
- alarm(15);
- pause();
- alarm(0);
- if (kill(MasterPid, 0) < 0 && errno != EPERM)
- {
- debug1("attacher: Panic! MasterPid %d does not exist.\n", MasterPid);
- AttacherPanic++;
- }
-#else
- pause();
-#endif
-#if defined(DEBUG) || !defined(DO_NOT_POLL_MASTER)
- if (AttacherPanic)
- {
- fcntl(0, F_SETFL, 0);
- SetTTY(0, &attach_Mode);
- printf("\nSuddenly the Dungeon collapses!! - You die...\n");
- eexit(1);
- }
-#endif
-#ifdef BSDJOBS
- if (SuspendPlease)
- {
- SuspendPlease = 0;
-#if defined(MULTIUSER) && !defined(USE_SETEUID)
- if (multiattach)
- exit(SIG_STOP);
-#endif
- signal(SIGTSTP, SIG_DFL);
- debug("attacher: killing myself SIGTSTP\n");
- kill(getpid(), SIGTSTP);
- debug("attacher: continuing from stop\n");
- signal(SIG_STOP, SigStop);
- (void) Attach(MSG_CONT);
- }
-#endif
-#ifdef LOCK
- if (LockPlease)
- {
- LockPlease = 0;
-#if defined(MULTIUSER) && !defined(USE_SETEUID)
- if (multiattach)
- exit(SIG_LOCK);
-#endif
- LockTerminal();
-# ifdef SYSVSIGS
- signal(SIG_LOCK, DoLock);
-# endif
- (void) Attach(MSG_CONT);
- }
-#endif /* LOCK */
-#if defined(SIGWINCH) && defined(TIOCGWINSZ)
- if (SigWinchPlease)
- {
- SigWinchPlease = 0;
-# ifdef SYSVSIGS
- signal(SIGWINCH, AttacherWinch);
-# endif
- (void) Attach(MSG_WINCH);
- }
-#endif /* SIGWINCH */
- }
-}
-
-#ifdef LOCK
-
-/* ADDED by Rainer Pruy 10/15/87 */
-/* POLISHED by mls. 03/10/91 */
-
-static char LockEnd[] = "Welcome back to screen !!\n";
-
-static sigret_t
-LockHup SIGDEFARG
-{
- int ppid = getppid();
- setgid(real_gid);
-#ifdef MULTIUSER
- setuid(own_uid);
-#else
- setuid(real_uid);
-#endif
- if (ppid > 1)
- Kill(ppid, SIGHUP);
- exit(0);
-}
-
-static void
-LockTerminal()
-{
- char *prg;
- int sig, pid;
- sigret_t (*sigs[NSIG])__P(SIGPROTOARG);
-
- for (sig = 1; sig < NSIG; sig++)
- sigs[sig] = signal(sig, sig == SIGCHLD ? SIG_DFL : SIG_IGN);
- signal(SIGHUP, LockHup);
- printf("\n");
-
- prg = getenv("LOCKPRG");
- if (prg && strcmp(prg, "builtin") && !access(prg, X_OK))
- {
- signal(SIGCHLD, SIG_DFL);
- debug1("lockterminal: '%s' seems executable, execl it!\n", prg);
- if ((pid = fork()) == 0)
- {
- /* Child */
- setgid(real_gid);
-#ifdef MULTIUSER
- setuid(own_uid);
-#else
- setuid(real_uid); /* this should be done already */
-#endif
- closeallfiles(0); /* important: /etc/shadow may be open */
- execl(prg, "SCREEN-LOCK", NULL);
- exit(errno);
- }
- if (pid == -1)
- Msg(errno, "Cannot lock terminal - fork failed");
- else
- {
-#ifdef BSDWAIT
- union wait wstat;
-#else
- int wstat;
-#endif
- int wret;
-
-#ifdef hpux
- signal(SIGCHLD, SIG_DFL);
-#endif
- errno = 0;
- while (((wret = wait(&wstat)) != pid) ||
- ((wret == -1) && (errno == EINTR))
- )
- errno = 0;
-
- if (errno)
- {
- Msg(errno, "Lock");
- sleep(2);
- }
- else if (WTERMSIG(wstat) != 0)
- {
- fprintf(stderr, "Lock: %s: Killed by signal: %d%s\n", prg,
- WTERMSIG(wstat), WIFCORESIG(wstat) ? " (Core dumped)" : "");
- sleep(2);
- }
- else if (WEXITSTATUS(wstat))
- {
- debug2("Lock: %s: return code %d\n", prg, WEXITSTATUS(wstat));
- }
- else
- printf(LockEnd);
- }
- }
- else
- {
- if (prg)
- {
- debug1("lockterminal: '%s' seems NOT executable, we use our builtin\n", prg);
- }
- else
- {
- debug("lockterminal: using buitin.\n");
- }
- screen_builtin_lck();
- }
- /* reset signals */
- for (sig = 1; sig < NSIG; sig++)
- {
- if (sigs[sig] != (sigret_t(*)__P(SIGPROTOARG)) -1)
- signal(sig, sigs[sig]);
- }
-} /* LockTerminal */
-
-#ifdef USE_PAM
-
-/*
- * PAM support by Pablo Averbuj <pablo@averbuj.com>
- */
-
-#include <security/pam_appl.h>
-
-static int PAM_conv __P((int, const struct pam_message **, struct pam_response **, void *));
-
-static int
-PAM_conv(num_msg, msg, resp, appdata_ptr)
-int num_msg;
-const struct pam_message **msg;
-struct pam_response **resp;
-void *appdata_ptr;
-{
- int replies = 0;
- struct pam_response *reply = NULL;
-
- reply = malloc(sizeof(struct pam_response)*num_msg);
- if (!reply)
- return PAM_CONV_ERR;
- #define COPY_STRING(s) (s) ? strdup(s) : NULL
-
- for (replies = 0; replies < num_msg; replies++)
- {
- switch (msg[replies]->msg_style)
- {
- case PAM_PROMPT_ECHO_OFF:
- /* wants password */
- reply[replies].resp_retcode = PAM_SUCCESS;
- reply[replies].resp = appdata_ptr ? strdup((char *)appdata_ptr) : 0;
- break;
- case PAM_TEXT_INFO:
- /* ignore the informational mesage */
- /* but first clear out any drek left by malloc */
- reply[replies].resp = NULL;
- break;
- case PAM_PROMPT_ECHO_ON:
- /* user name given to PAM already */
- /* fall through */
- default:
- /* unknown or PAM_ERROR_MSG */
- free(reply);
- return PAM_CONV_ERR;
- }
- }
- *resp = reply;
- return PAM_SUCCESS;
-}
-
-static struct pam_conv PAM_conversation = {
- &PAM_conv,
- NULL
-};
-
-
-#endif
-
-/* -- original copyright by Luigi Cannelloni 1985 (luigi@faui70.UUCP) -- */
-static void
-screen_builtin_lck()
-{
- char fullname[100], *cp1, message[100 + 100];
-#ifdef USE_PAM
- pam_handle_t *pamh = 0;
- int pam_error;
-#else
- char *pass, mypass[16 + 1], salt[3];
-#endif
-
-#ifndef USE_PAM
- pass = ppp->pw_passwd;
- if (pass == 0 || *pass == 0)
- {
- if ((pass = getpass("Key: ")))
- {
- strncpy(mypass, pass, sizeof(mypass) - 1);
- mypass[sizeof(mypass) - 1] = 0;
- if (*mypass == 0)
- return;
- if ((pass = getpass("Again: ")))
- {
- if (strcmp(mypass, pass))
- {
- fprintf(stderr, "Passwords don't match.\007\n");
- sleep(2);
- return;
- }
- }
- }
- if (pass == 0)
- {
- fprintf(stderr, "Getpass error.\007\n");
- sleep(2);
- return;
- }
-
- salt[0] = 'A' + (int)(time(0) % 26);
- salt[1] = 'A' + (int)((time(0) >> 6) % 26);
- salt[2] = 0;
- pass = crypt(mypass, salt);
- pass = ppp->pw_passwd = SaveStr(pass);
- }
-#endif
-
- debug("screen_builtin_lck looking in gcos field\n");
- strncpy(fullname, ppp->pw_gecos, sizeof(fullname) - 9);
- fullname[sizeof(fullname) - 9] = 0;
-
- if ((cp1 = index(fullname, ',')) != NULL)
- *cp1 = '\0';
- if ((cp1 = index(fullname, '&')) != NULL)
- {
- strncpy(cp1, ppp->pw_name, 8);
- cp1[8] = 0;
- if (*cp1 >= 'a' && *cp1 <= 'z')
- *cp1 -= 'a' - 'A';
- }
-
- sprintf(message, "Screen used by %s <%s>.\nPassword:\007",
- fullname, ppp->pw_name);
-
- /* loop here to wait for correct password */
- for (;;)
- {
- debug("screen_builtin_lck awaiting password\n");
- errno = 0;
- if ((cp1 = getpass(message)) == NULL)
- {
- AttacherFinit(SIGARG);
- /* NOTREACHED */
- }
-#ifdef USE_PAM
- PAM_conversation.appdata_ptr = cp1;
- pam_error = pam_start("screen", ppp->pw_name, &PAM_conversation, &pamh);
- if (pam_error != PAM_SUCCESS)
- AttacherFinit(SIGARG); /* goodbye */
- pam_error = pam_authenticate(pamh, 0);
- pam_end(pamh, pam_error);
- PAM_conversation.appdata_ptr = 0;
- if (pam_error == PAM_SUCCESS)
- break;
-#else
- if (!strncmp(crypt(cp1, pass), pass, strlen(pass)))
- break;
-#endif
- debug("screen_builtin_lck: NO!!!!!\n");
- bzero(cp1, strlen(cp1));
- }
- bzero(cp1, strlen(cp1));
- debug("password ok.\n");
-}
-
-#endif /* LOCK */
-
-
-void
-SendCmdMessage(sty, match, av)
-char *sty;
-char *match;
-char **av;
-{
- int i, s;
- struct msg m;
- char *p;
- int len, n;
-
- if (sty == 0)
- {
- i = FindSocket(&s, (int *)0, (int *)0, match);
- if (i == 0)
- Panic(0, "No screen session found.");
- if (i != 1)
- Panic(0, "Use -S to specify a session.");
- }
- else
- {
-#ifdef NAME_MAX
- if (strlen(sty) > NAME_MAX)
- sty[NAME_MAX] = 0;
-#endif
- if (strlen(sty) > 2 * MAXSTR - 1)
- sty[2 * MAXSTR - 1] = 0;
- sprintf(SockPath + strlen(SockPath), "/%s", sty);
- if ((s = MakeClientSocket(1)) == -1)
- exit(1);
- }
- bzero((char *)&m, sizeof(m));
- m.type = MSG_COMMAND;
- if (attach_tty)
- {
- strncpy(m.m_tty, attach_tty, sizeof(m.m_tty) - 1);
- m.m_tty[sizeof(m.m_tty) - 1] = 0;
- }
- p = m.m.command.cmd;
- n = 0;
- for (; *av && n < MAXARGS - 1; ++av, ++n)
- {
- len = strlen(*av) + 1;
- if (p + len >= m.m.command.cmd + sizeof(m.m.command.cmd) - 1)
- break;
- strcpy(p, *av);
- p += len;
- }
- *p = 0;
- m.m.command.nargs = n;
- strncpy(m.m.attach.auser, LoginName, sizeof(m.m.attach.auser) - 1);
- m.m.command.auser[sizeof(m.m.command.auser) - 1] = 0;
- m.protocol_revision = MSG_REVISION;
- strncpy(m.m.command.preselect, preselect ? preselect : "", sizeof(m.m.command.preselect) - 1);
- m.m.command.preselect[sizeof(m.m.command.preselect) - 1] = 0;
- m.m.command.apid = getpid();
- debug1("SendCommandMsg writing '%s'\n", m.m.command.cmd);
- if (WriteMessage(s, &m))
- Msg(errno, "write");
- close(s);
-}
diff --git a/src/braille.c b/src/braille.c
deleted file mode 100644
index 9951087..0000000
--- a/src/braille.c
+++ /dev/null
@@ -1,945 +0,0 @@
-/*
- * A braille interface to unix tty terminals
- *
- * Authors: Hadi Bargi Rangin bargi@dots.physics.orst.edu
- * Bill Barry barryb@dots.physics.orst.edu
- *
- * Copyright (c) 1995 by Science Access Project, Oregon State University.
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-#include "braille.h"
-
-#ifdef HAVE_BRAILLE
-
-
-extern int bd_init_powerbraille_40 __P((void));
-extern int bd_init_powerbraille_80 __P((void));
-extern int bd_init_navigator_40 __P((void));
-
-extern struct layer *flayer;
-extern struct display *displays, *display;
-extern char *rc_name;
-
-
-
-
-/* global variables */
-
-struct braille_display bd;
-
-struct bd_type {
- char *name;
- int (*init) __P((void));
-};
-
-static struct bd_type bd_typelist[] =
-{
- {"powerbraille_40", bd_init_powerbraille_40},
- {"powerbraille_80", bd_init_powerbraille_80},
- {"navigator_40" , bd_init_navigator_40}
-};
-
-static void position_braille_cursor __P((void));
-static int initialize_braille_display_type __P((char *));
-static int open_braille_device __P(());
-static int load_braille_table __P((char *));
-static void bd_signal __P((void));
-static void bd_bc_left __P((void));
-static void bd_bc_right __P((void));
-static void bd_bc_up __P((void));
-static void bd_bc_down __P((void));
-static void bd_upper_left __P((void));
-static void bd_upper_right __P((void));
-static void bd_lower_left __P((void));
-static void bd_lower_right __P((void));
-static int bd_do_search __P((int, int, int));
-static void bd_normalize __P((int, int));
-static void bd_readev_fn __P((struct event *, char *));
-static void bd_writeev_fn __P((struct event *, char *));
-static void bd_selectev_fn __P((struct event *, char *));
-
-static unsigned char btable_local [] =
-{
- 0xC8,0xC1,0xC3,0xC9,0xD9,0xD1,0xCB,0xDB,
- 0xD3,0xCA,0xDA,0xC5,0xC7,0xCD,0xDD,0xD5,
- 0xCF,0xDF,0xD7,0xCE,0xDE,0xE5,0xE7,0xFA,
- 0xED,0xFD,0xF5,0xEA,0xF3,0xFB,0xD8,0xF8,
- 0x00,0x2E,0x10,0x3C,0x2B,0x29,0x2F,0x04,
- 0x37,0x3E,0x21,0x2C,0x20,0x24,0x28,0x0C,
- 0x34,0x02,0x06,0x12,0x32,0x22,0x16,0x36,
- 0x26,0x14,0x31,0x30,0x23,0x3F,0x1C,0x39,
- 0x48,0x41,0x43,0x49,0x59,0x51,0x4B,0x5B,
- 0x53,0x4A,0x5A,0x45,0x47,0x4D,0x5D,0x55,
- 0x4F,0x5F,0x57,0x4E,0x5E,0x65,0x67,0x7A,
- 0x6D,0x7D,0x75,0x6A,0x73,0x7B,0x58,0x38,
- 0x08,0x01,0x03,0x09,0x19,0x11,0x0B,0x1B,
- 0x13,0x0A,0x1A,0x05,0x07,0x0D,0x1D,0x15,
- 0x0F,0x1F,0x17,0x0E,0x1E,0x25,0x27,0x3A,
- 0x2D,0x3D,0x35,0x2A,0x33,0x3B,0x18,0x78,
- 0x88,0x81,0x83,0x89,0x99,0x91,0x8B,0x9B,
- 0x93,0x8A,0x9A,0x85,0x87,0x8D,0x9D,0x95,
- 0x8F,0x9F,0x97,0x8E,0x9E,0xA5,0xA7,0xBA,
- 0xAD,0xBD,0xB5,0xAA,0xB3,0xBB,0x98,0xB8,
- 0x40,0x6E,0x50,0x7C,0x6B,0x69,0x6F,0x44,
- 0x77,0x7E,0x61,0x6C,0x60,0x64,0x68,0x4C,
- 0x74,0x42,0x46,0x52,0x72,0x62,0x56,0x76,
- 0x66,0x54,0x71,0x70,0x63,0x7F,0x5C,0x79,
- 0xC0,0xEE,0xD0,0xFC,0xEB,0xE9,0xEF,0xC4,
- 0xF7,0xFE,0xE1,0xEC,0xE0,0xE4,0xE8,0xCC,
- 0xF4,0xC2,0xC6,0xD2,0xF2,0xE2,0xD6,0xF6,
- 0xE6,0xD4,0xF1,0xF0,0xE3,0xFF,0xDC,0xF9,
- 0x80,0xAE,0x90,0xBC,0xAB,0xA9,0xAF,0x84,
- 0xB7,0xBE,0xA1,0xAC,0xA0,0xA4,0xA8,0x8C,
- 0xB4,0x82,0x86,0x92,0xB2,0xA2,0x96,0xB6,
- 0xA6,0x94,0xB1,0xB0,0xA3,0xBF,0x9C,0xB9
-};
-
-void
-InitBraille()
-{
- bd.bd_start_braille=0;
- bd.bd_port = 0;
- bd.bd_braille_table = SaveStr("internal us-braille.tbl");
- bd.bd_type = 0;
- bd.bd_baud = 9600;
- bd.bd_bell = 1;
- bd.bd_eightdot = 1;
- bd.bd_info = 0;
- bd.bd_link = 1;
- bd.bd_ncells = 0;
- bd.bd_width = 0;
- bd.bd_ncrc = 1;
- bd.bd_scroll = 1;
- bd.bd_skip = 0;
- bd.bd_using_braille = 0;
- bd.bd_obuflen = 0;
- bd.bd_fd = -1;
- bcopy((char *)btable_local, bd.bd_btable, 256);
-}
-
-static int
-initialize_braille_display_type(s)
-char *s;
-{
- int i;
-
- for (i = 0; i < sizeof(bd_typelist)/sizeof(*bd_typelist); i++)
- if (!strcmp(s, bd_typelist[i].name))
- break;
- if (i == sizeof(bd_typelist)/sizeof(*bd_typelist))
- {
- Msg(0, "No entry for bd_type: %s ", s);
- return -1;
- }
- bd.bd_type = bd_typelist[i].name;
- if ((*bd_typelist[i].init)())
- return -1;
-
- if (!bd.bd_width)
- bd.bd_width = bd.bd_ncells;
-
- return 0;
-}
-
-void
-StartBraille()
-{
- bd.bd_dpy = displays;
-
- debug("StartBraille called\n");
- evdeq(&bd.bd_readev);
- evdeq(&bd.bd_writeev);
- evdeq(&bd.bd_selectev);
- bd.bd_using_braille = 0;
-
- if (!bd.bd_start_braille)
- return;
-
- if (bd.bd_type == 0 || bd.bd_port == 0)
- return;
-
- if (bd.bd_fd < 0 && open_braille_device())
- {
- Msg(0, "bd_port turned off");
- free(bd.bd_port);
- bd.bd_port = 0;
- return;
- }
-
- /* check if braille display is connected and turned on */
- if (bd.bd_response_test())
- {
- Msg(0, "Make sure that braille display is connected and turned on. ");
- Msg(0, "start_braille turned off");
- bd.bd_start_braille = 0;
- }
- else
- {
- bd.bd_using_braille = 1;
- bd.bd_readev.fd = bd.bd_writeev.fd = bd.bd_fd;
- bd.bd_readev.type = EV_READ;
- bd.bd_writeev.type = EV_WRITE;
- bd.bd_selectev.type = EV_ALWAYS;
- bd.bd_readev.data = bd.bd_writeev.data = bd.bd_selectev.data = (char *)&bd;
- bd.bd_readev.handler = bd_readev_fn;
- bd.bd_writeev.handler = bd_writeev_fn;
- bd.bd_selectev.handler = bd_selectev_fn;
- evenq(&bd.bd_readev);
- bd.bd_writeev.condpos = &bd.bd_obuflen;
- bd.bd_writeev.condneg = 0;
- evenq(&bd.bd_writeev);
- bd.bd_selectev.pri = -20;
- evenq(&bd.bd_selectev);
- }
-}
-
-
-static int
-load_braille_table(tablename)
-char *tablename;
-{
- int i, j, c, p;
- FILE *fp;
- char buffer[80], a[10];
-
- if ((fp = secfopen(tablename, "r")) == 0)
- {
- Msg(errno, "Braille table not found: %s ", tablename);
- return -1;
- }
- bzero(bd.bd_btable, 256);
- /* format:
- * Dec Hex Braille Description
- * 7 07 (12-45--8) BEL
- */
- while (fgets(buffer, sizeof(buffer), fp))
- {
- if (buffer[0] == '#')
- continue;
- sscanf(buffer,"%d %x %8s", &i, &j, a);
- if (i < 0 || i > 255)
- continue;
- for (j=1, p=1, c=0; j<9; j++, p*=2)
- if (a[j] == '0' + j)
- c += p;
- bd.bd_btable[i] = c;
- }
- fclose(fp);
- return 0;
-}
-
-
-static int
-open_braille_device(s)
-char *s;
-{
- char str[256];
-
- sprintf(str, "%d cs8 -istrip ixon ixoff", bd.bd_baud);
- bd.bd_fd = OpenTTY(bd.bd_port, str);
- if (bd.bd_fd == -1)
- {
- Msg(errno, "open comm port failed: %s ", bd.bd_port);
- return -1;
- }
- fcntl(bd.bd_fd, F_SETFL, FNBLOCK);
- return 0;
-}
-
-
-static void
-position_braille_cursor()
-{
- int sx = bd.bd_sx;
- int bx = BD_FORE->w_bd_x;
- int eol = BD_FORE->w_width;
- int w = bd.bd_width;
-
- if (bd.bd_scroll)
- bx = sx - w + bd.bd_ncrc; /* keep rc centered in window */
- else
- bx = w * (int)(sx / w); /* increase bc in integral steps */
-
- if (bx > eol - w)
- bx = eol - w;
- if (bx < 0)
- bx = 0;
- BD_FORE->w_bd_x = bx;
- BD_FORE->w_bd_y = bd.bd_sy;
-}
-
-
-void
-RefreshBraille()
-{
- int i, y, xs, xe;
- int cursor_pos;
-
- if (!bd.bd_using_braille)
- return;
- if (!BD_FORE)
- return;
- bcopy(bd.bd_line, bd.bd_oline, bd.bd_ncells);
- bd.bd_refreshing = 1;
- flayer = bd.bd_dpy->d_forecv->c_layer;
- bd.bd_sx = flayer->l_x;
- bd.bd_sy = flayer->l_y;
- display = bd.bd_dpy;
- if ((D_obufp != D_obuf) && bd.bd_link)
- {
- /* jump to real cursor */
- debug("calling position_braille_cursor\n");
- position_braille_cursor();
- }
- bclear(bd.bd_line, bd.bd_ncells);
-
- y = BD_FORE->w_bd_y;
- xs = BD_FORE->w_bd_x;
-
- if (bd.bd_info & 1)
- {
- sprintf(bd.bd_line, "%02d%02d", (BD_FORE->w_bd_x + 1) % 100, (BD_FORE->w_bd_y + 1) % 100);
- bd.bd_line[4] = ' ';
- }
- if (bd.bd_info & 2)
- {
- sprintf(bd.bd_line + bd.bd_ncells - 4, "%02d%02d",(bd.bd_sx +1) % 100, (bd.bd_sy +1) % 100);
- }
-
- xe = xs + bd.bd_width - 1;
-
- if (xs > flayer->l_width - 1)
- xs = flayer->l_width - 1;
- if (xe > flayer->l_width - 1)
- xe = flayer->l_width - 1;
-
- if (D_status)
- {
- sprintf(bd.bd_line, "**%-*.*s", bd.bd_ncells - 2, bd.bd_ncells - 2, D_status_lastmsg ? D_status_lastmsg : "unknown msg");
- xs = xe = -1;
- }
- else if (xs <= xe)
- {
- LayRedisplayLine(-1, xs, xe, 1);
- LayRedisplayLine(y, xs, xe, 1);
- }
-
- debug1("Braille: got >%s<\n", bd.bd_line);
-
- bd.bd_refreshing = 0;
-
- if (y == bd.bd_sy && xs <= bd.bd_sx && bd.bd_sx <= xe)
- cursor_pos = bd.bd_sx - xs + (bd.bd_info & 1 ? 4 : 0);
- else
- cursor_pos = bd.bd_ncells;
- for (i = 0; i < bd.bd_ncells; i++)
- if (bd.bd_line[i] != bd.bd_oline[i])
- break;
- if (bd.bd_cursorpos != cursor_pos || i < bd.bd_ncells)
- bd.write_line_braille(bd.bd_line, bd.bd_ncells, cursor_pos);
- bd.bd_cursorpos = cursor_pos;
-}
-
-
-/**********************************************************************
- *
- */
-
-/*
- * So, why is there a Flush() down below? The reason is simple: the
- * cursor warp (if bd_link is on) checks the obuf to see if something
- * happened. If there would be no Flush, screen would warp the
- * bd cursor if a bd movement command tries to ring the bell.
- * (In other words: this is a gross hack!)
- */
-static void
-bd_signal()
-{
- if (!bd.bd_bell)
- return;
- display = bd.bd_dpy;
- if (D_obufp != D_obuf)
- AddCStr(D_BL);
- else
- {
- AddCStr(D_BL);
- Flush();
- }
-}
-
-static int
-bd_do_search(y, xs, xe)
-int y, xs, xe;
-{
- int oy = BD_FORE->w_bd_y;
-
- if (!bd.bd_skip) /* no skip mode, found it */
- {
- if (xs > xe)
- return 0;
- bd.bd_searchmin = xs;
- bd.bd_searchmax = xe;
- return 1;
- }
- flayer = bd.bd_dpy->d_forecv->c_layer;
- bd.bd_searchmax = -1;
- bd.bd_searchmin = flayer->l_width;
- if (xs <= xe)
- {
- BD_FORE->w_bd_y = y; /* stupid hack */
- bd.bd_refreshing = bd.bd_searching = 1;
- bd.bd_searchstart = xs;
- bd.bd_searchend = xe;
- LayRedisplayLine(-1, xs, xe, 1);
- LayRedisplayLine(y, xs, xe, 1);
- bd.bd_refreshing = bd.bd_searching = 0;
- BD_FORE->w_bd_y = oy;
- }
- return bd.bd_searchmax >= 0;
-}
-
-static void
-bd_normalize(x, y)
-int x, y;
-{
- if (x > BD_FORE->w_width - bd.bd_width)
- x = BD_FORE->w_width - bd.bd_width;
- if (x < 0)
- x = 0;
- if (y < 0)
- {
- bd_signal();
- y = 0;
- }
- if (y >= BD_FORE->w_height)
- {
- bd_signal();
- y = BD_FORE->w_height - 1;
- }
- if (x != BD_FORE->w_bd_x || y != BD_FORE->w_bd_y)
- bd.bd_moved = 1;
- BD_FORE->w_bd_x = x;
- BD_FORE->w_bd_y = y;
-}
-
-static void
-bd_bc_left()
-{
- int bx = BD_FORE->w_bd_x, by = BD_FORE->w_bd_y;
- int ex;
-
- ex = bx - 1;
- bx = 0;
- for (; by >= 0; by--)
- {
- if (bd_do_search(by, 0, ex))
- {
- if (!bd.bd_skip && by != BD_FORE->w_bd_y)
- bd_signal();
- bx = bd.bd_searchmax + 1 - bd.bd_width;
- break;
- }
- ex = BD_FORE->w_width - 1;
- }
- bd_normalize(bx, by);
-}
-
-static void
-bd_bc_right()
-{
- int bx = BD_FORE->w_bd_x, by = BD_FORE->w_bd_y;
- int sx;
-
- sx = bx + bd.bd_width;
- bx = BD_FORE->w_width - bd.bd_width;
- for (; by < BD_FORE->w_height; by++)
- {
- if (bd_do_search(by, sx, BD_FORE->w_width - 1))
- {
- if (!bd.bd_skip && by != BD_FORE->w_bd_y)
- bd_signal();
- bx = bd.bd_searchmin;
- break;
- }
- sx = 0;
- }
- bd_normalize(bx, by);
-}
-
-static void
-bd_bc_up()
-{
- int bx = BD_FORE->w_bd_x, by = BD_FORE->w_bd_y;
-
- for (by--; by >= 0; by--)
- if (bd_do_search(by, bx, bx + bd.bd_width - 1))
- break;
- bd_normalize(bx, by);
-}
-
-static void
-bd_bc_down()
-{
- int bx = BD_FORE->w_bd_x, by = BD_FORE->w_bd_y;
-
- for (by++; by < BD_FORE->w_height; by++)
- if (bd_do_search(by, bx, bx + bd.bd_width - 1))
- break;
- bd_normalize(bx, by);
-}
-
-
-static void
-bd_upper_left()
-{
- bd_normalize(0, 0);
-}
-
-
-static void
-bd_upper_right()
-{
- bd_normalize(BD_FORE->w_width - bd.bd_width, 0);
-}
-
-
-static void
-bd_lower_left()
-{
- bd_normalize(0, BD_FORE->w_height - 1);
-}
-
-
-static void
-bd_lower_right()
-{
- bd_normalize(BD_FORE->w_width - bd.bd_width, BD_FORE->w_height -1);
-}
-
-/**********************************************************************
- *
- */
-
-
-static void
-bd_check(x, c)
-int x, c;
-{
- if (c == ' ')
- return;
- if (x < bd.bd_searchstart || x > bd.bd_searchend)
- return;
- if (x > bd.bd_searchmax)
- bd.bd_searchmax = x;
- if (x < bd.bd_searchmin)
- bd.bd_searchmin = x;
-}
-
-
-
-/*ARGSUSED*/
-void
-BGotoPos(la, x, y)
-struct layer *la;
-int x, y;
-{
-}
-
-/*ARGSUSED*/
-void
-BCDisplayLine(la, ml, y, xs, xe, isblank)
-struct layer *la;
-struct mline *ml;
-int y, xs, xe;
-int isblank;
-{
- int x;
- int sx, ex;
- char *l;
-
- if (y != BD_FORE->w_bd_y)
- return;
- if (bd.bd_searching)
- {
- for (x = xs; x <= xe; x++)
- bd_check(x, ml->image[x]);
- return;
- }
- l = bd.bd_line;
- sx = BD_FORE->w_bd_x;
- ex = sx + bd.bd_width - 1;
- if (bd.bd_info & 1)
- l += 4;
- for (x = xs; x <= xe; x++)
- if (x >= sx && x <= ex)
- l[x - sx] = ml->image[x];
-}
-
-/*ARGSUSED*/
-void
-BPutChar(la, c, x, y)
-struct layer *la;
-struct mchar *c;
-int x, y;
-{
- int sx, ex;
- char *l;
-
- if (y != BD_FORE->w_bd_y)
- return;
- if (bd.bd_searching)
- {
- bd_check(x, c->image);
- return;
- }
- l = bd.bd_line;
- sx = BD_FORE->w_bd_x;
- ex = sx + bd.bd_width - 1;
- if (bd.bd_info & 1)
- l += 4;
- if (x >= sx && x <= ex)
- l[x - sx] = c->image;
-}
-
-/*ARGSUSED*/
-void
-BPutStr(la, s, n, r, x, y)
-struct layer *la;
-char *s;
-int n;
-struct mchar *r;
-int x, y;
-{
- int sx, ex;
- char *l;
-
- if (y != BD_FORE->w_bd_y)
- return;
- if (bd.bd_searching)
- {
- for (; n > 0; n--, s++, x++)
- bd_check(x, *s);
- return;
- }
- l = bd.bd_line;
- sx = BD_FORE->w_bd_x;
- ex = sx + bd.bd_width - 1;
- if (bd.bd_info & 1)
- l += 4;
- for (; n > 0; n--, s++, x++)
- if (x >= sx && x <= ex)
- l[x - sx] = *s;
-}
-
-
-
-/**********************************************************************
- *
- */
-
-static char *infonames[] = {"none", "bc", "sc", "bc+sc"};
-
-void
-DoBrailleAction(act, msgok)
-struct action *act;
-int msgok;
-{
- int nr, dosig;
- int n, l, o;
- char *s, **args;
- struct stat st;
-
- nr = act->nr;
- args = act->args;
- dosig = display && !*rc_name;
-
- switch(nr)
- {
- case RC_BD_BELL:
- if (ParseSwitch(act, &bd.bd_bell) || !msgok)
- {
- bd_signal();
- break;
- }
- Msg(0, bd.bd_bell ? "bd_bell is on." : "bd_bell is off.");
- break;
-
- case RC_BD_EIGHTDOT:
- if (ParseSwitch(act, &bd.bd_eightdot) || !msgok)
- break;
- Msg(0, "switched to %d-dots system.", bd.bd_eightdot ? 8 : 6);
- break;
-
- case RC_BD_INFO:
- n = bd.bd_info;
- if (*args)
- {
- if (strlen(*args) == 4)
- n = args[0][n] - '0';
- else if (ParseNum(act, &n))
- break;
- }
- if (n < 0 && n > 3)
- {
- Msg(0, "Out of range; 0 <= bd_info >= 3 ");
- break;
- }
- /* bd_width at the beginning is unknown */
- if (bd.bd_width == 0)
- break;
-
- o = (bd.bd_info * 2 + 2) & 12;
- l = (n * 2 + 2) & 12;
- if (l >= bd.bd_ncells)
- {
- Msg(0, "bd_info is too large for braille display.");
- break;
- }
- if (l >= bd.bd_width + o)
- {
- Msg(0, "bd_info is too large for bd_width.");
- break;
- }
- bd.bd_width += o - l;
- bd.bd_info = n;
-
- if (msgok)
- Msg(0, "bd_info is %s.", infonames[n]);
- position_braille_cursor();
- break;
-
- case RC_BD_LINK:
- if (*args == 0 && bd.bd_moved)
- bd.bd_link = 0;
- if (ParseSwitch(act, &bd.bd_link))
- break;
- if (bd.bd_link)
- {
- bd.bd_moved = 0;
- if (dosig)
- bd_signal();
- position_braille_cursor();
- }
- if (msgok)
- Msg(0, bd.bd_link ? "bd_link is on." : "bd_link is off.");
- break;
-
- case RC_BD_SKIP:
- if (ParseSwitch(act, &bd.bd_skip))
- break;
- if (bd.bd_skip && dosig)
- bd_signal();
- if (msgok)
- Msg(0, bd.bd_skip ? "bd_skip is on." : "bd_skip is off.");
- break;
-
- case RC_BD_SCROLL:
- if (ParseSwitch(act, &bd.bd_scroll) || !msgok)
- {
- position_braille_cursor();
- break;
- }
- Msg(0, bd.bd_scroll ? "bd_scroll is on." : "bd_scroll is off.");
- break;
-
- case RC_BD_NCRC:
- n = bd.bd_ncrc;
- if (*args)
- {
- if (args[0][0] == '+')
- n = (n + atoi(*args + 1)) % bd.bd_width + 1;
- else if (args[0][0] == '-')
- n = (n - atoi(*args + 1)) % bd.bd_width + 1;
- else if (ParseNum(act, &n))
- break;
- }
- if (n < 1 || n > bd.bd_width)
- {
- Msg(0, "Out of range; 1 <= bd_ncrc >= %d", bd.bd_width);
- break;
- }
- bd.bd_ncrc = n;
- if (msgok)
- Msg(0, "bd_ncrc status is: %d ", bd.bd_ncrc);
- position_braille_cursor();
- break;
-
- case RC_BD_BRAILLE_TABLE:
- s = 0;
- if (*args)
- {
- if (ParseSaveStr(act, &s))
- break;
- if (load_braille_table(s))
- {
- free(s);
- break;
- }
- if (bd.bd_braille_table)
- free(bd.bd_braille_table);
- bd.bd_braille_table = s;
- }
- if (msgok)
- Msg(0, "bd_braille_table is: %s ", bd.bd_braille_table);
- break;
-
- case RC_BD_PORT:
- s = 0;
- if (*args)
- {
- if (ParseSaveStr(act, &s))
- break;
-
- if (stat(s, &st) || !S_ISCHR(st.st_mode) || access(s, R_OK|W_OK))
- {
- Msg(0, "Cannot access braille device port %s", s);
- free(s);
- break;
- }
- if (bd.bd_fd >= 0)
- close(bd.bd_fd);
- bd.bd_fd = -1;
- if (bd.bd_port)
- free(bd.bd_port);
- bd.bd_port = s;
- }
- if (msgok)
- Msg(0, "bd_port is: %s ", bd.bd_port ? bd.bd_port : "not set");
- StartBraille();
- break;
-
- case RC_BD_TYPE:
- s = 0;
- if (*args)
- if (ParseSaveStr(act, &s) || initialize_braille_display_type(s))
- break;
- if (msgok)
- Msg(0, "bd_type is: %s ", bd.bd_type ? bd.bd_type : "not set");
- StartBraille();
- break;
-
- case RC_BD_START_BRAILLE:
- if (ParseSwitch(act, &bd.bd_start_braille))
- break;
- if (msgok)
- Msg(0, bd.bd_start_braille ? "bd_start_braille is on." : "bd_start_braille is off.");
- StartBraille();
- break;
-
- case RC_BD_WIDTH:
- n = bd.bd_width;
- if (*args)
- {
- if (ParseNum(act, &n))
- break;
- }
- if (n <= 0)
- {
- Msg(0, "Invalid value for bd_width: %d ", n);
- break;
- }
- l = (bd.bd_info * 2 + 2) & 12;
- if (n > bd.bd_ncells - l || n < l)
- {
- Msg(0, "bd_info is too large for bd_width.");
- break;
- }
- bd.bd_width = n;
- if (msgok)
- Msg(0, "bd_width is: %d ", bd.bd_width);
- break;
-
- case RC_BD_BC_LEFT:
- bd_bc_left();
- break;
-
- case RC_BD_BC_RIGHT:
- bd_bc_right();
- break;
-
- case RC_BD_BC_UP:
- bd_bc_up();
- break;
-
- case RC_BD_BC_DOWN:
- bd_bc_down();
- break;
-
- case RC_BD_UPPER_LEFT:
- bd_upper_left();
- break;
-
- case RC_BD_UPPER_RIGHT:
- bd_upper_right();
- break;
-
- case RC_BD_LOWER_LEFT:
- bd_lower_left();
- break;
-
- case RC_BD_LOWER_RIGHT:
- bd_lower_right();
- break;
-
- default:
- break;
- }
-}
-
-static void
-bd_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- bd.buttonpress();
-}
-
-static void
-bd_writeev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- int len;
-
- if (bd.bd_obuflen == 0)
- return;
- if ((len = write(bd.bd_fd, bd.bd_obuf, bd.bd_obuflen)) < 0)
- len = bd.bd_obuflen; /* dead braille display */
- if ((bd.bd_obuflen -= len))
- bcopy(bd.bd_obuf + len, bd.bd_obuf, bd.bd_obuflen);
-}
-
-static void
-bd_selectev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- RefreshBraille();
-}
-
-#endif /* HAVE_BRAILLE */
diff --git a/src/braille.h b/src/braille.h
deleted file mode 100644
index d72d2f6..0000000
--- a/src/braille.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Authors: Hadi Bargi Rangin bargi@dots.physics.orst.edu
- * Bill Barry barryb@dots.physics.orst.edu
- * Randy Lundquist randyl@dots.physics.orst.edu
- *
- * Modifications Copyright (c) 1995 by
- * Science Access Project, Oregon State University.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-#ifdef HAVE_BRAILLE
-
-extern void StartBraille __P((void));
-
-struct braille_display
-{
- struct display *bd_dpy; /* display we are connected to */
- int bd_start_braille; /* screenrc var to request to turn braille on */
- int bd_using_braille; /* all is fine, use braille */
- struct event bd_readev;
- struct event bd_writeev;
- struct event bd_selectev;
- int bd_fd; /* file descriptor */
- int bd_obuflen; /* current number of charactors in output buffer */
- char bd_obuf[IOSIZE];
- int bd_info; /* default, no info, 0,1,2,3 */
- int bd_ncrc; /* default 1, numbers of cells on the right side of real cursor, 1...bd_width */
- int bd_skip; /* default off, on/off */
- int bd_link; /* default, linked, on/off */
- int bd_width; /* length of braille display to use, <=bd_ncells */
- int bd_scroll; /* default on, scroll on/off */
- char *bd_braille_table; /* braille code */
-
- int bd_bell; /* bell used for navigation on/off */
- int bd_ncells; /* real number of cells on braille display */
- int bd_eightdot; /* eightdot on/off */
- int bd_baud; /* communication baudrate between port and braille display */
- char *bd_port; /* serial port to use */
- char *bd_type; /* kind of braille display */
- double bd_version; /* rom version of braille display */
- char bd_btable[256]; /* braille translation table */
-
- /* functions which communicate with braille displays */
- int (*write_line_braille) __P((char [],int, int));
- void (*buttonpress) __P((void));
- int (*bd_response_test) __P((void));
-
- int bd_refreshing; /* are we doing a refresh? */
- char bd_line[40+1]; /* bd_ncells chars displayed on braille */
- int bd_cursorpos; /* cursor position on braille */
- char bd_oline[40+1]; /* bd_ncells chars displayed on braille */
- int bd_sx, bd_sy; /* screen cursor pos */
- int bd_moved; /* used braille move keys */
-
- int bd_searching; /* are we seaching (bd_skip is on) */
- int bd_searchmax; /* search: max x */
- int bd_searchmin; /* search: min x */
- int bd_searchstart;
- int bd_searchend;
-};
-
-extern struct braille_display bd;
-
-#define BD_FORE bd.bd_dpy->d_fore
-
-#endif
diff --git a/src/braille_tsi.c b/src/braille_tsi.c
deleted file mode 100644
index eed260a..0000000
--- a/src/braille_tsi.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* bd-tsi.c, TSI specific key bindings and display commands
- *
- * dotscreen
- * A braille interface to unix tty terminals
- * Authors: Hadi Bargi Rangin bargi@dots.physics.orst.edu
- * Bill Barry barryb@dots.physics.orst.edu
- *
- * Copyright (c) 1995 by Science Access Project, Oregon State University.
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-#include "braille.h"
-
-#ifdef HAVE_BRAILLE
-
-extern struct display *display;
-
-struct key2rc {
- int key;
- int nr;
- char *arg1;
- char *arg2;
-};
-
-
-static int tsi_ctype = 1; /* cursor type, 0,1,2 */
-
-static int tsi_line_type; /* indicates number of cells on powerbraille
- display 01=20 cells 02=40 cells 03=80 cells */
-
-static int display_status_tsi __P((void));
-static int write_line_tsi __P((char *, int, int));
-static void buttonpress_tsi __P((struct key2rc *));
-static void buttonpress_navigator_40 __P((void));
-static void buttonpress_powerbraille_40 __P((void));
-static void buttonpress_powerbraille_80 __P((void));
-
-int
-bd_init_powerbraille_40()
-{
- bd.write_line_braille = write_line_tsi;
- bd.buttonpress = buttonpress_powerbraille_40;
- bd.bd_response_test = display_status_tsi;
- bd.bd_ncells = 40;
- tsi_line_type = 2;
- return 0;
-}
-
-int
-bd_init_powerbraille_80()
-{
- bd.write_line_braille = write_line_tsi;
- bd.buttonpress = buttonpress_powerbraille_80;
- bd.bd_response_test = display_status_tsi;
- bd.bd_ncells = 80;
- tsi_line_type = 3;
- return 0;
-}
-
-int
-bd_init_navigator_40()
-{
- bd.write_line_braille = write_line_tsi;
- bd.buttonpress = buttonpress_navigator_40;
- bd.bd_response_test = display_status_tsi;
- bd.bd_ncells = 40;
- tsi_line_type = 2;
- return 0;
-}
-
-static int
-display_status_tsi()
-{
- char obuf[3],ibuf[20];
- int r;
-
- obuf[0] = 0xff;
- obuf[1] = 0xff;
- obuf[2] = 0x0a;
- r = read(bd.bd_fd, ibuf, 20); /* flush the input port */
- r = write(bd.bd_fd, obuf, 3);
- if (r != 3)
- return -1;
-
- /* we have written to the display asking for a response
- we wait 1 second for the response, read it and if no
- response we wait 2 seconds, if still no response,
- return -1 to indicate no braille display available */
- sleep(1);
- r = read(bd.bd_fd, ibuf, 2);
- if (r == -1)
- {
- sleep(2);
- r = read(bd.bd_fd, ibuf, 2);
- }
- debug2("first chars from braille display %d %d\n",ibuf[0],ibuf[1]);
- if (r != 2 || ibuf[0] != 0 || ibuf[1] != 5)
- return -1;
-
- r= read(bd.bd_fd,ibuf,2);
- if (r != 2)
- return -1;
- debug2("braille display size:%d dots:%d\n", ibuf[0], ibuf[1]);
- bd.bd_ncells = (unsigned char)ibuf[0];
- if (bd.bd_ncells <= 1)
- return -1;
- r = read(bd.bd_fd,ibuf,1);
- if (r != 1)
- return -1;
- if (r != -1)
- if (ibuf[0] == 'V')
- r = read(bd.bd_fd, ibuf, 3);
- else
- r = read(bd.bd_fd, ibuf + 1, 2) + 1;
- if (r != 3)
- return -1;
- ibuf[3] = 0;
- debug1("braille display version %s\n", ibuf);
- bd.bd_version = atof(ibuf);
- return 0;
-}
-
-
-static int
-write_line_tsi (bstr,line_length, cursor_pos)
-char *bstr;
-int line_length, cursor_pos;
-{
- int obp, i;
- bd.bd_obuf[0] = 0xff;
- bd.bd_obuf[1] = 0xff;
- bd.bd_obuf[2] = tsi_line_type;
- bd.bd_obuf[3] = 0x07;
- bd.bd_obuf[4] = cursor_pos;
- bd.bd_obuf[5] = tsi_ctype;
- obp=6;
-
- for (i=0; i < line_length; i++)
- {
- bd.bd_obuf[2*i+obp] = 0;
- bd.bd_obuf[2*i+1+obp] = bd.bd_btable[(int)(unsigned char)bstr[i]];
- }
- for (i=line_length; i < bd.bd_ncells; i++)
- {
- bd.bd_obuf[2*i+obp] = 0;
- bd.bd_obuf[2*i+1+obp] = bd.bd_btable[(int)' '];
- }
-
- bd.bd_obuflen = 2*bd.bd_ncells + obp ;
- return 0;
-}
-
-static struct key2rc keys_navigator_40[] = {
- {0x4000000, RC_STUFF, "-k", "kl"}, /* 1 */
- {0x10000000, RC_STUFF, "-k", "kr"}, /* 3 */
- {0x8000000, RC_STUFF, "-k", "ku"}, /* 2 */
- {0x20000000, RC_STUFF, "-k", "kd"}, /* 4 */
- {0x2000, RC_BD_BC_LEFT, 0, 0}, /* 6 */
- {0x8000, RC_BD_BC_RIGHT, 0, 0}, /* 8 */
- {0x4000, RC_BD_BC_UP, 0, 0}, /* 7 */
- {0x10000, RC_BD_BC_DOWN, 0, 0}, /* 9 */
- {0x6000, RC_BD_UPPER_LEFT, 0, 0}, /* 6, 7 */
- {0xc000, RC_BD_UPPER_RIGHT, 0, 0}, /* 7, 8 */
- {0x12000, RC_BD_LOWER_LEFT, 0, 0}, /* 6, 9 */
- {0x18000, RC_BD_LOWER_RIGHT, 0, 0}, /* 8, 9 */
- {0xa000, RC_BD_INFO, "1032", 0}, /* bc 6, 8 */
- {0x14000000, RC_BD_INFO, "2301", 0}, /* sc 1, 3 */
- {0x4008000, RC_BD_INFO, "3330", 0}, /* bc+sc 1, 8 */
- {0x8010000, RC_BD_BELL, 0, 0}, /* 2, 9 */
- {0x8004000, RC_BD_EIGHTDOT, 0, 0}, /* 2, 7 */
- {0x40000000, RC_STUFF, "\015", 0}, /* 5 */
- {0x20000, RC_BD_LINK, 0, 0}, /* 10 */
- {0x10002000, RC_BD_SCROLL, 0, 0}, /* 3, 6 */
- {0x20010000, RC_BD_NCRC, "+", 0}, /* 4, 9 */
- {0x14000, RC_BD_SKIP, 0, 0}, /* 7, 9*/
- {-1, RC_ILLEGAL, 0, 0}
-};
-
-static struct key2rc keys_powerbraille_40[] = {
- {0x4000000, RC_STUFF, "-k", "kl"}, /* 1 */
- {0x10000000, RC_STUFF, "-k", "kr"}, /* 3 */
- {0x8000000, RC_STUFF, "-k", "ku"}, /* 2 */
- {0x20000000, RC_STUFF, "-k", "kd"}, /* 4 */
- {0x2000, RC_BD_BC_LEFT, 0, 0}, /* 6 */
- {0x8000, RC_BD_BC_RIGHT, 0, 0}, /* 8 */
- {0x4000, RC_BD_BC_UP, 0, 0}, /* 7 */
- {0x10000, RC_BD_BC_DOWN, 0, 0}, /* 9 */
- {0x8002000, RC_BD_UPPER_LEFT, 0, 0}, /* 2, 6 */
- {0xc000, RC_BD_UPPER_RIGHT, 0, 0}, /* 7, 8 */
- {0x20002000, RC_BD_LOWER_LEFT, 0, 0}, /* 3, 6 */
- {0x18000, RC_BD_LOWER_RIGHT, 0, 0}, /* 8, 9 */
- {0x8008000, RC_BD_INFO, "1032", 0}, /* bc 2, 8 */
- {0x6000, RC_BD_INFO, "2301", 0}, /* 6, 7 */
- {0x8004000, RC_BD_INFO, "3330", 0}, /* bc+sc 2, 7 */
- {0x8010000, RC_BD_BELL, 0, 0}, /* 2, 9 */
- {0x20008000, RC_BD_EIGHTDOT, 0, 0}, /* 4, 6 */
- {0x40000000, RC_STUFF, "\015", 0}, /* 5 */
- {0x20000, RC_BD_LINK, 0, 0}, /* 10 */
- {0xa000, RC_BD_SCROLL, 0, 0}, /* 6, 8 */
- {0x20010000, RC_BD_NCRC, "+", 0}, /* 4, 9 */
- {0x20004000, RC_BD_SKIP, 0, 0}, /* 4, 7 */
- {-1, RC_ILLEGAL, 0, 0}
-};
-
-
-static struct key2rc keys_powerbraille_80[] = {
- {0x4000000, RC_STUFF, "-k", "kl"}, /* 1 */
- {0x10000000, RC_STUFF, "-k", "kr"}, /* 3 */
- {0x8000000, RC_STUFF, "-k", "ku"}, /* 2 */
- {0x20000000, RC_STUFF, "-k", "kd"}, /* 4 */
- {0x40000, RC_BD_BC_LEFT, 0, 0}, /* 6 */
- {0x100000, RC_BD_BC_RIGHT, 0, 0}, /* 8 */
- {0x4000, RC_BD_BC_UP, 0, 0}, /* 7 */
- {0x10000, RC_BD_BC_DOWN, 0, 0}, /* 9 */
- {0x44000, RC_BD_UPPER_LEFT, 0, 0}, /* 6, 7 */
- {0x104000, RC_BD_UPPER_RIGHT, 0, 0}, /* 7, 8 */
- {0x50000, RC_BD_LOWER_LEFT, 0, 0}, /* 6, 9 */
- {0x110000, RC_BD_LOWER_RIGHT, 0, 0}, /* 8, 9 */
- {0x8100000, RC_BD_INFO, "1032", 0}, /* 2, 8 */
- {0x8040000, RC_BD_INFO, "2301", 0}, /* 2, 6 */
- {0x140000, RC_BD_INFO, "3330", 0}, /* 6, 8 */
- {0x8010000, RC_BD_BELL, 0, 0}, /* 2, 9 */
- {0x8004000, RC_BD_EIGHTDOT, 0, 0}, /* 2, 7 */
- {0x40000000, RC_STUFF, "\015", 0}, /* 5 */
- {0x20000, RC_BD_LINK, 0, 0}, /* 10 */
- {0x20004000, RC_BD_SCROLL, 0, 0}, /* 4, 7 */
- {0x20010000, RC_BD_NCRC, "+", 0}, /* 4, 9 */
- {0x40010000, RC_BD_SKIP, 0, 0}, /* 5, 9 */
- {-1, RC_ILLEGAL, 0, 0}
-};
-
-static void
-buttonpress_tsi(tab)
-struct key2rc *tab;
-{
- int i, nb;
- int bkeys;
- unsigned char buf[10];
- nb = read(bd.bd_fd, buf, 10);
- debug1("buttonpress_tsi: read %d bytes\n", nb);
- for (i=0, bkeys=0; i < nb; i++)
- {
- switch (buf[i] & 0xE0)
- {
- case 0x00: bkeys += ((int)(buf[i] & 0x1f) ); break;
- case 0x20: bkeys += ((int)(buf[i] & 0x1f) << 5 ); break;
- case 0x40: bkeys += ((int)(buf[i] & 0x1f) << 9 ); break;
- case 0x60: bkeys += ((int)(buf[i] & 0x1f) << 13 ); break;
- case 0xA0: bkeys += ((int)(buf[i] & 0x1f) << 18 ); break;
- case 0xC0: bkeys += ((int)(buf[i] & 0x1f) << 22 ); break;
- case 0xE0: bkeys += ((int)(buf[i] & 0x1f) << 26 ); break;
- default: break;
- }
- }
- debug1("bkeys %x\n", bkeys);
- for (i = 0; tab[i].key != -1; i++)
- if (bkeys == tab[i].key)
- break;
- debug1("bkey index %d\n", i);
- if (tab[i].key != -1 && tab[i].nr != RC_ILLEGAL)
- {
- char *args[3];
- int argl[2];
-
- struct action act;
- args[0] = tab[i].arg1;
- args[1] = tab[i].arg2;
- args[2] = 0;
- argl[0] = args[0] ? strlen(args[0]) : 0;
- argl[1] = args[1] ? strlen(args[1]) : 0;
- act.nr = tab[i].nr;
- act.args = args;
- act.argl = argl;
- display = bd.bd_dpy;
- DoAction(&act, -2);
- }
-}
-
-
-static void
-buttonpress_navigator_40()
-{
- buttonpress_tsi(keys_navigator_40);
-}
-
-static void
-buttonpress_powerbraille_40()
-{
- buttonpress_tsi(keys_powerbraille_40);
-}
-
-static void
-buttonpress_powerbraille_80()
-{
- buttonpress_tsi(keys_powerbraille_80);
-}
-
-#endif /* HAVE_BRAILLE */
-
-
diff --git a/src/comm.c b/src/comm.c
deleted file mode 100644
index 0934847..0000000
--- a/src/comm.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
-#ifdef HAVE_BRAILLE
- * Modified by:
- * Authors: Hadi Bargi Rangin bargi@dots.physics.orst.edu
- * Bill Barry barryb@dots.physics.orst.edu
- *
- * Modifications Copyright (c) 1995 by
- * Science Access Project, Oregon State University.
-#endif
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include "config.h"
-#include "acls.h"
-#include "comm.h"
-
-#define bcopy :-( /* or include screen.h here */
-
-/* Must be in alpha order ! */
-
-struct comm comms[RC_LAST + 1] =
-{
-#ifdef MULTIUSER
- { "acladd", ARGS_1234 },
- { "aclchg", ARGS_23 },
- { "acldel", ARGS_1 },
- { "aclgrp", ARGS_12 },
- { "aclumask", ARGS_1|ARGS_ORMORE },
-#endif
- { "activity", ARGS_1 },
-#ifdef MULTIUSER
- { "addacl", ARGS_1234 },
-#endif
- { "allpartial", NEED_DISPLAY|ARGS_1 },
- { "altscreen", ARGS_01 },
- { "at", NEED_DISPLAY|ARGS_2|ARGS_ORMORE },
-#ifdef COLOR
- { "attrcolor", ARGS_12 },
-#endif
- { "autodetach", ARGS_1 },
-#ifdef AUTO_NUKE
- { "autonuke", NEED_DISPLAY|ARGS_1 },
-#endif
- { "backtick", ARGS_1|ARGS_ORMORE },
-#ifdef COLOR
- { "bce", NEED_FORE|ARGS_01 },
-#endif
-
-#ifdef HAVE_BRAILLE
-/* keywords for braille display (bd) */
- { "bd_bc_down", ARGS_0 },
- { "bd_bc_left", ARGS_0 },
- { "bd_bc_right", ARGS_0 },
- { "bd_bc_up", ARGS_0 },
- { "bd_bell", ARGS_01 },
- { "bd_braille_table", ARGS_01 },
- { "bd_eightdot", ARGS_01 },
- { "bd_info", ARGS_01 },
- { "bd_link", ARGS_01 },
- { "bd_lower_left", ARGS_0 },
- { "bd_lower_right", ARGS_0 },
- { "bd_ncrc", ARGS_01 },
- { "bd_port", ARGS_01 },
- { "bd_scroll", ARGS_01 },
- { "bd_skip", ARGS_01 },
- { "bd_start_braille", ARGS_01 },
- { "bd_type", ARGS_01 },
- { "bd_upper_left", ARGS_0 },
- { "bd_upper_right", ARGS_0 },
- { "bd_width", ARGS_01 },
-#endif
-
- { "bell", ARGS_01 },
- { "bell_msg", ARGS_01 },
- { "bind", ARGS_1|ARGS_ORMORE },
-#ifdef MAPKEYS
- { "bindkey", ARGS_0|ARGS_ORMORE },
-#endif
- { "blanker", NEED_DISPLAY|ARGS_0},
-#ifdef BLANKER_PRG
- { "blankerprg", ARGS_1|ARGS_ORMORE },
-#endif
- { "break", NEED_FORE|ARGS_01 },
- { "breaktype", NEED_FORE|ARGS_01 },
-#ifdef COPY_PASTE
- { "bufferfile", ARGS_01 },
-#endif
- { "c1", NEED_FORE|ARGS_01 },
- { "caption", ARGS_12 },
-#ifdef MULTIUSER
- { "chacl", ARGS_23 },
-#endif
- { "charset", NEED_FORE|ARGS_1 },
- { "chdir", ARGS_01 },
- { "clear", NEED_FORE|ARGS_0 },
- { "colon", NEED_LAYER|ARGS_01 },
- { "command", NEED_DISPLAY|ARGS_02 },
-#ifdef COPY_PASTE
- { "compacthist", ARGS_01 },
-#endif
- { "console", NEED_FORE|ARGS_01 },
-#ifdef COPY_PASTE
- { "copy", NEED_FORE|ARGS_0 },
- { "crlf", ARGS_01 },
-#endif
- { "debug", ARGS_01 },
-#ifdef AUTO_NUKE
- { "defautonuke", ARGS_1 },
-#endif
-#ifdef COLOR
- { "defbce", ARGS_1 },
-#endif
- { "defbreaktype", ARGS_01 },
- { "defc1", ARGS_1 },
- { "defcharset", ARGS_01 },
-#ifdef ENCODINGS
- { "defencoding", ARGS_1 },
-#endif
- { "defescape", ARGS_1 },
- { "defflow", ARGS_12 },
- { "defgr", ARGS_1 },
- { "defhstatus", ARGS_01 },
-#ifdef ENCODINGS
- { "defkanji", ARGS_1 },
-#endif
- { "deflog", ARGS_1 },
-#if defined(UTMPOK) && defined(LOGOUTOK)
- { "deflogin", ARGS_1 },
-#endif
- { "defmode", ARGS_1 },
- { "defmonitor", ARGS_1 },
-#ifdef MULTI
- { "defnonblock", ARGS_1 },
-#endif
- { "defobuflimit", ARGS_1 },
-#ifdef COPY_PASTE
- { "defscrollback", ARGS_1 },
-#endif
- { "defshell", ARGS_1 },
- { "defsilence", ARGS_1 },
- { "defslowpaste", ARGS_1 },
-#ifdef UTF8
- { "defutf8", ARGS_1 },
-#endif
- { "defwrap", ARGS_1 },
- { "defwritelock", ARGS_1 },
-#ifdef DETACH
- { "detach", NEED_DISPLAY|ARGS_01 },
-#endif
- { "digraph", NEED_LAYER|ARGS_01 },
- { "dinfo", NEED_DISPLAY|ARGS_0 },
- { "displays", NEED_LAYER|ARGS_0 },
- { "dumptermcap", NEED_FORE|ARGS_0 },
- { "echo", ARGS_12 },
-#ifdef ENCODINGS
- { "encoding", ARGS_12 },
-#endif
- { "escape", ARGS_1 },
- { "eval", ARGS_1|ARGS_ORMORE },
-#ifdef PSEUDOS
- { "exec", NEED_FORE|ARGS_0|ARGS_ORMORE },
-#endif
- { "fit", NEED_DISPLAY|ARGS_0 },
- { "flow", NEED_FORE|ARGS_01 },
- { "focus", NEED_DISPLAY|ARGS_01 },
- { "gr", NEED_FORE|ARGS_01 },
- { "hardcopy", ARGS_012 },
- { "hardcopy_append", ARGS_1 },
- { "hardcopydir", ARGS_01 },
- { "hardstatus", ARGS_012 },
- { "height", ARGS_0123 },
- { "help", NEED_LAYER|ARGS_02 },
-#ifdef COPY_PASTE
- { "history", NEED_DISPLAY|NEED_FORE|ARGS_0 },
-#endif
- { "hstatus", NEED_FORE|ARGS_1 },
- { "idle", ARGS_0|ARGS_ORMORE },
- { "ignorecase", ARGS_01 },
- { "info", NEED_LAYER|ARGS_0 },
-#ifdef ENCODINGS
- { "kanji", NEED_FORE|ARGS_12 },
-#endif
- { "kill", NEED_FORE|ARGS_0 },
- { "lastmsg", NEED_DISPLAY|ARGS_0 },
- { "license", NEED_LAYER|ARGS_0 },
-#ifdef LOCK
- { "lockscreen", NEED_DISPLAY|ARGS_0 },
-#endif
- { "log", NEED_FORE|ARGS_01 },
- { "logfile", ARGS_012 },
-#if defined(UTMPOK) && defined(LOGOUTOK)
- { "login", NEED_FORE|ARGS_01 },
-#endif
- { "logtstamp", ARGS_012 },
-#ifdef MAPKEYS
- { "mapdefault", NEED_DISPLAY|ARGS_0 },
- { "mapnotnext", NEED_DISPLAY|ARGS_0 },
- { "maptimeout", ARGS_01 },
-#endif
-#ifdef COPY_PASTE
- { "markkeys", ARGS_1 },
-#endif
- { "maxwin", ARGS_1 },
- { "meta", NEED_LAYER|ARGS_0 },
- { "monitor", NEED_FORE|ARGS_01 },
- { "msgminwait", ARGS_1 },
- { "msgwait", ARGS_1 },
-#ifdef MULTIUSER
- { "multiuser", ARGS_1 },
-#endif
-#ifdef NETHACK
- { "nethack", ARGS_1 },
-#endif
- { "next", ARGS_0 },
-#ifdef MULTI
- { "nonblock", NEED_DISPLAY|ARGS_01 },
-#endif
- { "number", NEED_FORE|ARGS_01 },
- { "obuflimit", NEED_DISPLAY|ARGS_01 },
- { "only", NEED_DISPLAY|ARGS_0 },
- { "other", ARGS_0 },
- { "partial", NEED_FORE|ARGS_01 },
-#ifdef PASSWORD
- { "password", ARGS_01 },
-#endif
-#ifdef COPY_PASTE
- { "paste", NEED_LAYER|ARGS_012 },
- { "pastefont", ARGS_01 },
-#endif
- { "pow_break", NEED_FORE|ARGS_01 },
-#if defined(DETACH) && defined(POW_DETACH)
- { "pow_detach", NEED_DISPLAY|ARGS_0 },
- { "pow_detach_msg", ARGS_01 },
-#endif
- { "prev", ARGS_0 },
- { "printcmd", ARGS_01 },
- { "process", NEED_DISPLAY|ARGS_01 },
- { "quit", ARGS_0 },
-#ifdef COPY_PASTE
- { "readbuf", ARGS_0123 },
-#endif
- { "readreg", ARGS_0|ARGS_ORMORE },
- { "redisplay", NEED_DISPLAY|ARGS_0 },
- { "register", ARGS_24 },
- { "remove", NEED_DISPLAY|ARGS_0 },
-#ifdef COPY_PASTE
- { "removebuf", ARGS_0 },
-#endif
- { "reset", NEED_FORE|ARGS_0 },
- { "resize", NEED_DISPLAY|ARGS_01 },
- { "screen", ARGS_0|ARGS_ORMORE },
-#ifdef COPY_PASTE
- { "scrollback", NEED_FORE|ARGS_1 },
-#endif
- { "select", ARGS_01 },
- { "sessionname", ARGS_01 },
- { "setenv", ARGS_012 },
- { "setsid", ARGS_1 },
- { "shell", ARGS_1 },
- { "shelltitle", ARGS_1 },
- { "silence", NEED_FORE|ARGS_01 },
- { "silencewait", ARGS_1 },
- { "sleep", ARGS_1 },
- { "slowpaste", NEED_FORE|ARGS_01 },
- { "sorendition", ARGS_012 },
- { "source", ARGS_1 },
- { "split", NEED_DISPLAY|ARGS_0 },
- { "startup_message", ARGS_1 },
- { "stuff", NEED_LAYER|ARGS_12 },
-#ifdef MULTIUSER
- { "su", NEED_DISPLAY|ARGS_012 },
-#endif
-#ifdef BSDJOBS
- { "suspend", NEED_DISPLAY|ARGS_0 },
-#endif
- { "term", ARGS_1 },
- { "termcap", ARGS_23 },
- { "termcapinfo", ARGS_23 },
- { "terminfo", ARGS_23 },
- { "time", ARGS_01 },
- { "title", NEED_FORE|ARGS_01 },
- { "umask", ARGS_1|ARGS_ORMORE },
- { "unsetenv", ARGS_1 },
-#ifdef UTF8
- { "utf8", NEED_FORE|ARGS_012 },
-#endif
- { "vbell", ARGS_01 },
- { "vbell_msg", ARGS_01 },
- { "vbellwait", ARGS_1 },
- { "verbose", ARGS_01 },
- { "version", ARGS_0 },
- { "wall", NEED_DISPLAY|ARGS_1},
- { "width", ARGS_0123 },
- { "windowlist", NEED_DISPLAY|ARGS_012 },
- { "windows", NEED_DISPLAY|ARGS_0 },
- { "wrap", NEED_FORE|ARGS_01 },
-#ifdef COPY_PASTE
- { "writebuf", ARGS_0123 },
-#endif
- { "writelock", NEED_FORE|ARGS_01 },
- { "xoff", NEED_LAYER|ARGS_0 },
- { "xon", NEED_LAYER|ARGS_0 },
-#ifdef ZMODEM
- { "zmodem", ARGS_012 },
-#endif
- { "zombie", ARGS_01 }
-};
diff --git a/src/comm.h.dist b/src/comm.h.dist
deleted file mode 100644
index bdc620e..0000000
--- a/src/comm.h.dist
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * This file is automagically created from comm.c -- DO NOT EDIT
- */
-
-struct comm
-{
- char *name;
- int flags;
-#ifdef MULTIUSER
- AclBits userbits[ACL_BITS_PER_CMD];
-#endif
-};
-
-#define ARGS_MASK (3)
-
-#define ARGS_0 (0)
-#define ARGS_1 (1)
-#define ARGS_2 (2)
-#define ARGS_3 (3)
-
-#define ARGS_PLUS1 (1<<2)
-#define ARGS_PLUS2 (1<<3)
-#define ARGS_PLUS3 (1<<4)
-#define ARGS_ORMORE (1<<5)
-
-#define NEED_FORE (1<<6) /* this command needs a fore window */
-#define NEED_DISPLAY (1<<7) /* this command needs a display */
-#define NEED_LAYER (1<<8) /* this command needs a layer */
-
-#define ARGS_01 (ARGS_0 | ARGS_PLUS1)
-#define ARGS_02 (ARGS_0 | ARGS_PLUS2)
-#define ARGS_12 (ARGS_1 | ARGS_PLUS1)
-#define ARGS_23 (ARGS_2 | ARGS_PLUS1)
-#define ARGS_24 (ARGS_2 | ARGS_PLUS2)
-#define ARGS_34 (ARGS_3 | ARGS_PLUS1)
-#define ARGS_012 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2)
-#define ARGS_0123 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3)
-#define ARGS_123 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2)
-#define ARGS_124 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS3)
-#define ARGS_1234 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3)
-
-struct action
-{
- int nr;
- char **args;
- int *argl;
-};
-
-#define RC_ILLEGAL -1
-
-#define RC_ACLADD 0
-#define RC_ACLCHG 1
-#define RC_ACLDEL 2
-#define RC_ACLGRP 3
-#define RC_ACLUMASK 4
-#define RC_ACTIVITY 5
-#define RC_ADDACL 6
-#define RC_ALLPARTIAL 7
-#define RC_ALTSCREEN 8
-#define RC_AT 9
-#define RC_ATTRCOLOR 10
-#define RC_AUTODETACH 11
-#define RC_AUTONUKE 12
-#define RC_BACKTICK 13
-#define RC_BCE 14
-#define RC_BELL 15
-#define RC_BELL_MSG 16
-#define RC_BIND 17
-#define RC_BINDKEY 18
-#define RC_BLANKER 19
-#define RC_BLANKERPRG 20
-#define RC_BREAK 21
-#define RC_BREAKTYPE 22
-#define RC_BUFFERFILE 23
-#define RC_C1 24
-#define RC_CAPTION 25
-#define RC_CHACL 26
-#define RC_CHARSET 27
-#define RC_CHDIR 28
-#define RC_CLEAR 29
-#define RC_COLON 30
-#define RC_COMMAND 31
-#define RC_COMPACTHIST 32
-#define RC_CONSOLE 33
-#define RC_COPY 34
-#define RC_CRLF 35
-#define RC_DEBUG 36
-#define RC_DEFAUTONUKE 37
-#define RC_DEFBCE 38
-#define RC_DEFBREAKTYPE 39
-#define RC_DEFC1 40
-#define RC_DEFCHARSET 41
-#define RC_DEFENCODING 42
-#define RC_DEFESCAPE 43
-#define RC_DEFFLOW 44
-#define RC_DEFGR 45
-#define RC_DEFHSTATUS 46
-#define RC_DEFKANJI 47
-#define RC_DEFLOG 48
-#define RC_DEFLOGIN 49
-#define RC_DEFMODE 50
-#define RC_DEFMONITOR 51
-#define RC_DEFNONBLOCK 52
-#define RC_DEFOBUFLIMIT 53
-#define RC_DEFSCROLLBACK 54
-#define RC_DEFSHELL 55
-#define RC_DEFSILENCE 56
-#define RC_DEFSLOWPASTE 57
-#define RC_DEFUTF8 58
-#define RC_DEFWRAP 59
-#define RC_DEFWRITELOCK 60
-#define RC_DETACH 61
-#define RC_DIGRAPH 62
-#define RC_DINFO 63
-#define RC_DISPLAYS 64
-#define RC_DUMPTERMCAP 65
-#define RC_ECHO 66
-#define RC_ENCODING 67
-#define RC_ESCAPE 68
-#define RC_EVAL 69
-#define RC_EXEC 70
-#define RC_FIT 71
-#define RC_FLOW 72
-#define RC_FOCUS 73
-#define RC_GR 74
-#define RC_HARDCOPY 75
-#define RC_HARDCOPY_APPEND 76
-#define RC_HARDCOPYDIR 77
-#define RC_HARDSTATUS 78
-#define RC_HEIGHT 79
-#define RC_HELP 80
-#define RC_HISTORY 81
-#define RC_HSTATUS 82
-#define RC_IDLE 83
-#define RC_IGNORECASE 84
-#define RC_INFO 85
-#define RC_KANJI 86
-#define RC_KILL 87
-#define RC_LASTMSG 88
-#define RC_LICENSE 89
-#define RC_LOCKSCREEN 90
-#define RC_LOG 91
-#define RC_LOGFILE 92
-#define RC_LOGIN 93
-#define RC_LOGTSTAMP 94
-#define RC_MAPDEFAULT 95
-#define RC_MAPNOTNEXT 96
-#define RC_MAPTIMEOUT 97
-#define RC_MARKKEYS 98
-#define RC_MAXWIN 99
-#define RC_META 100
-#define RC_MONITOR 101
-#define RC_MSGMINWAIT 102
-#define RC_MSGWAIT 103
-#define RC_MULTIUSER 104
-#define RC_NETHACK 105
-#define RC_NEXT 106
-#define RC_NONBLOCK 107
-#define RC_NUMBER 108
-#define RC_OBUFLIMIT 109
-#define RC_ONLY 110
-#define RC_OTHER 111
-#define RC_PARTIAL 112
-#define RC_PASSWORD 113
-#define RC_PASTE 114
-#define RC_PASTEFONT 115
-#define RC_POW_BREAK 116
-#define RC_POW_DETACH 117
-#define RC_POW_DETACH_MSG 118
-#define RC_PREV 119
-#define RC_PRINTCMD 120
-#define RC_PROCESS 121
-#define RC_QUIT 122
-#define RC_READBUF 123
-#define RC_READREG 124
-#define RC_REDISPLAY 125
-#define RC_REGISTER 126
-#define RC_REMOVE 127
-#define RC_REMOVEBUF 128
-#define RC_RESET 129
-#define RC_RESIZE 130
-#define RC_SCREEN 131
-#define RC_SCROLLBACK 132
-#define RC_SELECT 133
-#define RC_SESSIONNAME 134
-#define RC_SETENV 135
-#define RC_SETSID 136
-#define RC_SHELL 137
-#define RC_SHELLTITLE 138
-#define RC_SILENCE 139
-#define RC_SILENCEWAIT 140
-#define RC_SLEEP 141
-#define RC_SLOWPASTE 142
-#define RC_SORENDITION 143
-#define RC_SOURCE 144
-#define RC_SPLIT 145
-#define RC_STARTUP_MESSAGE 146
-#define RC_STUFF 147
-#define RC_SU 148
-#define RC_SUSPEND 149
-#define RC_TERM 150
-#define RC_TERMCAP 151
-#define RC_TERMCAPINFO 152
-#define RC_TERMINFO 153
-#define RC_TIME 154
-#define RC_TITLE 155
-#define RC_UMASK 156
-#define RC_UNSETENV 157
-#define RC_UTF8 158
-#define RC_VBELL 159
-#define RC_VBELL_MSG 160
-#define RC_VBELLWAIT 161
-#define RC_VERBOSE 162
-#define RC_VERSION 163
-#define RC_WALL 164
-#define RC_WIDTH 165
-#define RC_WINDOWLIST 166
-#define RC_WINDOWS 167
-#define RC_WRAP 168
-#define RC_WRITEBUF 169
-#define RC_WRITELOCK 170
-#define RC_XOFF 171
-#define RC_XON 172
-#define RC_ZMODEM 173
-#define RC_ZOMBIE 174
-
-#define RC_LAST 174
diff --git a/src/comm.sh b/src/comm.sh
deleted file mode 100644
index 44c83dd..0000000
--- a/src/comm.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-#! /bin/sh
-
-if test -z "$AWK"; then
- AWK=awk
-fi
-if test -z "$CC"; then
- CC=cc
-fi
-if test -z "$srcdir"; then
- srcdir=.
-fi
-
-LC_ALL=C
-export LC_ALL
-
-rm -f comm.h
-cat << EOF > comm.h
-/*
- * This file is automagically created from comm.c -- DO NOT EDIT
- */
-
-struct comm
-{
- char *name;
- int flags;
-#ifdef MULTIUSER
- AclBits userbits[ACL_BITS_PER_CMD];
-#endif
-};
-
-#define ARGS_MASK (3)
-
-#define ARGS_0 (0)
-#define ARGS_1 (1)
-#define ARGS_2 (2)
-#define ARGS_3 (3)
-
-#define ARGS_PLUS1 (1<<2)
-#define ARGS_PLUS2 (1<<3)
-#define ARGS_PLUS3 (1<<4)
-#define ARGS_ORMORE (1<<5)
-
-#define NEED_FORE (1<<6) /* this command needs a fore window */
-#define NEED_DISPLAY (1<<7) /* this command needs a display */
-#define NEED_LAYER (1<<8) /* this command needs a layer */
-
-#define ARGS_01 (ARGS_0 | ARGS_PLUS1)
-#define ARGS_02 (ARGS_0 | ARGS_PLUS2)
-#define ARGS_12 (ARGS_1 | ARGS_PLUS1)
-#define ARGS_23 (ARGS_2 | ARGS_PLUS1)
-#define ARGS_24 (ARGS_2 | ARGS_PLUS2)
-#define ARGS_34 (ARGS_3 | ARGS_PLUS1)
-#define ARGS_012 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2)
-#define ARGS_0123 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3)
-#define ARGS_123 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2)
-#define ARGS_124 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS3)
-#define ARGS_1234 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3)
-
-struct action
-{
- int nr;
- char **args;
- int *argl;
-};
-
-#define RC_ILLEGAL -1
-
-EOF
-$AWK < ${srcdir}/comm.c >> comm.h '
-/^ [{] ".*/ { if (old > $2) {
- printf("***ERROR: %s <= %s !!!\n\n", $2, old);
- exit 1;
- }
- old = $2;
- }
-'
-$CC -E -I. -I${srcdir} ${srcdir}/comm.c > comm.cpp
-sed < comm.cpp \
- -n \
- -e '/^ *{ "/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
- -e '/^ *{ "/s/^ *{ "\([^"]*\)".*/\1/p' \
-| $AWK '
-/.*/ { printf "#define RC_%s %d\n",$0,i++;
- }
-END { printf "\n#define RC_LAST %d\n",i-1;
- }
-' >> comm.h
-chmod a-w comm.h
-rm -f comm.cpp
diff --git a/src/config.h.in b/src/config.h.in
deleted file mode 100644
index cc2d298..0000000
--- a/src/config.h.in
+++ /dev/null
@@ -1,663 +0,0 @@
-/* Copyright (c) 1993-2000
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-
-
-
-
-/**********************************************************************
- *
- * User Configuration Section
- */
-
-/*
- * Maximum of simultaneously allowed windows per screen session.
- */
-#ifndef MAXWIN
-# define MAXWIN 40
-#endif
-
-/*
- * Define SOCKDIR to be the directory to contain the named sockets
- * screen creates. This should be in a common subdirectory, such as
- * /usr/local or /tmp. It makes things a little more secure if you
- * choose a directory which is not writable by everyone or where the
- * "sticky" bit is on, but this isn't required.
- * If SOCKDIR is not defined screen will put the named sockets in
- * the user's home directory. Notice that this can cause you problems
- * if some user's HOME directories are AFS- or NFS-mounted. Especially
- * AFS is unlikely to support named sockets.
- *
- * Screen will name the subdirectories "S-$USER" (e.g /tmp/S-davison).
- */
-#undef SOCKDIR
-
-/*
- * Define this if the SOCKDIR is not shared between hosts.
- */
-#define SOCKDIR_IS_LOCAL_TO_HOST
-
-/*
- * Screen sources two startup files. First a global file with a path
- * specified here, second your local $HOME/.screenrc
- * Don't define this, if you don't want it.
- */
-#ifndef ETCSCREENRC
-# define ETCSCREENRC "/usr/local/etc/screenrc"
-#endif
-
-/*
- * Screen can look for the environment variable $SYSSCREENRC and -if it
- * exists- load the file specified in that variable as global screenrc.
- * If you want to enable this feature, define ALLOW_SYSSCREENRC to one (1).
- * Otherwise ETCSCREENRC is always loaded.
- */
-#define ALLOW_SYSSCREENRC 1
-
-/*
- * Screen needs encoding files for the translation of utf8
- * into some encodings, e.g. JIS, BIG5.
- * Only needed if FONT, ENCODINGS and UTF8 are defined.
- */
-#ifndef SCREENENCODINGS
-# define SCREENENCODINGS "/usr/local/lib/screen/encodings"
-#endif
-/*
- * Define CHECKLOGIN to force Screen users to enter their Unix password
- * in addition to the screen password.
- *
- * Define NOSYSLOG if yo do not have logging facilities. Currently
- * syslog() will be used to trace ``su'' commands only.
- */
-#define CHECKLOGIN 1
-#undef NOSYSLOG
-
-
-/*
- * define PTYMODE if you do not like the default of 0622, which allows
- * public write to your pty.
- * define PTYGROUP to some numerical group-id if you do not want the
- * tty to be in "your" group.
- * Note, screen is unable to change mode or group of the pty if it
- * is not installed with sufficient privilege. (e.g. set-uid-root)
- * define PTYROFS if the /dev/pty devices are mounted on a read-only
- * filesystem so screen should not even attempt to set mode or group
- * even if running as root (e.g. on TiVo).
- */
-#undef PTYMODE
-#undef PTYGROUP
-#undef PTYROFS
-
-/*
- * If screen is NOT installed set-uid root, screen can provide tty
- * security by exclusively locking the ptys. While this keeps other
- * users from opening your ptys, it also keeps your own subprocesses
- * from being able to open /dev/tty. Define LOCKPTY to add this
- * exclusive locking.
- */
-#undef LOCKPTY
-
-/*
- * If you'd rather see the status line on the first line of your
- * terminal rather than the last, define TOPSTAT.
- */
-#undef TOPSTAT
-
-/*
- * define DETACH can detach a session. An absolute 'must'.
- */
-#define DETACH
-
-/*
- * here come the erlangen extensions to screen:
- * define LOCK if you want to use a lock program for a screenlock.
- * define PASSWORD for secure reattach of your screen.
- * define COPY_PASTE to use the famous hacker's treasure zoo.
- * define POW_DETACH to have a detach_and_logout key (requires DETACH).
- * define REMOTE_DETACH (-d option) to move screen between terminals.
- * define AUTO_NUKE to enable Tim MacKenzies clear screen nuking
- * define PSEUDOS to allow window input/output filtering
- * define MULTI to allow multiple attaches.
- * define MULTIUSER to allow other users attach to your session
- * (if they are in the acl, of course)
- * define MAPKEYS to include input keyboard translation.
- * define FONT to support ISO2022/alternet charset support
- * define COLOR to include ansi color support. This may expose
- * a bug in x11r6-color-xterm.
- * define DW_CHARS to include support for double-width character
- * sets.
- * define ENCODINGS to include support for encodings like euc or big5.
- * Needs FONT to work.
- * define UTF8 if you want support for UTF-8 encoding.
- * Needs FONT and ENCODINGS to work.
- * define COLORS16 if you want 16 colors.
- * Needs COLOR to work.
- * define BUILTIN_TELNET to add telnet support to screen.
- * Syntax: screen //telnet host [port]
- * define RXVT_OSC if you want support for rxvts special
- * change fgcolor/bgcolor/bgpicture sequences
- */
-#undef SIMPLESCREEN
-#ifndef SIMPLESCREEN
-# define LOCK
-# define PASSWORD
-# define COPY_PASTE
-# define REMOTE_DETACH
-# define POW_DETACH
-# define AUTO_NUKE
-# define PSEUDOS
-# define MULTI
-# define MULTIUSER
-# define MAPKEYS
-# define COLOR
-# define FONT
-# define DW_CHARS
-# define ENCODINGS
-# define UTF8
-# define COLORS16
-# define ZMODEM
-# define BLANKER_PRG
-#endif /* SIMPLESCREEN */
-
-#undef BUILTIN_TELNET
-#undef RXVT_OSC
-#undef COLORS256
-
-
-/*
- * If you have a braille display you should define HAVE_BRAILLE.
- * The code inside #ifdef HAVE_BRAILLE was contributed by Hadi Bargi
- * Rangin (bargi@dots.physics.orst.edu).
- * WARNING: this is more or less unsupported code, it may be full of
- * bugs leading to security holes, enable at your own risk!
- */
-#undef HAVE_BRAILLE
-
-
-/*
- * As error messages are mostly meaningless to the user, we
- * try to throw out phrases that are somewhat more familiar
- * to ...well, at least familiar to us NetHack players.
- */
-#ifndef NONETHACK
-# define NETHACK
-#endif /* NONETHACK */
-
-/*
- * If screen is installed with permissions to update /etc/utmp (such
- * as if it is installed set-uid root), define UTMPOK.
- */
-#define UTMPOK
-
-/* Set LOGINDEFAULT to one (1)
- * if you want entries added to /etc/utmp by default, else set it to
- * zero (0).
- * LOGINDEFAULT will be one (1) whenever LOGOUTOK is undefined!
- */
-#define LOGINDEFAULT 1
-
-/* Set LOGOUTOK to one (1)
- * if you want the user to be able to log her/his windows out.
- * (Meaning: They are there, but not visible in /etc/utmp).
- * Disabling this feature only makes sense if you have a secure /etc/utmp
- * database.
- * Negative examples: suns usually have a world writable utmp file,
- * xterm will run perfectly without s-bit.
- *
- * If LOGOUTOK is undefined and UTMPOK is defined, all windows are
- * initially and permanently logged in.
- *
- * Set CAREFULUTMP to one (1) if you want that users have at least one
- * window per screen session logged in.
- */
-#define LOGOUTOK 1
-#undef CAREFULUTMP
-
-
-/*
- * If UTMPOK is defined and your system (incorrectly) counts logins by
- * counting non-null entries in /etc/utmp (instead of counting non-null
- * entries with no hostname that are not on a pseudo tty), define USRLIMIT
- * to have screen put an upper-limit on the number of entries to write
- * into /etc/utmp. This helps to keep you from exceeding a limited-user
- * license.
- */
-#undef USRLIMIT
-
-/*
- * both must be defined if you want to favor tcsendbreak over
- * other calls to generate a break condition on serial lines.
- * (Do not bother, if you are not using plain tty windows.)
- */
-#define POSIX_HAS_A_GOOD_TCSENDBREAK
-#define SUNOS4_AND_WE_TRUST_TCSENDBREAK
-
-/*
- * to lower the interrupt load on the host machine, you may want to
- * adjust the VMIN and VTIME settings used for plain tty windows.
- * See the termio(4) manual page (Non-Canonical Mode Input Processing)
- * for details.
- * if undefined, VMIN=1, VTIME=0 is used as a default - this gives you
- * best user responsiveness, but highest interrupt frequency.
- * (Do not bother, if you are not using plain tty windows.)
- */
-#define TTYVMIN 100
-#define TTYVTIME 2
-
-/*
- * looks like the above values are ignored by setting FNDELAY.
- * This is default for all pty/ttys, you may disable it for
- * ttys here. After playing with it for a while, one may find out
- * that this feature may cause screen to lock up.
- */
-#ifdef bsdi
-# define TTY_DISABLE_FNBLOCK /* select barfs without it ... */
-#endif
-
-
-/*
- * Some terminals, e.g. Wyse 120, use a bitfield to select attributes.
- * This doesn't work with the standard so/ul/m? terminal entries,
- * because they will cancel each other out.
- * On TERMINFO machines, "sa" (sgr) may work. If you want screen
- * to switch attributes only with sgr, define USE_SGR.
- * This is *not* recomended, do this only if you must.
- */
-#undef USE_SGR
-
-
-/*
- * Define USE_LOCALE if you want screen to use the locale names
- * for the name of the month and day of the week.
- */
-#define USE_LOCALE
-
-/*
- * Define USE_PAM if your system supports PAM (Pluggable Authentication
- * Modules) and you want screen to use it instead of calling crypt().
- * (You may also need to add -lpam to LIBS in the Makefile.)
- */
-#undef USE_PAM
-
-/*
- * Define CHECK_SCREEN_W if you want screen to set TERM to screen-w
- * if the terminal width is greater than 131 columns. No longer needed
- * on modern systems which use $COLUMNS or the tty settings instead.
- */
-#undef CHECK_SCREEN_W
-
-/**********************************************************************
- *
- * End of User Configuration Section
- *
- * Rest of this file is modified by 'configure'
- * Change at your own risk!
- *
- */
-
-/*
- * Some defines to identify special unix variants
- */
-#ifndef SVR4
-#undef SVR4
-#endif
-
-/* #ifndef __osf__ */
-#ifndef MIPS
-#undef MIPS
-#endif
-/* #endif */
-
-#ifndef OSX
-#undef OSX
-#endif
-
-#ifndef ISC
-#undef ISC
-#endif
-
-#ifndef sysV68
-#undef sysV68
-#endif
-
-#ifndef _POSIX_SOURCE
-#undef _POSIX_SOURCE
-#endif
-
-/*
- * Define POSIX if your system supports IEEE Std 1003.1-1988 (POSIX).
- */
-#undef POSIX
-
-/*
- * Define BSDJOBS if you have BSD-style job control (both process
- * groups and a tty that deals correctly with them).
- */
-#undef BSDJOBS
-
-/*
- * Define TERMIO if you have struct termio instead of struct sgttyb.
- * This is usually the case for SVID systems, where BSD uses sgttyb.
- * POSIX systems should define this anyway, even though they use
- * struct termios.
- */
-#undef TERMIO
-
-/*
- * Define CYTERMIO if you have cyrillic termio modes.
- */
-#undef CYTERMIO
-
-/*
- * Define TERMINFO if your machine emulates the termcap routines
- * with the terminfo database.
- * Thus the .screenrc file is parsed for
- * the command 'terminfo' and not 'termcap'.
- */
-#undef TERMINFO
-
-/*
- * If your library does not define ospeed, define this.
- */
-#undef NEED_OSPEED
-
-/*
- * Define SYSV if your machine is SYSV complient (Sys V, HPUX, A/UX)
- */
-#ifndef SYSV
-#undef SYSV
-#endif
-
-/*
- * Define SIGVOID if your signal handlers return void. On older
- * systems, signal returns int, but on newer ones, it returns void.
- */
-#undef SIGVOID
-
-/*
- * Define USESIGSET if you have sigset for BSD 4.1 reliable signals.
- */
-#undef USESIGSET
-
-/*
- * Define SYSVSIGS if signal handlers must be reinstalled after
- * they have been called.
- */
-#undef SYSVSIGS
-
-/*
- * Define BSDWAIT if your system defines a 'union wait' in <sys/wait.h>
- *
- * Only allow BSDWAIT i.e. wait3 on nonposix systems, since
- * posix implies wait(3) and waitpid(3). vdlinden@fwi.uva.nl
- *
- */
-#ifndef POSIX
-#undef BSDWAIT
-#endif
-
-/*
- * On RISCOS we prefer wait2() over wait3(). rouilj@sni-usa.com
- */
-#ifdef BSDWAIT
-#undef USE_WAIT2
-#endif
-
-/*
- * Define HAVE_DIRENT_H if your system has <dirent.h> instead of
- * <sys/dir.h>
- */
-#undef HAVE_DIRENT_H
-
-/*
- * If your system has getutent(), pututline(), etc. to write to the
- * utmp file, define GETUTENT.
- */
-#undef GETUTENT
-
-/*
- * Define UTHOST if the utmp file has a host field.
- */
-#undef UTHOST
-
-/*
- * Define if you have the utempter utmp helper program
- */
-#undef HAVE_UTEMPTER
-
-/*
- * If ttyslot() breaks getlogin() by returning indexes to utmp entries
- * of type DEAD_PROCESS, then our getlogin() replacement should be
- * selected by defining BUGGYGETLOGIN.
- */
-#undef BUGGYGETLOGIN
-
-/*
- * If your system has the calls setreuid() and setregid(),
- * define HAVE_SETREUID. Otherwise screen will use a forked process to
- * safely create output files without retaining any special privileges.
- */
-#undef HAVE_SETREUID
-
-/*
- * If your system supports BSD4.4's seteuid() and setegid(), define
- * HAVE_SETEUID.
- */
-#undef HAVE_SETEUID
-
-/*
- * If you want the "time" command to display the current load average
- * define LOADAV. Maybe you must install screen with the needed
- * privileges to read /dev/kmem.
- * Note that NLIST_ stuff is only checked, when getloadavg() is not available.
- */
-#undef LOADAV
-
-#undef LOADAV_NUM
-#undef LOADAV_TYPE
-#undef LOADAV_SCALE
-#undef LOADAV_GETLOADAVG
-#undef LOADAV_UNIX
-#undef LOADAV_AVENRUN
-#undef LOADAV_USE_NLIST64
-
-#undef NLIST_DECLARED
-#undef NLIST_STRUCT
-#undef NLIST_NAME_UNION
-
-/*
- * If your system has the new format /etc/ttys (like 4.3 BSD) and the
- * getttyent(3) library functions, define GETTTYENT.
- */
-#undef GETTTYENT
-
-/*
- * Define USEBCOPY if the bcopy/memcpy from your system's C library
- * supports the overlapping of source and destination blocks. When
- * undefined, screen uses its own (probably slower) version of bcopy().
- *
- * SYSV machines may have a working memcpy() -- Oh, this is
- * quite unlikely. Tell me if you see one.
- * "But then, memmove() should work, if at all available" he thought...
- * Boing, never say "works everywhere" unless you checked SCO UNIX.
- * Their memove fails the test in the configure script. Sigh. (Juergen)
- */
-#undef USEBCOPY
-#undef USEMEMCPY
-#undef USEMEMMOVE
-
-/*
- * If your system has vsprintf() and requires the use of the macros in
- * "varargs.h" to use functions with variable arguments,
- * define USEVARARGS.
- */
-#undef USEVARARGS
-
-/*
- * If your system has strerror() define this.
- */
-#undef HAVE_STRERROR
-
-/*
- * If the select return value doesn't treat a descriptor that is
- * usable for reading and writing as two hits, define SELECT_BROKEN.
- */
-#undef SELECT_BROKEN
-
-/*
- * Define this if your system supports named pipes.
- */
-#undef NAMEDPIPE
-
-/*
- * Define this if your system exits select() immediatly if a pipe is
- * opened read-only and no writer has opened it.
- */
-#undef BROKEN_PIPE
-
-/*
- * Define this if the unix-domain socket implementation doesn't
- * create a socket in the filesystem.
- */
-#undef SOCK_NOT_IN_FS
-
-/*
- * If your system has setenv() and unsetenv() define USESETENV
- */
-#undef USESETENV
-
-/*
- * If your system does not come with a setenv()/putenv()/getenv()
- * functions, you may bring in our own code by defining NEEDPUTENV.
- */
-#undef NEEDPUTENV
-
-/*
- * If the passwords are stored in a shadow file and you want the
- * builtin lock to work properly, define SHADOWPW.
- */
-#undef SHADOWPW
-
-/*
- * If you are on a SYS V machine that restricts filename length to 14
- * characters, you may need to enforce that by setting NAME_MAX to 14
- */
-#undef NAME_MAX /* KEEP_UNDEF_HERE override system value */
-#undef NAME_MAX
-
-/*
- * define HAVE_RENAME if your system has a rename() function
- */
-#undef HAVE_RENAME
-
-/*
- * define HAVE__EXIT if your system has the _exit() call.
- */
-#undef HAVE__EXIT
-
-/*
- * define HAVE_LSTAT if your system has symlinks and the lstat() call.
- */
-#undef HAVE_LSTAT
-
-/*
- * define HAVE_UTIMES if your system has the utimes() call.
- */
-#undef HAVE_UTIMES
-
-/*
- * define HAVE_FCHOWN if your system has the fchown() call.
- */
-#undef HAVE_FCHOWN
-
-/*
- * define HAVE_FCHMOD if your system has the fchmod() call.
- */
-#undef HAVE_FCHMOD
-
-/*
- * define HAVE_VSNPRINTF if your system has vsnprintf() (GNU lib).
- */
-#undef HAVE_VSNPRINTF
-
-/*
- * define HAVE_GETCWD if your system has the getcwd() call.
- */
-#undef HAVE_GETCWD
-
-/*
- * define HAVE_SETLOCALE if your system has the setlocale() call.
- */
-#undef HAVE_SETLOCALE
-
-/*
- * define HAVE_STRFTIME if your system has the strftime() call.
- */
-#undef HAVE_STRFTIME
-
-/*
- * define HAVE_NL_LANGINFO if your system has the nl_langinfo() call
- * and <langinfo.h> defines CODESET.
- */
-#undef HAVE_NL_LANGINFO
-
-/*
- * Newer versions of Solaris include fdwalk, which can greatly improve
- * the startup time of screen; otherwise screen spends a lot of time
- * closing file descriptors.
- */
-#undef HAVE_FDWALK
-
-/*
- * define HAVE_DEV_PTC if you have a /dev/ptc character special
- * device.
- */
-#undef HAVE_DEV_PTC
-
-/*
- * define HAVE_SVR4_PTYS if you have a /dev/ptmx character special
- * device and support the ptsname(), grantpt(), unlockpt() functions.
- */
-#undef HAVE_SVR4_PTYS
-
-/*
- * define HAVE_GETPT if you have the getpt() function.
- */
-#undef HAVE_GETPT
-
-/*
- * define HAVE_OPENPTY if your system has the openpty() call.
- */
-#undef HAVE_OPENPTY
-
-/*
- * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen
- * to unusual environments. E.g. For SunOs the defaults are "qpr" and
- * "0123456789abcdef". For SunOs 4.1.2
- * #define PTYRANGE0 "pqrstuvwxyzPQRST"
- * is recommended by Dan Jacobson.
- */
-#undef PTYRANGE0
-#undef PTYRANGE1
-
diff --git a/src/configure b/src/configure
deleted file mode 100755
index 75675fc..0000000
--- a/src/configure
+++ /dev/null
@@ -1,9194 +0,0 @@
-#! /bin/sh
-# From configure.in Revision: 1.18 .
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57.
-#
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
- LC_TELEPHONE LC_TIME
-do
- if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
- eval $as_var=C; export $as_var
- else
- $as_unset $as_var
- fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)$' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
- /^X\/\(\/\/\)$/{ s//\1/; q; }
- /^X\/\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
-fi
-
-
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" || {
- # Find who we are. Look in the path if we contain no path at all
- # relative or not.
- case $0 in
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
- ;;
- esac
- # We did not find ourselves, most probably we were run as `sh COMMAND'
- # in which case we are not to be found in the path.
- if test "x$as_myself" = x; then
- as_myself=$0
- fi
- if test ! -f "$as_myself"; then
- { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
- { (exit 1); exit 1; }; }
- fi
- case $CONFIG_SHELL in
- '')
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for as_base in sh bash ksh sh5; do
- case $as_dir in
- /*)
- if ("$as_dir/$as_base" -c '
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
- $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
- $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
- CONFIG_SHELL=$as_dir/$as_base
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" ${1+"$@"}
- fi;;
- esac
- done
-done
-;;
- esac
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line before each line; the second 'sed' does the real
- # work. The second script uses 'N' to pair each line-number line
- # with the numbered line, and appends trailing '-' during
- # substitution so that $LINENO is not a special case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
- sed '=' <$as_myself |
- sed '
- N
- s,$,-,
- : loop
- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
- t loop
- s,-$,,
- s,^['$as_cr_digits']*\n,,
- ' >$as_me.lineno &&
- chmod +x $as_me.lineno ||
- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
- { (exit 1); exit 1; }; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensible to this).
- . ./$as_me.lineno
- # Exit status is that of the last command.
- exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
- *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T=' ' ;;
- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
- *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- # We could just check for DJGPP; but this test a) works b) is more generic
- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
- if test -f conf$$.exe; then
- # Don't use ln at all; we don't have any links
- as_ln_s='cp -p'
- else
- as_ln_s='ln -s'
- fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p=:
-else
- as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" $as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-exec 6>&1
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_config_libobj_dir=.
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete. It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
-# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-
-ac_unique_file="screen.c"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# if HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#if HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-# include <stdint.h>
-# endif
-#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS VERSION ac_prefix_program CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP AWK INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA WRITEPATH XTERMPATH LIBOBJS LTLIBOBJS'
-ac_subst_files=''
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-ac_prev=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval "$ac_prev=\$ac_option"
- ac_prev=
- continue
- fi
-
- ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_option in
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
- | --da=*)
- datadir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/-/_/g'`
- eval "enable_$ac_feature=no" ;;
-
- -enable-* | --enable-*)
- ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/-/_/g'`
- case $ac_option in
- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
- *) ac_optarg=yes ;;
- esac
- eval "enable_$ac_feature='$ac_optarg'" ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst \
- | --locals | --local | --loca | --loc | --lo)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* \
- | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- case $ac_option in
- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
- *) ac_optarg=yes ;;
- esac
- eval "with_$ac_package='$ac_optarg'" ;;
-
- -without-* | --without-*)
- ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package | sed 's/-/_/g'`
- eval "with_$ac_package=no" ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
- { (exit 1); exit 1; }; }
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
- { (exit 1); exit 1; }; }
- ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
- eval "$ac_envvar='$ac_optarg'"
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- { echo "$as_me: error: missing argument to $ac_option" >&2
- { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
- eval ac_val=$`echo $ac_var`
- case $ac_val in
- [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
- localstatedir libdir includedir oldincludedir infodir mandir
-do
- eval ac_val=$`echo $ac_var`
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) ;;
- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used." >&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then its parent.
- ac_confdir=`(dirname "$0") 2>/dev/null ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$0" : 'X\(//\)[^/]' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$0" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r $srcdir/$ac_unique_file; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
- if test "$ac_srcdir_defaulted" = yes; then
- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
- { (exit 1); exit 1; }; }
- else
- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
- { (exit 1); exit 1; }; }
- fi
-fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
- { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
- { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures this package to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-_ACEOF
-
- cat <<_ACEOF
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --infodir=DIR info documentation [PREFIX/info]
- --mandir=DIR man documentation [PREFIX/man]
-_ACEOF
-
- cat <<\_ACEOF
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-
- cat <<\_ACEOF
-
-Optional Features:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --disable-socket-dir disable system wide socket-dir and use ~/.screen instead
- --enable-pam enable PAM support
- --enable-locale use localized month/day names
- --enable-telnet enable builtin telnet
- --enable-colors256 enable support for 256 colors
- --enable-rxvt_osc enable support for rxvt OSC codes
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-socket-dir=path where to put the per-user sockets
- --with-pty-mode=mode default mode for ptys
- --with-pty-group=group default group for ptys
- --with-sys-screenrc=path where to put the global screenrc file
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
- headers in a nonstandard directory <include dir>
- CPP C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-_ACEOF
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- ac_popdir=`pwd`
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d $ac_dir || continue
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
- cd $ac_dir
- # Check for guested configure; otherwise get Cygnus style configure.
- if test -f $ac_srcdir/configure.gnu; then
- echo
- $SHELL $ac_srcdir/configure.gnu --help=recursive
- elif test -f $ac_srcdir/configure; then
- echo
- $SHELL $ac_srcdir/configure --help=recursive
- elif test -f $ac_srcdir/configure.ac ||
- test -f $ac_srcdir/configure.in; then
- echo
- $ac_configure --help
- else
- echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi
- cd $ac_popdir
- done
-fi
-
-test -n "$ac_init_help" && exit 0
-if $ac_init_version; then
- cat <<\_ACEOF
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit 0
-fi
-exec 5>config.log
-cat >&5 <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by $as_me, which was
-generated by GNU Autoconf 2.57. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- echo "PATH: $as_dir"
-done
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_sep=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
- for ac_arg
- do
- case $ac_arg in
- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- continue ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case $ac_pass in
- 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
- 2)
- ac_configure_args1="$ac_configure_args1 '$ac_arg'"
- if test $ac_must_keep_next = true; then
- ac_must_keep_next=false # Got value, back to normal.
- else
- case $ac_arg in
- *=* | --config-cache | -C | -disable-* | --disable-* \
- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
- | -with-* | --with-* | -without-* | --without-* | --x)
- case "$ac_configure_args0 " in
- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
- esac
- ;;
- -* ) ac_must_keep_next=true ;;
- esac
- fi
- ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
- # Get rid of the leading space.
- ac_sep=" "
- ;;
- esac
- done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
-
- cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
- echo
- # The following way of writing the cache mishandles newlines in values,
-{
- (set) 2>&1 |
- case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- sed -n \
- "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
- ;;
- *)
- sed -n \
- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
- ;;
- esac;
-}
- echo
-
- cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
- echo
- for ac_var in $ac_subst_vars
- do
- eval ac_val=$`echo $ac_var`
- echo "$ac_var='"'"'$ac_val'"'"'"
- done | sort
- echo
-
- if test -n "$ac_subst_files"; then
- cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
-_ASBOX
- echo
- for ac_var in $ac_subst_files
- do
- eval ac_val=$`echo $ac_var`
- echo "$ac_var='"'"'$ac_val'"'"'"
- done | sort
- echo
- fi
-
- if test -s confdefs.h; then
- cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
- echo
- sed "/^$/d" confdefs.h | sort
- echo
- fi
- test "$ac_signal" != 0 &&
- echo "$as_me: caught signal $ac_signal"
- echo "$as_me: exit $exit_status"
- } >&5
- rm -f core core.* *.core &&
- rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
- ' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
- fi
-fi
-for ac_site_file in $CONFIG_SITE; do
- if test -r "$ac_site_file"; then
- { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file"
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special
- # files actually), so we avoid doing that.
- if test -f "$cache_file"; then
- { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . $cache_file;;
- *) . ./$cache_file;;
- esac
- fi
-else
- { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
- sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val="\$ac_cv_env_${ac_var}_value"
- eval ac_new_val="\$ac_env_${ac_var}_value"
- case $ac_old_set,$ac_new_set in
- set,)
- { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
-echo "$as_me: former value: $ac_old_val" >&2;}
- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
-echo "$as_me: current value: $ac_new_val" >&2;}
- ac_cache_corrupted=:
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
- ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ac_config_headers="$ac_config_headers config.h"
-
-
-
-rev=`sed < ${srcdir}/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`
-vers=`sed < ${srcdir}/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`
-pat=`sed < ${srcdir}/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`
-VERSION="$rev.$vers.$pat"
-echo "this is screen version $VERSION" 1>&6
-
-
-if test "x$prefix" = xNONE; then
- echo $ECHO_N "checking for prefix by $ECHO_C" >&6
- # Extract the first word of "screen", so it can be a program name with args.
-set dummy screen; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_ac_prefix_program+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $ac_prefix_program in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_prefix_program="$ac_prefix_program" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_prefix_program="$as_dir/$ac_word$ac_exec_ext"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- ;;
-esac
-fi
-ac_prefix_program=$ac_cv_path_ac_prefix_program
-
-if test -n "$ac_prefix_program"; then
- echo "$as_me:$LINENO: result: $ac_prefix_program" >&5
-echo "${ECHO_T}$ac_prefix_program" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- if test -n $ac_prefix_program; then
- prefix=`(dirname "$ac_prefix_program") 2>/dev/null ||
-$as_expr X"$ac_prefix_program" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_prefix_program" : 'X\(//\)[^/]' \| \
- X"$ac_prefix_program" : 'X\(//\)$' \| \
- X"$ac_prefix_program" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_prefix_program" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- prefix=`(dirname "$prefix") 2>/dev/null ||
-$as_expr X"$prefix" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$prefix" : 'X\(//\)[^/]' \| \
- X"$prefix" : 'X\(//\)$' \| \
- X"$prefix" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$prefix" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- fi
-fi
-
-if test "x$prefix" = xNONE; then
- echo $ECHO_N "checking for prefix by $ECHO_C" >&6
- # Extract the first word of "gzip", so it can be a program name with args.
-set dummy gzip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_ac_prefix_program+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $ac_prefix_program in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_prefix_program="$ac_prefix_program" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_prefix_program="$as_dir/$ac_word$ac_exec_ext"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- ;;
-esac
-fi
-ac_prefix_program=$ac_cv_path_ac_prefix_program
-
-if test -n "$ac_prefix_program"; then
- echo "$as_me:$LINENO: result: $ac_prefix_program" >&5
-echo "${ECHO_T}$ac_prefix_program" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- if test -n $ac_prefix_program; then
- prefix=`(dirname "$ac_prefix_program") 2>/dev/null ||
-$as_expr X"$ac_prefix_program" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_prefix_program" : 'X\(//\)[^/]' \| \
- X"$ac_prefix_program" : 'X\(//\)$' \| \
- X"$ac_prefix_program" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_prefix_program" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- prefix=`(dirname "$prefix") 2>/dev/null ||
-$as_expr X"$prefix" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$prefix" : 'X\(//\)[^/]' \| \
- X"$prefix" : 'X\(//\)$' \| \
- X"$prefix" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$prefix" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- fi
-fi
-
-
-old_CFLAGS="$CFLAGS"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- CC=$ac_ct_CC
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- CC=$ac_ct_CC
-else
- CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$ac_ct_CC" && break
-done
-
- CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
- "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
- (eval $ac_compiler --version </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
- (eval $ac_compiler -v </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
- (eval $ac_compiler -V </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output" >&5
-echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
- (eval $ac_link_default) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- # Find the output, starting from the most likely. This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
- ;;
- conftest.$ac_ext )
- # This is the source file.
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- # FIXME: I believe we export ac_cv_exeext for Libtool,
- # but it would be cool to find out if it's true. Does anybody
- # maintain Libtool? --akim.
- export ac_cv_exeext
- break;;
- * )
- break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
- { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
-
-# Check the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
- if { ac_try='./$ac_file'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
- fi
- fi
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- export ac_cv_exeext
- break;;
- * ) break;;
- esac
-done
-else
- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_compiler_gnu=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_prog_cc_g=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX -qlanglvl=ansi
-# Ultrix and OSF/1 -std1
-# HP-UX 10.20 and later -Ae
-# HP-UX older versions -Aa -D_HPUX_SOURCE
-# SVR4 -Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_prog_cc_stdc=$ac_arg
-break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
- x|xno)
- echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
- *)
- echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
- CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C. Since we use `exit',
-# in C++ we need to declare it. In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
- choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- for ac_declaration in \
- ''\
- '#include <stdlib.h>' \
- 'extern "C" void std::exit (int) throw (); using std::exit;' \
- 'extern "C" void std::exit (int); using std::exit;' \
- 'extern "C" void exit (int) throw ();' \
- 'extern "C" void exit (int);' \
- 'void exit (int);'
-do
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <stdlib.h>
-$ac_declaration
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_declaration
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
- echo '#ifdef __cplusplus' >>confdefs.h
- echo $ac_declaration >>confdefs.h
- echo '#endif' >>confdefs.h
-fi
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if test "${ac_cv_prog_CPP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether non-existent headers
- # can be detected and how.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- # Broken: success on invalid input.
-continue
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether non-existent headers
- # can be detected and how.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- # Broken: success on invalid input.
-continue
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
- :
-else
- { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if echo a | (grep -E '(a|b)') >/dev/null 2>&1
- then ac_cv_prog_egrep='grep -E'
- else ac_cv_prog_egrep='egrep'
- fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-if test $ac_cv_c_compiler_gnu = yes; then
- echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5
-echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
-if test "${ac_cv_prog_gcc_traditional+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_pattern="Autoconf.*'x'"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sgtty.h>
-Autoconf TIOCGETP
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "$ac_pattern" >/dev/null 2>&1; then
- ac_cv_prog_gcc_traditional=yes
-else
- ac_cv_prog_gcc_traditional=no
-fi
-rm -f conftest*
-
-
- if test $ac_cv_prog_gcc_traditional = no; then
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <termio.h>
-Autoconf TCGETA
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "$ac_pattern" >/dev/null 2>&1; then
- ac_cv_prog_gcc_traditional=yes
-fi
-rm -f conftest*
-
- fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5
-echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
- if test $ac_cv_prog_gcc_traditional = yes; then
- CC="$CC -traditional"
- fi
-fi
-
-echo "$as_me:$LINENO: checking for library containing strerror" >&5
-echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
-if test "${ac_cv_search_strerror+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_func_search_save_LIBS=$LIBS
-ac_cv_search_strerror=no
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char strerror ();
-int
-main ()
-{
-strerror ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_strerror="none required"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_strerror" = no; then
- for ac_lib in cposix; do
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char strerror ();
-int
-main ()
-{
-strerror ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_strerror="-l$ac_lib"
-break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- done
-fi
-LIBS=$ac_func_search_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
-echo "${ECHO_T}$ac_cv_search_strerror" >&6
-if test "$ac_cv_search_strerror" != no; then
- test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
-
-fi
-
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-main(){exit(0);}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-
-if test $CC != cc ; then
-echo "Your $CC failed - restarting with CC=cc" 1>&6
-
-echo "" 1>&6
-
-CC=cc
-export CC
-exec $0 $configure_args
-fi
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-main(){exit(0);}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-exec 5>&2
-eval $ac_link
-echo "CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;" 1>&6
-
-echo "$ac_compile" 1>&6
-
-{ { echo "$as_me:$LINENO: error: Can't run the compiler - sorry" >&5
-echo "$as_me: error: Can't run the compiler - sorry" >&2;}
- { (exit 1); exit 1; }; }
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-main()
-{
- int __something_strange_();
- __something_strange_(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- { { echo "$as_me:$LINENO: error: Your compiler does not set the exit status - sorry" >&5
-echo "$as_me: error: Your compiler does not set the exit status - sorry" >&2;}
- { (exit 1); exit 1; }; }
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-for ac_prog in gawk mawk nawk awk
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AWK+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_AWK="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
- echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$AWK" && break
-done
-
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/install-sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f $ac_dir/install.sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f $ac_dir/shtool; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
- { (exit 1); exit 1; }; }
-fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
- ./ | .// | /cC/* | \
- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- /usr/ucb/* ) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # program-specific install script used by HP pwplus--don't use.
- :
- else
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
- fi
- fi
- done
- done
- ;;
-esac
-done
-
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL=$ac_cv_path_install
- else
- # As a last resort, use the slow shell script. We don't cache a
- # path for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the path is relative.
- INSTALL=$ac_install_sh
- fi
-fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-
-if test -f etc/toolcheck; then
-{ echo "$as_me:$LINENO: checking for buggy tools..." >&5
-echo "$as_me: checking for buggy tools..." >&6;}
-sh etc/toolcheck 1>&6
-fi
-
-
-
-echo "$as_me:$LINENO: checking if a system-wide socket dir should be used" >&5
-echo $ECHO_N "checking if a system-wide socket dir should be used... $ECHO_C" >&6
-# Check whether --enable-socket-dir or --disable-socket-dir was given.
-if test "${enable_socket_dir+set}" = set; then
- enableval="$enable_socket_dir"
-
- echo "$as_me:$LINENO: result: no. ~/.screen will be used instead." >&5
-echo "${ECHO_T}no. ~/.screen will be used instead." >&6
-
-else
-
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
- echo "$as_me:$LINENO: checking for the socket dir" >&5
-echo $ECHO_N "checking for the socket dir... $ECHO_C" >&6
- SOCKDIR="(eff_uid ? \"/tmp/uscreens\" : \"/tmp/screens\")"
-
-# Check whether --with-socket-dir or --without-socket-dir was given.
-if test "${with_socket_dir+set}" = set; then
- withval="$with_socket_dir"
- SOCKDIR="\"${withval}\""
-fi;
- echo "$as_me:$LINENO: result: ${SOCKDIR}" >&5
-echo "${ECHO_T}${SOCKDIR}" >&6
- cat >>confdefs.h <<_ACEOF
-#define SOCKDIR $SOCKDIR
-_ACEOF
-
-
-
-fi;
-
-
-if test -n "$ISC"; then
- cat >>confdefs.h <<\_ACEOF
-#define ISC 1
-_ACEOF
- LIBS="$LIBS -linet"
-fi
-
-
-if test -f /sysV68 ; then
-cat >>confdefs.h <<\_ACEOF
-#define sysV68 1
-_ACEOF
-
-fi
-
-{ echo "$as_me:$LINENO: checking for MIPS..." >&5
-echo "$as_me: checking for MIPS..." >&6;}
-if test -f /lib/libmld.a || test -f /usr/lib/libmld.a || test -f /usr/lib/cmplrs/cc/libmld.a; then
-oldlibs="$LIBS"
-test -f /bin/mx || LIBS="$LIBS -lmld" # for nlist. But not on alpha.
-{ echo "$as_me:$LINENO: checking mld library..." >&5
-echo "$as_me: checking mld library..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-if test -r /dev/ptc; then
-cat >>confdefs.h <<\_ACEOF
-#define MIPS 1
-_ACEOF
-
-{ echo "$as_me:$LINENO: checking wait3..." >&5
-echo "$as_me: checking wait3..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-wait3();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ echo "$as_me:$LINENO: checking wait2..." >&5
-echo "$as_me: checking wait2..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-wait2();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define USE_WAIT2 1
-_ACEOF
- LIBS="$LIBS -lbsd" ; CC="$CC -I/usr/include/bsd"
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-fi
-
-
-{ echo "$as_me:$LINENO: checking for Ultrix..." >&5
-echo "$as_me: checking for Ultrix..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#if defined(ultrix) || defined(__ultrix)
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- ULTRIX=1
-fi
-rm -f conftest*
-
-
-if test -f /usr/lib/libpyr.a ; then
-oldlibs="$LIBS"
-LIBS="$LIBS -lpyr"
-{ echo "$as_me:$LINENO: checking Pyramid OSX..." >&5
-echo "$as_me: checking Pyramid OSX..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-open_controlling_pty("")
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define OSX 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-
-{ echo "$as_me:$LINENO: checking for butterfly..." >&5
-echo "$as_me: checking for butterfly..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#if defined(butterfly)
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- butterfly=1
-fi
-rm -f conftest*
-
-
-if test -z "$butterfly"; then
-if test -n "$ULTRIX"; then
- test -z "$GCC" && CC="$CC -YBSD"
-fi
-{ echo "$as_me:$LINENO: checking for POSIX.1..." >&5
-echo "$as_me: checking for POSIX.1..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <unistd.h>
-main () {
-#ifdef _POSIX_VERSION
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- echo "- you have a POSIX system" 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define POSIX 1
-_ACEOF
- posix=1
-fi
-rm -f conftest*
-
-fi
-
-{ echo "$as_me:$LINENO: checking for System V..." >&5
-echo "$as_me: checking for System V..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <signal.h>
-#include <fcntl.h>
-int
-main ()
-{
-int x = SIGCHLD | FNDELAY;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-cat >>confdefs.h <<\_ACEOF
-#define SYSV 1
-_ACEOF
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking for sequent/ptx..." >&5
-echo "$as_me: checking for sequent/ptx..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#ifdef _SEQUENT_
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- LIBS="$LIBS -lsocket -linet";seqptx=1
-fi
-rm -f conftest*
-
-
-oldlibs="$LIBS"
-LIBS="$LIBS -lelf"
-{ echo "$as_me:$LINENO: checking SVR4..." >&5
-echo "$as_me: checking SVR4..." >&6;}
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_header_stdc=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdc=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then
- :
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- exit(2);
- exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_Header=yes"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <utmpx.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- if test "${ac_cv_header_dwarf_h+set}" = set; then
- echo "$as_me:$LINENO: checking for dwarf.h" >&5
-echo $ECHO_N "checking for dwarf.h... $ECHO_C" >&6
-if test "${ac_cv_header_dwarf_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_dwarf_h" >&5
-echo "${ECHO_T}$ac_cv_header_dwarf_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking dwarf.h usability" >&5
-echo $ECHO_N "checking dwarf.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_includes_default
-#include <dwarf.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking dwarf.h presence" >&5
-echo $ECHO_N "checking dwarf.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <dwarf.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: dwarf.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: dwarf.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: dwarf.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: dwarf.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: dwarf.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: dwarf.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: dwarf.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: dwarf.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: dwarf.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: dwarf.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
-echo "$as_me:$LINENO: checking for dwarf.h" >&5
-echo $ECHO_N "checking for dwarf.h... $ECHO_C" >&6
-if test "${ac_cv_header_dwarf_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_dwarf_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_dwarf_h" >&5
-echo "${ECHO_T}$ac_cv_header_dwarf_h" >&6
-
-fi
-if test $ac_cv_header_dwarf_h = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define SVR4 1
-_ACEOF
- cat >>confdefs.h <<\_ACEOF
-#define BUGGYGETLOGIN 1
-_ACEOF
-
-else
- if test "${ac_cv_header_elf_h+set}" = set; then
- echo "$as_me:$LINENO: checking for elf.h" >&5
-echo $ECHO_N "checking for elf.h... $ECHO_C" >&6
-if test "${ac_cv_header_elf_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5
-echo "${ECHO_T}$ac_cv_header_elf_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking elf.h usability" >&5
-echo $ECHO_N "checking elf.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_includes_default
-#include <elf.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking elf.h presence" >&5
-echo $ECHO_N "checking elf.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <elf.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: elf.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: elf.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: elf.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: elf.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: elf.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: elf.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: elf.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: elf.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: elf.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: elf.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
-echo "$as_me:$LINENO: checking for elf.h" >&5
-echo $ECHO_N "checking for elf.h... $ECHO_C" >&6
-if test "${ac_cv_header_elf_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_elf_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5
-echo "${ECHO_T}$ac_cv_header_elf_h" >&6
-
-fi
-if test $ac_cv_header_elf_h = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define SVR4 1
-_ACEOF
- cat >>confdefs.h <<\_ACEOF
-#define BUGGYGETLOGIN 1
-_ACEOF
-
-fi
-
-
-fi
-
-
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking for Solaris 2.x..." >&5
-echo "$as_me: checking for Solaris 2.x..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#if defined(SVR4) && defined(sun)
- yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- LIBS="$LIBS -lsocket -lnsl -lkstat"
-fi
-rm -f conftest*
-
-
-
-
-{ echo "$as_me:$LINENO: checking BSD job jontrol..." >&5
-echo "$as_me: checking BSD job jontrol..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <sys/ioctl.h>
-
-int
-main ()
-{
-
-#ifdef POSIX
-tcsetpgrp(0, 0);
-#else
-int x = TIOCSPGRP;
-#ifdef SYSV
-setpgrp();
-#else
-int y = TIOCNOTTY;
-#endif
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- you have jobcontrol" 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define BSDJOBS 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "- you don't have jobcontrol" 1>&6
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking setreuid..." >&5
-echo "$as_me: checking setreuid..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
-#ifdef __hpux
-setresuid(0, 0, 0);
-#else
-setreuid(0, 0);
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_SETREUID 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-{ echo "$as_me:$LINENO: checking seteuid..." >&5
-echo "$as_me: checking seteuid..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
-#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(sun) && defined(SVR4)) || defined(ISC) || defined(sony_news)
-seteuid_is_broken(0);
-#else
-seteuid(0);
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_SETEUID 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-
-{ echo "$as_me:$LINENO: checking select..." >&5
-echo "$as_me: checking select..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-select(0, 0, 0, 0, 0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$LIBS -lnet -lnsl"
-{ echo "$as_me:$LINENO: checking select with $LIBS..." >&5
-echo "$as_me: checking select with $LIBS..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-select(0, 0, 0, 0, 0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: !!! no select - no screen" >&5
-echo "$as_me: error: !!! no select - no screen" >&2;}
- { (exit 1); exit 1; }; }
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking fifos..." >&5
-echo "$as_me: checking fifos..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-char *fin = "/tmp/conftest$$";
-
-main()
-{
- struct stat stb;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
-#ifdef POSIX
- if (mkfifo(fin, 0777))
-#else
- if (mknod(fin, S_IFIFO|0777, 0))
-#endif
- exit(1);
- if (stat(fin, &stb) || (stb.st_mode & S_IFIFO) != S_IFIFO)
- exit(1);
- close(0);
-#ifdef __386BSD__
- /*
- * The next test fails under 386BSD, but screen works using fifos.
- * Fifos in O_RDWR mode are only used for the BROKEN_PIPE case and for
- * the select() configuration test.
- */
- exit(0);
-#endif
- if (open(fin, O_RDONLY | O_NONBLOCK))
- exit(1);
- if (fork() == 0)
- {
- close(0);
- if (open(fin, O_WRONLY | O_NONBLOCK))
- exit(1);
- close(0);
- if (open(fin, O_WRONLY | O_NONBLOCK))
- exit(1);
- if (write(0, "TEST", 4) == -1)
- exit(1);
- exit(0);
- }
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- your fifos are usable" 1>&6
- fifo=1
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- your fifos are not usable" 1>&6
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f /tmp/conftest*
-
-if test -n "$fifo"; then
-{ echo "$as_me:$LINENO: checking for broken fifo implementation..." >&5
-echo "$as_me: checking for broken fifo implementation..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-char *fin = "/tmp/conftest$$";
-
-main()
-{
- struct timeval tv;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
-#ifdef POSIX
- if (mkfifo(fin, 0600))
-#else
- if (mknod(fin, S_IFIFO|0600, 0))
-#endif
- exit(1);
- close(0);
- if (open(fin, O_RDONLY|O_NONBLOCK))
- exit(1);
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- if (select(1, &f, 0, 0, &tv))
- exit(1);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- your implementation is ok" 1>&6
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- you have a broken implementation" 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define BROKEN_PIPE 1
-_ACEOF
- fifobr=1
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f /tmp/conftest*
-fi
-
-
-{ echo "$as_me:$LINENO: checking sockets..." >&5
-echo "$as_me: checking sockets..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <fcntl.h>
-
-char *son = "/tmp/conftest$$";
-
-main()
-{
- int s1, s2, l;
- struct sockaddr_un a;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
- if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(1);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, son);
- (void) unlink(son);
- if (bind(s1, (struct sockaddr *) &a, strlen(son)+2) == -1)
- exit(1);
- if (listen(s1, 2))
- exit(1);
- if (fork() == 0)
- {
- if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- kill(getppid(), 3);
- (void)connect(s2, (struct sockaddr *)&a, strlen(son) + 2);
- if (write(s2, "HELLO", 5) == -1)
- kill(getppid(), 3);
- exit(0);
- }
- l = sizeof(a);
- close(0);
- if (accept(s1, &a, &l))
- exit(1);
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- your sockets are usable" 1>&6
- sock=1
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- your sockets are not usable" 1>&6
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f /tmp/conftest*
-
-if test -n "$sock"; then
-{ echo "$as_me:$LINENO: checking socket implementation..." >&5
-echo "$as_me: checking socket implementation..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-char *son = "/tmp/conftest$$";
-
-main()
-{
- int s;
- struct stat stb;
- struct sockaddr_un a;
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(0);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, son);
- (void) unlink(son);
- if (bind(s, (struct sockaddr *) &a, strlen(son)+2) == -1)
- exit(0);
- if (stat(son, &stb))
- exit(1);
- close(s);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- you are normal" 1>&6
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- unix domain sockets are not kept in the filesystem" 1>&6
-
-cat >>confdefs.h <<\_ACEOF
-#define SOCK_NOT_IN_FS 1
-_ACEOF
- socknofs=1
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f /tmp/conftest*
-fi
-
-
-if test -n "$fifo"; then
- if test -n "$sock"; then
- if test -n "$nore"; then
- echo "- hmmm... better take the fifos" 1>&6
-
- cat >>confdefs.h <<\_ACEOF
-#define NAMEDPIPE 1
-_ACEOF
-
- elif test -n "$fifobr"; then
- echo "- as your fifos are broken lets use the sockets." 1>&6
-
- else
- echo "- both sockets and fifos usable. let's take fifos." 1>&6
-
- cat >>confdefs.h <<\_ACEOF
-#define NAMEDPIPE 1
-_ACEOF
-
- fi
- else
- echo "- using named pipes" 1>&6
-
- cat >>confdefs.h <<\_ACEOF
-#define NAMEDPIPE 1
-_ACEOF
-
- fi
-elif test -n "$sock"; then
- echo "- using unix-domain sockets" 1>&6
-
-else
- { { echo "$as_me:$LINENO: error: you have neither usable sockets nor usable pipes -> no screen" >&5
-echo "$as_me: error: you have neither usable sockets nor usable pipes -> no screen" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-
-{ echo "$as_me:$LINENO: checking select return value..." >&5
-echo "$as_me: checking select return value..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-char *nam = "/tmp/conftest$$";
-
-#ifdef NAMEDPIPE
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-
-main()
-{
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
-#ifdef __FreeBSD__
-/* From Andrew A. Chernov (ache@astral.msk.su):
- * opening RDWR fifo fails in BSD 4.4, but select return values are
- * right.
- */
- exit(0);
-#endif
- (void)alarm(5);
-#ifdef POSIX
- if (mkfifo(nam, 0777))
-#else
- if (mknod(nam, S_IFIFO|0777, 0))
-#endif
- exit(1);
- close(0);
- if (open(nam, O_RDWR | O_NONBLOCK))
- exit(1);
- if (write(0, "TEST", 4) == -1)
- exit(1);
-
-#else
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-main()
-{
- int s1, s2, l;
- struct sockaddr_un a;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
- if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(1);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, nam);
- (void) unlink(nam);
- if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
- exit(1);
- if (listen(s1, 2))
- exit(1);
- if (fork() == 0)
- {
- if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- kill(getppid(), 3);
- (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
- if (write(s2, "HELLO", 5) == -1)
- kill(getppid(), 3);
- exit(0);
- }
- l = sizeof(a);
- close(0);
- if (accept(s1, (struct sockaddr *)&a, &l))
- exit(1);
-#endif
-
-
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- if (select(1, &f, &f, 0, 0) != 2)
- exit(1);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- select is ok" 1>&6
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- select can't count" 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define SELECT_BROKEN 1
-_ACEOF
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-{ echo "$as_me:$LINENO: checking for tgetent..." >&5
-echo "$as_me: checking for tgetent..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-tgetent((char *)0, (char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-olibs="$LIBS"
-LIBS="-lcurses $olibs"
-{ echo "$as_me:$LINENO: checking libcurses..." >&5
-echo "$as_me: checking libcurses..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
-#ifdef __hpux
-__sorry_hpux_libcurses_is_totally_broken_in_10_10();
-#else
-tgetent((char *)0, (char *)0);
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="-ltermcap $olibs"
-{ echo "$as_me:$LINENO: checking libtermcap..." >&5
-echo "$as_me: checking libtermcap..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-tgetent((char *)0, (char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="-ltermlib $olibs"
-{ echo "$as_me:$LINENO: checking libtermlib..." >&5
-echo "$as_me: checking libtermlib..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-tgetent((char *)0, (char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="-lncurses $olibs"
-{ echo "$as_me:$LINENO: checking libncurses..." >&5
-echo "$as_me: checking libncurses..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-tgetent((char *)0, (char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: !!! no tgetent - no screen" >&5
-echo "$as_me: error: !!! no tgetent - no screen" >&2;}
- { (exit 1); exit 1; }; }
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-main()
-{
- exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- you use the termcap database" 1>&6
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-echo "- you use the terminfo database" 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define TERMINFO 1
-_ACEOF
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: checking ospeed..." >&5
-echo "$as_me: checking ospeed..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-extern short ospeed;
-int
-main ()
-{
-ospeed=5;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-cat >>confdefs.h <<\_ACEOF
-#define NEED_OSPEED 1
-_ACEOF
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking for /dev/ptc..." >&5
-echo "$as_me: checking for /dev/ptc..." >&6;}
-if test -r /dev/ptc; then
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DEV_PTC 1
-_ACEOF
-
-fi
-
-{ echo "$as_me:$LINENO: checking for SVR4 ptys..." >&5
-echo "$as_me: checking for SVR4 ptys..." >&6;}
-sysvr4ptys=
-if test -c /dev/ptmx ; then
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-ptsname(0);grantpt(0);unlockpt(0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_SVR4_PTYS 1
-_ACEOF
-
-sysvr4ptys=1
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-
-
-for ac_func in getpt
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-if test -z "$sysvr4ptys"; then
-
-for ac_func in openpty
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
- echo "$as_me:$LINENO: checking for openpty in -lutil" >&5
-echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6
-if test "${ac_cv_lib_util_openpty+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lutil $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char openpty ();
-int
-main ()
-{
-openpty ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_lib_util_openpty=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_util_openpty=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_util_openpty" >&5
-echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6
-if test $ac_cv_lib_util_openpty = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_OPENPTY 1
-_ACEOF
- LIBS="$LIBS -lutil"
-fi
-
-fi
-done
-
-fi
-
-{ echo "$as_me:$LINENO: checking for ptyranges..." >&5
-echo "$as_me: checking for ptyranges..." >&6;}
-if test -d /dev/ptym ; then
-pdir='/dev/ptym'
-else
-pdir='/dev'
-fi
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#ifdef M_UNIX
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- ptys=`echo /dev/ptyp??`
-else
- ptys=`echo $pdir/pty??`
-fi
-rm -f conftest*
-
-if test "$ptys" != "$pdir/pty??" ; then
-p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
-p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'`
-cat >>confdefs.h <<_ACEOF
-#define PTYRANGE0 "$p0"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PTYRANGE1 "$p1"
-_ACEOF
-
-fi
-
-
-# Check whether --with-pty-mode or --without-pty-mode was given.
-if test "${with_pty_mode+set}" = set; then
- withval="$with_pty_mode"
- ptymode="${withval}"
-fi;
-
-# Check whether --with-pty-group or --without-pty-group was given.
-if test "${with_pty_group+set}" = set; then
- withval="$with_pty_group"
- ptygrp="${withval}"
-fi;
-test -n "$ptymode" || ptymode=0620
-if test -n "$ptygrp" ; then
-cat >>confdefs.h <<_ACEOF
-#define PTYMODE $ptymode
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PTYGROUP $ptygrp
-_ACEOF
-
-else
-
-{ echo "$as_me:$LINENO: checking default tty permissions/group..." >&5
-echo "$as_me: checking default tty permissions/group..." >&6;}
-rm -f conftest_grp
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-main()
-{
- struct stat sb;
- char *x,*ttyname();
- int om, m;
- FILE *fp;
-
- if (!(x = ttyname(0))) exit(1);
- if (stat(x, &sb)) exit(1);
- om = sb.st_mode;
- if (om & 002) exit(0);
- m = system("mesg y");
- if (m == -1 || m == 127) exit(1);
- if (stat(x, &sb)) exit(1);
- m = sb.st_mode;
- if (chmod(x, om)) exit(1);
- if (m & 002) exit(0);
- if (sb.st_gid == getgid()) exit(1);
- if (!(fp=fopen("conftest_grp", "w")))
- exit(1);
- fprintf(fp, "%d\n", sb.st_gid);
- fclose(fp);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
-
- if test -f conftest_grp; then
- ptygrp=`cat conftest_grp`
- echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
-
- cat >>confdefs.h <<_ACEOF
-#define PTYMODE $ptymode
-_ACEOF
-
- cat >>confdefs.h <<_ACEOF
-#define PTYGROUP $ptygrp
-_ACEOF
-
- else
- echo "- ptys are world accessable" 1>&6
-
- fi
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-
- WRITEPATH=''
- XTERMPATH=''
- # Extract the first word of "write", so it can be a program name with args.
-set dummy write; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_WRITEPATH+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $WRITEPATH in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_WRITEPATH="$WRITEPATH" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_WRITEPATH="$as_dir/$ac_word$ac_exec_ext"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- ;;
-esac
-fi
-WRITEPATH=$ac_cv_path_WRITEPATH
-
-if test -n "$WRITEPATH"; then
- echo "$as_me:$LINENO: result: $WRITEPATH" >&5
-echo "${ECHO_T}$WRITEPATH" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- # Extract the first word of "xterm", so it can be a program name with args.
-set dummy xterm; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_XTERMPATH+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $XTERMPATH in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_XTERMPATH="$XTERMPATH" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_XTERMPATH="$as_dir/$ac_word$ac_exec_ext"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- ;;
-esac
-fi
-XTERMPATH=$ac_cv_path_XTERMPATH
-
-if test -n "$XTERMPATH"; then
- echo "$as_me:$LINENO: result: $XTERMPATH" >&5
-echo "${ECHO_T}$XTERMPATH" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- found=
- if test -n "$WRITEPATH$XTERMPATH"; then
- findfollow=
- lsfollow=
- found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
- if test -n "$found"; then
- findfollow=-follow
- lsfollow=L
- fi
- if test -n "$XTERMPATH"; then
- ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
- if test tty != "$ptygrpn"; then
- XTERMPATH=
- fi
- fi
- fi
- if test -n "$WRITEPATH$XTERMPATH"; then
- found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
- if test -n "$found"; then
- ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
- echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
-
- cat >>confdefs.h <<_ACEOF
-#define PTYMODE $ptymode
-_ACEOF
-
- cat >>confdefs.h <<_ACEOF
-#define PTYGROUP $ptygrp
-_ACEOF
-
- else
- echo "- ptys are world accessable" 1>&6
-
- fi
- else
- echo "- can't determine - assume ptys are world accessable" 1>&6
-
- fi
-
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f conftest_grp
-fi
-
-{ echo "$as_me:$LINENO: checking getutent..." >&5
-echo "$as_me: checking getutent..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <time.h> /* to get time_t on SCO */
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-#ifdef __hpux
-#define pututline _pututline
-#endif
-
-int
-main ()
-{
-int x = DEAD_PROCESS; pututline((struct utmp *)0); getutent();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define GETUTENT 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-olibs="$LIBS"
-LIBS="$LIBS -lgen"
-{ echo "$as_me:$LINENO: checking getutent with -lgen..." >&5
-echo "$as_me: checking getutent with -lgen..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <time.h>
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-#ifdef __hpux
-#define pututline _pututline
-#endif
-
-int
-main ()
-{
-int x = DEAD_PROCESS; pututline((struct utmp *)0); getutent();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define GETUTENT 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$olibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-{ echo "$as_me:$LINENO: checking ut_host..." >&5
-echo "$as_me: checking ut_host..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <time.h>
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-
-int
-main ()
-{
-struct utmp u; u.ut_host[0] = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define UTHOST 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-if test "${ac_cv_header_utempter_h+set}" = set; then
- echo "$as_me:$LINENO: checking for utempter.h" >&5
-echo $ECHO_N "checking for utempter.h... $ECHO_C" >&6
-if test "${ac_cv_header_utempter_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_utempter_h" >&5
-echo "${ECHO_T}$ac_cv_header_utempter_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking utempter.h usability" >&5
-echo $ECHO_N "checking utempter.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_includes_default
-#include <utempter.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking utempter.h presence" >&5
-echo $ECHO_N "checking utempter.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <utempter.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: utempter.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: utempter.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: utempter.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: utempter.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: utempter.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: utempter.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: utempter.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: utempter.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: utempter.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: utempter.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
-echo "$as_me:$LINENO: checking for utempter.h" >&5
-echo $ECHO_N "checking for utempter.h... $ECHO_C" >&6
-if test "${ac_cv_header_utempter_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_utempter_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_utempter_h" >&5
-echo "${ECHO_T}$ac_cv_header_utempter_h" >&6
-
-fi
-if test $ac_cv_header_utempter_h = yes; then
- have_utempter=yes
-else
- have_utempter=no
-fi
-
-
-if test "$have_utempter" = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_UTEMPTER 1
-_ACEOF
-
- LIBS="$LIBS -lutempter"
-fi
-
-{ echo "$as_me:$LINENO: checking for libutil(s)..." >&5
-echo "$as_me: checking for libutil(s)..." >&6;}
-test -f /usr/lib/libutils.a && LIBS="$LIBS -lutils"
-test -f /usr/lib/libutil.a && LIBS="$LIBS -lutil"
-
-{ echo "$as_me:$LINENO: checking getloadavg..." >&5
-echo "$as_me: checking getloadavg..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-getloadavg((double *)0, 0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define LOADAV_GETLOADAVG 1
-_ACEOF
- load=1
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-if test -f /usr/lib/libkvm.a ; then
-olibs="$LIBS"
-LIBS="$LIBS -lkvm"
-{ echo "$as_me:$LINENO: checking getloadavg with -lkvm..." >&5
-echo "$as_me: checking getloadavg with -lkvm..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-getloadavg((double *)0, 0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define LOADAV_GETLOADAVG 1
-_ACEOF
- load=1
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$olibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-if test -z "$load" ; then
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#if defined(NeXT) || defined(apollo) || defined(linux)
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- load=1
-fi
-rm -f conftest*
-
-fi
-if test -z "$load" ; then
-{ echo "$as_me:$LINENO: checking for kernelfile..." >&5
-echo "$as_me: checking for kernelfile..." >&6;}
-for core in /unix /vmunix /dynix /hp-ux /xelos /dev/ksyms /kernel/unix /kernel/genunix /unicos /mach /netbsd /386bsd /dgux /bsd /stand/vmunix; do
- if test -f $core || test -c $core; then
- break
- fi
-done
-if test ! -f $core && test ! -c $core ; then
- echo "- no kernelfile found" 1>&6
-
-else
- echo "- using kernelfile '$core'" 1>&6
-
- if test -r $core ; then
- cat >>confdefs.h <<_ACEOF
-#define LOADAV_UNIX "$core"
-_ACEOF
-
- if test "${ac_cv_header_nlist_h+set}" = set; then
- echo "$as_me:$LINENO: checking for nlist.h" >&5
-echo $ECHO_N "checking for nlist.h... $ECHO_C" >&6
-if test "${ac_cv_header_nlist_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_nlist_h" >&5
-echo "${ECHO_T}$ac_cv_header_nlist_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking nlist.h usability" >&5
-echo $ECHO_N "checking nlist.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-$ac_includes_default
-#include <nlist.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking nlist.h presence" >&5
-echo $ECHO_N "checking nlist.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <nlist.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: nlist.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: nlist.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: nlist.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: nlist.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: nlist.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: nlist.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: nlist.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: nlist.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: nlist.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: nlist.h: proceeding with the preprocessor's result" >&2;}
- (
- cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
- ) |
- sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
-echo "$as_me:$LINENO: checking for nlist.h" >&5
-echo $ECHO_N "checking for nlist.h... $ECHO_C" >&6
-if test "${ac_cv_header_nlist_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_nlist_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_nlist_h" >&5
-echo "${ECHO_T}$ac_cv_header_nlist_h" >&6
-
-fi
-if test $ac_cv_header_nlist_h = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define NLIST_STRUCT 1
-_ACEOF
-
- { echo "$as_me:$LINENO: checking n_un in struct nlist..." >&5
-echo "$as_me: checking n_un in struct nlist..." >&6;}
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <nlist.h>
-int
-main ()
-{
-struct nlist n; n.n_un.n_name = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define NLIST_NAME_UNION 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-
- { echo "$as_me:$LINENO: checking for nlist declaration..." >&5
-echo "$as_me: checking for nlist declaration..." >&6;}
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#ifdef NLIST_STRUCT
-# include <nlist.h>
-#else
-# include <a.out.h>
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "nlist(( | )( | )*.*\(|\()" >/dev/null 2>&1; then
- cat >>confdefs.h <<\_ACEOF
-#define NLIST_DECLARED 1
-_ACEOF
-
-fi
-rm -f conftest*
-
-
- { echo "$as_me:$LINENO: checking for avenrun symbol..." >&5
-echo "$as_me: checking for avenrun symbol..." >&6;}
- nlist64=
- for av in avenrun _avenrun _Loadavg avenrun _avenrun _Loadavg; do
- if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#ifdef NLIST_STRUCT
-#include <nlist.h>
-#else
-#include <a.out.h>
-#endif
-
-$nlist64
-
-struct nlist nl[2];
-
-main()
-{
-#if !defined(_AUX_SOURCE) && !defined(AUX)
-# ifdef NLIST_NAME_UNION
- nl[0].n_un.n_name = "$av";
-# else
- nl[0].n_name = "$av";
-# endif
-#else
- strncpy(nl[0].n_name, "$av", sizeof(nl[0].n_name));
-#endif
- nlist(LOADAV_UNIX, nl);
- if (nl[0].n_value == 0)
- exit(1);
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- avensym=$av;break
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
- if test "$av" = _Loadavg; then
- nlist64='#define nlist nlist64'
- fi
- done
- if test -z "$avensym" ; then
- echo "- no avenrun symbol found" 1>&6
-
- else
- echo "- using avenrun symbol '$avensym'" 1>&6
-
- cat >>confdefs.h <<_ACEOF
-#define LOADAV_AVENRUN "$avensym"
-_ACEOF
-
- if test -n "$nlist64"; then
- echo "- used nlist64 to find it" 1>&6
-
- cat >>confdefs.h <<\_ACEOF
-#define LOADAV_USE_NLIST64 1
-_ACEOF
-
- fi
- load=1
- fi
- else
- echo "Can't configure the load average display feature" 1>&6
-
- echo "because $core is not readable by you." 1>&6
-
- echo "To configure the load average display feature" 1>&6
-
- echo "re-run configure as root if possible." 1>&6
-
- echo "If you are not the system administrator then disregard" 1>&6
-
- echo "this warning. You can still use screen without" 1>&6
-
- echo "the load average display feature." 1>&6
-
- fi
-fi
-fi
-
-cat > conftest.c <<EOF
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-_CUT_HERE_
-
-#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k))
-loadtype=long
-# if defined(apollo) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX)
-loadscale=65536
-# else
-# if defined(FSCALE) && !defined(__osf__)
-# undef FSCALE
-loadscale=FSCALE
-# else
-# ifdef sgi
-loadtype=int
-loadscale=1024
-# else
-# if defined(MIPS) || defined(SVR4) || defined(m88k)
-loadscale=256
-# else /* not MIPS */
-loadscale=1000 /* our default value */
-# endif /* MIPS */
-# endif /* sgi */
-# endif /* not FSCALE */
-# endif /* not apollo */
-#else
-loadtype=double
-loadscale=1
-#endif
-#ifdef alliant
-loadnum=4
-#else
-loadnum=3
-#endif
-
-EOF
-eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out"
-. ./conftest.out
-rm -f conftest*
-
-
-if test -n "$load" ; then cat >>confdefs.h <<\_ACEOF
-#define LOADAV 1
-_ACEOF
- fi
-if test -n "$loadtype" ; then cat >>confdefs.h <<_ACEOF
-#define LOADAV_TYPE $loadtype
-_ACEOF
- fi
-if test -n "$loadnum" ; then cat >>confdefs.h <<_ACEOF
-#define LOADAV_NUM $loadnum
-_ACEOF
- fi
-if test -n "$loadscale" ; then cat >>confdefs.h <<_ACEOF
-#define LOADAV_SCALE $loadscale
-_ACEOF
- fi
-
-if test -n "$posix" ; then
-
-echo "assuming posix signal definition" 1>&6
-
-cat >>confdefs.h <<\_ACEOF
-#define SIGVOID 1
-_ACEOF
-
-
-else
-
-{ echo "$as_me:$LINENO: checking return type of signal handlers..." >&5
-echo "$as_me: checking return type of signal handlers..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <signal.h>
-#ifdef signal
-#undef signal
-#endif
-extern void (*signal ()) ();
-int
-main ()
-{
-int i;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define SIGVOID 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: checking sigset..." >&5
-echo "$as_me: checking sigset..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <signal.h>
-
-int
-main ()
-{
-
-#ifdef SIGVOID
-sigset(0, (void (*)())0);
-#else
-sigset(0, (int (*)())0);
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define USESIGSET 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-{ echo "$as_me:$LINENO: checking signal implementation..." >&5
-echo "$as_me: checking signal implementation..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <sys/types.h>
-#include <signal.h>
-
-#ifndef SIGCLD
-#define SIGCLD SIGCHLD
-#endif
-#ifdef USESIGSET
-#define signal sigset
-#endif
-
-int got;
-
-#ifdef SIGVOID
-void
-#endif
-hand()
-{
- got++;
-}
-
-main()
-{
- /* on hpux we use sigvec to get bsd signals */
-#ifdef __hpux
- (void)signal(SIGCLD, hand);
- kill(getpid(), SIGCLD);
- kill(getpid(), SIGCLD);
- if (got < 2)
- exit(1);
-#endif
- exit(0);
-}
-
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-cat >>confdefs.h <<\_ACEOF
-#define SYSVSIGS 1
-_ACEOF
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-fi
-
-
-{ echo "$as_me:$LINENO: checking for crypt and sec libraries..." >&5
-echo "$as_me: checking for crypt and sec libraries..." >&6;}
-test -f /lib/libcrypt_d.a || test -f /usr/lib/libcrypt_d.a && LIBS="$LIBS -lcrypt_d"
-oldlibs="$LIBS"
-LIBS="$LIBS -lcrypt"
-{ echo "$as_me:$LINENO: checking crypt..." >&5
-echo "$as_me: checking crypt..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-test -f /lib/libsec.a || test -f /usr/lib/libsec.a && LIBS="$LIBS -lsec"
-test -f /lib/libshadow.a || test -f /usr/lib/libshadow.a && LIBS="$LIBS -lshadow"
-oldlibs="$LIBS"
-LIBS="$LIBS -lsun"
-{ echo "$as_me:$LINENO: checking IRIX sun library..." >&5
-echo "$as_me: checking IRIX sun library..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking syslog..." >&5
-echo "$as_me: checking syslog..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-closelog();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-oldlibs="$LIBS"
-LIBS="$LIBS -lbsd"
-{ echo "$as_me:$LINENO: checking syslog in libbsd.a..." >&5
-echo "$as_me: checking syslog in libbsd.a..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-closelog();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "- found." 1>&6
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS="$oldlibs"
-echo "- bad news: syslog missing." 1>&6
- cat >>confdefs.h <<\_ACEOF
-#define NOSYSLOG 1
-_ACEOF
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#ifdef M_UNIX
- yes;
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "yes" >/dev/null 2>&1; then
- LIBS="$LIBS -lsocket -lcrypt_i"
-fi
-rm -f conftest*
-
-
-{ echo "$as_me:$LINENO: checking wait union..." >&5
-echo "$as_me: checking wait union..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <sys/wait.h>
-
-int
-main ()
-{
-
- union wait x;
- int y;
-#ifdef WEXITSTATUS
- y = WEXITSTATUS(x);
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define BSDWAIT 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-
-if test -z "$butterfly"; then
-{ echo "$as_me:$LINENO: checking for termio or termios..." >&5
-echo "$as_me: checking for termio or termios..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <termio.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- cat >>confdefs.h <<\_ACEOF
-#define TERMIO 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- if test -n "$posix"; then
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <termios.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- cat >>confdefs.h <<\_ACEOF
-#define TERMIO 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-rm -f conftest.err conftest.$ac_ext
-fi
-
-fi
-rm -f conftest.err conftest.$ac_ext
-fi
-
-{ echo "$as_me:$LINENO: checking getspnam..." >&5
-echo "$as_me: checking getspnam..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <shadow.h>
-int
-main ()
-{
-getspnam("x");
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define SHADOWPW 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking getttyent..." >&5
-echo "$as_me: checking getttyent..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-getttyent();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define GETTTYENT 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking fdwalk..." >&5
-echo "$as_me: checking fdwalk..." >&6;}
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <stdlib.h>
-int
-main ()
-{
-fdwalk(NULL, NULL);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_FDWALK 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-{ echo "$as_me:$LINENO: checking whether memcpy/memmove/bcopy handles overlapping arguments..." >&5
-echo "$as_me: checking whether memcpy/memmove/bcopy handles overlapping arguments..." >&6;}
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define USEBCOPY 1
-_ACEOF
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#define bcopy(s,d,l) memmove(d,s,l)
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define USEMEMMOVE 1
-_ACEOF
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#define bcopy(s,d,l) memcpy(d,s,l)
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define USEMEMCPY 1
-_ACEOF
-
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-echo "$as_me:$LINENO: checking long file names" >&5
-echo $ECHO_N "checking long file names... $ECHO_C" >&6
-(echo 1 > /tmp/conftest9012345) 2>/dev/null
-(echo 2 > /tmp/conftest9012346) 2>/dev/null
-val=`cat /tmp/conftest9012345 2>/dev/null`
-if test -f /tmp/conftest9012345 && test "$val" = 1; then
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-cat >>confdefs.h <<\_ACEOF
-#define NAME_MAX 14
-_ACEOF
-
-fi
-rm -f /tmp/conftest*
-
-echo "$as_me:$LINENO: checking for vsprintf" >&5
-echo $ECHO_N "checking for vsprintf... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-vsprintf(0,0,0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6;cat >>confdefs.h <<\_ACEOF
-#define USEVARARGS 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-
-
-
-
-
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
- as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
-echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <$ac_hdr>
-
-int
-main ()
-{
-if ((DIR *) 0)
-return 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_Header=yes"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
-_ACEOF
-
-ac_header_dirent=$ac_hdr; break
-fi
-
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
- echo "$as_me:$LINENO: checking for library containing opendir" >&5
-echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
-if test "${ac_cv_search_opendir+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_func_search_save_LIBS=$LIBS
-ac_cv_search_opendir=no
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir ();
-int
-main ()
-{
-opendir ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_opendir="none required"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_opendir" = no; then
- for ac_lib in dir; do
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir ();
-int
-main ()
-{
-opendir ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_opendir="-l$ac_lib"
-break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- done
-fi
-LIBS=$ac_func_search_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
-echo "${ECHO_T}$ac_cv_search_opendir" >&6
-if test "$ac_cv_search_opendir" != no; then
- test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
-
-fi
-
-else
- echo "$as_me:$LINENO: checking for library containing opendir" >&5
-echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
-if test "${ac_cv_search_opendir+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_func_search_save_LIBS=$LIBS
-ac_cv_search_opendir=no
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir ();
-int
-main ()
-{
-opendir ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_opendir="none required"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_opendir" = no; then
- for ac_lib in x; do
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir ();
-int
-main ()
-{
-opendir ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_opendir="-l$ac_lib"
-break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- done
-fi
-LIBS=$ac_func_search_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
-echo "${ECHO_T}$ac_cv_search_opendir" >&6
-if test "$ac_cv_search_opendir" != no; then
- test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
-
-fi
-
-fi
-
-
-echo "$as_me:$LINENO: checking for setenv" >&5
-echo $ECHO_N "checking for setenv... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-setenv((char *)0,(char *)0);unsetenv((char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6;cat >>confdefs.h <<\_ACEOF
-#define USESETENV 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-echo "$as_me:$LINENO: checking for putenv" >&5
-echo $ECHO_N "checking for putenv... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-putenv((char *)0);unsetenv((char *)0);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6;cat >>confdefs.h <<\_ACEOF
-#define NEEDPUTENV 1
-_ACEOF
-
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-echo "$as_me:$LINENO: checking for nl_langinfo(CODESET)" >&5
-echo $ECHO_N "checking for nl_langinfo(CODESET)... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-#include <langinfo.h>
-
-int
-main ()
-{
-nl_langinfo(CODESET);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6;cat >>confdefs.h <<\_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-
-echo "$as_me:$LINENO: checking for library containing gethostname" >&5
-echo $ECHO_N "checking for library containing gethostname... $ECHO_C" >&6
-if test "${ac_cv_search_gethostname+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_func_search_save_LIBS=$LIBS
-ac_cv_search_gethostname=no
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostname ();
-int
-main ()
-{
-gethostname ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_gethostname="none required"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_gethostname" = no; then
- for ac_lib in nsl; do
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostname ();
-int
-main ()
-{
-gethostname ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_search_gethostname="-l$ac_lib"
-break
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- done
-fi
-LIBS=$ac_func_search_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_search_gethostname" >&5
-echo "${ECHO_T}$ac_cv_search_gethostname" >&6
-if test "$ac_cv_search_gethostname" != no; then
- test "$ac_cv_search_gethostname" = "none required" || LIBS="$ac_cv_search_gethostname $LIBS"
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-for ac_func in rename fchmod fchown strerror lstat _exit utimes vsnprintf getcwd setlocale strftime
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-# Check whether --enable-pam or --disable-pam was given.
-if test "${enable_pam+set}" = set; then
- enableval="$enable_pam"
-
-fi;
-if test "$enable_pam" = "yes"; then
- echo "$as_me:$LINENO: checking for PAM support" >&5
-echo $ECHO_N "checking for PAM support... $ECHO_C" >&6
- oldlibs="$LIBS"
- LIBS="$LIBS -lpam"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-#include <security/pam_appl.h>
-int
-main ()
-{
-
- pam_start(0, 0, 0, 0);
- pam_authenticate(0, 0);
- pam_end(0,0);
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6;cat >>confdefs.h <<\_ACEOF
-#define USE_PAM 1
-_ACEOF
-
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6;LIBS="$oldlibs"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-
-# Check whether --enable-use_locale or --disable-use_locale was given.
-if test "${enable_use_locale+set}" = set; then
- enableval="$enable_use_locale"
-
-fi;
-if test "$enable_use_locale" = "yes"; then
- cat >>confdefs.h <<\_ACEOF
-#define USE_LOCALE 1
-_ACEOF
-
-fi
-# Check whether --enable-telnet or --disable-telnet was given.
-if test "${enable_telnet+set}" = set; then
- enableval="$enable_telnet"
-
-fi;
-if test "$enable_telnet" = "yes"; then
- cat >>confdefs.h <<\_ACEOF
-#define BUILTIN_TELNET 1
-_ACEOF
-
-fi
-# Check whether --enable-colors256 or --disable-colors256 was given.
-if test "${enable_colors256+set}" = set; then
- enableval="$enable_colors256"
-
-fi;
-if test "$enable_colors256" = "yes"; then
- cat >>confdefs.h <<\_ACEOF
-#define COLORS256 1
-_ACEOF
-
-fi
-# Check whether --enable-rxvt_osc or --disable-rxvt_osc was given.
-if test "${enable_rxvt_osc+set}" = set; then
- enableval="$enable_rxvt_osc"
-
-fi;
-if test "$enable_rxvt_osc" = "yes"; then
- cat >>confdefs.h <<\_ACEOF
-#define RXVT_OSC 1
-_ACEOF
-
-fi
-
-if test -z "$old_CFLAGS"; then
- if test "x$CFLAGS" = "x-g"; then
- CFLAGS="-O"
- fi
-fi
-test -n "$seqptx" && LIBS="-ltermcap -lc -lsocket -linet -lnsl -lsec -lseq"
-
-if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-main(){exit(0);}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: Can't run the compiler - internal error. Sorry." >&5
-echo "$as_me: error: Can't run the compiler - internal error. Sorry." >&2;}
- { (exit 1); exit 1; }; }
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-ETCSCREENRC="\"/usr/local/etc/screenrc\""
-if test -n "$prefix"; then
-ETCSCREENRC="\"$prefix/etc/screenrc\""
-fi
-echo "$as_me:$LINENO: checking for the global screenrc file" >&5
-echo $ECHO_N "checking for the global screenrc file... $ECHO_C" >&6
-
-# Check whether --with-sys-screenrc or --without-sys-screenrc was given.
-if test "${with_sys_screenrc+set}" = set; then
- withval="$with_sys_screenrc"
- ETCSCREENRC="\"${withval}\""
-fi;
-cat >>confdefs.h <<_ACEOF
-#define ETCSCREENRC $ETCSCREENRC
-_ACEOF
-
-echo "$as_me:$LINENO: result: $ETCSCREENRC" >&5
-echo "${ECHO_T}$ETCSCREENRC" >&6
-
-SCREENENCODINGS="\"/usr/local/lib/screen/utf8encodings\""
-if test -n "$datadir"; then
-eval SCREENENCODINGS="$datadir/screen/utf8encodings"
-SCREENENCODINGS="\"$SCREENENCODINGS\""
-fi
-echo "$as_me:$LINENO: checking for the utf8-encodings location" >&5
-echo $ECHO_N "checking for the utf8-encodings location... $ECHO_C" >&6
-cat >>confdefs.h <<_ACEOF
-#define SCREENENCODINGS $SCREENENCODINGS
-_ACEOF
-
-echo "$as_me:$LINENO: result: $SCREENENCODINGS" >&5
-echo "${ECHO_T}$SCREENENCODINGS" >&6
-
- ac_config_files="$ac_config_files Makefile doc/Makefile"
- ac_config_commands="$ac_config_commands default"
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems. If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
- (set) 2>&1 |
- case `(ac_space=' '; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \).
- sed -n \
- "s/'/'\\\\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
- ;;
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n \
- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
- ;;
- esac;
-} |
- sed '
- t clear
- : clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
- t end
- /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
- : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
- if test -w $cache_file; then
- test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
- cat confcache >$cache_file
- else
- echo "not updating unwritable cache $cache_file"
- fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[ ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[ ]*$//;
-}'
-fi
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_i=`echo "$ac_i" |
- sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
- # 2. Add them.
- ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
- ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
- LC_TELEPHONE LC_TIME
-do
- if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
- eval $as_var=C; export $as_var
- else
- $as_unset $as_var
- fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)$' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
- /^X\/\(\/\/\)$/{ s//\1/; q; }
- /^X\/\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
-fi
-
-
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" || {
- # Find who we are. Look in the path if we contain no path at all
- # relative or not.
- case $0 in
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
- ;;
- esac
- # We did not find ourselves, most probably we were run as `sh COMMAND'
- # in which case we are not to be found in the path.
- if test "x$as_myself" = x; then
- as_myself=$0
- fi
- if test ! -f "$as_myself"; then
- { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
- { (exit 1); exit 1; }; }
- fi
- case $CONFIG_SHELL in
- '')
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for as_base in sh bash ksh sh5; do
- case $as_dir in
- /*)
- if ("$as_dir/$as_base" -c '
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
- $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
- $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
- CONFIG_SHELL=$as_dir/$as_base
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" ${1+"$@"}
- fi;;
- esac
- done
-done
-;;
- esac
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line before each line; the second 'sed' does the real
- # work. The second script uses 'N' to pair each line-number line
- # with the numbered line, and appends trailing '-' during
- # substitution so that $LINENO is not a special case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
- sed '=' <$as_myself |
- sed '
- N
- s,$,-,
- : loop
- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
- t loop
- s,-$,,
- s,^['$as_cr_digits']*\n,,
- ' >$as_me.lineno &&
- chmod +x $as_me.lineno ||
- { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
- { (exit 1); exit 1; }; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensible to this).
- . ./$as_me.lineno
- # Exit status is that of the last command.
- exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
- *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T=' ' ;;
- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
- *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- # We could just check for DJGPP; but this test a) works b) is more generic
- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
- if test -f conf$$.exe; then
- # Don't use ln at all; we don't have any links
- as_ln_s='cp -p'
- else
- as_ln_s='ln -s'
- fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p=:
-else
- as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" $as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling. Logging --version etc. is OK.
-exec 5>>config.log
-{
- echo
- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by $as_me, which was
-generated by GNU Autoconf 2.57. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
- CONFIG_LINKS = $CONFIG_LINKS
- CONFIG_COMMANDS = $CONFIG_COMMANDS
- $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
-
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
- echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_headers"; then
- echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
- echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
- echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
- -h, --help print this help, then exit
- -V, --version print version number, then exit
- -q, --quiet do not print progress messages
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-config.status
-configured by $0, generated by GNU Autoconf 2.57,
- with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value. By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
- case $1 in
- --*=*)
- ac_option=`expr "x$1" : 'x\([^=]*\)='`
- ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
- ac_shift=:
- ;;
- -*)
- ac_option=$1
- ac_optarg=$2
- ac_shift=shift
- ;;
- *) # This is not an option, so the user has probably given explicit
- # arguments.
- ac_option=$1
- ac_need_defaults=false;;
- esac
-
- case $ac_option in
- # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- ac_cs_recheck=: ;;
- --version | --vers* | -V )
- echo "$ac_cs_version"; exit 0 ;;
- --he | --h)
- # Conflict between --help and --header
- { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
- { (exit 1); exit 1; }; };;
- --help | --hel | -h )
- echo "$ac_cs_usage"; exit 0 ;;
- --debug | --d* | -d )
- debug=: ;;
- --file | --fil | --fi | --f )
- $ac_shift
- CONFIG_FILES="$CONFIG_FILES $ac_optarg"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- $ac_shift
- CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
- ac_need_defaults=false;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil | --si | --s)
- ac_cs_silent=: ;;
-
- # This is an error.
- -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
- { (exit 1); exit 1; }; } ;;
-
- *) ac_config_targets="$ac_config_targets $1" ;;
-
- esac
- shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
- exec 6>/dev/null
- ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
- echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
- exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-
-
-
-
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
- case "$ac_config_target" in
- # Handling of arguments.
- "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
- "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
- "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
- "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used. Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience. Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
- trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
- trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-
-{
- tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
-} ||
-{
- tmp=./confstat$$-$RANDOM
- (umask 077 && mkdir $tmp)
-} ||
-{
- echo "$me: cannot create a temporary directory in ." >&2
- { (exit 1); exit 1; }
-}
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
- # Protect against being on the right side of a sed subst in config.status.
- sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
- s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@VERSION@,$VERSION,;t t
-s,@ac_prefix_program@,$ac_prefix_program,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@CPP@,$CPP,;t t
-s,@EGREP@,$EGREP,;t t
-s,@AWK@,$AWK,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@WRITEPATH@,$WRITEPATH,;t t
-s,@XTERMPATH@,$XTERMPATH,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
-
-_ACEOF
-
- cat >>$CONFIG_STATUS <<\_ACEOF
- # Split the substitutions into bite-sized pieces for seds with
- # small command number limits, like on Digital OSF/1 and HP-UX.
- ac_max_sed_lines=48
- ac_sed_frag=1 # Number of current file.
- ac_beg=1 # First line for current file.
- ac_end=$ac_max_sed_lines # Line after last line for current file.
- ac_more_lines=:
- ac_sed_cmds=
- while $ac_more_lines; do
- if test $ac_beg -gt 1; then
- sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
- else
- sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
- fi
- if test ! -s $tmp/subs.frag; then
- ac_more_lines=false
- else
- # The purpose of the label and of the branching condition is to
- # speed up the sed processing (if there are no `@' at all, there
- # is no need to browse any of the substitutions).
- # These are the two extra sed commands mentioned above.
- (echo ':t
- /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
- else
- ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
- fi
- ac_sed_frag=`expr $ac_sed_frag + 1`
- ac_beg=$ac_end
- ac_end=`expr $ac_end + $ac_max_sed_lines`
- fi
- done
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds=cat
- fi
-fi # test -n "$CONFIG_FILES"
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case $ac_file in
- - | *:- | *:-:* ) # input from stdin
- cat >$tmp/stdin
- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- * ) ac_file_in=$ac_file.in ;;
- esac
-
- # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
- ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- { if $as_mkdir_p; then
- mkdir -p "$ac_dir"
- else
- as_dir="$ac_dir"
- as_dirs=
- while test ! -d "$as_dir"; do
- as_dirs="$as_dir $as_dirs"
- as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- done
- test ! -n "$as_dirs" || mkdir $as_dirs
- fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }; }
-
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
-
- case $INSTALL in
- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
- *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
- esac
-
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- if test x"$ac_file" = x-; then
- configure_input=
- else
- configure_input="$ac_file. "
- fi
- configure_input=$configure_input"Generated from `echo $ac_file_in |
- sed 's,.*/,,'` by configure."
-
- # First look for the input files in the build tree, otherwise in the
- # src tree.
- ac_file_inputs=`IFS=:
- for f in $ac_file_in; do
- case $f in
- -) echo $tmp/stdin ;;
- [\\/$]*)
- # Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- echo $f;;
- *) # Relative
- if test -f "$f"; then
- # Build tree
- echo $f
- elif test -f "$srcdir/$f"; then
- # Source tree
- echo $srcdir/$f
- else
- # /dev/null tree
- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- fi;;
- esac
- done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
- sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
- rm -f $tmp/stdin
- if test x"$ac_file" != x-; then
- mv $tmp/out $ac_file
- else
- cat $tmp/out
- rm -f $tmp/out
- fi
-
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='[ ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case $ac_file in
- - | *:- | *:-:* ) # input from stdin
- cat >$tmp/stdin
- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- * ) ac_file_in=$ac_file.in ;;
- esac
-
- test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
- # First look for the input files in the build tree, otherwise in the
- # src tree.
- ac_file_inputs=`IFS=:
- for f in $ac_file_in; do
- case $f in
- -) echo $tmp/stdin ;;
- [\\/$]*)
- # Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- echo $f;;
- *) # Relative
- if test -f "$f"; then
- # Build tree
- echo $f
- elif test -f "$srcdir/$f"; then
- # Source tree
- echo $srcdir/$f
- else
- # /dev/null tree
- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- fi;;
- esac
- done` || { (exit 1); exit 1; }
- # Remove the trailing spaces.
- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h. The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status. Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless. Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo ' :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
- # Write a limited-size here document to $tmp/defines.sed.
- echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#define' lines.
- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/defines.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
- rm -f conftest.defines
- mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo ' fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
- # Write a limited-size here document to $tmp/undefs.sed.
- echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#undef'
- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/undefs.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
- rm -f conftest.undefs
- mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
-cat >>$CONFIG_STATUS <<\_ACEOF
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- if test x"$ac_file" = x-; then
- echo "/* Generated by configure. */" >$tmp/config.h
- else
- echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
- fi
- cat $tmp/in >>$tmp/config.h
- rm -f $tmp/in
- if test x"$ac_file" != x-; then
- if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
- { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
- else
- ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- { if $as_mkdir_p; then
- mkdir -p "$ac_dir"
- else
- as_dir="$ac_dir"
- as_dirs=
- while test ! -d "$as_dir"; do
- as_dirs="$as_dir $as_dirs"
- as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- done
- test ! -n "$as_dirs" || mkdir $as_dirs
- fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }; }
-
- rm -f $ac_file
- mv $tmp/config.h $ac_file
- fi
- else
- cat $tmp/config.h
- rm -f $tmp/config.h
- fi
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
- ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
- ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_dest" : 'X\(//\)[^/]' \| \
- X"$ac_dest" : 'X\(//\)$' \| \
- X"$ac_dest" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
-
- { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
- case $ac_dest in
- default )
-# a hook for preserving undef directive in config.h
-mv config.h conftest
-sed -e 's@^\(.*\)defin.\( .*\) .*/\*\(.*KEEP_UNDEF_HERE\)@\1undef\2 /\*\3@' < conftest > config.h
-rm -f conftest
- ;;
- esac
-done
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded. So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status. When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
- ac_cs_success=:
- ac_config_status_args=
- test "$silent" = yes &&
- ac_config_status_args="$ac_config_status_args --quiet"
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
- $ac_cs_success || { (exit 1); exit 1; }
-fi
-
-
-echo ""
-if test -z "$AWK"; then
-echo "!!! Since you have no awk you must copy the files 'comm.h.dist'"
-echo "!!! and 'term.h.dist' to 'comm.h' and 'term.h'."
-echo "!!! Do _not_ change the user configuration section in config.h!"
-echo "Please check the pathnames in the Makefile."
-else
-echo "Now please check the pathnames in the Makefile and in the user"
-echo "configuration section in config.h."
-fi
-echo "Then type 'make' to make screen. Good luck."
-echo ""
diff --git a/src/configure.in b/src/configure.in
deleted file mode 100644
index 27f229a..0000000
--- a/src/configure.in
+++ /dev/null
@@ -1,1307 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl $Id$ FAU
-dnl
-dnl Many thanks to David MacKenzie for writing autoconf and
-dnl providing a sample configure.in file for screen.
-dnl
-AC_REVISION($Revision$)dnl
-AC_INIT(screen.c)
-AC_CONFIG_HEADER(config.h)
-
-dnl
-dnl Define some useful macros
-dnl
-AC_DEFUN(AC_PROGRAM_SOURCE,
-[AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <<EOF
-#include "confdefs.h"
-[$1]
-_CUT_HERE_
-[$2]
-EOF
-eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out"
-. ./conftest.out
-rm -f conftest*
-])dnl
-dnl
-define(AC_NOTE,
-[echo "$1" 1>&AC_FD_MSG
-])dnl
-
-dnl
-dnl Extract version from patchlevel.h
-dnl
-rev=`sed < ${srcdir}/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`
-vers=`sed < ${srcdir}/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`
-pat=`sed < ${srcdir}/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`
-VERSION="$rev.$vers.$pat"
-AC_NOTE(this is screen version $VERSION)
-AC_SUBST(VERSION)
-AC_PREFIX_PROGRAM(screen)
-AC_PREFIX_PROGRAM(gzip)
-
-old_CFLAGS="$CFLAGS"
-AC_PROG_CC
-AC_PROG_CPP
-AC_PROG_GCC_TRADITIONAL
-AC_ISC_POSIX
-
-AC_TRY_RUN(main(){exit(0);},,[
-if test $CC != cc ; then
-AC_NOTE(Your $CC failed - restarting with CC=cc)
-AC_NOTE()
-CC=cc
-export CC
-exec $0 $configure_args
-fi
-])
-
-AC_TRY_RUN(main(){exit(0);},,
-exec 5>&2
-eval $ac_link
-AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;)
-AC_NOTE($ac_compile)
-AC_MSG_ERROR(Can't run the compiler - sorry))
-
-AC_TRY_RUN([
-main()
-{
- int __something_strange_();
- __something_strange_(0);
-}
-],AC_MSG_ERROR(Your compiler does not set the exit status - sorry))
-
-AC_PROG_AWK
-
-AC_PROG_INSTALL
-
-if test -f etc/toolcheck; then
-AC_CHECKING(for buggy tools)
-sh etc/toolcheck 1>&AC_FD_MSG
-fi
-
-
-
-dnl SOCKDIR
-AC_MSG_CHECKING(if a system-wide socket dir should be used)
-AC_ARG_ENABLE(socket-dir,
- [ --disable-socket-dir disable system wide socket-dir and use ~/.screen instead],
- [
- AC_MSG_RESULT(no. ~/.screen will be used instead.)
- ],
- [
- AC_MSG_RESULT(yes)
- AC_MSG_CHECKING(for the socket dir)
- SOCKDIR="(eff_uid ? \"/tmp/uscreens\" : \"/tmp/screens\")"
- AC_ARG_WITH(socket-dir, [ --with-socket-dir=path where to put the per-user sockets], [ SOCKDIR="\"${withval}\"" ])
- AC_MSG_RESULT(${SOCKDIR})
- AC_DEFINE_UNQUOTED(SOCKDIR, $SOCKDIR)
- ]
-)
-
-
-dnl
-dnl **** special unix variants ****
-dnl
-if test -n "$ISC"; then
- AC_DEFINE(ISC) LIBS="$LIBS -linet"
-fi
-
-dnl AC_CHECKING(for OSF1)
-dnl if test -f /bin/uname ; then
-dnl if test `/bin/uname` = OSF1 || test -f /osf_boot; then
-dnl AC_DEFINE(OSF1) # this disables MIPS again....
-dnl fi
-dnl fi
-
-if test -f /sysV68 ; then
-AC_DEFINE(sysV68)
-fi
-
-AC_CHECKING(for MIPS)
-if test -f /lib/libmld.a || test -f /usr/lib/libmld.a || test -f /usr/lib/cmplrs/cc/libmld.a; then
-oldlibs="$LIBS"
-test -f /bin/mx || LIBS="$LIBS -lmld" # for nlist. But not on alpha.
-dnl djm@eng.umd.edu: "... for one thing, it doubles the size of the executable"
-AC_CHECKING(mld library)
-AC_TRY_LINK(,,,LIBS="$oldlibs")
-dnl
-dnl
-if test -r /dev/ptc; then
-AC_DEFINE(MIPS)
-AC_CHECKING(wait3)
-AC_TRY_LINK(,[wait3();], ,
-AC_CHECKING(wait2)
-AC_TRY_LINK(,[wait2();],
-dnl John Rouillard (rouilj@sni-usa.com):
-dnl need -I/usr/include/bsd in RISCOS otherwise sockets are broken, no
-dnl job control etc.
-dnl Detect RISCOS if wait2 is present, but not wait3.
-AC_DEFINE(USE_WAIT2) LIBS="$LIBS -lbsd" ; CC="$CC -I/usr/include/bsd"
-))
-fi
-fi
-
-
-AC_CHECKING(for Ultrix)
-AC_EGREP_CPP(yes,
-[#if defined(ultrix) || defined(__ultrix)
- yes;
-#endif
-], ULTRIX=1)
-
-if test -f /usr/lib/libpyr.a ; then
-oldlibs="$LIBS"
-LIBS="$LIBS -lpyr"
-AC_CHECKING(Pyramid OSX)
-AC_TRY_LINK(,[open_controlling_pty("")], AC_DEFINE(OSX), LIBS="$oldlibs")
-fi
-
-dnl ghazi@caip.rutgers.edu (Kaveh R. Ghazi):
-dnl BBN butterfly is not POSIX, but a MACH BSD system.
-dnl Do not define POSIX and TERMIO.
-AC_CHECKING(for butterfly)
-AC_EGREP_CPP(yes,
-[#if defined(butterfly)
- yes;
-#endif
-], butterfly=1)
-
-if test -z "$butterfly"; then
-if test -n "$ULTRIX"; then
- test -z "$GCC" && CC="$CC -YBSD"
-fi
-AC_CHECKING(for POSIX.1)
-AC_EGREP_CPP(yes,
-[#include <sys/types.h>
-#include <unistd.h>
-main () {
-#ifdef _POSIX_VERSION
- yes;
-#endif
-], AC_NOTE(- you have a POSIX system) AC_DEFINE(POSIX) posix=1)
-fi
-
-AC_CHECKING(for System V)
-AC_TRY_COMPILE(
-[#include <sys/types.h>
-#include <signal.h>
-#include <fcntl.h>], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV))
-
-AC_CHECKING(for sequent/ptx)
-AC_EGREP_CPP(yes,
-[#ifdef _SEQUENT_
- yes;
-#endif
-], LIBS="$LIBS -lsocket -linet";seqptx=1)
-
-oldlibs="$LIBS"
-LIBS="$LIBS -lelf"
-AC_CHECKING(SVR4)
-AC_TRY_LINK([#include <utmpx.h>
-],,
-[AC_CHECK_HEADER(dwarf.h, AC_DEFINE(SVR4) AC_DEFINE(BUGGYGETLOGIN),
-[AC_CHECK_HEADER(elf.h, AC_DEFINE(SVR4) AC_DEFINE(BUGGYGETLOGIN))])]
-,LIBS="$oldlibs")
-
-AC_CHECKING(for Solaris 2.x)
-AC_EGREP_CPP(yes,
-[#if defined(SVR4) && defined(sun)
- yes
-#endif
-], LIBS="$LIBS -lsocket -lnsl -lkstat")
-
-dnl
-dnl **** typedefs ****
-dnl
-dnl (currently not used)
-dnl
-dnl AC_CHECKING(for pid_t)
-dnl AC_EGREP_CPP(pid_t,[#include <sys/types.h>
-dnl ],AC_DEFINE(PID_T_DEFINED))
-dnl
-dnl AC_CHECKING(for sig_t)
-dnl AC_EGREP_CPP(sig_t,[#include <sys/types.h>
-dnl #include <signal.h>
-dnl ],AC_DEFINE(SIG_T_DEFINED))
-dnl
-dnl AC_CHECKING(for uid_t)
-dnl AC_EGREP_CPP(uid_t,[#include <sys/types.h>
-dnl ],AC_DEFINE(UID_T_DEFINED))
-dnl
-
-dnl
-dnl **** Job control ****
-dnl
-
-AC_CHECKING(BSD job jontrol)
-AC_TRY_LINK(
-[#include <sys/types.h>
-#include <sys/ioctl.h>
-], [
-#ifdef POSIX
-tcsetpgrp(0, 0);
-#else
-int x = TIOCSPGRP;
-#ifdef SYSV
-setpgrp();
-#else
-int y = TIOCNOTTY;
-#endif
-#endif
-], AC_NOTE(- you have jobcontrol) AC_DEFINE(BSDJOBS), AC_NOTE(- you don't have jobcontrol))
-
-dnl
-dnl **** setreuid(), seteuid() ****
-dnl
-AC_CHECKING(setreuid)
-AC_TRY_LINK(,[
-#ifdef __hpux
-setresuid(0, 0, 0);
-#else
-setreuid(0, 0);
-#endif
-], AC_DEFINE(HAVE_SETREUID))
-dnl
-dnl seteuid() check:
-dnl linux seteuid was broken before V1.1.11
-dnl NeXT, AUX, ISC, and ultrix are still broken (no saved uid support)
-dnl Solaris seteuid doesn't change the saved uid, bad for
-dnl multiuser screen sessions
-AC_CHECKING(seteuid)
-AC_TRY_LINK(,[
-#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(sun) && defined(SVR4)) || defined(ISC) || defined(sony_news)
-seteuid_is_broken(0);
-#else
-seteuid(0);
-#endif
-], AC_DEFINE(HAVE_SETEUID))
-
-dnl
-dnl **** select() ****
-dnl
-
-AC_CHECKING(select)
-AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
-LIBS="$LIBS -lnet -lnsl"
-AC_CHECKING(select with $LIBS)
-AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
-AC_MSG_ERROR(!!! no select - no screen))
-)
-dnl
-dnl **** FIFO tests ****
-dnl
-
-AC_CHECKING(fifos)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-char *fin = "/tmp/conftest$$";
-
-main()
-{
- struct stat stb;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
-#ifdef POSIX
- if (mkfifo(fin, 0777))
-#else
- if (mknod(fin, S_IFIFO|0777, 0))
-#endif
- exit(1);
- if (stat(fin, &stb) || (stb.st_mode & S_IFIFO) != S_IFIFO)
- exit(1);
- close(0);
-#ifdef __386BSD__
- /*
- * The next test fails under 386BSD, but screen works using fifos.
- * Fifos in O_RDWR mode are only used for the BROKEN_PIPE case and for
- * the select() configuration test.
- */
- exit(0);
-#endif
- if (open(fin, O_RDONLY | O_NONBLOCK))
- exit(1);
- if (fork() == 0)
- {
- close(0);
- if (open(fin, O_WRONLY | O_NONBLOCK))
- exit(1);
- close(0);
- if (open(fin, O_WRONLY | O_NONBLOCK))
- exit(1);
- if (write(0, "TEST", 4) == -1)
- exit(1);
- exit(0);
- }
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- exit(0);
-}
-], AC_NOTE(- your fifos are usable) fifo=1,
-AC_NOTE(- your fifos are not usable))
-rm -f /tmp/conftest*
-
-if test -n "$fifo"; then
-AC_CHECKING(for broken fifo implementation)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-char *fin = "/tmp/conftest$$";
-
-main()
-{
- struct timeval tv;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
-#ifdef POSIX
- if (mkfifo(fin, 0600))
-#else
- if (mknod(fin, S_IFIFO|0600, 0))
-#endif
- exit(1);
- close(0);
- if (open(fin, O_RDONLY|O_NONBLOCK))
- exit(1);
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- if (select(1, &f, 0, 0, &tv))
- exit(1);
- exit(0);
-}
-], AC_NOTE(- your implementation is ok),
-AC_NOTE(- you have a broken implementation) AC_DEFINE(BROKEN_PIPE) fifobr=1)
-rm -f /tmp/conftest*
-fi
-
-dnl
-dnl **** SOCKET tests ****
-dnl
-dnl may need LIBS="$LIBS -lsocket" here
-dnl
-
-AC_CHECKING(sockets)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <fcntl.h>
-
-char *son = "/tmp/conftest$$";
-
-main()
-{
- int s1, s2, l;
- struct sockaddr_un a;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
- if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(1);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, son);
- (void) unlink(son);
- if (bind(s1, (struct sockaddr *) &a, strlen(son)+2) == -1)
- exit(1);
- if (listen(s1, 2))
- exit(1);
- if (fork() == 0)
- {
- if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- kill(getppid(), 3);
- (void)connect(s2, (struct sockaddr *)&a, strlen(son) + 2);
- if (write(s2, "HELLO", 5) == -1)
- kill(getppid(), 3);
- exit(0);
- }
- l = sizeof(a);
- close(0);
- if (accept(s1, &a, &l))
- exit(1);
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- exit(0);
-}
-], AC_NOTE(- your sockets are usable) sock=1,
-AC_NOTE(- your sockets are not usable))
-rm -f /tmp/conftest*
-
-if test -n "$sock"; then
-AC_CHECKING(socket implementation)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-char *son = "/tmp/conftest$$";
-
-main()
-{
- int s;
- struct stat stb;
- struct sockaddr_un a;
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(0);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, son);
- (void) unlink(son);
- if (bind(s, (struct sockaddr *) &a, strlen(son)+2) == -1)
- exit(0);
- if (stat(son, &stb))
- exit(1);
- close(s);
- exit(0);
-}
-],AC_NOTE(- you are normal),
-AC_NOTE(- unix domain sockets are not kept in the filesystem)
-AC_DEFINE(SOCK_NOT_IN_FS) socknofs=1)
-rm -f /tmp/conftest*
-fi
-
-
-dnl
-dnl **** choose sockets or fifos ****
-dnl
-if test -n "$fifo"; then
- if test -n "$sock"; then
- if test -n "$nore"; then
- AC_NOTE(- hmmm... better take the fifos)
- AC_DEFINE(NAMEDPIPE)
- elif test -n "$fifobr"; then
- AC_NOTE(- as your fifos are broken lets use the sockets.)
- else
- AC_NOTE(- both sockets and fifos usable. let's take fifos.)
- AC_DEFINE(NAMEDPIPE)
- fi
- else
- AC_NOTE(- using named pipes, of course)
- AC_DEFINE(NAMEDPIPE)
- fi
-elif test -n "$sock"; then
- AC_NOTE(- using unix-domain sockets, of course)
-else
- AC_MSG_ERROR(you have neither usable sockets nor usable pipes -> no screen)
-fi
-
-dnl
-dnl **** check the select implementation ****
-dnl
-
-AC_CHECKING(select return value)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-char *nam = "/tmp/conftest$$";
-
-#ifdef NAMEDPIPE
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-
-
-main()
-{
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
-#ifdef __FreeBSD__
-/* From Andrew A. Chernov (ache@astral.msk.su):
- * opening RDWR fifo fails in BSD 4.4, but select return values are
- * right.
- */
- exit(0);
-#endif
- (void)alarm(5);
-#ifdef POSIX
- if (mkfifo(nam, 0777))
-#else
- if (mknod(nam, S_IFIFO|0777, 0))
-#endif
- exit(1);
- close(0);
- if (open(nam, O_RDWR | O_NONBLOCK))
- exit(1);
- if (write(0, "TEST", 4) == -1)
- exit(1);
-
-#else
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-main()
-{
- int s1, s2, l;
- struct sockaddr_un a;
-#ifdef FD_SET
- fd_set f;
-#else
- int f;
-#endif
-
- (void)alarm(5);
- if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- exit(1);
- a.sun_family = AF_UNIX;
- strcpy(a.sun_path, nam);
- (void) unlink(nam);
- if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
- exit(1);
- if (listen(s1, 2))
- exit(1);
- if (fork() == 0)
- {
- if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- kill(getppid(), 3);
- (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
- if (write(s2, "HELLO", 5) == -1)
- kill(getppid(), 3);
- exit(0);
- }
- l = sizeof(a);
- close(0);
- if (accept(s1, (struct sockaddr *)&a, &l))
- exit(1);
-#endif
-
-
-#ifdef FD_SET
- FD_SET(0, &f);
-#else
- f = 1;
-#endif
- if (select(1, &f, 0, 0, 0) == -1)
- exit(1);
- if (select(1, &f, &f, 0, 0) != 2)
- exit(1);
- exit(0);
-}
-],AC_NOTE(- select is ok),
-AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN))
-
-dnl
-dnl **** termcap or terminfo ****
-dnl
-AC_CHECKING(for tgetent)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
-olibs="$LIBS"
-LIBS="-lcurses $olibs"
-AC_CHECKING(libcurses)
-AC_TRY_LINK(,[
-#ifdef __hpux
-__sorry_hpux_libcurses_is_totally_broken_in_10_10();
-#else
-tgetent((char *)0, (char *)0);
-#endif
-],,
-LIBS="-ltermcap $olibs"
-AC_CHECKING(libtermcap)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
-LIBS="-ltermlib $olibs"
-AC_CHECKING(libtermlib)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
-LIBS="-lncurses $olibs"
-AC_CHECKING(libncurses)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
-AC_MSG_ERROR(!!! no tgetent - no screen))))))
-
-AC_TRY_RUN([
-main()
-{
- exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
-}], AC_NOTE(- you use the termcap database),
-AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO))
-AC_CHECKING(ospeed)
-AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED))
-
-dnl
-dnl **** PTY specific things ****
-dnl
-AC_CHECKING(for /dev/ptc)
-if test -r /dev/ptc; then
-AC_DEFINE(HAVE_DEV_PTC)
-fi
-
-AC_CHECKING(for SVR4 ptys)
-sysvr4ptys=
-if test -c /dev/ptmx ; then
-AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS)
-sysvr4ptys=1])
-fi
-
-AC_CHECK_FUNCS(getpt)
-
-dnl check for openpty()
-if test -z "$sysvr4ptys"; then
-AC_CHECK_FUNCS(openpty,,
-[AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])])
-fi
-
-AC_CHECKING(for ptyranges)
-if test -d /dev/ptym ; then
-pdir='/dev/ptym'
-else
-pdir='/dev'
-fi
-dnl SCO uses ptyp%d
-AC_EGREP_CPP(yes,
-[#ifdef M_UNIX
- yes;
-#endif
-], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`)
-dnl if test -c /dev/ptyp19; then
-dnl ptys=`echo /dev/ptyp??`
-dnl else
-dnl ptys=`echo $pdir/pty??`
-dnl fi
-if test "$ptys" != "$pdir/pty??" ; then
-p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
-p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'`
-AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0")
-AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1")
-fi
-
-dnl **** pty mode/group handling ****
-dnl
-dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222
-AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ])
-AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ])
-test -n "$ptymode" || ptymode=0620
-if test -n "$ptygrp" ; then
-AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
-AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
-else
-
-AC_CHECKING(default tty permissions/group)
-rm -f conftest_grp
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-main()
-{
- struct stat sb;
- char *x,*ttyname();
- int om, m;
- FILE *fp;
-
- if (!(x = ttyname(0))) exit(1);
- if (stat(x, &sb)) exit(1);
- om = sb.st_mode;
- if (om & 002) exit(0);
- m = system("mesg y");
- if (m == -1 || m == 127) exit(1);
- if (stat(x, &sb)) exit(1);
- m = sb.st_mode;
- if (chmod(x, om)) exit(1);
- if (m & 002) exit(0);
- if (sb.st_gid == getgid()) exit(1);
- if (!(fp=fopen("conftest_grp", "w")))
- exit(1);
- fprintf(fp, "%d\n", sb.st_gid);
- fclose(fp);
- exit(0);
-}
-],[
- if test -f conftest_grp; then
- ptygrp=`cat conftest_grp`
- AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
- AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
- AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
- else
- AC_NOTE(- ptys are world accessable)
- fi
-],[
- WRITEPATH=''
- XTERMPATH=''
- AC_PATH_PROG(WRITEPATH, write)
- AC_PATH_PROG(XTERMPATH, xterm)
- found=
- if test -n "$WRITEPATH$XTERMPATH"; then
- findfollow=
- lsfollow=
- found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
- if test -n "$found"; then
- findfollow=-follow
- lsfollow=L
- fi
- if test -n "$XTERMPATH"; then
- ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
- if test tty != "$ptygrpn"; then
- XTERMPATH=
- fi
- fi
- fi
- if test -n "$WRITEPATH$XTERMPATH"; then
- found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
- if test -n "$found"; then
- ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
- AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
- AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
- AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
- else
- AC_NOTE(- ptys are world accessable)
- fi
- else
- AC_NOTE(- can't determine - assume ptys are world accessable)
- fi
- ]
-)
-rm -f conftest_grp
-fi
-
-dnl
-dnl **** utmp handling ****
-dnl
-AC_CHECKING(getutent)
-AC_TRY_LINK([
-#include <time.h> /* to get time_t on SCO */
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-#ifdef __hpux
-#define pututline _pututline
-#endif
-],
-[int x = DEAD_PROCESS; pututline((struct utmp *)0); getutent();], AC_DEFINE(GETUTENT),
-olibs="$LIBS"
-LIBS="$LIBS -lgen"
-AC_CHECKING(getutent with -lgen)
-AC_TRY_LINK([
-#include <time.h>
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-#ifdef __hpux
-#define pututline _pututline
-#endif
-],
-[int x = DEAD_PROCESS; pututline((struct utmp *)0); getutent();], AC_DEFINE(GETUTENT), LIBS="$olibs")
-)
-AC_CHECKING(ut_host)
-AC_TRY_COMPILE([
-#include <time.h>
-#include <sys/types.h>
-#if defined(SVR4) && !defined(DGUX)
-#include <utmpx.h>
-#define utmp utmpx
-#else
-#include <utmp.h>
-#endif
-],[struct utmp u; u.ut_host[0] = 0;], AC_DEFINE(UTHOST))
-AC_CHECK_HEADER(utempter.h, have_utempter=yes, have_utempter=no)
-if test "$have_utempter" = yes; then
- AC_DEFINE(HAVE_UTEMPTER)
- LIBS="$LIBS -lutempter"
-fi
-
-dnl
-dnl **** loadav ****
-dnl
-AC_CHECKING(for libutil(s))
-test -f /usr/lib/libutils.a && LIBS="$LIBS -lutils"
-test -f /usr/lib/libutil.a && LIBS="$LIBS -lutil"
-
-AC_CHECKING(getloadavg)
-AC_TRY_LINK(,[getloadavg((double *)0, 0);],
-AC_DEFINE(LOADAV_GETLOADAVG) load=1,
-if test -f /usr/lib/libkvm.a ; then
-olibs="$LIBS"
-LIBS="$LIBS -lkvm"
-AC_CHECKING(getloadavg with -lkvm)
-AC_TRY_LINK(,[getloadavg((double *)0, 0);],
-AC_DEFINE(LOADAV_GETLOADAVG) load=1, LIBS="$olibs")
-fi
-)
-
-if test -z "$load" ; then
-AC_EGREP_CPP(yes,
-[#if defined(NeXT) || defined(apollo) || defined(linux)
- yes;
-#endif
-], load=1)
-fi
-if test -z "$load" ; then
-AC_CHECKING(for kernelfile)
-for core in /unix /vmunix /dynix /hp-ux /xelos /dev/ksyms /kernel/unix /kernel/genunix /unicos /mach /netbsd /386bsd /dgux /bsd /stand/vmunix; do
- if test -f $core || test -c $core; then
- break
- fi
-done
-if test ! -f $core && test ! -c $core ; then
- AC_NOTE(- no kernelfile found)
-else
- AC_NOTE(- using kernelfile '$core')
- if test -r $core ; then
- AC_DEFINE_UNQUOTED(LOADAV_UNIX,"$core")
- AC_CHECK_HEADER(nlist.h,
- [AC_DEFINE(NLIST_STRUCT)
- AC_CHECKING(n_un in struct nlist)
- AC_TRY_COMPILE([#include <nlist.h>],
- [struct nlist n; n.n_un.n_name = 0;],
- AC_DEFINE(NLIST_NAME_UNION))])
-
- AC_CHECKING(for nlist declaration)
- AC_EGREP_CPP([nlist(( | )( | )*.*\(|\()],[
-#ifdef NLIST_STRUCT
-# include <nlist.h>
-#else
-# include <a.out.h>
-#endif
-],AC_DEFINE(NLIST_DECLARED))
-
- AC_CHECKING(for avenrun symbol)
- nlist64=
- for av in avenrun _avenrun _Loadavg avenrun _avenrun _Loadavg; do
- AC_TRY_RUN([
-#include <sys/types.h>
-#ifdef NLIST_STRUCT
-#include <nlist.h>
-#else
-#include <a.out.h>
-#endif
-
-$nlist64
-
-struct nlist nl[2];
-
-main()
-{
-#if !defined(_AUX_SOURCE) && !defined(AUX)
-# ifdef NLIST_NAME_UNION
- nl[0].n_un.n_name = "$av";
-# else
- nl[0].n_name = "$av";
-# endif
-#else
- strncpy(nl[0].n_name, "$av", sizeof(nl[0].n_name));
-#endif
- nlist(LOADAV_UNIX, nl);
- if (nl[0].n_value == 0)
- exit(1);
- exit(0);
-}
- ],avensym=$av;break)
- if test "$av" = _Loadavg; then
- nlist64='#define nlist nlist64'
- fi
- done
- if test -z "$avensym" ; then
- AC_NOTE(- no avenrun symbol found)
- else
- AC_NOTE(- using avenrun symbol '$avensym')
- AC_DEFINE_UNQUOTED(LOADAV_AVENRUN,"$avensym")
- if test -n "$nlist64"; then
- AC_NOTE(- used nlist64 to find it)
- AC_DEFINE(LOADAV_USE_NLIST64)
- fi
- load=1
- fi
- else
- AC_NOTE( Can't configure the load average display feature)
- AC_NOTE( because $core is not readable by you.)
- AC_NOTE( To configure the load average display feature,)
- AC_NOTE( re-run configure as root if possible.)
- AC_NOTE( If you are not the system administrator then disregard)
- AC_NOTE( this warning. You can still use screen without)
- AC_NOTE( the load average display feature.)
- fi
-fi
-fi
-
-AC_PROGRAM_SOURCE([
-#include <sys/types.h>
-#include <sys/param.h>
-],[
-#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k))
-loadtype=long
-# if defined(apollo) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX)
-loadscale=65536
-# else
-# if defined(FSCALE) && !defined(__osf__)
-# undef FSCALE
-loadscale=FSCALE
-# else
-# ifdef sgi
-loadtype=int
-loadscale=1024
-# else
-# if defined(MIPS) || defined(SVR4) || defined(m88k)
-loadscale=256
-# else /* not MIPS */
-loadscale=1000 /* our default value */
-# endif /* MIPS */
-# endif /* sgi */
-# endif /* not FSCALE */
-# endif /* not apollo */
-#else
-loadtype=double
-loadscale=1
-#endif
-#ifdef alliant
-loadnum=4
-#else
-loadnum=3
-#endif
-])
-
-if test -n "$load" ; then AC_DEFINE(LOADAV) fi
-if test -n "$loadtype" ; then AC_DEFINE_UNQUOTED(LOADAV_TYPE,$loadtype) fi
-if test -n "$loadnum" ; then AC_DEFINE_UNQUOTED(LOADAV_NUM,$loadnum) fi
-if test -n "$loadscale" ; then AC_DEFINE_UNQUOTED(LOADAV_SCALE,$loadscale) fi
-
-dnl
-dnl **** signal handling ****
-dnl
-if test -n "$posix" ; then
-
-dnl POSIX has reliable signals with void return type.
-AC_NOTE(assuming posix signal definition)
-AC_DEFINE(SIGVOID)
-
-else
-
-AC_CHECKING(return type of signal handlers)
-AC_TRY_COMPILE(
-[#include <sys/types.h>
-#include <signal.h>
-#ifdef signal
-#undef signal
-#endif
-extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID))
-AC_CHECKING(sigset)
-AC_TRY_LINK([
-#include <sys/types.h>
-#include <signal.h>
-],[
-#ifdef SIGVOID
-sigset(0, (void (*)())0);
-#else
-sigset(0, (int (*)())0);
-#endif
-], AC_DEFINE(USESIGSET))
-AC_CHECKING(signal implementation)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <signal.h>
-
-#ifndef SIGCLD
-#define SIGCLD SIGCHLD
-#endif
-#ifdef USESIGSET
-#define signal sigset
-#endif
-
-int got;
-
-#ifdef SIGVOID
-void
-#endif
-hand()
-{
- got++;
-}
-
-main()
-{
- /* on hpux we use sigvec to get bsd signals */
-#ifdef __hpux
- (void)signal(SIGCLD, hand);
- kill(getpid(), SIGCLD);
- kill(getpid(), SIGCLD);
- if (got < 2)
- exit(1);
-#endif
- exit(0);
-}
-],,AC_DEFINE(SYSVSIGS))
-
-fi
-
-dnl
-dnl **** libraries ****
-dnl
-
-AC_CHECKING(for crypt and sec libraries)
-test -f /lib/libcrypt_d.a || test -f /usr/lib/libcrypt_d.a && LIBS="$LIBS -lcrypt_d"
-oldlibs="$LIBS"
-LIBS="$LIBS -lcrypt"
-AC_CHECKING(crypt)
-AC_TRY_LINK(,,,LIBS="$oldlibs")
-test -f /lib/libsec.a || test -f /usr/lib/libsec.a && LIBS="$LIBS -lsec"
-test -f /lib/libshadow.a || test -f /usr/lib/libshadow.a && LIBS="$LIBS -lshadow"
-oldlibs="$LIBS"
-LIBS="$LIBS -lsun"
-AC_CHECKING(IRIX sun library)
-AC_TRY_LINK(,,,LIBS="$oldlibs")
-
-AC_CHECKING(syslog)
-AC_TRY_LINK(,[closelog();], , [oldlibs="$LIBS"
-LIBS="$LIBS -lbsd"
-AC_CHECKING(syslog in libbsd.a)
-AC_TRY_LINK(, [closelog();], AC_NOTE(- found.), [LIBS="$oldlibs"
-AC_NOTE(- bad news: syslog missing.) AC_DEFINE(NOSYSLOG)])])
-
-AC_EGREP_CPP(yes,
-[#ifdef M_UNIX
- yes;
-#endif
-], LIBS="$LIBS -lsocket -lcrypt_i")
-
-dnl
-dnl **** misc things ****
-dnl
-AC_CHECKING(wait union)
-AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/wait.h>
-],[
- union wait x;
- int y;
-#ifdef WEXITSTATUS
- y = WEXITSTATUS(x);
-#endif
-],AC_DEFINE(BSDWAIT))
-
-if test -z "$butterfly"; then
-AC_CHECKING(for termio or termios)
-AC_TRY_CPP([#include <termio.h>], AC_DEFINE(TERMIO),
-if test -n "$posix"; then
-AC_TRY_CPP([#include <termios.h>], AC_DEFINE(TERMIO))
-fi
-)
-fi
-
-dnl AC_CHECK_HEADER(shadow.h, AC_DEFINE(SHADOWPW))
-AC_CHECKING(getspnam)
-AC_TRY_LINK([#include <shadow.h>], [getspnam("x");],AC_DEFINE(SHADOWPW))
-
-AC_CHECKING(getttyent)
-AC_TRY_LINK(,[getttyent();], AC_DEFINE(GETTTYENT))
-
-AC_CHECKING(fdwalk)
-AC_TRY_LINK([#include <stdlib.h>], [fdwalk(NULL, NULL);],AC_DEFINE(HAVE_FDWALK))
-
-AC_CHECKING(whether memcpy/memmove/bcopy handles overlapping arguments)
-AC_TRY_RUN([
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}], AC_DEFINE(USEBCOPY))
-
-AC_TRY_RUN([
-#define bcopy(s,d,l) memmove(d,s,l)
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}], AC_DEFINE(USEMEMMOVE))
-
-
-AC_TRY_RUN([
-#define bcopy(s,d,l) memcpy(d,s,l)
-main() {
- char buf[10];
- strcpy(buf, "abcdefghi");
- bcopy(buf, buf + 2, 3);
- if (strncmp(buf, "ababcf", 6))
- exit(1);
- strcpy(buf, "abcdefghi");
- bcopy(buf + 2, buf, 3);
- if (strncmp(buf, "cdedef", 6))
- exit(1);
- exit(0); /* libc version works properly. */
-}], AC_DEFINE(USEMEMCPY))
-
-AC_MSG_CHECKING(long file names)
-(echo 1 > /tmp/conftest9012345) 2>/dev/null
-(echo 2 > /tmp/conftest9012346) 2>/dev/null
-val=`cat /tmp/conftest9012345 2>/dev/null`
-if test -f /tmp/conftest9012345 && test "$val" = 1; then
-AC_MSG_RESULT(yes)
-else
-AC_MSG_RESULT(no)
-AC_DEFINE(NAME_MAX, 14)
-fi
-rm -f /tmp/conftest*
-
-AC_MSG_CHECKING(for vsprintf)
-AC_TRY_LINK(,[vsprintf(0,0,0);], AC_MSG_RESULT(yes);AC_DEFINE(USEVARARGS), AC_MSG_RESULT(no))
-
-AC_HEADER_DIRENT
-
-AC_MSG_CHECKING(for setenv)
-AC_TRY_LINK(,[setenv((char *)0,(char *)0);unsetenv((char *)0);], AC_MSG_RESULT(yes);AC_DEFINE(USESETENV),
-AC_MSG_RESULT(no)
-AC_MSG_CHECKING(for putenv)
-AC_TRY_LINK(,[putenv((char *)0);unsetenv((char *)0);], AC_MSG_RESULT(yes) , AC_MSG_RESULT(no);AC_DEFINE(NEEDPUTENV)
-))
-AC_MSG_CHECKING([for nl_langinfo(CODESET)])
-AC_TRY_LINK([
-#include <langinfo.h>
-],[nl_langinfo(CODESET);], AC_MSG_RESULT(yes);AC_DEFINE(HAVE_NL_LANGINFO), AC_MSG_RESULT(no))
-
-AC_SEARCH_LIBS(gethostname, nsl)
-
-AC_CHECK_FUNCS(rename fchmod fchown strerror lstat _exit utimes vsnprintf getcwd setlocale strftime)
-
-AC_ARG_ENABLE(pam, [ --enable-pam enable PAM support])
-if test "$enable_pam" = "yes"; then
- AC_MSG_CHECKING(for PAM support)
- oldlibs="$LIBS"
- LIBS="$LIBS -lpam"
- AC_TRY_LINK([#include <security/pam_appl.h>], [
- pam_start(0, 0, 0, 0);
- pam_authenticate(0, 0);
- pam_end(0,0);
- ], AC_MSG_RESULT(yes);AC_DEFINE(USE_PAM),
- AC_MSG_RESULT(no);LIBS="$oldlibs")
-fi
-
-AC_ARG_ENABLE(use_locale, [ --enable-locale use localized month/day names])
-if test "$enable_use_locale" = "yes"; then
- AC_DEFINE(USE_LOCALE)
-fi
-AC_ARG_ENABLE(telnet, [ --enable-telnet enable builtin telnet])
-if test "$enable_telnet" = "yes"; then
- AC_DEFINE(BUILTIN_TELNET)
-fi
-AC_ARG_ENABLE(colors256, [ --enable-colors256 enable support for 256 colors])
-if test "$enable_colors256" = "yes"; then
- AC_DEFINE(COLORS256)
-fi
-AC_ARG_ENABLE(rxvt_osc, [ --enable-rxvt_osc enable support for rxvt OSC codes])
-if test "$enable_rxvt_osc" = "yes"; then
- AC_DEFINE(RXVT_OSC)
-fi
-
-dnl
-dnl **** the end ****
-dnl
-if test -z "$old_CFLAGS"; then
- if test "x$CFLAGS" = "x-g"; then
- CFLAGS="-O"
- fi
-fi
-dnl Ptx bug workaround -- insert -lc after -ltermcap
-test -n "$seqptx" && LIBS="-ltermcap -lc -lsocket -linet -lnsl -lsec -lseq"
-
-AC_TRY_RUN(main(){exit(0);},,AC_MSG_ERROR(Can't run the compiler - internal error. Sorry.))
-
-ETCSCREENRC="\"/usr/local/etc/screenrc\""
-if test -n "$prefix"; then
-ETCSCREENRC="\"$prefix/etc/screenrc\""
-fi
-AC_MSG_CHECKING(for the global screenrc file)
-AC_ARG_WITH(sys-screenrc, [ --with-sys-screenrc=path where to put the global screenrc file], [ ETCSCREENRC="\"${withval}\"" ])
-AC_DEFINE_UNQUOTED(ETCSCREENRC,$ETCSCREENRC)
-AC_MSG_RESULT($ETCSCREENRC)
-
-SCREENENCODINGS="\"/usr/local/lib/screen/utf8encodings\""
-if test -n "$datadir"; then
-eval SCREENENCODINGS="$datadir/screen/utf8encodings"
-SCREENENCODINGS="\"$SCREENENCODINGS\""
-fi
-AC_MSG_CHECKING(for the utf8-encodings location)
-AC_DEFINE_UNQUOTED(SCREENENCODINGS,$SCREENENCODINGS)
-AC_MSG_RESULT($SCREENENCODINGS)
-
-AC_OUTPUT(Makefile doc/Makefile, [[
-# a hook for preserving undef directive in config.h
-mv config.h conftest
-sed -e 's@^\(.*\)defin.\( .*\) .*/\*\(.*KEEP_UNDEF_HERE\)@\1undef\2 /\*\3@' < conftest > config.h
-rm -f conftest
-]])
-
-echo ""
-if test -z "$AWK"; then
-echo "!!! Since you have no awk you must copy the files 'comm.h.dist'"
-echo "!!! and 'term.h.dist' to 'comm.h' and 'term.h'."
-echo "!!! Do _not_ change the user configuration section in config.h!"
-echo "Please check the pathnames in the Makefile."
-else
-echo "Now please check the pathnames in the Makefile and in the user"
-echo "configuration section in config.h."
-fi
-echo "Then type 'make' to make screen. Good luck."
-echo ""
diff --git a/src/display.c b/src/display.c
deleted file mode 100644
index 9e09187..0000000
--- a/src/display.c
+++ /dev/null
@@ -1,3922 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <signal.h>
-#include <fcntl.h>
-#ifndef sun
-# include <sys/ioctl.h>
-#endif
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-#include "braille.h"
-
-static int CountChars __P((int));
-static int DoAddChar __P((int));
-static int BlankResize __P((int, int));
-static int CallRewrite __P((int, int, int, int));
-static void FreeCanvas __P((struct canvas *));
-static void disp_readev_fn __P((struct event *, char *));
-static void disp_writeev_fn __P((struct event *, char *));
-#ifdef linux
-static void disp_writeev_eagain __P((struct event *, char *));
-#endif
-static void disp_status_fn __P((struct event *, char *));
-static void disp_hstatus_fn __P((struct event *, char *));
-static void disp_blocked_fn __P((struct event *, char *));
-static void cv_winid_fn __P((struct event *, char *));
-#ifdef MAPKEYS
-static void disp_map_fn __P((struct event *, char *));
-#endif
-static void disp_idle_fn __P((struct event *, char *));
-#ifdef BLANKER_PRG
-static void disp_blanker_fn __P((struct event *, char *));
-#endif
-static void WriteLP __P((int, int));
-static void INSERTCHAR __P((int));
-static void RAW_PUTCHAR __P((int));
-#ifdef COLOR
-static void SetBackColor __P((int));
-#endif
-
-
-extern struct layer *flayer;
-extern struct win *windows, *fore;
-extern struct LayFuncs WinLf;
-
-extern int use_hardstatus;
-extern int MsgWait, MsgMinWait;
-extern int Z0width, Z1width;
-extern unsigned char *blank, *null;
-extern struct mline mline_blank, mline_null, mline_old;
-extern struct mchar mchar_null, mchar_blank, mchar_so;
-extern struct NewWindow nwin_default;
-extern struct action idleaction;
-
-/* XXX shouldn't be here */
-extern char *hstatusstring;
-extern char *captionstring;
-
-extern int pastefont;
-extern int idletimo;
-
-#ifdef BLANKER_PRG
-extern int pty_preopen;
-#if defined(TIOCSWINSZ) || defined(TIOCGWINSZ)
-extern struct winsize glwz;
-#endif
-extern char **NewEnv;
-extern int real_uid, real_gid;
-#endif
-
-/*
- * tputs needs this to calculate the padding
- */
-#ifndef NEED_OSPEED
-extern
-#endif /* NEED_OSPEED */
-short ospeed;
-
-
-struct display *display, *displays;
-#ifdef COLOR
-int attr2color[8][4];
-int nattr2color;
-#endif
-
-#ifndef MULTI
-struct display TheDisplay;
-#endif
-
-/*
- * The default values
- */
-int defobuflimit = OBUF_MAX;
-int defnonblock = -1;
-#ifdef AUTO_NUKE
-int defautonuke = 0;
-#endif
-int captionalways;
-int hardstatusemu = HSTATUS_IGNORE;
-
-/*
- * Default layer management
- */
-
-void
-DefProcess(bufp, lenp)
-char **bufp;
-int *lenp;
-{
- *bufp += *lenp;
- *lenp = 0;
-}
-
-void
-DefRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- if (isblank == 0 && y >= 0)
- DefClearLine(y, xs, xe, 0);
-}
-
-void
-DefClearLine(y, xs, xe, bce)
-int y, xs, xe, bce;
-{
- LClearLine(flayer, y, xs, xe, bce, (struct mline *)0);
-}
-
-/*ARGSUSED*/
-int
-DefRewrite(y, xs, xe, rend, doit)
-int y, xs, xe, doit;
-struct mchar *rend;
-{
- return EXPENSIVE;
-}
-
-/*ARGSUSED*/
-int
-DefResize(wi, he)
-int wi, he;
-{
- return -1;
-}
-
-void
-DefRestore()
-{
- LAY_DISPLAYS(flayer, InsertMode(0));
- /* ChangeScrollRegion(0, D_height - 1); */
- LKeypadMode(flayer, 0);
- LCursorkeysMode(flayer, 0);
- LCursorVisibility(flayer, 0);
- LMouseMode(flayer, 0);
- LSetRendition(flayer, &mchar_null);
- LSetFlow(flayer, nwin_default.flowflag & FLOW_NOW);
-}
-
-/*
- * Blank layer management
- */
-
-struct LayFuncs BlankLf =
-{
- DefProcess,
- 0,
- DefRedisplayLine,
- DefClearLine,
- DefRewrite,
- BlankResize,
- DefRestore
-};
-
-/*ARGSUSED*/
-static int
-BlankResize(wi, he)
-int wi, he;
-{
- flayer->l_width = wi;
- flayer->l_height = he;
- return 0;
-}
-
-
-/*
- * Generate new display, start with a blank layer.
- * The termcap arrays are not initialised here.
- * The new display is placed in the displays list.
- */
-
-struct display *
-MakeDisplay(uname, utty, term, fd, pid, Mode)
-char *uname, *utty, *term;
-int fd, pid;
-struct mode *Mode;
-{
- struct acluser **u;
- struct baud_values *b;
-
- if (!*(u = FindUserPtr(uname)) && UserAdd(uname, (char *)0, u))
- return 0; /* could not find or add user */
-
-#ifdef MULTI
- if ((display = (struct display *)calloc(1, sizeof(*display))) == 0)
- return 0;
-#else
- if (displays)
- return 0;
- bzero((char *)&TheDisplay, sizeof(TheDisplay));
- display = &TheDisplay;
-#endif
- display->d_next = displays;
- displays = display;
- D_flow = 1;
- D_nonblock = defnonblock;
- D_userfd = fd;
- D_readev.fd = D_writeev.fd = fd;
- D_readev.type = EV_READ;
- D_writeev.type = EV_WRITE;
- D_readev.data = D_writeev.data = (char *)display;
- D_readev.handler = disp_readev_fn;
- D_writeev.handler = disp_writeev_fn;
- evenq(&D_readev);
- D_writeev.condpos = &D_obuflen;
- D_writeev.condneg = &D_obuffree;
- evenq(&D_writeev);
- D_statusev.type = EV_TIMEOUT;
- D_statusev.data = (char *)display;
- D_statusev.handler = disp_status_fn;
- D_hstatusev.type = EV_TIMEOUT;
- D_hstatusev.data = (char *)display;
- D_hstatusev.handler = disp_hstatus_fn;
- D_blockedev.type = EV_TIMEOUT;
- D_blockedev.data = (char *)display;
- D_blockedev.handler = disp_blocked_fn;
- D_blockedev.condpos = &D_obuffree;
- D_blockedev.condneg = &D_obuflenmax;
- D_hstatusev.handler = disp_hstatus_fn;
-#ifdef MAPKEYS
- D_mapev.type = EV_TIMEOUT;
- D_mapev.data = (char *)display;
- D_mapev.handler = disp_map_fn;
-#endif
- D_idleev.type = EV_TIMEOUT;
- D_idleev.data = (char *)display;
- D_idleev.handler = disp_idle_fn;
-#ifdef BLANKER_PRG
- D_blankerev.type = EV_READ;
- D_blankerev.data = (char *)display;
- D_blankerev.handler = disp_blanker_fn;
- D_blankerev.fd = -1;
-#endif
- D_OldMode = *Mode;
- D_status_obuffree = -1;
- Resize_obuf(); /* Allocate memory for buffer */
- D_obufmax = defobuflimit;
- D_obuflenmax = D_obuflen - D_obufmax;
-#ifdef AUTO_NUKE
- D_auto_nuke = defautonuke;
-#endif
- D_obufp = D_obuf;
- D_printfd = -1;
- D_userpid = pid;
-
-#ifdef POSIX
- if ((b = lookup_baud((int)cfgetospeed(&D_OldMode.tio))))
- D_dospeed = b->idx;
-#else
-# ifdef TERMIO
- if ((b = lookup_baud(D_OldMode.tio.c_cflag & CBAUD)))
- D_dospeed = b->idx;
-# else
- D_dospeed = (short)D_OldMode.m_ttyb.sg_ospeed;
-# endif
-#endif
- debug1("New displays ospeed = %d\n", D_dospeed);
-
- strncpy(D_usertty, utty, sizeof(D_usertty) - 1);
- D_usertty[sizeof(D_usertty) - 1] = 0;
- strncpy(D_termname, term, sizeof(D_termname) - 1);
- D_termname[sizeof(D_termname) - 1] = 0;
- D_user = *u;
- D_processinput = ProcessInput;
- return display;
-}
-
-
-void
-FreeDisplay()
-{
- struct win *p;
- struct canvas *cv, *cvp;
-#ifdef MULTI
- struct display *d, **dp;
-#endif
-
-#ifdef FONT
- FreeTransTable();
-#endif
-#ifdef BLANKER_PRG
- KillBlanker();
-#endif
- if (D_userfd >= 0)
- {
- Flush();
- if (!display)
- return;
- SetTTY(D_userfd, &D_OldMode);
- fcntl(D_userfd, F_SETFL, 0);
- }
- freetty();
- if (D_tentry)
- free(D_tentry);
- D_tentry = 0;
- if (D_processinputdata)
- free(D_processinputdata);
- D_processinputdata = 0;
- D_tcinited = 0;
- evdeq(&D_hstatusev);
- evdeq(&D_statusev);
- evdeq(&D_readev);
- evdeq(&D_writeev);
- evdeq(&D_blockedev);
-#ifdef MAPKEYS
- evdeq(&D_mapev);
- if (D_kmaps)
- {
- free(D_kmaps);
- D_kmaps = 0;
- D_aseqs = 0;
- D_nseqs = 0;
- D_seqp = 0;
- D_seql = 0;
- D_seqh = 0;
- }
-#endif
- evdeq(&D_idleev);
-#ifdef BLANKER_PRG
- evdeq(&D_blankerev);
-#endif
-#ifdef HAVE_BRAILLE
- if (bd.bd_dpy == display)
- {
- bd.bd_start_braille = 0;
- StartBraille();
- }
-#endif
-
-#ifdef MULTI
- for (dp = &displays; (d = *dp) ; dp = &d->d_next)
- if (d == display)
- break;
- ASSERT(d);
- if (D_status_lastmsg)
- free(D_status_lastmsg);
- if (D_obuf)
- free(D_obuf);
- *dp = display->d_next;
- cv = display->d_cvlist;
-#else /* MULTI */
- ASSERT(display == displays);
- ASSERT(display == &TheDisplay);
- cv = display->d_cvlist;
- display->d_cvlist = 0;
- displays = 0;
-#endif /* MULTI */
-
- for (p = windows; p; p = p->w_next)
- {
- if (p->w_pdisplay == display)
- p->w_pdisplay = 0;
- if (p->w_lastdisp == display)
- p->w_lastdisp = 0;
- if (p->w_readev.condneg == &D_status || p->w_readev.condneg == &D_obuflenmax)
- p->w_readev.condpos = p->w_readev.condneg = 0;
- }
- for (; cv; cv = cvp)
- {
- cvp = cv->c_next;
- FreeCanvas(cv);
- }
-#ifdef ZMODEM
- for (p = windows; p; p = p->w_next)
- if (p->w_zdisplay == display)
- zmodem_abort(p, 0);
-#endif
-#ifdef MULTI
- free((char *)display);
-#endif
- display = 0;
-}
-
-int
-MakeDefaultCanvas()
-{
- struct canvas *cv;
-
- ASSERT(display);
- if ((cv = (struct canvas *)calloc(1, sizeof *cv)) == 0)
- return -1;
- cv->c_xs = 0;
- cv->c_xe = D_width - 1;
- cv->c_ys = 0;
- cv->c_ye = D_height - 1 - (D_has_hstatus == HSTATUS_LASTLINE) - captionalways;
- cv->c_xoff = 0;
- cv->c_yoff = 0;
- cv->c_next = 0;
- cv->c_display = display;
- cv->c_vplist = 0;
- cv->c_captev.type = EV_TIMEOUT;
- cv->c_captev.data = (char *)cv;
- cv->c_captev.handler = cv_winid_fn;
-
- cv->c_blank.l_cvlist = cv;
- cv->c_blank.l_width = cv->c_xe - cv->c_xs + 1;
- cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1;
- cv->c_blank.l_x = cv->c_blank.l_y = 0;
- cv->c_blank.l_layfn = &BlankLf;
- cv->c_blank.l_data = 0;
- cv->c_blank.l_next = 0;
- cv->c_blank.l_bottom = &cv->c_blank;
- cv->c_blank.l_blocking = 0;
- cv->c_layer = &cv->c_blank;
- cv->c_lnext = 0;
-
- D_cvlist = cv;
- RethinkDisplayViewports();
- D_forecv = cv; /* default input focus */
- return 0;
-}
-
-static void
-FreeCanvas(cv)
-struct canvas *cv;
-{
- struct viewport *vp, *nvp;
- struct win *p;
-
- p = Layer2Window(cv->c_layer);
- SetCanvasWindow(cv, 0);
- if (p)
- WindowChanged(p, 'u');
- if (flayer == cv->c_layer)
- flayer = 0;
- for (vp = cv->c_vplist; vp; vp = nvp)
- {
- vp->v_canvas = 0;
- nvp = vp->v_next;
- vp->v_next = 0;
- free(vp);
- }
- evdeq(&cv->c_captev);
- free(cv);
-}
-
-int
-AddCanvas()
-{
- int hh, h, i, j;
- struct canvas *cv, **cvpp;
-
- for (cv = D_cvlist, j = 0; cv; cv = cv->c_next)
- j++;
- j++; /* new canvas */
- h = D_height - (D_has_hstatus == HSTATUS_LASTLINE);
- if (h / j <= 1)
- return -1;
-
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (cv == D_forecv)
- break;
- ASSERT(cv);
- cvpp = &cv->c_next;
-
- if ((cv = (struct canvas *)calloc(1, sizeof *cv)) == 0)
- return -1;
-
- cv->c_xs = 0;
- cv->c_xe = D_width - 1;
- cv->c_ys = 0;
- cv->c_ye = D_height - 1;
- cv->c_xoff = 0;
- cv->c_yoff = 0;
- cv->c_display = display;
- cv->c_vplist = 0;
- cv->c_captev.type = EV_TIMEOUT;
- cv->c_captev.data = (char *)cv;
- cv->c_captev.handler = cv_winid_fn;
-
- cv->c_blank.l_cvlist = cv;
- cv->c_blank.l_width = cv->c_xe - cv->c_xs + 1;
- cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1;
- cv->c_blank.l_x = cv->c_blank.l_y = 0;
- cv->c_blank.l_layfn = &BlankLf;
- cv->c_blank.l_data = 0;
- cv->c_blank.l_next = 0;
- cv->c_blank.l_bottom = &cv->c_blank;
- cv->c_blank.l_blocking = 0;
- cv->c_layer = &cv->c_blank;
- cv->c_lnext = 0;
-
- cv->c_next = *cvpp;
- *cvpp = cv;
-
- i = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- hh = h / j-- - 1;
- cv->c_ys = i;
- cv->c_ye = i + hh - 1;
- cv->c_yoff = i;
- i += hh + 1;
- h -= hh + 1;
- }
-
- RethinkDisplayViewports();
- ResizeLayersToCanvases();
- return 0;
-}
-
-void
-RemCanvas()
-{
- int hh, h, i, j;
- struct canvas *cv, **cvpp;
- int did = 0;
-
- h = D_height - (D_has_hstatus == HSTATUS_LASTLINE);
- for (cv = D_cvlist, j = 0; cv; cv = cv->c_next)
- j++;
- if (j == 1)
- return;
- i = 0;
- j--;
- for (cvpp = &D_cvlist; (cv = *cvpp); cvpp = &cv->c_next)
- {
- if (cv == D_forecv && !did)
- {
- *cvpp = cv->c_next;
- FreeCanvas(cv);
- cv = *cvpp;
- D_forecv = cv ? cv : D_cvlist;
- D_fore = Layer2Window(D_forecv->c_layer);
- flayer = D_forecv->c_layer;
- if (cv == 0)
- break;
- did = 1;
- }
- hh = h / j-- - 1;
- if (!captionalways && i == 0 && j == 0)
- hh++;
- cv->c_ys = i;
- cv->c_ye = i + hh - 1;
- cv->c_yoff = i;
- i += hh + 1;
- h -= hh + 1;
- }
- RethinkDisplayViewports();
- ResizeLayersToCanvases();
-}
-
-void
-OneCanvas()
-{
- struct canvas *mycv = D_forecv;
- struct canvas *cv, **cvpp;
-
- for (cvpp = &D_cvlist; (cv = *cvpp);)
- {
- if (cv == mycv)
- {
- cv->c_ys = 0;
- cv->c_ye = D_height - 1 - (D_has_hstatus == HSTATUS_LASTLINE) - captionalways;
- cv->c_yoff = 0;
- cvpp = &cv->c_next;
- }
- else
- {
- *cvpp = cv->c_next;
- FreeCanvas(cv);
- }
- }
- RethinkDisplayViewports();
- ResizeLayersToCanvases();
-}
-
-int
-RethinkDisplayViewports()
-{
- struct canvas *cv;
- struct viewport *vp, *vpn;
-
- /* free old viewports */
- for (cv = display->d_cvlist; cv; cv = cv->c_next)
- {
- for (vp = cv->c_vplist; vp; vp = vpn)
- {
- vp->v_canvas = 0;
- vpn = vp->v_next;
- bzero((char *)vp, sizeof(*vp));
- free(vp);
- }
- cv->c_vplist = 0;
- }
- display->d_vpxmin = -1;
- display->d_vpxmax = -1;
-
- for (cv = display->d_cvlist; cv; cv = cv->c_next)
- {
- if ((vp = (struct viewport *)malloc(sizeof *vp)) == 0)
- return -1;
-#ifdef HOLE
- vp->v_canvas = cv;
- vp->v_xs = cv->c_xs;
- vp->v_ys = (cv->c_ys + cv->c_ye) / 2;
- vp->v_xe = cv->c_xe;
- vp->v_ye = cv->c_ye;
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- vp->v_next = cv->c_vplist;
- cv->c_vplist = vp;
-
- if ((vp = (struct viewport *)malloc(sizeof *vp)) == 0)
- return -1;
- vp->v_canvas = cv;
- vp->v_xs = (cv->c_xs + cv->c_xe) / 2;
- vp->v_ys = (3 * cv->c_ys + cv->c_ye) / 4;
- vp->v_xe = cv->c_xe;
- vp->v_ye = (cv->c_ys + cv->c_ye) / 2 - 1;
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- vp->v_next = cv->c_vplist;
- cv->c_vplist = vp;
-
- if ((vp = (struct viewport *)malloc(sizeof *vp)) == 0)
- return -1;
- vp->v_canvas = cv;
- vp->v_xs = cv->c_xs;
- vp->v_ys = (3 * cv->c_ys + cv->c_ye) / 4;
- vp->v_xe = (3 * cv->c_xs + cv->c_xe) / 4 - 1;
- vp->v_ye = (cv->c_ys + cv->c_ye) / 2 - 1;
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- vp->v_next = cv->c_vplist;
- cv->c_vplist = vp;
-
- if ((vp = (struct viewport *)malloc(sizeof *vp)) == 0)
- return -1;
- vp->v_canvas = cv;
- vp->v_xs = cv->c_xs;
- vp->v_ys = cv->c_ys;
- vp->v_xe = cv->c_xe;
- vp->v_ye = (3 * cv->c_ys + cv->c_ye) / 4 - 1;
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- vp->v_next = cv->c_vplist;
- cv->c_vplist = vp;
-#else
- vp->v_canvas = cv;
- vp->v_xs = cv->c_xs;
- vp->v_ys = cv->c_ys;
- vp->v_xe = cv->c_xe;
- vp->v_ye = cv->c_ye;
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- vp->v_next = cv->c_vplist;
- cv->c_vplist = vp;
-#endif
-
- if (cv->c_xs < display->d_vpxmin || display->d_vpxmin == -1)
- display->d_vpxmin = cv->c_xs;
- if (cv->c_xe > display->d_vpxmax || display->d_vpxmax == -1)
- display->d_vpxmax = cv->c_xe;
- }
- return 0;
-}
-
-void
-RethinkViewportOffsets(cv)
-struct canvas *cv;
-{
- struct viewport *vp;
-
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- vp->v_xoff = cv->c_xoff;
- vp->v_yoff = cv->c_yoff;
- }
-}
-
-/*
- * if the adaptflag is on, we keep the size of this display, else
- * we may try to restore our old window sizes.
- */
-void
-InitTerm(adapt)
-int adapt;
-{
- ASSERT(display);
- ASSERT(D_tcinited);
- D_top = D_bot = -1;
- AddCStr(D_TI);
- AddCStr(D_IS);
- /* Check for toggle */
- if (D_IM && strcmp(D_IM, D_EI))
- AddCStr(D_EI);
- D_insert = 0;
-#ifdef MAPKEYS
- AddCStr(D_KS);
- AddCStr(D_CCS);
-#else
- /* Check for toggle */
- if (D_KS && strcmp(D_KS, D_KE))
- AddCStr(D_KE);
- if (D_CCS && strcmp(D_CCS, D_CCE))
- AddCStr(D_CCE);
-#endif
- D_keypad = 0;
- D_cursorkeys = 0;
- AddCStr(D_ME);
- AddCStr(D_EA);
- AddCStr(D_CE0);
- D_rend = mchar_null;
- D_atyp = 0;
- if (adapt == 0)
- ResizeDisplay(D_defwidth, D_defheight);
- ChangeScrollRegion(0, D_height - 1);
- D_x = D_y = 0;
- Flush();
- ClearAll();
- debug1("we %swant to adapt all our windows to the display\n",
- (adapt) ? "" : "don't ");
- /* In case the size was changed by a init sequence */
- CheckScreenSize((adapt) ? 2 : 0);
-}
-
-void
-FinitTerm()
-{
- ASSERT(display);
-#ifdef BLANKER_PRG
- KillBlanker();
-#endif
- if (D_tcinited)
- {
- ResizeDisplay(D_defwidth, D_defheight);
- InsertMode(0);
- ChangeScrollRegion(0, D_height - 1);
- KeypadMode(0);
- CursorkeysMode(0);
- CursorVisibility(0);
- MouseMode(0);
- SetRendition(&mchar_null);
- SetFlow(FLOW_NOW);
-#ifdef MAPKEYS
- AddCStr(D_KE);
- AddCStr(D_CCE);
-#endif
- if (D_hstatus)
- ShowHStatus((char *)0);
-#ifdef RXVT_OSC
- ClearAllXtermOSC();
-#endif
- D_x = D_y = -1;
- GotoPos(0, D_height - 1);
- AddChar('\r');
- AddChar('\n');
- AddCStr(D_TE);
- }
- Flush();
-}
-
-
-static void
-INSERTCHAR(c)
-int c;
-{
- ASSERT(display);
- if (!D_insert && D_x < D_width - 1)
- {
- if (D_IC || D_CIC)
- {
- if (D_IC)
- AddCStr(D_IC);
- else
- AddCStr2(D_CIC, 1);
- RAW_PUTCHAR(c);
- return;
- }
- InsertMode(1);
- if (!D_insert)
- {
- RefreshLine(D_y, D_x, D_width-1, 0);
- return;
- }
- }
- RAW_PUTCHAR(c);
-}
-
-void
-PUTCHAR(c)
-int c;
-{
- ASSERT(display);
- if (D_insert && D_x < D_width - 1)
- InsertMode(0);
- RAW_PUTCHAR(c);
-}
-
-void
-PUTCHARLP(c)
-int c;
-{
- if (D_x < D_width - 1)
- {
- if (D_insert)
- InsertMode(0);
- RAW_PUTCHAR(c);
- return;
- }
- if (D_CLP || D_y != D_bot)
- {
- int y = D_y;
- RAW_PUTCHAR(c);
- if (D_AM && !D_CLP)
- GotoPos(D_width - 1, y);
- return;
- }
- debug("PUTCHARLP: lp_missing!\n");
- D_lp_missing = 1;
- D_rend.image = c;
- D_lpchar = D_rend;
-#ifdef DW_CHARS
- /* XXX -> PutChar ? */
- if (D_mbcs)
- {
- D_lpchar.mbcs = c;
- D_lpchar.image = D_mbcs;
- D_mbcs = 0;
- D_x--;
- }
-#endif
-}
-
-/*
- * RAW_PUTCHAR() is for all text that will be displayed.
- * NOTE: charset Nr. 0 has a conversion table, but c1, c2, ... don't.
- */
-
-STATIC void
-RAW_PUTCHAR(c)
-int c;
-{
- ASSERT(display);
-
-#ifdef FONT
-# ifdef UTF8
- if (D_encoding == UTF8)
- {
- c = (c & 255) | (unsigned char)D_rend.font << 8;
-# ifdef DW_CHARS
- if (D_mbcs)
- {
- c = D_mbcs;
- if (D_x == D_width)
- D_x += D_AM ? 1 : -1;
- D_mbcs = 0;
- }
- else if (utf8_isdouble(c))
- {
- D_mbcs = c;
- D_x++;
- return;
- }
-# endif
- if (c < 32)
- {
- AddCStr2(D_CS0, '0');
- AddChar(c + 0x5f);
- AddCStr(D_CE0);
- goto addedutf8;
- }
- AddUtf8(c);
- goto addedutf8;
- }
-# endif
-# ifdef DW_CHARS
- if (is_dw_font(D_rend.font))
- {
- int t = c;
- if (D_mbcs == 0)
- {
- D_mbcs = c;
- D_x++;
- return;
- }
- D_x--;
- if (D_x == D_width - 1)
- D_x += D_AM ? 1 : -1;
- c = D_mbcs;
- D_mbcs = t;
- }
-# endif
-# if defined(ENCODINGS) && defined(DW_CHARS)
- if (D_encoding)
- c = PrepareEncodedChar(c);
-# endif
-# ifdef DW_CHARS
- kanjiloop:
-# endif
- if (D_xtable && D_xtable[(int)(unsigned char)D_rend.font] && D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c])
- AddStr(D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c]);
- else
- AddChar(D_rend.font != '0' ? c : D_c0_tab[(int)(unsigned char)c]);
-#else /* FONT */
- AddChar(c);
-#endif /* FONT */
-
-#ifdef UTF8
-addedutf8:
-#endif
- if (++D_x >= D_width)
- {
- if (D_AM == 0)
- D_x = D_width - 1;
- else if (!D_CLP || D_x > D_width)
- {
- D_x -= D_width;
- if (D_y < D_height-1 && D_y != D_bot)
- D_y++;
- }
- }
-#ifdef DW_CHARS
- if (D_mbcs)
- {
- c = D_mbcs;
- D_mbcs = 0;
- goto kanjiloop;
- }
-#endif
-}
-
-static int
-DoAddChar(c)
-int c;
-{
- /* this is for ESC-sequences only (AddChar is a macro) */
- AddChar(c);
- return c;
-}
-
-void
-AddCStr(s)
-char *s;
-{
- if (display && s && *s)
- {
- ospeed = D_dospeed;
- tputs(s, 1, DoAddChar);
- }
-}
-
-void
-AddCStr2(s, c)
-char *s;
-int c;
-{
- if (display && s && *s)
- {
- ospeed = D_dospeed;
- tputs(tgoto(s, 0, c), 1, DoAddChar);
- }
-}
-
-
-/* Insert mode is a toggle on some terminals, so we need this hack:
- */
-void
-InsertMode(on)
-int on;
-{
- if (display && on != D_insert && D_IM)
- {
- D_insert = on;
- if (on)
- AddCStr(D_IM);
- else
- AddCStr(D_EI);
- }
-}
-
-/* ...and maybe keypad application mode is a toggle, too:
- */
-void
-KeypadMode(on)
-int on;
-{
-#ifdef MAPKEYS
- if (display)
- D_keypad = on;
-#else
- if (display && D_keypad != on && D_KS)
- {
- D_keypad = on;
- if (on)
- AddCStr(D_KS);
- else
- AddCStr(D_KE);
- }
-#endif
-}
-
-void
-CursorkeysMode(on)
-int on;
-{
-#ifdef MAPKEYS
- if (display)
- D_cursorkeys = on;
-#else
- if (display && D_cursorkeys != on && D_CCS)
- {
- D_cursorkeys = on;
- if (on)
- AddCStr(D_CCS);
- else
- AddCStr(D_CCE);
- }
-#endif
-}
-
-void
-ReverseVideo(on)
-int on;
-{
- if (display && D_revvid != on && D_CVR)
- {
- D_revvid = on;
- if (D_revvid)
- AddCStr(D_CVR);
- else
- AddCStr(D_CVN);
- }
-}
-
-void
-CursorVisibility(v)
-int v;
-{
- if (display && D_curvis != v)
- {
- if (D_curvis)
- AddCStr(D_VE); /* do this always, just to be safe */
- D_curvis = 0;
- if (v == -1 && D_VI)
- AddCStr(D_VI);
- else if (v == 1 && D_VS)
- AddCStr(D_VS);
- else
- return;
- D_curvis = v;
- }
-}
-
-void
-MouseMode(mode)
-int mode;
-{
- if (display && D_mouse != mode)
- {
- char mousebuf[20];
- if (!D_CXT)
- return;
- if (D_mouse)
- {
- sprintf(mousebuf, "\033[?%dl", D_mouse);
- AddStr(mousebuf);
- }
- if (mode)
- {
- sprintf(mousebuf, "\033[?%dh", mode);
- AddStr(mousebuf);
- }
- D_mouse = mode;
- }
-}
-
-static int StrCost;
-
-/* ARGSUSED */
-static int
-CountChars(c)
-int c;
-{
- StrCost++;
- return c;
-}
-
-int
-CalcCost(s)
-register char *s;
-{
- ASSERT(display);
- if (s)
- {
- StrCost = 0;
- ospeed = D_dospeed;
- tputs(s, 1, CountChars);
- return StrCost;
- }
- else
- return EXPENSIVE;
-}
-
-static int
-CallRewrite(y, xs, xe, doit)
-int y, xs, xe, doit;
-{
- struct canvas *cv, *cvlist, *cvlnext;
- struct viewport *vp;
- struct layer *oldflayer;
- int cost;
-
- debug3("CallRewrite %d %d %d\n", y, xs, xe);
- ASSERT(display);
- ASSERT(xe >= xs);
-
- vp = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- if (y < cv->c_ys || y > cv->c_ye || xe < cv->c_xs || xs > cv->c_xe)
- continue;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- if (y >= vp->v_ys && y <= vp->v_ye && xe >= vp->v_xs && xs <= vp->v_xe)
- break;
- if (vp)
- break;
- }
- if (doit)
- {
- oldflayer = flayer;
- flayer = cv->c_layer;
- cvlist = flayer->l_cvlist;
- cvlnext = cv->c_lnext;
- flayer->l_cvlist = cv;
- cv->c_lnext = 0;
- LayRewrite(y - vp->v_yoff, xs - vp->v_xoff, xe - vp->v_xoff, &D_rend, 1);
- flayer->l_cvlist = cvlist;
- cv->c_lnext = cvlnext;
- flayer = oldflayer;
- return 0;
- }
- if (cv == 0 || cv->c_layer == 0)
- return EXPENSIVE; /* not found or nothing on it */
- if (xs < vp->v_xs || xe > vp->v_xe)
- return EXPENSIVE; /* crosses viewport boundaries */
- if (y - vp->v_yoff < 0 || y - vp->v_yoff >= cv->c_layer->l_height)
- return EXPENSIVE; /* line not on layer */
- if (xs - vp->v_xoff < 0 || xe - vp->v_xoff >= cv->c_layer->l_width)
- return EXPENSIVE; /* line not on layer */
-#ifdef UTF8
- if (D_encoding == UTF8)
- D_rend.font = 0;
-#endif
- oldflayer = flayer;
- flayer = cv->c_layer;
- debug3("Calling Rewrite %d %d %d\n", y - vp->v_yoff, xs - vp->v_xoff, xe - vp->v_xoff);
- cost = LayRewrite(y - vp->v_yoff, xs - vp->v_xoff, xe - vp->v_xoff, &D_rend, 0);
- flayer = oldflayer;
- if (D_insert)
- cost += D_EIcost + D_IMcost;
- return cost;
-}
-
-
-void
-GotoPos(x2, y2)
-int x2, y2;
-{
- register int dy, dx, x1, y1;
- register int costx, costy;
- register int m;
- register char *s;
- int CMcost;
- enum move_t xm = M_NONE, ym = M_NONE;
-
- if (!display)
- return;
-
- x1 = D_x;
- y1 = D_y;
-
- if (x1 == D_width)
- {
- if (D_CLP && D_AM)
- x1 = -1; /* don't know how the terminal treats this */
- else
- x1--;
- }
- if (x2 == D_width)
- x2--;
- dx = x2 - x1;
- dy = y2 - y1;
- if (dy == 0 && dx == 0)
- return;
- debug2("GotoPos (%d,%d)", x1, y1);
- debug2(" -> (%d,%d)\n", x2, y2);
- if (!D_MS) /* Safe to move ? */
- SetRendition(&mchar_null);
- if (y1 < 0 /* don't know the y position */
- || (y2 > D_bot && y1 <= D_bot) /* have to cross border */
- || (y2 < D_top && y1 >= D_top)) /* of scrollregion ? */
- {
- DoCM:
- if (D_HO && !x2 && !y2)
- AddCStr(D_HO);
- else
- AddCStr(tgoto(D_CM, x2, y2));
- D_x = x2;
- D_y = y2;
- return;
- }
-
- /* some scrollregion implementations don't allow movements
- * away from the region. sigh.
- */
- if ((y1 > D_bot && y2 > y1) || (y1 < D_top && y2 < y1))
- goto DoCM;
-
- /* Calculate CMcost */
- if (D_HO && !x2 && !y2)
- s = D_HO;
- else
- s = tgoto(D_CM, x2, y2);
- CMcost = CalcCost(s);
-
- /* Calculate the cost to move the cursor to the right x position */
- costx = EXPENSIVE;
- if (x1 >= 0) /* relativ x positioning only if we know where we are */
- {
- if (dx > 0)
- {
- if (D_CRI && (dx > 1 || !D_ND))
- {
- costx = CalcCost(tgoto(D_CRI, 0, dx));
- xm = M_CRI;
- }
- if ((m = D_NDcost * dx) < costx)
- {
- costx = m;
- xm = M_RI;
- }
- /* Speedup: dx <= LayRewrite() */
- if (dx < costx && (m = CallRewrite(y1, x1, x2 - 1, 0)) < costx)
- {
- costx = m;
- xm = M_RW;
- }
- }
- else if (dx < 0)
- {
- if (D_CLE && (dx < -1 || !D_BC))
- {
- costx = CalcCost(tgoto(D_CLE, 0, -dx));
- xm = M_CLE;
- }
- if ((m = -dx * D_LEcost) < costx)
- {
- costx = m;
- xm = M_LE;
- }
- }
- else
- costx = 0;
- }
- /* Speedup: LayRewrite() >= x2 */
- if (x2 + D_CRcost < costx && (m = (x2 ? CallRewrite(y1, 0, x2 - 1, 0) : 0) + D_CRcost) < costx)
- {
- costx = m;
- xm = M_CR;
- }
-
- /* Check if it is already cheaper to do CM */
- if (costx >= CMcost)
- goto DoCM;
-
- /* Calculate the cost to move the cursor to the right y position */
- costy = EXPENSIVE;
- if (dy > 0)
- {
- if (D_CDO && dy > 1) /* DO & NL are always != 0 */
- {
- costy = CalcCost(tgoto(D_CDO, 0, dy));
- ym = M_CDO;
- }
- if ((m = dy * ((x2 == 0) ? D_NLcost : D_DOcost)) < costy)
- {
- costy = m;
- ym = M_DO;
- }
- }
- else if (dy < 0)
- {
- if (D_CUP && (dy < -1 || !D_UP))
- {
- costy = CalcCost(tgoto(D_CUP, 0, -dy));
- ym = M_CUP;
- }
- if ((m = -dy * D_UPcost) < costy)
- {
- costy = m;
- ym = M_UP;
- }
- }
- else
- costy = 0;
-
- /* Finally check if it is cheaper to do CM */
- if (costx + costy >= CMcost)
- goto DoCM;
-
- switch (xm)
- {
- case M_LE:
- while (dx++ < 0)
- AddCStr(D_BC);
- break;
- case M_CLE:
- AddCStr2(D_CLE, -dx);
- break;
- case M_RI:
- while (dx-- > 0)
- AddCStr(D_ND);
- break;
- case M_CRI:
- AddCStr2(D_CRI, dx);
- break;
- case M_CR:
- AddCStr(D_CR);
- D_x = 0;
- x1 = 0;
- /* FALLTHROUGH */
- case M_RW:
- if (x1 < x2)
- (void) CallRewrite(y1, x1, x2 - 1, 1);
- break;
- default:
- break;
- }
-
- switch (ym)
- {
- case M_UP:
- while (dy++ < 0)
- AddCStr(D_UP);
- break;
- case M_CUP:
- AddCStr2(D_CUP, -dy);
- break;
- case M_DO:
- s = (x2 == 0) ? D_NL : D_DO;
- while (dy-- > 0)
- AddCStr(s);
- break;
- case M_CDO:
- AddCStr2(D_CDO, dy);
- break;
- default:
- break;
- }
- D_x = x2;
- D_y = y2;
-}
-
-void
-ClearAll()
-{
- ASSERT(display);
- ClearArea(0, 0, 0, D_width - 1, D_width - 1, D_height - 1, 0, 0);
-}
-
-void
-ClearArea(x1, y1, xs, xe, x2, y2, bce, uselayfn)
-int x1, y1, xs, xe, x2, y2, bce, uselayfn;
-{
- int y, xxe;
- struct canvas *cv;
- struct viewport *vp;
-
- debug2("Clear %d,%d", x1, y1);
- debug2(" %d-%d", xs, xe);
- debug2(" %d,%d", x2, y2);
- debug2(" uselayfn=%d bce=%d\n", uselayfn, bce);
- ASSERT(display);
- if (x1 == D_width)
- x1--;
- if (x2 == D_width)
- x2--;
- if (xs == -1)
- xs = x1;
- if (xe == -1)
- xe = x2;
- if (D_UT) /* Safe to erase ? */
- SetRendition(&mchar_null);
-#ifdef COLOR
- if (D_BE)
- SetBackColor(bce);
-#endif
- if (D_lp_missing && y1 <= D_bot && xe >= D_width - 1)
- {
- if (y2 > D_bot || (y2 == D_bot && x2 >= D_width - 1))
- D_lp_missing = 0;
- }
- if (x2 == D_width - 1 && (xs == 0 || y1 == y2) && xe == D_width - 1 && y2 == D_height - 1 && (!bce || D_BE))
- {
-#ifdef AUTO_NUKE
- if (x1 == 0 && y1 == 0 && D_auto_nuke)
- NukePending();
-#endif
- if (x1 == 0 && y1 == 0 && D_CL)
- {
- AddCStr(D_CL);
- D_y = D_x = 0;
- return;
- }
- /*
- * Workaround a hp700/22 terminal bug. Do not use CD where CE
- * is also appropriate.
- */
- if (D_CD && (y1 < y2 || !D_CE))
- {
- GotoPos(x1, y1);
- AddCStr(D_CD);
- return;
- }
- }
- if (x1 == 0 && xs == 0 && (xe == D_width - 1 || y1 == y2) && y1 == 0 && D_CCD && (!bce || D_BE))
- {
- GotoPos(x1, y1);
- AddCStr(D_CCD);
- return;
- }
- xxe = xe;
- for (y = y1; y <= y2; y++, x1 = xs)
- {
- if (y == y2)
- xxe = x2;
- if (x1 == 0 && D_CB && (xxe != D_width - 1 || (D_x == xxe && D_y == y)) && (!bce || D_BE))
- {
- GotoPos(xxe, y);
- AddCStr(D_CB);
- continue;
- }
- if (xxe == D_width - 1 && D_CE && (!bce || D_BE))
- {
- GotoPos(x1, y);
- AddCStr(D_CE);
- continue;
- }
- if (uselayfn)
- {
- vp = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- if (y < cv->c_ys || y > cv->c_ye || xxe < cv->c_xs || x1 > cv->c_xe)
- continue;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- if (y >= vp->v_ys && y <= vp->v_ye && xxe >= vp->v_xs && x1 <= vp->v_xe)
- break;
- if (vp)
- break;
- }
- if (cv && cv->c_layer && x1 >= vp->v_xs && xxe <= vp->v_xe &&
- y - vp->v_yoff >= 0 && y - vp->v_yoff < cv->c_layer->l_height &&
- xxe - vp->v_xoff >= 0 && x1 - vp->v_xoff < cv->c_layer->l_width)
- {
- struct layer *oldflayer = flayer;
- struct canvas *cvlist, *cvlnext;
- flayer = cv->c_layer;
- cvlist = flayer->l_cvlist;
- cvlnext = cv->c_lnext;
- flayer->l_cvlist = cv;
- cv->c_lnext = 0;
- LayClearLine(y - vp->v_yoff, x1 - vp->v_xoff, xxe - vp->v_xoff, bce);
- flayer->l_cvlist = cvlist;
- cv->c_lnext = cvlnext;
- flayer = oldflayer;
- continue;
- }
- }
- ClearLine((struct mline *)0, y, x1, xxe, bce);
- }
-}
-
-
-/*
- * if cur_only > 0, we only redisplay current line, as a full refresh is
- * too expensive over a low baud line.
- */
-void
-Redisplay(cur_only)
-int cur_only;
-{
- ASSERT(display);
-
- /* XXX do em all? */
- InsertMode(0);
- ChangeScrollRegion(0, D_height - 1);
- KeypadMode(0);
- CursorkeysMode(0);
- CursorVisibility(0);
- MouseMode(0);
- SetRendition(&mchar_null);
- SetFlow(FLOW_NOW);
-
- ClearAll();
-#ifdef RXVT_OSC
- RefreshXtermOSC();
-#endif
- if (cur_only > 0 && D_fore)
- RefreshArea(0, D_fore->w_y, D_width - 1, D_fore->w_y, 1);
- else
- RefreshAll(1);
- RefreshHStatus();
- CV_CALL(D_forecv, LayRestore();LaySetCursor());
-}
-
-void
-RedisplayDisplays(cur_only)
-int cur_only;
-{
- struct display *olddisplay = display;
- for (display = displays; display; display = display->d_next)
- Redisplay(cur_only);
- display = olddisplay;
-}
-
-
-/* XXX: use oml! */
-void
-ScrollH(y, xs, xe, n, bce, oml)
-int y, xs, xe, n, bce;
-struct mline *oml;
-{
- int i;
-
- if (n == 0)
- return;
- if (xe != D_width - 1)
- {
- RefreshLine(y, xs, xe, 0);
- /* UpdateLine(oml, y, xs, xe); */
- return;
- }
- GotoPos(xs, y);
- if (D_UT)
- SetRendition(&mchar_null);
-#ifdef COLOR
- if (D_BE)
- SetBackColor(bce);
-#endif
- if (n > 0)
- {
- if (n >= xe - xs + 1)
- n = xe - xs + 1;
- if (D_CDC && !(n == 1 && D_DC))
- AddCStr2(D_CDC, n);
- else if (D_DC)
- {
- for (i = n; i--; )
- AddCStr(D_DC);
- }
- else
- {
- RefreshLine(y, xs, xe, 0);
- /* UpdateLine(oml, y, xs, xe); */
- return;
- }
- }
- else
- {
- if (-n >= xe - xs + 1)
- n = -(xe - xs + 1);
- if (!D_insert)
- {
- if (D_CIC && !(n == -1 && D_IC))
- AddCStr2(D_CIC, -n);
- else if (D_IC)
- {
- for (i = -n; i--; )
- AddCStr(D_IC);
- }
- else if (D_IM)
- {
- InsertMode(1);
- SetRendition(&mchar_null);
-#ifdef COLOR
- SetBackColor(bce);
-#endif
- for (i = -n; i--; )
- INSERTCHAR(' ');
- bce = 0; /* all done */
- }
- else
- {
- /* UpdateLine(oml, y, xs, xe); */
- RefreshLine(y, xs, xe, 0);
- return;
- }
- }
- else
- {
- SetRendition(&mchar_null);
-#ifdef COLOR
- SetBackColor(bce);
-#endif
- for (i = -n; i--; )
- INSERTCHAR(' ');
- bce = 0; /* all done */
- }
- }
- if (bce && !D_BE)
- {
- if (n > 0)
- ClearLine((struct mline *)0, y, xe - n + 1, xe, bce);
- else
- ClearLine((struct mline *)0, y, xs, xs - n - 1, bce);
- }
- if (D_lp_missing && y == D_bot)
- {
- if (n > 0)
- WriteLP(D_width - 1 - n, y);
- D_lp_missing = 0;
- }
-}
-
-void
-ScrollV(xs, ys, xe, ye, n, bce)
-int xs, ys, xe, ye, n, bce;
-{
- int i;
- int up;
- int oldtop, oldbot;
- int alok, dlok, aldlfaster;
- int missy = 0;
-
- ASSERT(display);
- if (n == 0)
- return;
- if (n >= ye - ys + 1 || -n >= ye - ys + 1)
- {
- ClearArea(xs, ys, xs, xe, xe, ye, bce, 0);
- return;
- }
- if (xs > D_vpxmin || xe < D_vpxmax)
- {
- RefreshArea(xs, ys, xe, ye, 0);
- return;
- }
-
- if (D_lp_missing)
- {
- if (D_bot > ye || D_bot < ys)
- missy = D_bot;
- else
- {
- missy = D_bot - n;
- if (missy > ye || missy < ys)
- D_lp_missing = 0;
- }
- }
-
- up = 1;
- if (n < 0)
- {
- up = 0;
- n = -n;
- }
- if (n >= ye - ys + 1)
- n = ye - ys + 1;
-
- oldtop = D_top;
- oldbot = D_bot;
- if (ys < D_top || D_bot != ye)
- ChangeScrollRegion(ys, ye);
- alok = (D_AL || D_CAL || (ys >= D_top && ye == D_bot && up));
- dlok = (D_DL || D_CDL || (ys >= D_top && ye == D_bot && !up));
- if (D_top != ys && !(alok && dlok))
- ChangeScrollRegion(ys, ye);
-
- if (D_lp_missing &&
- (oldbot != D_bot ||
- (oldbot == D_bot && up && D_top == ys && D_bot == ye)))
- {
- WriteLP(D_width - 1, oldbot);
- if (oldbot == D_bot) /* have scrolled */
- {
- if (--n == 0)
- {
-/* XXX
- ChangeScrollRegion(oldtop, oldbot);
-*/
- if (bce && !D_BE)
- ClearLine((struct mline *)0, ye, xs, xe, bce);
- return;
- }
- }
- }
-
- if (D_UT)
- SetRendition(&mchar_null);
-#ifdef COLOR
- if (D_BE)
- SetBackColor(bce);
-#endif
-
- aldlfaster = (n > 1 && ys >= D_top && ye == D_bot && ((up && D_CDL) || (!up && D_CAL)));
-
- if ((up || D_SR) && D_top == ys && D_bot == ye && !aldlfaster)
- {
- if (up)
- {
- GotoPos(0, ye);
- for(i = n; i-- > 0; )
- AddCStr(D_NL); /* was SF, I think NL is faster */
- }
- else
- {
- GotoPos(0, ys);
- for(i = n; i-- > 0; )
- AddCStr(D_SR);
- }
- }
- else if (alok && dlok)
- {
- if (up || ye != D_bot)
- {
- GotoPos(0, up ? ys : ye+1-n);
- if (D_CDL && !(n == 1 && D_DL))
- AddCStr2(D_CDL, n);
- else
- for(i = n; i--; )
- AddCStr(D_DL);
- }
- if (!up || ye != D_bot)
- {
- GotoPos(0, up ? ye+1-n : ys);
- if (D_CAL && !(n == 1 && D_AL))
- AddCStr2(D_CAL, n);
- else
- for(i = n; i--; )
- AddCStr(D_AL);
- }
- }
- else
- {
- RefreshArea(xs, ys, xe, ye, 0);
- return;
- }
- if (bce && !D_BE)
- {
- if (up)
- ClearArea(xs, ye - n + 1, xs, xe, xe, ye, bce, 0);
- else
- ClearArea(xs, ys, xs, xe, xe, ys + n - 1, bce, 0);
- }
- if (D_lp_missing && missy != D_bot)
- WriteLP(D_width - 1, missy);
-/* XXX
- ChangeScrollRegion(oldtop, oldbot);
- if (D_lp_missing && missy != D_bot)
- WriteLP(D_width - 1, missy);
-*/
-}
-
-void
-SetAttr(new)
-register int new;
-{
- register int i, j, old, typ;
-
- if (!display || (old = D_rend.attr) == new)
- return;
-#ifdef COLORS16
- D_col16change = (old ^ new) & (A_BFG | A_BBG);
- new ^= D_col16change;
- if (old == new)
- return;
-#endif
-#if defined(TERMINFO) && defined(USE_SGR)
- if (D_SA)
- {
- char *tparm();
- SetFont(ASCII);
- ospeed = D_dospeed;
- tputs(tparm(D_SA, new & A_SO, new & A_US, new & A_RV, new & A_BL,
- new & A_DI, new & A_BD, 0 , 0 ,
- 0), 1, DoAddChar);
- D_rend.attr = new;
- D_atyp = 0;
-# ifdef COLOR
- if (D_hascolor)
- rend_setdefault(&D_rend);
-# endif
- return;
- }
-#endif
- D_rend.attr = new;
- typ = D_atyp;
- if ((new & old) != old)
- {
- if ((typ & ATYP_U))
- AddCStr(D_UE);
- if ((typ & ATYP_S))
- AddCStr(D_SE);
- if ((typ & ATYP_M))
- {
- AddCStr(D_ME);
-#ifdef COLOR
- /* ansi attrib handling: \E[m resets color, too */
- if (D_hascolor)
- rend_setdefault(&D_rend);
-#endif
-#ifdef FONT
- if (!D_CG0)
- {
- /* D_ME may also reset the alternate charset */
- D_rend.font = 0;
-# ifdef ENCODINGS
- D_realfont = 0;
-# endif
- }
-#endif
- }
- old = 0;
- typ = 0;
- }
- old ^= new;
- for (i = 0, j = 1; old && i < NATTR; i++, j <<= 1)
- {
- if ((old & j) == 0)
- continue;
- old ^= j;
- if (D_attrtab[i])
- {
- AddCStr(D_attrtab[i]);
- typ |= D_attrtyp[i];
- }
- }
- D_atyp = typ;
-}
-
-#ifdef FONT
-void
-SetFont(new)
-int new;
-{
- int old = D_rend.font;
- if (!display || old == new)
- return;
- D_rend.font = new;
-#ifdef ENCODINGS
- if (D_encoding && CanEncodeFont(D_encoding, new))
- return;
- if (new == D_realfont)
- return;
- D_realfont = new;
-#endif
- if (D_xtable && D_xtable[(int)(unsigned char)new] &&
- D_xtable[(int)(unsigned char)new][256])
- {
- AddCStr(D_xtable[(int)(unsigned char)new][256]);
- return;
- }
-
- if (!D_CG0 && new != '0')
- {
- new = ASCII;
- if (old == new)
- return;
- }
-
- if (new == ASCII)
- AddCStr(D_CE0);
-#ifdef DW_CHARS
- else if (new < ' ')
- {
- AddStr("\033$");
- if (new > 2)
- AddChar('(');
- AddChar(new + '@');
- }
-#endif
- else
- AddCStr2(D_CS0, new);
-}
-#endif
-
-#ifdef COLOR
-
-int
-color256to16(jj)
-int jj;
-{
- int min, max;
- int r, g, b;
-
- if (jj >= 232)
- {
- jj = (jj - 232) / 6;
- jj = (jj & 1) << 3 | (jj & 2 ? 7 : 0);
- }
- else if (jj >= 16)
- {
- jj -= 16;
- r = jj / 36;
- g = (jj / 6) % 6;
- b = jj % 6;
- min = r < g ? (r < b ? r : b) : (g < b ? g : b);
- max = r > g ? (r > b ? r : b) : (g > b ? g : b);
- if (min == max)
- jj = ((max + 1) & 2) << 2 | ((max + 1) & 4 ? 7 : 0);
- else
- jj = (b - min) / (max - min) << 2 | (g - min) / (max - min) << 1 | (r -
-min) / (max - min) | (max > 3 ? 8 : 0);
- }
- return jj;
-}
-
-#ifdef COLORS256
-int
-color256to88(jj)
-int jj;
-{
- int r, g, b;
-
- if (jj >= 232)
- return (jj - 232) / 3 + 80;
- if (jj >= 16)
- {
- jj -= 16;
- r = jj / 36;
- g = (jj / 6) % 6;
- b = jj % 6;
- return ((r + 1) / 2) * 16 + ((g + 1) / 2) * 4 + ((b + 1) / 2) + 16;
- }
- return jj;
-}
-#endif
-
-void
-SetColor(f, b)
-int f, b;
-{
- int of, ob;
- static unsigned char sftrans[8] = {0,4,2,6,1,5,3,7};
-
- if (!display)
- return;
-
- of = rend_getfg(&D_rend);
- ob = rend_getbg(&D_rend);
-
-#ifdef COLORS16
- /* intense default not invented yet */
- if (f == 0x100)
- f = 0;
- if (b == 0x100)
- b = 0;
-#endif
- debug2("SetColor %d %d", coli2e(of), coli2e(ob));
- debug2(" -> %d %d\n", coli2e(f), coli2e(b));
- debug2("(%d %d", of, ob);
- debug2(" -> %d %d)\n", f, b);
-
- if (!D_CAX && D_hascolor && ((f == 0 && f != of) || (b == 0 && b != ob)))
- {
- if (D_OP)
- AddCStr(D_OP);
- else
- {
- int oattr;
- oattr = D_rend.attr;
- AddCStr(D_ME ? D_ME : "\033[m");
-#ifdef FONT
- if (D_ME && !D_CG0)
- {
- /* D_ME may also reset the alternate charset */
- D_rend.font = 0;
-# ifdef ENCODINGS
- D_realfont = 0;
-# endif
- }
-#endif
- D_atyp = 0;
- D_rend.attr = 0;
- SetAttr(oattr);
- }
- of = ob = 0;
- }
- rend_setfg(&D_rend, f);
- rend_setbg(&D_rend, b);
-#ifdef COLORS16
- D_col16change = 0;
-#endif
- if (!D_hascolor)
- return;
- f = f ? coli2e(f) : -1;
- b = b ? coli2e(b) : -1;
- of = of ? coli2e(of) : -1;
- ob = ob ? coli2e(ob) : -1;
-#ifdef COLORS256
- if (f != of && f > 15 && D_CCO != 256)
- f = D_CCO == 88 && D_CAF ? color256to88(f) : color256to16(f);
- if (f != of && f > 15 && D_CAF)
- {
- AddCStr2(D_CAF, f);
- of = f;
- }
- if (b != ob && b > 15 && D_CCO != 256)
- b = D_CCO == 88 && D_CAB ? color256to88(b) : color256to16(b);
- if (b != ob && b > 15 && D_CAB)
- {
- AddCStr2(D_CAB, b);
- ob = b;
- }
-#endif
- if (f != of && f != (of | 8))
- {
- if (f == -1)
- AddCStr("\033[39m"); /* works because AX is set */
- else if (D_CAF)
- AddCStr2(D_CAF, f & 7);
- else if (D_CSF)
- AddCStr2(D_CSF, sftrans[f & 7]);
- }
- if (b != ob && b != (ob | 8))
- {
- if (b == -1)
- AddCStr("\033[49m"); /* works because AX is set */
- else if (D_CAB)
- AddCStr2(D_CAB, b & 7);
- else if (D_CSB)
- AddCStr2(D_CSB, sftrans[b & 7]);
- }
-#ifdef COLORS16
- if (f != of && D_CXT && (f & 8) != 0 && f != -1)
- {
-# ifdef TERMINFO
- AddCStr2("\033[9%p1%dm", f & 7);
-# else
- AddCStr2("\033[9%dm", f & 7);
-# endif
- }
- if (b != ob && D_CXT && (b & 8) != 0 && b != -1)
- {
-# ifdef TERMINFO
- AddCStr2("\033[10%p1%dm", b & 7);
-# else
- AddCStr2("\033[10%dm", b & 7);
-# endif
- }
-#endif
-}
-
-static void
-SetBackColor(new)
-int new;
-{
- if (!display)
- return;
- SetColor(rend_getfg(&D_rend), new);
-}
-#endif /* COLOR */
-
-void
-SetRendition(mc)
-struct mchar *mc;
-{
- if (!display)
- return;
- if (nattr2color && D_hascolor && (mc->attr & nattr2color) != 0)
- {
- static struct mchar mmc;
- int i;
- mmc = *mc;
- for (i = 0; i < 8; i++)
- if (attr2color[i] && (mc->attr & (1 << i)) != 0)
- {
- if (mc->color == 0 && attr2color[i][3])
- ApplyAttrColor(attr2color[i][3], &mmc);
- else if ((mc->color & 0x0f) == 0 && attr2color[i][2])
- ApplyAttrColor(attr2color[i][2], &mmc);
- else if ((mc->color & 0xf0) == 0 && attr2color[i][1])
- ApplyAttrColor(attr2color[i][1], &mmc);
- else
- ApplyAttrColor(attr2color[i][0], &mmc);
- }
- mc = &mmc;
- debug2("SetRendition: mapped to %02x %02x\n", (unsigned char)mc->attr, 0x99 - (unsigned char)mc->color);
- }
- if (D_hascolor && D_CC8 && (mc->attr & (A_BFG|A_BBG)))
- {
- int a = mc->attr;
- if ((mc->attr & A_BFG) && D_MD)
- a |= A_BD;
- if ((mc->attr & A_BBG) && D_MB)
- a |= A_BL;
- if (D_rend.attr != a)
- SetAttr(a);
- }
- else if (D_rend.attr != mc->attr)
- SetAttr(mc->attr);
-#ifdef COLOR
- if (D_rend.color != mc->color
-# ifdef COLORS256
- || D_rend.colorx != mc->colorx
-# endif
-# ifdef COLORS16
- || D_col16change
-# endif
- )
- SetColor(rend_getfg(mc), rend_getbg(mc));
-#endif
-#ifdef FONT
- if (D_rend.font != mc->font)
- SetFont(mc->font);
-#endif
-}
-
-void
-SetRenditionMline(ml, x)
-struct mline *ml;
-int x;
-{
- if (!display)
- return;
- if (nattr2color && D_hascolor && (ml->attr[x] & nattr2color) != 0)
- {
- struct mchar mc;
- copy_mline2mchar(&mc, ml, x);
- SetRendition(&mc);
- return;
- }
- if (D_hascolor && D_CC8 && (ml->attr[x] & (A_BFG|A_BBG)))
- {
- int a = ml->attr[x];
- if ((ml->attr[x] & A_BFG) && D_MD)
- a |= A_BD;
- if ((ml->attr[x] & A_BBG) && D_MB)
- a |= A_BL;
- if (D_rend.attr != a)
- SetAttr(a);
- }
- else if (D_rend.attr != ml->attr[x])
- SetAttr(ml->attr[x]);
-#ifdef COLOR
- if (D_rend.color != ml->color[x]
-# ifdef COLORS256
- || D_rend.colorx != ml->colorx[x]
-# endif
-# ifdef COLORS16
- || D_col16change
-# endif
- )
- {
- struct mchar mc;
- copy_mline2mchar(&mc, ml, x);
- SetColor(rend_getfg(&mc), rend_getbg(&mc));
- }
-#endif
-#ifdef FONT
- if (D_rend.font != ml->font[x])
- SetFont(ml->font[x]);
-#endif
-}
-
-void
-MakeStatus(msg)
-char *msg;
-{
- register char *s, *t;
- register int max;
-
- if (!display)
- return;
-
- if (D_blocked)
- return;
- if (!D_tcinited)
- {
- debug("tc not inited, just writing msg\n");
- if (D_processinputdata)
- return; /* XXX: better */
- AddStr(msg);
- AddStr("\r\n");
- Flush();
- return;
- }
- if (!use_hardstatus || !D_HS)
- {
- max = D_width;
- if (D_CLP == 0)
- max--;
- }
- else
- max = D_WS > 0 ? D_WS : (D_width - !D_CLP);
- if (D_status)
- {
- /* same message? */
- if (strcmp(msg, D_status_lastmsg) == 0)
- {
- debug("same message - increase timeout");
- SetTimeout(&D_statusev, MsgWait);
- return;
- }
- if (!D_status_bell)
- {
- struct timeval now;
- int ti;
- gettimeofday(&now, NULL);
- ti = (now.tv_sec - D_status_time.tv_sec) * 1000 + (now.tv_usec - D_status_time.tv_usec) / 1000;
- if (ti < MsgMinWait)
- DisplaySleep1000(MsgMinWait - ti, 0);
- }
- RemoveStatus();
- }
- for (s = t = msg; *s && t - msg < max; ++s)
- if (*s == BELL)
- AddCStr(D_BL);
- else if ((unsigned char)*s >= ' ' && *s != 0177)
- *t++ = *s;
- *t = '\0';
- if (t == msg)
- return;
- if (t - msg >= D_status_buflen)
- {
- char *buf;
- if (D_status_lastmsg)
- buf = realloc(D_status_lastmsg, t - msg + 1);
- else
- buf = malloc(t - msg + 1);
- if (buf)
- {
- D_status_lastmsg = buf;
- D_status_buflen = t - msg + 1;
- }
- }
- if (t - msg < D_status_buflen)
- strcpy(D_status_lastmsg, msg);
- D_status_len = t - msg;
- D_status_lastx = D_x;
- D_status_lasty = D_y;
- if (!use_hardstatus || D_has_hstatus == HSTATUS_IGNORE || D_has_hstatus == HSTATUS_MESSAGE)
- {
- D_status = STATUS_ON_WIN;
- debug1("using STATLINE %d\n", STATLINE);
- GotoPos(0, STATLINE);
- SetRendition(&mchar_so);
- InsertMode(0);
- AddStr(msg);
- if (D_status_len < max)
- {
- /* Wayne Davison: add extra space for readability */
- D_status_len++;
- SetRendition(&mchar_null);
- AddChar(' ');
- if (D_status_len < max)
- {
- D_status_len++;
- AddChar(' ');
- AddChar('\b');
- }
- AddChar('\b');
- }
- D_x = -1;
- }
- else
- {
- D_status = STATUS_ON_HS;
- ShowHStatus(msg);
- }
- Flush();
- if (!display)
- return;
- if (D_status == STATUS_ON_WIN)
- {
- struct display *olddisplay = display;
- struct layer *oldflayer = flayer;
-
- ASSERT(D_obuffree == D_obuflen);
- /* this is copied over from RemoveStatus() */
- D_status = 0;
- GotoPos(0, STATLINE);
- RefreshLine(STATLINE, 0, D_status_len - 1, 0);
- GotoPos(D_status_lastx, D_status_lasty);
- flayer = D_forecv ? D_forecv->c_layer : 0;
- if (flayer)
- LaySetCursor();
- display = olddisplay;
- flayer = oldflayer;
- D_status_obuflen = D_obuflen;
- D_status_obuffree = D_obuffree;
- D_obuffree = D_obuflen = 0;
- D_status = STATUS_ON_WIN;
- }
- gettimeofday(&D_status_time, NULL);
- SetTimeout(&D_statusev, MsgWait);
- evenq(&D_statusev);
-#ifdef HAVE_BRAILLE
- RefreshBraille(); /* let user see multiple Msg()s */
-#endif
-}
-
-void
-RemoveStatus()
-{
- struct display *olddisplay;
- struct layer *oldflayer;
- int where;
-
- if (!display)
- return;
- if (!(where = D_status))
- return;
-
- debug("RemoveStatus\n");
- if (D_status_obuffree >= 0)
- {
- D_obuflen = D_status_obuflen;
- D_obuffree = D_status_obuffree;
- D_status_obuffree = -1;
- D_status = 0;
- D_status_bell = 0;
- evdeq(&D_statusev);
- return;
- }
- D_status = 0;
- D_status_bell = 0;
- evdeq(&D_statusev);
- olddisplay = display;
- oldflayer = flayer;
- if (where == STATUS_ON_WIN)
- {
- GotoPos(0, STATLINE);
- RefreshLine(STATLINE, 0, D_status_len - 1, 0);
- GotoPos(D_status_lastx, D_status_lasty);
- }
- else
- RefreshHStatus();
- flayer = D_forecv ? D_forecv->c_layer : 0;
- if (flayer)
- LaySetCursor();
- display = olddisplay;
- flayer = oldflayer;
-}
-
-/* refresh the display's hstatus line */
-void
-ShowHStatus(str)
-char *str;
-{
- int l, i, ox, oy, max;
-
- if (D_status == STATUS_ON_WIN && D_has_hstatus == HSTATUS_LASTLINE && STATLINE == D_height-1)
- return; /* sorry, in use */
- if (D_blocked)
- return;
-
- if (D_HS && D_has_hstatus == HSTATUS_HS)
- {
- if (!D_hstatus && (str == 0 || *str == 0))
- return;
- debug("ShowHStatus: using HS\n");
- SetRendition(&mchar_null);
- InsertMode(0);
- if (D_hstatus)
- AddCStr(D_DS);
- D_hstatus = 0;
- if (str == 0 || *str == 0)
- return;
- AddCStr2(D_TS, 0);
- max = D_WS > 0 ? D_WS : (D_width - !D_CLP);
- if ((int)strlen(str) > max)
- AddStrn(str, max);
- else
- AddStr(str);
- AddCStr(D_FS);
- D_hstatus = 1;
- }
- else if (D_has_hstatus == HSTATUS_LASTLINE)
- {
- debug("ShowHStatus: using last line\n");
- ox = D_x;
- oy = D_y;
- str = str ? str : "";
- l = strlen(str);
- if (l > D_width)
- l = D_width;
- GotoPos(0, D_height - 1);
- SetRendition(captionalways || D_cvlist == 0 || D_cvlist->c_next ? &mchar_null: &mchar_so);
- if (!PutWinMsg(str, 0, l))
- for (i = 0; i < l; i++)
- PUTCHARLP(str[i]);
- if (!captionalways && D_cvlist && !D_cvlist->c_next)
- while (l++ < D_width)
- PUTCHARLP(' ');
- if (l < D_width)
- ClearArea(l, D_height - 1, l, D_width - 1, D_width - 1, D_height - 1, 0, 0);
- if (ox != -1 && oy != -1)
- GotoPos(ox, oy);
- D_hstatus = *str ? 1 : 0;
- SetRendition(&mchar_null);
- }
- else if (str && *str && D_has_hstatus == HSTATUS_MESSAGE)
- {
- debug("ShowHStatus: using message\n");
- Msg(0, "%s", str);
- }
-}
-
-
-/*
- * Refreshes the harstatus of the fore window. Shouldn't be here...
- */
-void
-RefreshHStatus()
-{
- char *buf;
-
- evdeq(&D_hstatusev);
- if (D_status == STATUS_ON_HS)
- return;
- buf = MakeWinMsgEv(hstatusstring, D_fore, '%', (D_HS && D_has_hstatus == HSTATUS_HS && D_WS > 0) ? D_WS : D_width - !D_CLP, &D_hstatusev, 0);
- if (buf && *buf)
- {
- ShowHStatus(buf);
- if (D_has_hstatus != HSTATUS_IGNORE && D_hstatusev.timeout.tv_sec)
- evenq(&D_hstatusev);
- }
- else
- ShowHStatus((char *)0);
-}
-
-/*********************************************************************/
-/*
- * Here come the routines that refresh an arbitrary part of the screen.
- */
-
-void
-RefreshAll(isblank)
-int isblank;
-{
- struct canvas *cv;
-
- ASSERT(display);
- debug("Signalling full refresh!\n");
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- CV_CALL(cv, LayRedisplayLine(-1, -1, -1, isblank));
- display = cv->c_display; /* just in case! */
- }
- RefreshArea(0, 0, D_width - 1, D_height - 1, isblank);
-}
-
-void
-RefreshArea(xs, ys, xe, ye, isblank)
-int xs, ys, xe, ye, isblank;
-{
- int y;
- ASSERT(display);
- debug2("Refresh Area: %d,%d", xs, ys);
- debug3(" - %d,%d (isblank=%d)\n", xe, ye, isblank);
- if (!isblank && xs == 0 && xe == D_width - 1 && ye == D_height - 1 && (ys == 0 || D_CD))
- {
- ClearArea(xs, ys, xs, xe, xe, ye, 0, 0);
- isblank = 1;
- }
- for (y = ys; y <= ye; y++)
- RefreshLine(y, xs, xe, isblank);
-}
-
-void
-RefreshLine(y, from, to, isblank)
-int y, from, to, isblank;
-{
- struct viewport *vp, *lvp;
- struct canvas *cv, *lcv, *cvlist, *cvlnext;
- struct layer *oldflayer;
- int xx, yy;
- char *buf;
- struct win *p;
-
- ASSERT(display);
-
- debug2("RefreshLine %d %d", y, from);
- debug2(" %d %d\n", to, isblank);
-
- if (D_status == STATUS_ON_WIN && y == STATLINE)
- return; /* can't refresh status */
-
- if (isblank == 0 && D_CE && to == D_width - 1 && from < to)
- {
- GotoPos(from, y);
- if (D_UT || D_BE)
- SetRendition(&mchar_null);
- AddCStr(D_CE);
- isblank = 1;
- }
- while (from <= to)
- {
- lcv = 0;
- lvp = 0;
- for (cv = display->d_cvlist; cv; cv = cv->c_next)
- {
- if (y < cv->c_ys || y > cv->c_ye || to < cv->c_xs || from > cv->c_xe)
- continue;
- debug2("- canvas hit: %d %d", cv->c_xs, cv->c_ys);
- debug2(" %d %d\n", cv->c_xe, cv->c_ye);
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- debug2(" - vp: %d %d", vp->v_xs, vp->v_ys);
- debug2(" %d %d\n", vp->v_xe, vp->v_ye);
- /* find leftmost overlapping vp */
- if (y >= vp->v_ys && y <= vp->v_ye && from <= vp->v_xe && to >= vp->v_xs && (lvp == 0 || lvp->v_xs > vp->v_xs))
- {
- lcv = cv;
- lvp = vp;
- }
- }
- }
- if (lvp == 0)
- break;
- if (from < lvp->v_xs)
- {
- if (!isblank)
- DisplayLine(&mline_null, &mline_blank, y, from, lvp->v_xs - 1);
- from = lvp->v_xs;
- }
-
- /* call LayRedisplayLine on canvas lcv viewport lvp */
- yy = y - lvp->v_yoff;
- xx = to < lvp->v_xe ? to : lvp->v_xe;
-
- if (lcv->c_layer && yy == lcv->c_layer->l_height)
- {
- GotoPos(from, y);
- SetRendition(&mchar_blank);
- while (from <= lvp->v_xe && from - lvp->v_xoff < lcv->c_layer->l_width)
- {
- PUTCHARLP('-');
- from++;
- }
- if (from >= lvp->v_xe + 1)
- continue;
- }
- if (lcv->c_layer == 0 || yy >= lcv->c_layer->l_height || from - lvp->v_xoff >= lcv->c_layer->l_width)
- {
- if (!isblank)
- DisplayLine(&mline_null, &mline_blank, y, from, lvp->v_xe);
- from = lvp->v_xe + 1;
- continue;
- }
-
- if (xx - lvp->v_xoff >= lcv->c_layer->l_width)
- xx = lcv->c_layer->l_width + lvp->v_xoff - 1;
- oldflayer = flayer;
- flayer = lcv->c_layer;
- cvlist = flayer->l_cvlist;
- cvlnext = lcv->c_lnext;
- flayer->l_cvlist = lcv;
- lcv->c_lnext = 0;
- LayRedisplayLine(yy, from - lvp->v_xoff, xx - lvp->v_xoff, isblank);
- flayer->l_cvlist = cvlist;
- lcv->c_lnext = cvlnext;
- flayer = oldflayer;
-
- from = xx + 1;
- }
- if (from > to)
- return; /* all done */
-
- if (y == D_height - 1 && D_has_hstatus == HSTATUS_LASTLINE)
- {
- RefreshHStatus();
- return;
- }
-
- for (cv = display->d_cvlist; cv; cv = cv->c_next)
- if (y == cv->c_ye + 1)
- break;
- if (cv == 0)
- {
- if (!isblank)
- DisplayLine(&mline_null, &mline_blank, y, from, to);
- return;
- }
-
- p = Layer2Window(cv->c_layer);
- buf = MakeWinMsgEv(captionstring, p, '%', D_width - !D_CLP, &cv->c_captev, 0);
- if (cv->c_captev.timeout.tv_sec)
- evenq(&cv->c_captev);
- xx = strlen(buf);
- GotoPos(from, y);
- SetRendition(&mchar_so);
- if (PutWinMsg(buf, from, to + 1))
- from = xx > to + 1 ? to + 1 : xx;
- else
- {
- while (from <= to && from < xx)
- {
- PUTCHARLP(buf[from]);
- from++;
- }
- }
- while (from++ <= to)
- PUTCHARLP(' ');
-}
-
-/*********************************************************************/
-
-/* clear lp_missing by writing the char on the screen. The
- * position must be safe.
- */
-static void
-WriteLP(x2, y2)
-int x2, y2;
-{
- struct mchar oldrend;
-
- ASSERT(display);
- ASSERT(D_lp_missing);
- oldrend = D_rend;
- debug2("WriteLP(%d,%d)\n", x2, y2);
-#ifdef DW_CHARS
- if (D_lpchar.mbcs)
- {
- if (x2 > 0)
- x2--;
- else
- D_lpchar = mchar_blank;
- }
-#endif
- /* Can't use PutChar */
- GotoPos(x2, y2);
- SetRendition(&D_lpchar);
- PUTCHAR(D_lpchar.image);
-#ifdef DW_CHARS
- if (D_lpchar.mbcs)
- PUTCHAR(D_lpchar.mbcs);
-#endif
- D_lp_missing = 0;
- SetRendition(&oldrend);
-}
-
-void
-ClearLine(oml, y, from, to, bce)
-struct mline *oml;
-int from, to, y, bce;
-{
- int x;
-#ifdef COLOR
- struct mchar bcechar;
-#endif
-
- debug3("ClearLine %d,%d-%d\n", y, from, to);
- if (D_UT) /* Safe to erase ? */
- SetRendition(&mchar_null);
-#ifdef COLOR
- if (D_BE)
- SetBackColor(bce);
-#endif
- if (from == 0 && D_CB && (to != D_width - 1 || (D_x == to && D_y == y)) && (!bce || D_BE))
- {
- GotoPos(to, y);
- AddCStr(D_CB);
- return;
- }
- if (to == D_width - 1 && D_CE && (!bce || D_BE))
- {
- GotoPos(from, y);
- AddCStr(D_CE);
- return;
- }
- if (oml == 0)
- oml = &mline_null;
-#ifdef COLOR
- if (!bce)
- {
- DisplayLine(oml, &mline_blank, y, from, to);
- return;
- }
- bcechar = mchar_blank;
- rend_setbg(&bcechar, bce);
- for (x = from; x <= to; x++)
- copy_mchar2mline(&bcechar, &mline_old, x);
- DisplayLine(oml, &mline_old, y, from, to);
-#else
- DisplayLine(oml, &mline_blank, y, from, to);
-#endif
-}
-
-void
-DisplayLine(oml, ml, y, from, to)
-struct mline *oml, *ml;
-int from, to, y;
-{
- register int x;
- int last2flag = 0, delete_lp = 0;
-
- ASSERT(display);
- ASSERT(y >= 0 && y < D_height);
- ASSERT(from >= 0 && from < D_width);
- ASSERT(to >= 0 && to < D_width);
- if (!D_CLP && y == D_bot && to == D_width - 1)
- {
- if (D_lp_missing || !cmp_mline(oml, ml, to))
- {
-#ifdef DW_CHARS
- if ((D_IC || D_IM) && from < to && !dw_left(ml, to, D_encoding))
-#else
- if ((D_IC || D_IM) && from < to)
-#endif
- {
- last2flag = 1;
- D_lp_missing = 0;
- to--;
- }
- else
- {
- delete_lp = !cmp_mchar_mline(&mchar_blank, oml, to) && (D_CE || D_DC || D_CDC);
- D_lp_missing = !cmp_mchar_mline(&mchar_blank, ml, to);
- copy_mline2mchar(&D_lpchar, ml, to);
- }
- }
- to--;
- }
-#ifdef DW_CHARS
- if (D_mbcs)
- {
- /* finish dw-char (can happen after a wrap) */
- debug("DisplayLine finishing kanji\n");
- SetRenditionMline(ml, from);
- PUTCHAR(ml->image[from]);
- from++;
- }
-#endif
- for (x = from; x <= to; x++)
- {
-#if 0 /* no longer needed */
- if (x || D_x != D_width || D_y != y - 1)
-#endif
- {
- if (x < to || x != D_width - 1 || ml->image[x + 1])
- if (cmp_mline(oml, ml, x))
- continue;
- GotoPos(x, y);
- }
-#ifdef DW_CHARS
- if (dw_right(ml, x, D_encoding))
- {
- x--;
- debug1("DisplayLine on right side of dw char- x now %d\n", x);
- GotoPos(x, y);
- }
- if (x == to && dw_left(ml, x, D_encoding))
- break; /* don't start new kanji */
-#endif
- SetRenditionMline(ml, x);
- PUTCHAR(ml->image[x]);
-#ifdef DW_CHARS
- if (dw_left(ml, x, D_encoding))
- PUTCHAR(ml->image[++x]);
-#endif
- }
-#if 0 /* not needed any longer */
- /* compare != 0 because ' ' can happen when clipping occures */
- if (to == D_width - 1 && y < D_height - 1 && D_x == D_width && ml->image[to + 1])
- GotoPos(0, y + 1);
-#endif
- if (last2flag)
- {
- GotoPos(x, y);
- SetRenditionMline(ml, x + 1);
- PUTCHAR(ml->image[x + 1]);
- GotoPos(x, y);
- SetRenditionMline(ml, x);
- INSERTCHAR(ml->image[x]);
- }
- else if (delete_lp)
- {
- if (D_UT)
- SetRendition(&mchar_null);
- if (D_DC)
- AddCStr(D_DC);
- else if (D_CDC)
- AddCStr2(D_CDC, 1);
- else if (D_CE)
- AddCStr(D_CE);
- }
-}
-
-void
-PutChar(c, x, y)
-struct mchar *c;
-int x, y;
-{
- GotoPos(x, y);
- SetRendition(c);
- PUTCHARLP(c->image);
-#ifdef DW_CHARS
- if (c->mbcs)
- {
-# ifdef UTF8
- if (D_encoding == UTF8)
- D_rend.font = 0;
-# endif
- PUTCHARLP(c->mbcs);
- }
-#endif
-}
-
-void
-InsChar(c, x, xe, y, oml)
-struct mchar *c;
-int x, xe, y;
-struct mline *oml;
-{
- GotoPos(x, y);
- if (y == D_bot && !D_CLP)
- {
- if (x == D_width - 1)
- {
- D_lp_missing = 1;
- D_lpchar = *c;
- return;
- }
- if (xe == D_width - 1)
- D_lp_missing = 0;
- }
- if (x == xe)
- {
- SetRendition(c);
- PUTCHARLP(c->image);
- return;
- }
- if (!(D_IC || D_CIC || D_IM) || xe != D_width - 1)
- {
- RefreshLine(y, x, xe, 0);
- GotoPos(x + 1, y);
- /* UpdateLine(oml, y, x, xe); */
- return;
- }
- InsertMode(1);
- if (!D_insert)
- {
-#ifdef DW_CHARS
- if (c->mbcs && D_IC)
- AddCStr(D_IC);
- if (D_IC)
- AddCStr(D_IC);
- else
- AddCStr2(D_CIC, c->mbcs ? 2 : 1);
-#else
- if (D_IC)
- AddCStr(D_IC);
- else
- AddCStr2(D_CIC, 1);
-#endif
- }
- SetRendition(c);
- RAW_PUTCHAR(c->image);
-#ifdef DW_CHARS
- if (c->mbcs)
- {
-# ifdef UTF8
- if (D_encoding == UTF8)
- D_rend.font = 0;
-# endif
- if (D_x == D_width - 1)
- PUTCHARLP(c->mbcs);
- else
- RAW_PUTCHAR(c->mbcs);
- }
-#endif
-}
-
-void
-WrapChar(c, x, y, xs, ys, xe, ye, ins)
-struct mchar *c;
-int x, y;
-int xs, ys, xe, ye;
-int ins;
-{
- int bce;
-
-#ifdef COLOR
- bce = rend_getbg(c);
-#else
- bce = 0;
-#endif
- debug("WrapChar:");
- debug2(" x %d y %d", x, y);
- debug2(" Dx %d Dy %d", D_x, D_y);
- debug2(" xs %d ys %d", xs, ys);
- debug3(" xe %d ye %d ins %d\n", xe, ye, ins);
- if (xs != 0 || x != D_width || !D_AM)
- {
- if (y == ye)
- ScrollV(xs, ys, xe, ye, 1, bce);
- else if (y < D_height - 1)
- y++;
- if (ins)
- InsChar(c, xs, xe, y, 0);
- else
- PutChar(c, xs, y);
- return;
- }
- if (y == ye) /* we have to scroll */
- {
- debug("- scrolling\n");
- ChangeScrollRegion(ys, ye);
- if (D_bot != y || D_x != D_width || (!bce && !D_BE))
- {
- debug("- have to call ScrollV\n");
- ScrollV(xs, ys, xe, ye, 1, bce);
- y--;
- }
- }
- else if (y == D_bot) /* remove unusable region? */
- ChangeScrollRegion(0, D_height - 1);
- if (D_x != D_width || D_y != y)
- {
- if (D_CLP && y >= 0) /* don't even try if !LP */
- RefreshLine(y, D_width - 1, D_width - 1, 0);
- debug2("- refresh last char -> x,y now %d,%d\n", D_x, D_y);
- if (D_x != D_width || D_y != y) /* sorry, no bonus */
- {
- if (y == ye)
- ScrollV(xs, ys, xe, ye, 1, bce);
- GotoPos(xs, y == ye || y == D_height - 1 ? y : y + 1);
- }
- }
- debug("- writeing new char");
- if (y != ye && y < D_height - 1)
- y++;
- if (ins != D_insert)
- InsertMode(ins);
- if (ins && !D_insert)
- {
- InsChar(c, 0, xe, y, 0);
- debug2(" -> done with insert (%d,%d)\n", D_x, D_y);
- return;
- }
- D_y = y;
- D_x = 0;
- SetRendition(c);
- RAW_PUTCHAR(c->image);
-#ifdef DW_CHARS
- if (c->mbcs)
- {
-# ifdef UTF8
- if (D_encoding == UTF8)
- D_rend.font = 0;
-# endif
- RAW_PUTCHAR(c->mbcs);
- }
-#endif
- debug2(" -> done (%d,%d)\n", D_x, D_y);
-}
-
-int
-ResizeDisplay(wi, he)
-int wi, he;
-{
- ASSERT(display);
- debug2("ResizeDisplay: to (%d,%d).\n", wi, he);
- if (D_width == wi && D_height == he)
- {
- debug("ResizeDisplay: No change\n");
- return 0;
- }
- if (D_width != wi && (D_height == he || !D_CWS) && D_CZ0 && (wi == Z0width || wi == Z1width))
- {
- debug("ResizeDisplay: using Z0/Z1\n");
- AddCStr(wi == Z0width ? D_CZ0 : D_CZ1);
- ChangeScreenSize(wi, D_height, 0);
- return (he == D_height) ? 0 : -1;
- }
- if (D_CWS)
- {
- debug("ResizeDisplay: using WS\n");
- AddCStr(tgoto(D_CWS, wi, he));
- ChangeScreenSize(wi, he, 0);
- return 0;
- }
- return -1;
-}
-
-void
-ChangeScrollRegion(newtop, newbot)
-int newtop, newbot;
-{
- if (display == 0)
- return;
- if (newtop == newbot)
- return; /* xterm etc can't do it */
- if (newtop == -1)
- newtop = 0;
- if (newbot == -1)
- newbot = D_height - 1;
- if (D_CS == 0)
- {
- D_top = 0;
- D_bot = D_height - 1;
- return;
- }
- if (D_top == newtop && D_bot == newbot)
- return;
- debug2("ChangeScrollRegion: (%d - %d)\n", newtop, newbot);
- AddCStr(tgoto(D_CS, newbot, newtop));
- D_top = newtop;
- D_bot = newbot;
- D_y = D_x = -1; /* Just in case... */
-}
-
-#ifdef RXVT_OSC
-void
-SetXtermOSC(i, s)
-int i;
-char *s;
-{
- static char oscs[] = "1;\000\00020;\00039;\00049;\000";
-
- ASSERT(display);
- if (!D_CXT)
- return;
- if (!s)
- s = "";
- if (!D_xtermosc[i] && !*s)
- return;
- if (i == 0 && !*s)
- s = "screen"; /* always set icon name */
- if (i == 1 && !*s)
- s = ""; /* no background */
- if (i == 2 && !*s)
- s = "black"; /* black text */
- if (i == 3 && !*s)
- s = "white"; /* on white background */
- D_xtermosc[i] = 1;
- AddStr("\033]");
- AddStr(oscs + i * 4);
- AddStr(s);
- AddChar(7);
-}
-
-void
-ClearAllXtermOSC()
-{
- int i;
- for (i = 3; i >= 0; i--)
- SetXtermOSC(i, 0);
-}
-#endif
-
-/*
- * Output buffering routines
- */
-
-void
-AddStr(str)
-char *str;
-{
- register char c;
-
- ASSERT(display);
-
-#ifdef UTF8
- if (D_encoding == UTF8)
- {
- while ((c = *str++))
- AddUtf8((unsigned char)c);
- return;
- }
-#endif
- while ((c = *str++))
- AddChar(c);
-}
-
-void
-AddStrn(str, n)
-char *str;
-int n;
-{
- register char c;
-
- ASSERT(display);
-#ifdef UTF8
- if (D_encoding == UTF8)
- {
- while ((c = *str++) && n-- > 0)
- AddUtf8((unsigned char)c);
- }
- else
-#endif
- while ((c = *str++) && n-- > 0)
- AddChar(c);
- while (n-- > 0)
- AddChar(' ');
-}
-
-void
-Flush()
-{
- register int l;
- register char *p;
-
- ASSERT(display);
- l = D_obufp - D_obuf;
- debug1("Flush(): %d\n", l);
- if (l == 0)
- return;
- ASSERT(l + D_obuffree == D_obuflen);
- if (D_userfd < 0)
- {
- D_obuffree += l;
- D_obufp = D_obuf;
- return;
- }
- p = D_obuf;
- if (fcntl(D_userfd, F_SETFL, 0))
- debug1("Warning: BLOCK fcntl failed: %d\n", errno);
- while (l)
- {
- register int wr;
- wr = write(D_userfd, p, l);
- if (wr <= 0)
- {
- if (errno == EINTR)
- continue;
- debug1("Writing to display: %d\n", errno);
- wr = l;
- }
- if (!display)
- return;
- D_obuffree += wr;
- p += wr;
- l -= wr;
- }
- D_obuffree += l;
- D_obufp = D_obuf;
- if (fcntl(D_userfd, F_SETFL, FNBLOCK))
- debug1("Warning: NBLOCK fcntl failed: %d\n", errno);
- if (D_blocked == 1)
- D_blocked = 0;
- D_blocked_fuzz = 0;
-}
-
-void
-freetty()
-{
- if (D_userfd >= 0)
- close(D_userfd);
- debug1("did freetty %d\n", D_userfd);
- D_userfd = -1;
- D_obufp = 0;
- D_obuffree = 0;
- if (D_obuf)
- free(D_obuf);
- D_obuf = 0;
- D_obuflen = 0;
- D_obuflenmax = -D_obufmax;
- D_blocked = 0;
- D_blocked_fuzz = 0;
-}
-
-/*
- * Asynchronous output routines by
- * Tim MacKenzie (tym@dibbler.cs.monash.edu.au)
- */
-
-void
-Resize_obuf()
-{
- register int ind;
-
- ASSERT(display);
- if (D_status_obuffree >= 0)
- {
- ASSERT(D_obuffree == -1);
- if (!D_status_bell)
- {
- struct timeval now;
- int ti;
- gettimeofday(&now, NULL);
- ti = (now.tv_sec - D_status_time.tv_sec) * 1000 + (now.tv_usec - D_status_time.tv_usec) / 1000;
- if (ti < MsgMinWait)
- DisplaySleep1000(MsgMinWait - ti, 0);
- }
- RemoveStatus();
- if (--D_obuffree > 0) /* redo AddChar decrement */
- return;
- }
- if (D_obuflen && D_obuf)
- {
- ind = D_obufp - D_obuf;
- D_obuflen += GRAIN;
- D_obuffree += GRAIN;
- D_obuf = realloc(D_obuf, D_obuflen);
- }
- else
- {
- ind = 0;
- D_obuflen = GRAIN;
- D_obuffree = GRAIN;
- D_obuf = malloc(D_obuflen);
- }
- if (!D_obuf)
- Panic(0, "Out of memory");
- D_obufp = D_obuf + ind;
- D_obuflenmax = D_obuflen - D_obufmax;
- debug1("ResizeObuf: resized to %d\n", D_obuflen);
-}
-
-void
-DisplaySleep1000(n, eat)
-int n;
-int eat;
-{
- char buf;
- fd_set r;
- struct timeval t;
-
- if (n <= 0)
- return;
- if (!display)
- {
- debug("DisplaySleep has no display sigh\n");
- sleep1000(n);
- return;
- }
- t.tv_usec = (n % 1000) * 1000;
- t.tv_sec = n / 1000;
- FD_ZERO(&r);
- FD_SET(D_userfd, &r);
- if (select(FD_SETSIZE, &r, (fd_set *)0, (fd_set *)0, &t) > 0)
- {
- debug("display activity stopped sleep\n");
- if (eat)
- read(D_userfd, &buf, 1);
- }
- debug2("DisplaySleep(%d) ending, eat was %d\n", n, eat);
-}
-
-#ifdef AUTO_NUKE
-void
-NukePending()
-{/* Nuke pending output in current display, clear screen */
- register int len;
- int oldtop = D_top, oldbot = D_bot;
- struct mchar oldrend;
- int oldkeypad = D_keypad, oldcursorkeys = D_cursorkeys;
- int oldcurvis = D_curvis;
- int oldmouse = D_mouse;
-
- oldrend = D_rend;
- len = D_obufp - D_obuf;
- debug1("NukePending: nuking %d chars\n", len);
-
- /* Throw away any output that we can... */
-# ifdef POSIX
- tcflush(D_userfd, TCOFLUSH);
-# else
-# ifdef TCFLSH
- (void) ioctl(D_userfd, TCFLSH, (char *) 1);
-# endif
-# endif
-
- D_obufp = D_obuf;
- D_obuffree += len;
- D_top = D_bot = -1;
- AddCStr(D_TI);
- AddCStr(D_IS);
- /* Turn off all attributes. (Tim MacKenzie) */
- if (D_ME)
- AddCStr(D_ME);
- else
- {
-#ifdef COLOR
- if (D_hascolor)
- AddStr("\033[m"); /* why is D_ME not set? */
-#endif
- AddCStr(D_SE);
- AddCStr(D_UE);
- }
- /* Check for toggle */
- if (D_IM && strcmp(D_IM, D_EI))
- AddCStr(D_EI);
- D_insert = 0;
- /* Check for toggle */
-#ifdef MAPKEYS
- if (D_KS && strcmp(D_KS, D_KE))
- AddCStr(D_KS);
- if (D_CCS && strcmp(D_CCS, D_CCE))
- AddCStr(D_CCS);
-#else
- if (D_KS && strcmp(D_KS, D_KE))
- AddCStr(D_KE);
- D_keypad = 0;
- if (D_CCS && strcmp(D_CCS, D_CCE))
- AddCStr(D_CCE);
- D_cursorkeys = 0;
-#endif
- AddCStr(D_CE0);
- D_rend = mchar_null;
- D_atyp = 0;
- AddCStr(D_DS);
- D_hstatus = 0;
- AddCStr(D_VE);
- D_curvis = 0;
- ChangeScrollRegion(oldtop, oldbot);
- SetRendition(&oldrend);
- KeypadMode(oldkeypad);
- CursorkeysMode(oldcursorkeys);
- CursorVisibility(oldcurvis);
- MouseMode(oldmouse);
- if (D_CWS)
- {
- debug("ResizeDisplay: using WS\n");
- AddCStr(tgoto(D_CWS, D_width, D_height));
- }
- else if (D_CZ0 && (D_width == Z0width || D_width == Z1width))
- {
- debug("ResizeDisplay: using Z0/Z1\n");
- AddCStr(D_width == Z0width ? D_CZ0 : D_CZ1);
- }
-}
-#endif /* AUTO_NUKE */
-
-#ifdef linux
-/* linux' select can't handle flow control, so wait 100ms if
- * we get EAGAIN
- */
-static void
-disp_writeev_eagain(ev, data)
-struct event *ev;
-char *data;
-{
- display = (struct display *)data;
- evdeq(&D_writeev);
- D_writeev.type = EV_WRITE;
- D_writeev.handler = disp_writeev_fn;
- evenq(&D_writeev);
-}
-#endif
-
-static void
-disp_writeev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- int len, size = OUTPUT_BLOCK_SIZE;
-
- display = (struct display *)data;
- len = D_obufp - D_obuf;
- if (len < size)
- size = len;
- ASSERT(len >= 0);
- size = write(D_userfd, D_obuf, size);
- if (size >= 0)
- {
- len -= size;
- if (len)
- {
- bcopy(D_obuf + size, D_obuf, len);
- debug2("ASYNC: wrote %d - remaining %d\n", size, len);
- }
- D_obufp -= size;
- D_obuffree += size;
- if (D_blocked_fuzz)
- {
- D_blocked_fuzz -= size;
- if (D_blocked_fuzz < 0)
- D_blocked_fuzz = 0;
- }
- if (D_blockedev.queued)
- {
- if (D_obufp - D_obuf > D_obufmax / 2)
- {
- debug2("%s: resetting timeout to %g secs\n", D_usertty, D_nonblock/1000.);
- SetTimeout(&D_blockedev, D_nonblock);
- }
- else
- {
- debug1("%s: deleting blocked timeout\n", D_usertty);
- evdeq(&D_blockedev);
- }
- }
- if (D_blocked == 1 && D_obuf == D_obufp)
- {
- /* empty again, restart output */
- debug1("%s: buffer empty, unblocking\n", D_usertty);
- D_blocked = 0;
- Activate(D_fore ? D_fore->w_norefresh : 0);
- D_blocked_fuzz = D_obufp - D_obuf;
- }
- }
- else
- {
-#ifdef linux
- /* linux flow control is badly broken */
- if (errno == EAGAIN)
- {
- evdeq(&D_writeev);
- D_writeev.type = EV_TIMEOUT;
- D_writeev.handler = disp_writeev_eagain;
- SetTimeout(&D_writeev, 100);
- evenq(&D_writeev);
- }
-#endif
- if (errno != EINTR && errno != EAGAIN)
-#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
- if (errno != EWOULDBLOCK)
-#endif
- Msg(errno, "Error writing output to display");
- }
-}
-
-static void
-disp_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- int size;
- char buf[IOSIZE];
- struct canvas *cv;
-
- display = (struct display *)data;
-
- /* Hmmmm... a bit ugly... */
- if (D_forecv)
- for (cv = D_forecv->c_layer->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_status == STATUS_ON_WIN)
- RemoveStatus();
- }
-
- display = (struct display *)data;
- if (D_fore == 0)
- size = IOSIZE;
- else
- {
-#ifdef PSEUDOS
- if (W_UWP(D_fore))
- size = sizeof(D_fore->w_pwin->p_inbuf) - D_fore->w_pwin->p_inlen;
- else
-#endif
- size = sizeof(D_fore->w_inbuf) - D_fore->w_inlen;
- }
-
- if (size > IOSIZE)
- size = IOSIZE;
- if (size <= 0)
- size = 1; /* Always allow one char for command keys */
-
- size = read(D_userfd, buf, size);
- if (size < 0)
- {
- if (errno == EINTR || errno == EAGAIN)
- return;
-#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
- if (errno == EWOULDBLOCK)
- return;
-#endif
- debug1("Read error: %d - hangup!\n", errno);
- Hangup();
- sleep(1);
- return;
- }
- else if (size == 0)
- {
- debug("Found EOF - hangup!\n");
- Hangup();
- sleep(1);
- return;
- }
- if (D_blocked == 4)
- {
- D_blocked = 0;
-#ifdef BLANKER_PRG
- KillBlanker();
-#endif
- Activate(D_fore ? D_fore->w_norefresh : 0);
- ResetIdle();
- return;
- }
-#ifdef ZMODEM
- if (D_blocked > 1) /* 2, 3 */
- {
- char *bufp;
- struct win *p;
-
- flayer = 0;
- for (p = windows; p ; p = p->w_next)
- if (p->w_zdisplay == display)
- {
- flayer = &p->w_layer;
- bufp = buf;
- while (size > 0)
- LayProcess(&bufp, &size);
- return;
- }
- debug("zmodem window gone, deblocking display");
- zmodem_abort(0, display);
- }
-#endif
- if (idletimo > 0)
- ResetIdle();
- if (D_fore)
- D_fore->w_lastdisp = display;
- if (D_mouse && D_forecv)
- {
- unsigned char *bp = (unsigned char *)buf;
- int x, y, i = size;
-
- /* XXX this assumes that the string is read in as a whole... */
- for (i = size; i > 0; i--, bp++)
- {
- if (i > 5 && bp[0] == 033 && bp[1] == '[' && bp[2] == 'M')
- {
- bp++;
- i--;
- }
- else if (i < 5 || bp[0] != 0233 || bp[1] != 'M')
- continue;
- x = bp[3] - 33;
- y = bp[4] - 33;
- if (x >= D_forecv->c_xs && x <= D_forecv->c_xe && y >= D_forecv->c_ys && y <= D_forecv->c_ye)
- {
- x -= D_forecv->c_xoff;
- y -= D_forecv->c_yoff;
- if (x >= 0 && x < D_forecv->c_layer->l_width && y >= 0 && y < D_forecv->c_layer->l_height)
- {
- bp[3] = x + 33;
- bp[4] = y + 33;
- i -= 4;
- bp += 4;
- continue;
- }
- }
- if (bp[0] == '[')
- {
- bcopy((char *)bp + 1, (char *)bp, i);
- bp--;
- size--;
- }
- if (i > 5)
- bcopy((char *)bp + 5, (char *)bp, i - 5);
- bp--;
- i -= 4;
- size -= 5;
- }
- }
-#ifdef ENCODINGS
- if (D_encoding != (D_forecv ? D_forecv->c_layer->l_encoding : 0))
- {
- int i, j, c, enc;
- char buf2[IOSIZE * 2 + 10];
- enc = D_forecv ? D_forecv->c_layer->l_encoding : 0;
- for (i = j = 0; i < size; i++)
- {
- c = ((unsigned char *)buf)[i];
- c = DecodeChar(c, D_encoding, &D_decodestate);
- if (c == -2)
- i--; /* try char again */
- if (c < 0)
- continue;
- if (pastefont)
- {
- int font = 0;
- j += EncodeChar(buf2 + j, c, enc, &font);
- j += EncodeChar(buf2 + j, -1, enc, &font);
- }
- else
- j += EncodeChar(buf2 + j, c, enc, 0);
- if (j > (int)sizeof(buf2) - 10) /* just in case... */
- break;
- }
- (*D_processinput)(buf2, j);
- return;
- }
-#endif
- (*D_processinput)(buf, size);
-}
-
-static void
-disp_status_fn(ev, data)
-struct event *ev;
-char *data;
-{
- display = (struct display *)data;
- debug1("disp_status_fn for display %x\n", (int)display);
- if (D_status)
- RemoveStatus();
-}
-
-static void
-disp_hstatus_fn(ev, data)
-struct event *ev;
-char *data;
-{
- display = (struct display *)data;
- if (D_status == STATUS_ON_HS)
- {
- SetTimeout(ev, 1);
- evenq(ev);
- return;
- }
- RefreshHStatus();
-}
-
-static void
-disp_blocked_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p;
-
- display = (struct display *)data;
- debug1("blocked timeout %s\n", D_usertty);
- if (D_obufp - D_obuf > D_obufmax + D_blocked_fuzz)
- {
- debug("stopping output to display\n");
- D_blocked = 1;
- /* re-enable all windows */
- for (p = windows; p; p = p->w_next)
- if (p->w_readev.condneg == &D_obuflenmax)
- {
- debug1("freeing window #%d\n", p->w_number);
- p->w_readev.condpos = p->w_readev.condneg = 0;
- }
- }
-}
-
-static void
-cv_winid_fn(ev, data)
-struct event *ev;
-char *data;
-{
- int ox, oy;
- struct canvas *cv = (struct canvas *)data;
-
- display = cv->c_display;
- if (D_status == STATUS_ON_WIN)
- {
- SetTimeout(ev, 1);
- evenq(ev);
- return;
- }
- ox = D_x;
- oy = D_y;
- if (cv->c_ye + 1 < D_height)
- RefreshLine(cv->c_ye + 1, 0, D_width - 1, 0);
- if (ox != -1 && oy != -1)
- GotoPos(ox, oy);
-}
-
-#ifdef MAPKEYS
-static void
-disp_map_fn(ev, data)
-struct event *ev;
-char *data;
-{
- char *p;
- int l, i;
- unsigned char *q;
- display = (struct display *)data;
- debug("Flushing map sequence\n");
- if (!(l = D_seql))
- return;
- p = (char *)D_seqp - l;
- D_seqp = D_kmaps + 3;
- D_seql = 0;
- if ((q = D_seqh) != 0)
- {
- D_seqh = 0;
- i = q[0] << 8 | q[1];
- i &= ~KMAP_NOTIMEOUT;
- debug1("Mapping former hit #%d - ", i);
- debug2("%d(%s) - ", q[2], q + 3);
- if (StuffKey(i))
- ProcessInput2((char *)q + 3, q[2]);
- if (display == 0)
- return;
- l -= q[2];
- p += q[2];
- }
- else
- D_dontmap = 1;
- ProcessInput(p, l);
-}
-#endif
-
-static void
-disp_idle_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct display *olddisplay;
- display = (struct display *)data;
- debug("idle timeout\n");
- if (idletimo <= 0 || idleaction.nr == RC_ILLEGAL)
- return;
- olddisplay = display;
- flayer = D_forecv->c_layer;
- fore = D_fore;
- DoAction(&idleaction, -1);
- if (idleaction.nr == RC_BLANKER)
- return;
- for (display = displays; display; display = display->d_next)
- if (olddisplay == display)
- break;
- if (display)
- ResetIdle();
-}
-
-void
-ResetIdle()
-{
- if (idletimo > 0)
- {
- SetTimeout(&D_idleev, idletimo);
- if (!D_idleev.queued)
- evenq(&D_idleev);
- }
- else
- evdeq(&D_idleev);
-}
-
-
-#ifdef BLANKER_PRG
-
-static void
-disp_blanker_fn(ev, data)
-struct event *ev;
-char *data;
-{
- char buf[IOSIZE], *b;
- int size;
-
- display = (struct display *)data;
- size = read(D_blankerev.fd, buf, IOSIZE);
- if (size <= 0)
- {
- evdeq(&D_blankerev);
- close(D_blankerev.fd);
- D_blankerev.fd = -1;
- return;
- }
- for (b = buf; size; size--)
- AddChar(*b++);
-}
-
-void
-KillBlanker()
-{
- int oldtop = D_top, oldbot = D_bot;
- struct mchar oldrend;
-
- if (D_blankerev.fd == -1)
- return;
- if (D_blocked == 4)
- D_blocked = 0;
- evdeq(&D_blankerev);
- close(D_blankerev.fd);
- D_blankerev.fd = -1;
- Kill(D_blankerpid, SIGHUP);
- D_top = D_bot = -1;
- oldrend = D_rend;
- if (D_ME)
- {
- AddCStr(D_ME);
- AddCStr(D_ME);
- }
- else
- {
-#ifdef COLOR
- if (D_hascolor)
- AddStr("\033[m\033[m"); /* why is D_ME not set? */
-#endif
- AddCStr(D_SE);
- AddCStr(D_UE);
- }
- AddCStr(D_VE);
- AddCStr(D_CE0);
- D_rend = mchar_null;
- D_atyp = 0;
- D_curvis = 0;
- D_x = D_y = -1;
- ChangeScrollRegion(oldtop, oldbot);
- SetRendition(&oldrend);
- ClearAll();
-}
-
-void
-RunBlanker(cmdv)
-char **cmdv;
-{
- char *m;
- int pid;
- int slave = -1;
- char termname[30];
-#ifndef TIOCSWINSZ
- char libuf[20], cobuf[20];
-#endif
- char **np;
-
- strcpy(termname, "TERM=");
- strncpy(termname + 5, D_termname, sizeof(termname) - 6);
- termname[sizeof(termname) - 1] = 0;
- KillBlanker();
- D_blankerpid = -1;
- if ((D_blankerev.fd = OpenPTY(&m)) == -1)
- {
- Msg(0, "OpenPty failed");
- return;
- }
-#ifdef O_NOCTTY
- if (pty_preopen)
- {
- if ((slave = open(m, O_RDWR|O_NOCTTY)) == -1)
- {
- Msg(errno, "%s", m);
- close(D_blankerev.fd);
- D_blankerev.fd = -1;
- return;
- }
- }
-#endif
- switch (pid = (int)fork())
- {
- case -1:
- Msg(errno, "fork");
- close(D_blankerev.fd);
- D_blankerev.fd = -1;
- return;
- case 0:
- displays = 0;
-#ifdef DEBUG
- if (dfp && dfp != stderr)
- fclose(dfp);
-#endif
- if (setgid(real_gid) || setuid(real_uid))
- Panic(errno, "setuid/setgid");
- brktty(D_userfd);
- freetty();
- close(0);
- close(1);
- close(2);
- closeallfiles(slave);
- if (open(m, O_RDWR))
- Panic(errno, "Cannot open %s", m);
- dup(0);
- dup(0);
- if (slave != -1)
- close(slave);
- InitPTY(0);
- fgtty(0);
- SetTTY(0, &D_OldMode);
- np = NewEnv + 3;
- *np++ = NewEnv[0];
- *np++ = termname;
-#ifdef TIOCSWINSZ
- glwz.ws_col = D_width;
- glwz.ws_row = D_height;
- (void)ioctl(0, TIOCSWINSZ, (char *)&glwz);
-#else
- sprintf(libuf, "LINES=%d", D_height);
- sprintf(libuf, "COLUMNS=%d", D_width);
- *np++ = libuf;
- *np++ = cobuf;
-#endif
-#ifdef SIGPIPE
- signal(SIGPIPE, SIG_DFL);
-#endif
- display = 0;
- execvpe(*cmdv, cmdv, NewEnv + 3);
- Panic(errno, *cmdv);
- default:
- break;
- }
- D_blankerpid = pid;
- evenq(&D_blankerev);
- D_blocked = 4;
- ClearAll();
-}
-
-#endif
diff --git a/src/display.h b/src/display.h
deleted file mode 100644
index 49f3ee7..0000000
--- a/src/display.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-#ifdef MAPKEYS
-
-#define KMAP_KEYS (T_OCAPS-T_CAPS)
-#define KMAP_AKEYS (T_OCAPS-T_CURSOR)
-#define KMAP_EXT 50
-
-#define KMAP_NOTIMEOUT 0x4000
-
-struct kmap_ext
-{
- char *str;
- int fl;
- struct action um;
- struct action dm;
- struct action mm;
-};
-
-#endif
-
-struct win; /* forward declaration */
-
-struct canvas
-{
- struct canvas *c_next; /* next canvas on display */
- struct display *c_display; /* back pointer to display */
- struct viewport *c_vplist;
- struct layer *c_layer; /* layer on this canvas */
- struct canvas *c_lnext; /* next canvas that displays layer */
- struct layer c_blank; /* bottom layer, always blank */
- int c_xoff; /* canvas x offset on display */
- int c_yoff; /* canvas y offset on display */
- int c_xs;
- int c_xe;
- int c_ys;
- int c_ye;
- struct event c_captev; /* caption changed event */
-};
-
-struct viewport
-{
- struct viewport *v_next; /* next vp on canvas */
- struct canvas *v_canvas; /* back pointer to canvas */
- int v_xoff; /* layer x offset on display */
- int v_yoff; /* layer y offset on display */
- int v_xs; /* vp upper left */
- int v_xe; /* vp upper right */
- int v_ys; /* vp lower left */
- int v_ye; /* vp lower right */
-};
-
-struct display
-{
- struct display *d_next; /* linked list */
- struct acluser *d_user; /* user who owns that display */
- struct canvas *d_cvlist; /* the canvases of this display */
- struct canvas *d_forecv; /* current input focus */
- void (*d_processinput) __P((char *, int));
- char *d_processinputdata; /* data for processinput */
- int d_vpxmin, d_vpxmax; /* min/max used position on display */
- struct win *d_fore; /* pointer to fore window */
- struct win *d_other; /* pointer to other window */
- int d_nonblock; /* -1 don't block if obufmax reached */
- /* >0: block after nonblock secs */
- char d_termname[20 + 1]; /* $TERM */
- char *d_tentry; /* buffer for tgetstr */
- char d_tcinited; /* termcap inited flag */
- int d_width, d_height; /* width/height of the screen */
- int d_defwidth, d_defheight; /* default width/height of windows */
- int d_top, d_bot; /* scrollregion start/end */
- int d_x, d_y; /* cursor position */
- struct mchar d_rend; /* current rendition */
- int d_col16change; /* the 16col bits changed in attr */
- char d_atyp; /* current attribute types */
-#ifdef DW_CHARS
- int d_mbcs; /* saved char for multibytes charset */
-#endif
-#ifdef ENCODINGS
- int d_encoding; /* what encoding type the display is */
- int d_decodestate; /* state of our decoder */
- int d_realfont; /* real font of terminal */
-#endif
- int d_insert; /* insert mode flag */
- int d_keypad; /* application keypad flag */
- int d_cursorkeys; /* application cursorkeys flag */
- int d_revvid; /* reverse video */
- int d_curvis; /* cursor visibility */
- int d_has_hstatus; /* display has hardstatus line */
- int d_hstatus; /* hardstatus used */
- int d_lp_missing; /* last character on bot line missing */
- int d_mouse; /* mouse mode */
-#ifdef RXVT_OSC
- int d_xtermosc[4]; /* osc used */
-#endif
- struct mchar d_lpchar; /* missing char */
- struct timeval d_status_time; /* time of status display */
- int d_status; /* is status displayed? */
- char d_status_bell; /* is it only a vbell? */
- int d_status_len; /* length of status line */
- char *d_status_lastmsg; /* last displayed message */
- int d_status_buflen; /* last message buffer len */
- int d_status_lastx; /* position of the cursor */
- int d_status_lasty; /* before status was displayed */
- int d_status_obuflen; /* saved obuflen */
- int d_status_obuffree; /* saved obuffree */
- struct event d_statusev; /* timeout event */
- struct event d_hstatusev; /* hstatus changed event */
- int d_kaablamm; /* display kaablamm msg */
- struct action *d_ESCseen; /* Was the last char an ESC (^a) */
- int d_userpid; /* pid of attacher */
- char d_usertty[MAXPATHLEN]; /* tty we are attached to */
- int d_userfd; /* fd of the tty */
- struct event d_readev; /* userfd read event */
- struct event d_writeev; /* userfd write event */
- struct event d_blockedev; /* blocked timeout */
- struct mode d_OldMode; /* tty mode when screen was started */
- struct mode d_NewMode; /* New tty mode */
- int d_flow; /* tty's flow control on/off flag*/
- int d_intrc; /* current intr when flow is on */
- char *d_obuf; /* output buffer */
- int d_obuflen; /* len of buffer */
- int d_obufmax; /* len where we are blocking the pty */
- int d_obuflenmax; /* len - max */
- char *d_obufp; /* pointer in buffer */
- int d_obuffree; /* free bytes in buffer */
-#ifdef AUTO_NUKE
- int d_auto_nuke; /* autonuke flag */
-#endif
-#ifdef MAPKEYS
- int d_nseqs; /* number of valid mappings */
- int d_aseqs; /* number of allocated mappings */
- unsigned char *d_kmaps; /* keymaps */
- unsigned char *d_seqp; /* pointer into keymap array */
- int d_seql; /* number of parsed chars */
- unsigned char *d_seqh; /* last hit */
- struct event d_mapev; /* timeout event */
- int d_dontmap; /* do not map next */
- int d_mapdefault; /* do map next to default */
-#endif
- union tcu d_tcs[T_N]; /* terminal capabilities */
- char *d_attrtab[NATTR]; /* attrib emulation table */
- char d_attrtyp[NATTR]; /* attrib group table */
- int d_hascolor; /* do we support color */
- short d_dospeed; /* baudrate of tty */
-#ifdef FONT
- char d_c0_tab[256]; /* conversion for C0 */
- char ***d_xtable; /* char translation table */
-#endif
- int d_UPcost, d_DOcost, d_LEcost, d_NDcost;
- int d_CRcost, d_IMcost, d_EIcost, d_NLcost;
- int d_printfd; /* fd for vt100 print sequence */
-#ifdef UTMPOK
- slot_t d_loginslot; /* offset, where utmp_logintty belongs */
- struct utmp d_utmp_logintty; /* here the original utmp structure is stored */
- int d_loginttymode;
-# ifdef _SEQUENT_
- char d_loginhost[100+1];
-# endif /* _SEQUENT_ */
-#endif
- int d_blocked;
- int d_blocked_fuzz;
- struct event d_idleev; /* screen blanker */
-#ifdef BLANKER_PRG
- int d_blankerpid;
- struct event d_blankerev;
-#endif
-};
-
-#ifdef MULTI
-# define DISPLAY(x) display->x
-#else
-extern struct display TheDisplay;
-# define DISPLAY(x) TheDisplay.x
-#endif
-
-#define D_user DISPLAY(d_user)
-#define D_username (DISPLAY(d_user) ? DISPLAY(d_user)->u_name : 0)
-#define D_cvlist DISPLAY(d_cvlist)
-#define D_forecv DISPLAY(d_forecv)
-#define D_processinput DISPLAY(d_processinput)
-#define D_processinputdata DISPLAY(d_processinputdata)
-#define D_vpxmin DISPLAY(d_vpxmin)
-#define D_vpxmax DISPLAY(d_vpxmax)
-#define D_fore DISPLAY(d_fore)
-#define D_other DISPLAY(d_other)
-#define D_nonblock DISPLAY(d_nonblock)
-#define D_termname DISPLAY(d_termname)
-#define D_tentry DISPLAY(d_tentry)
-#define D_tcinited DISPLAY(d_tcinited)
-#define D_width DISPLAY(d_width)
-#define D_height DISPLAY(d_height)
-#define D_defwidth DISPLAY(d_defwidth)
-#define D_defheight DISPLAY(d_defheight)
-#define D_top DISPLAY(d_top)
-#define D_bot DISPLAY(d_bot)
-#define D_x DISPLAY(d_x)
-#define D_y DISPLAY(d_y)
-#define D_rend DISPLAY(d_rend)
-#define D_col16change DISPLAY(d_col16change)
-#define D_atyp DISPLAY(d_atyp)
-#define D_mbcs DISPLAY(d_mbcs)
-#define D_encoding DISPLAY(d_encoding)
-#define D_decodestate DISPLAY(d_decodestate)
-#define D_realfont DISPLAY(d_realfont)
-#define D_insert DISPLAY(d_insert)
-#define D_keypad DISPLAY(d_keypad)
-#define D_cursorkeys DISPLAY(d_cursorkeys)
-#define D_revvid DISPLAY(d_revvid)
-#define D_curvis DISPLAY(d_curvis)
-#define D_has_hstatus DISPLAY(d_has_hstatus)
-#define D_hstatus DISPLAY(d_hstatus)
-#define D_lp_missing DISPLAY(d_lp_missing)
-#define D_mouse DISPLAY(d_mouse)
-#define D_xtermosc DISPLAY(d_xtermosc)
-#define D_lpchar DISPLAY(d_lpchar)
-#define D_status DISPLAY(d_status)
-#define D_status_time DISPLAY(d_status_time)
-#define D_status_bell DISPLAY(d_status_bell)
-#define D_status_len DISPLAY(d_status_len)
-#define D_status_lastmsg DISPLAY(d_status_lastmsg)
-#define D_status_buflen DISPLAY(d_status_buflen)
-#define D_status_lastx DISPLAY(d_status_lastx)
-#define D_status_lasty DISPLAY(d_status_lasty)
-#define D_status_obuflen DISPLAY(d_status_obuflen)
-#define D_status_obuffree DISPLAY(d_status_obuffree)
-#define D_statusev DISPLAY(d_statusev)
-#define D_hstatusev DISPLAY(d_hstatusev)
-#define D_kaablamm DISPLAY(d_kaablamm)
-#define D_ESCseen DISPLAY(d_ESCseen)
-#define D_userpid DISPLAY(d_userpid)
-#define D_usertty DISPLAY(d_usertty)
-#define D_userfd DISPLAY(d_userfd)
-#define D_OldMode DISPLAY(d_OldMode)
-#define D_NewMode DISPLAY(d_NewMode)
-#define D_flow DISPLAY(d_flow)
-#define D_intr DISPLAY(d_intr)
-#define D_obuf DISPLAY(d_obuf)
-#define D_obuflen DISPLAY(d_obuflen)
-#define D_obufmax DISPLAY(d_obufmax)
-#define D_obuflenmax DISPLAY(d_obuflenmax)
-#define D_obufp DISPLAY(d_obufp)
-#define D_obuffree DISPLAY(d_obuffree)
-#define D_auto_nuke DISPLAY(d_auto_nuke)
-#define D_nseqs DISPLAY(d_nseqs)
-#define D_aseqs DISPLAY(d_aseqs)
-#define D_seqp DISPLAY(d_seqp)
-#define D_seql DISPLAY(d_seql)
-#define D_seqh DISPLAY(d_seqh)
-#define D_dontmap DISPLAY(d_dontmap)
-#define D_mapdefault DISPLAY(d_mapdefault)
-#define D_kmaps DISPLAY(d_kmaps)
-#define D_tcs DISPLAY(d_tcs)
-#define D_attrtab DISPLAY(d_attrtab)
-#define D_attrtyp DISPLAY(d_attrtyp)
-#define D_hascolor DISPLAY(d_hascolor)
-#define D_dospeed DISPLAY(d_dospeed)
-#define D_c0_tab DISPLAY(d_c0_tab)
-#define D_xtable DISPLAY(d_xtable)
-#define D_UPcost DISPLAY(d_UPcost)
-#define D_DOcost DISPLAY(d_DOcost)
-#define D_LEcost DISPLAY(d_LEcost)
-#define D_NDcost DISPLAY(d_NDcost)
-#define D_CRcost DISPLAY(d_CRcost)
-#define D_IMcost DISPLAY(d_IMcost)
-#define D_EIcost DISPLAY(d_EIcost)
-#define D_NLcost DISPLAY(d_NLcost)
-#define D_printfd DISPLAY(d_printfd)
-#define D_loginslot DISPLAY(d_loginslot)
-#define D_utmp_logintty DISPLAY(d_utmp_logintty)
-#define D_loginttymode DISPLAY(d_loginttymode)
-#define D_loginhost DISPLAY(d_loginhost)
-#define D_readev DISPLAY(d_readev)
-#define D_writeev DISPLAY(d_writeev)
-#define D_blockedev DISPLAY(d_blockedev)
-#define D_mapev DISPLAY(d_mapev)
-#define D_blocked DISPLAY(d_blocked)
-#define D_blocked_fuzz DISPLAY(d_blocked_fuzz)
-#define D_idleev DISPLAY(d_idleev)
-#define D_blankerev DISPLAY(d_blankerev)
-#define D_blankerpid DISPLAY(d_blankerpid)
-
-
-#define GRAIN 4096 /* Allocation grain size for output buffer */
-#define OBUF_MAX 256 /* default for obuflimit */
-
-#define OUTPUT_BLOCK_SIZE 256 /* Block size of output to tty */
-
-#define AddChar(c) \
-do \
- { \
- if (--D_obuffree <= 0) \
- Resize_obuf(); \
- *D_obufp++ = (c); \
- } \
-while (0)
-
-#define CV_CALL(cv, cmd) \
-{ \
- struct display *olddisplay = display; \
- struct layer *oldflayer = flayer; \
- struct layer *l = cv->c_layer; \
- struct canvas *cvlist = l->l_cvlist; \
- struct canvas *cvlnext = cv->c_lnext; \
- flayer = l; \
- l->l_cvlist = cv; \
- cv->c_lnext = 0; \
- cmd; \
- flayer = oldflayer; \
- l->l_cvlist = cvlist; \
- cv->c_lnext = cvlnext; \
- display = olddisplay; \
-}
-
-#define STATUS_OFF 0
-#define STATUS_ON_WIN 1
-#define STATUS_ON_HS 2
-
-#define HSTATUS_IGNORE 0
-#define HSTATUS_LASTLINE 1
-#define HSTATUS_MESSAGE 2
-#define HSTATUS_HS 3
-#define HSTATUS_ALWAYS (1<<2)
diff --git a/src/encoding.c b/src/encoding.c
deleted file mode 100644
index c7616c4..0000000
--- a/src/encoding.c
+++ /dev/null
@@ -1,1708 +0,0 @@
-/* Copyright (c) 1993-2003
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#ifdef ENCODINGS
-
-extern unsigned char *null;
-extern struct display *display, *displays;
-extern struct layer *flayer;
-
-extern char *screenencodings;
-
-static int encmatch __P((char *, char *));
-# ifdef UTF8
-static int recode_char __P((int, int, int));
-static int recode_char_to_encoding __P((int, int));
-static void comb_tofront __P((int, int));
-# ifdef DW_CHARS
-static int recode_char_dw __P((int, int *, int, int));
-static int recode_char_dw_to_encoding __P((int, int *, int));
-# endif
-# endif
-
-struct encoding {
- char *name;
- char *charsets;
- int deffont;
- int usegr;
- int noc1;
- char *fontlist;
-};
-
-/* big5 font: ^X */
-/* KOI8-R font: 96 ! */
-/* CP1251 font: 96 ? */
-
-struct encoding encodings[] = {
- { "C", 0, 0, 0, 0, 0 },
- { "eucJP", "B\002I\00401", 0, 1, 0, "\002\004I" },
- { "SJIS", "BIBB01", 0, 1, 1, "\002I" },
- { "eucKR", "B\003BB01", 0, 1, 0, "\003" },
- { "eucCN", "B\001BB01", 0, 1, 0, "\001" },
- { "Big5", "B\030BB01", 0, 1, 0, "\030" },
- { "KOI8-R", 0, 0x80|'!', 0, 1, 0 },
- { "CP1251", 0, 0x80|'?', 0, 1, 0 },
- { "UTF-8", 0, -1, 0, 0, 0 },
- { "ISO8859-2", 0, 0x80|'B', 0, 0, 0 },
- { "ISO8859-3", 0, 0x80|'C', 0, 0, 0 },
- { "ISO8859-4", 0, 0x80|'D', 0, 0, 0 },
- { "ISO8859-5", 0, 0x80|'L', 0, 0, 0 },
- { "ISO8859-6", 0, 0x80|'G', 0, 0, 0 },
- { "ISO8859-7", 0, 0x80|'F', 0, 0, 0 },
- { "ISO8859-8", 0, 0x80|'H', 0, 0, 0 },
- { "ISO8859-9", 0, 0x80|'M', 0, 0, 0 },
- { "ISO8859-10", 0, 0x80|'V', 0, 0, 0 },
- { "ISO8859-15", 0, 0x80|'b', 0, 0, 0 },
- { "jis", 0, 0, 0, 0, "\002\004I" },
- { "GBK", "B\031BB01", 0x80|'b', 1, 1, "\031" }
-};
-
-#ifdef UTF8
-
-static unsigned short builtin_tabs[][2] = {
- { 0x30, 0 }, /* 0: special graphics (line drawing) */
- { 0x005f, 0x25AE },
- { 0x0060, 0x25C6 },
- { 0x0061, 0x2592 },
- { 0x0062, 0x2409 },
- { 0x0063, 0x240C },
- { 0x0064, 0x240D },
- { 0x0065, 0x240A },
- { 0x0066, 0x00B0 },
- { 0x0067, 0x00B1 },
- { 0x0068, 0x2424 },
- { 0x0069, 0x240B },
- { 0x006a, 0x2518 },
- { 0x006b, 0x2510 },
- { 0x006c, 0x250C },
- { 0x006d, 0x2514 },
- { 0x006e, 0x253C },
- { 0x006f, 0x23BA },
- { 0x0070, 0x23BB },
- { 0x0071, 0x2500 },
- { 0x0072, 0x23BC },
- { 0x0073, 0x23BD },
- { 0x0074, 0x251C },
- { 0x0075, 0x2524 },
- { 0x0076, 0x2534 },
- { 0x0077, 0x252C },
- { 0x0078, 0x2502 },
- { 0x0079, 0x2264 },
- { 0x007a, 0x2265 },
- { 0x007b, 0x03C0 },
- { 0x007c, 0x2260 },
- { 0x007d, 0x00A3 },
- { 0x007e, 0x00B7 },
- { 0, 0},
-
- { 0x34, 0 }, /* 4: Dutch */
- { 0x0023, 0x00a3 },
- { 0x0040, 0x00be },
- { 0x005b, 0x00ff },
- { 0x005c, 0x00bd },
- { 0x005d, 0x007c },
- { 0x007b, 0x00a8 },
- { 0x007c, 0x0066 },
- { 0x007d, 0x00bc },
- { 0x007e, 0x00b4 },
- { 0, 0},
-
- { 0x35, 0 }, /* 5: Finnish */
- { 0x005b, 0x00c4 },
- { 0x005c, 0x00d6 },
- { 0x005d, 0x00c5 },
- { 0x005e, 0x00dc },
- { 0x0060, 0x00e9 },
- { 0x007b, 0x00e4 },
- { 0x007c, 0x00f6 },
- { 0x007d, 0x00e5 },
- { 0x007e, 0x00fc },
- { 0, 0},
-
- { 0x36, 0 }, /* 6: Norwegian/Danish */
- { 0x0040, 0x00c4 },
- { 0x005b, 0x00c6 },
- { 0x005c, 0x00d8 },
- { 0x005d, 0x00c5 },
- { 0x005e, 0x00dc },
- { 0x0060, 0x00e4 },
- { 0x007b, 0x00e6 },
- { 0x007c, 0x00f8 },
- { 0x007d, 0x00e5 },
- { 0x007e, 0x00fc },
- { 0, 0},
-
- { 0x37, 0 }, /* 7: Swedish */
- { 0x0040, 0x00c9 },
- { 0x005b, 0x00c4 },
- { 0x005c, 0x00d6 },
- { 0x005d, 0x00c5 },
- { 0x005e, 0x00dc },
- { 0x0060, 0x00e9 },
- { 0x007b, 0x00e4 },
- { 0x007c, 0x00f6 },
- { 0x007d, 0x00e5 },
- { 0x007e, 0x00fc },
- { 0, 0},
-
- { 0x3d, 0}, /* =: Swiss */
- { 0x0023, 0x00f9 },
- { 0x0040, 0x00e0 },
- { 0x005b, 0x00e9 },
- { 0x005c, 0x00e7 },
- { 0x005d, 0x00ea },
- { 0x005e, 0x00ee },
- { 0x005f, 0x00e8 },
- { 0x0060, 0x00f4 },
- { 0x007b, 0x00e4 },
- { 0x007c, 0x00f6 },
- { 0x007d, 0x00fc },
- { 0x007e, 0x00fb },
- { 0, 0},
-
- { 0x41, 0}, /* A: UK */
- { 0x0023, 0x00a3 },
- { 0, 0},
-
- { 0x4b, 0}, /* K: German */
- { 0x0040, 0x00a7 },
- { 0x005b, 0x00c4 },
- { 0x005c, 0x00d6 },
- { 0x005d, 0x00dc },
- { 0x007b, 0x00e4 },
- { 0x007c, 0x00f6 },
- { 0x007d, 0x00fc },
- { 0x007e, 0x00df },
- { 0, 0},
-
- { 0x51, 0}, /* Q: French Canadian */
- { 0x0040, 0x00e0 },
- { 0x005b, 0x00e2 },
- { 0x005c, 0x00e7 },
- { 0x005d, 0x00ea },
- { 0x005e, 0x00ee },
- { 0x0060, 0x00f4 },
- { 0x007b, 0x00e9 },
- { 0x007c, 0x00f9 },
- { 0x007d, 0x00e8 },
- { 0x007e, 0x00fb },
- { 0, 0},
-
- { 0x52, 0}, /* R: French */
- { 0x0023, 0x00a3 },
- { 0x0040, 0x00e0 },
- { 0x005b, 0x00b0 },
- { 0x005c, 0x00e7 },
- { 0x005d, 0x00a7 },
- { 0x007b, 0x00e9 },
- { 0x007c, 0x00f9 },
- { 0x007d, 0x00e8 },
- { 0x007e, 0x00a8 },
- { 0, 0},
-
- { 0x59, 0}, /* Y: Italian */
- { 0x0023, 0x00a3 },
- { 0x0040, 0x00a7 },
- { 0x005b, 0x00b0 },
- { 0x005c, 0x00e7 },
- { 0x005d, 0x00e9 },
- { 0x0060, 0x00f9 },
- { 0x007b, 0x00e0 },
- { 0x007c, 0x00f2 },
- { 0x007d, 0x00e8 },
- { 0x007e, 0x00ec },
- { 0, 0},
-
- { 0x5a, 0}, /* Z: Spanish */
- { 0x0023, 0x00a3 },
- { 0x0040, 0x00a7 },
- { 0x005b, 0x00a1 },
- { 0x005c, 0x00d1 },
- { 0x005d, 0x00bf },
- { 0x007b, 0x00b0 },
- { 0x007c, 0x00f1 },
- { 0x007d, 0x00e7 },
- { 0, 0},
-
- { 0xe2, 0}, /* 96-b: ISO-8859-15 */
- { 0x00a4, 0x20ac },
- { 0x00a6, 0x0160 },
- { 0x00a8, 0x0161 },
- { 0x00b4, 0x017D },
- { 0x00b8, 0x017E },
- { 0x00bc, 0x0152 },
- { 0x00bd, 0x0153 },
- { 0x00be, 0x0178 },
- { 0, 0},
-
- { 0x4a, 0}, /* J: JIS 0201 Roman */
- { 0x005c, 0x00a5 },
- { 0x007e, 0x203e },
- { 0, 0},
-
- { 0x49, 0}, /* I: halfwidth katakana */
- { 0x0021, 0xff61 },
- { 0x005f|0x8000, 0xff9f },
- { 0, 0},
-
- { 0, 0}
-};
-
-struct recodetab
-{
- unsigned short (*tab)[2];
- int flags;
-};
-
-#define RECODETAB_ALLOCED 1
-#define RECODETAB_BUILTIN 2
-#define RECODETAB_TRIED 4
-
-static struct recodetab recodetabs[256];
-
-void
-InitBuiltinTabs()
-{
- unsigned short (*p)[2];
- for (p = builtin_tabs; (*p)[0]; p++)
- {
- recodetabs[(*p)[0]].flags = RECODETAB_BUILTIN;
- recodetabs[(*p)[0]].tab = p + 1;
- p++;
- while((*p)[0])
- p++;
- }
-}
-
-static int
-recode_char(c, to_utf, font)
-int c, to_utf, font;
-{
- int f;
- unsigned short (*p)[2];
-
- if (to_utf)
- {
- if (c < 256)
- return c;
- f = (c >> 8) & 0xff;
- c &= 0xff;
- /* map aliases to keep the table small */
- switch (f)
- {
- case 'C':
- f ^= ('C' ^ '5');
- break;
- case 'E':
- f ^= ('E' ^ '6');
- break;
- case 'H':
- f ^= ('H' ^ '7');
- break;
- default:
- break;
- }
- p = recodetabs[f].tab;
- if (p == 0 && recodetabs[f].flags == 0)
- {
- LoadFontTranslation(f, 0);
- p = recodetabs[f].tab;
- }
- if (p)
- for (; (*p)[0]; p++)
- {
- if ((p[0][0] & 0x8000) && (c <= (p[0][0] & 0x7fff)) && c >= p[-1][0])
- return c - p[-1][0] + p[-1][1];
- if ((*p)[0] == c)
- return (*p)[1];
- }
- return c & 0xff; /* map to latin1 */
- }
- if (font == -1)
- {
- if (c < 256)
- return c; /* latin1 */
- for (font = 32; font < 128; font++)
- {
- p = recodetabs[font].tab;
- if (p)
- for (; (*p)[1]; p++)
- {
- if ((p[0][0] & 0x8000) && c <= p[0][1] && c >= p[-1][1])
- return (c - p[-1][1] + p[-1][0]) | (font << 8);
- if ((*p)[1] == c)
- return (*p)[0] | (font << 8);
- }
- }
- return '?';
- }
- if (c < 128 && (font & 128) != 0)
- return c;
- if (font >= 32)
- {
- p = recodetabs[font].tab;
- if (p == 0 && recodetabs[font].flags == 0)
- {
- LoadFontTranslation(font, 0);
- p = recodetabs[font].tab;
- }
- if (p)
- for (; (*p)[1]; p++)
- {
- if ((p[0][0] & 0x8000) && c <= p[0][1] && c >= p[-1][1])
- return (c - p[-1][1] + p[-1][0]) | (font & 128 ? 0 : font << 8);
- if ((*p)[1] == c)
- return (*p)[0] | (font & 128 ? 0 : font << 8);
- }
- }
- return -1;
-}
-
-
-#ifdef DW_CHARS
-static int
-recode_char_dw(c, c2p, to_utf, font)
-int c, *c2p, to_utf, font;
-{
- int f;
- unsigned short (*p)[2];
-
- if (to_utf)
- {
- f = (c >> 8) & 0xff;
- c = (c & 255) << 8 | (*c2p & 255);
- *c2p = 0xffff;
- p = recodetabs[f].tab;
- if (p == 0 && recodetabs[f].flags == 0)
- {
- LoadFontTranslation(f, 0);
- p = recodetabs[f].tab;
- }
- if (p)
- for (; (*p)[0]; p++)
- if ((*p)[0] == c)
- {
-#ifdef DW_CHARS
- if (!utf8_isdouble((*p)[1]))
- *c2p = ' ';
-#endif
- return (*p)[1];
- }
- return UCS_REPL_DW;
- }
- if (font == -1)
- {
- for (font = 0; font < 030; font++)
- {
- p = recodetabs[font].tab;
- if (p)
- for (; (*p)[1]; p++)
- if ((*p)[1] == c)
- {
- *c2p = ((*p)[0] & 255) | font << 8 | 0x8000;
- return ((*p)[0] >> 8) | font << 8;
- }
- }
- *c2p = '?';
- return '?';
- }
- if (font < 32)
- {
- p = recodetabs[font].tab;
- if (p == 0 && recodetabs[font].flags == 0)
- {
- LoadFontTranslation(font, 0);
- p = recodetabs[font].tab;
- }
- if (p)
- for (; (*p)[1]; p++)
- if ((*p)[1] == c)
- {
- *c2p = ((*p)[0] & 255) | font << 8 | 0x8000;
- return ((*p)[0] >> 8) | font << 8;
- }
- }
- return -1;
-}
-#endif
-
-static int
-recode_char_to_encoding(c, encoding)
-int c, encoding;
-{
- char *fp;
- int x;
-
- if (encoding == UTF8)
- return recode_char(c, 1, -1);
- if ((fp = encodings[encoding].fontlist) != 0)
- while(*fp)
- if ((x = recode_char(c, 0, (unsigned char)*fp++)) != -1)
- return x;
- if (encodings[encoding].deffont)
- if ((x = recode_char(c, 0, encodings[encoding].deffont)) != -1)
- return x;
- return recode_char(c, 0, -1);
-}
-
-#ifdef DW_CHARS
-static int
-recode_char_dw_to_encoding(c, c2p, encoding)
-int c, *c2p, encoding;
-{
- char *fp;
- int x;
-
- if (encoding == UTF8)
- return recode_char_dw(c, c2p, 1, -1);
- if ((fp = encodings[encoding].fontlist) != 0)
- while(*fp)
- if ((x = recode_char_dw(c, c2p, 0, (unsigned char)*fp++)) != -1)
- return x;
- if (encodings[encoding].deffont)
- if ((x = recode_char_dw(c, c2p, 0, encodings[encoding].deffont)) != -1)
- return x;
- return recode_char_dw(c, c2p, 0, -1);
-}
-#endif
-
-
-struct mchar *
-recode_mchar(mc, from, to)
-struct mchar *mc;
-int from, to;
-{
- static struct mchar rmc;
- int c;
-
- debug3("recode_mchar %02x from %d to %d\n", mc->image, from, to);
- if (from == to || (from != UTF8 && to != UTF8))
- return mc;
- rmc = *mc;
- if (rmc.font == 0 && from != UTF8)
- rmc.font = encodings[from].deffont;
- if (rmc.font == 0) /* latin1 is the same in unicode */
- return mc;
- c = rmc.image | (rmc.font << 8);
-#ifdef DW_CHARS
- if (rmc.mbcs)
- {
- int c2 = rmc.mbcs;
- c = recode_char_dw_to_encoding(c, &c2, to);
- rmc.mbcs = c2;
- }
- else
-#endif
- c = recode_char_to_encoding(c, to);
- rmc.image = c & 255;
- rmc.font = c >> 8 & 255;
- return &rmc;
-}
-
-struct mline *
-recode_mline(ml, w, from, to)
-struct mline *ml;
-int w;
-int from, to;
-{
- static int maxlen;
- static int last;
- static struct mline rml[2], *rl;
- int i, c;
-
- if (from == to || (from != UTF8 && to != UTF8) || w == 0)
- return ml;
- if (ml->font == null && encodings[from].deffont == 0)
- return ml;
- if (w > maxlen)
- {
- for (i = 0; i < 2; i++)
- {
- if (rml[i].image == 0)
- rml[i].image = malloc(w);
- else
- rml[i].image = realloc(rml[i].image, w);
- if (rml[i].font == 0)
- rml[i].font = malloc(w);
- else
- rml[i].font = realloc(rml[i].font, w);
- if (rml[i].image == 0 || rml[i].font == 0)
- {
- maxlen = 0;
- return ml; /* sorry */
- }
- }
- maxlen = w;
- }
-
- debug("recode_mline: from\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(ml->image[i] >> 4) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(ml->image[i] ) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(ml->font[i] >> 4) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(ml->font[i] ) & 15]);
- debug("\n");
-
- rl = rml + last;
- rl->attr = ml->attr;
-#ifdef COLOR
- rl->color = ml->color;
-# ifdef COLORS256
- rl->colorx = ml->colorx;
-# endif
-#endif
- for (i = 0; i < w; i++)
- {
- c = ml->image[i] | (ml->font[i] << 8);
- if (from != UTF8 && c < 256)
- c |= encodings[from].deffont << 8;
-#ifdef DW_CHARS
- if ((from != UTF8 && (c & 0x1f00) != 0 && (c & 0xe000) == 0) || (from == UTF8 && utf8_isdouble(c)))
- {
- if (i + 1 == w)
- c = '?';
- else
- {
- int c2;
- i++;
- c2 = ml->image[i] | (ml->font[i] << 8);
- c = recode_char_dw_to_encoding(c, &c2, to);
- rl->font[i - 1] = c >> 8 & 255;
- rl->image[i - 1] = c & 255;
- c = c2;
- }
- }
- else
-#endif
- c = recode_char_to_encoding(c, to);
- rl->image[i] = c & 255;
- rl->font[i] = c >> 8 & 255;
- }
- last ^= 1;
- debug("recode_mline: to\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(rl->image[i] >> 4) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(rl->image[i] ) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(rl->font[i] >> 4) & 15]);
- debug("\n");
- for (i = 0; i < w; i++)
- debug1("%c", "0123456789abcdef"[(rl->font[i] ) & 15]);
- debug("\n");
- return rl;
-}
-
-struct combchar {
- unsigned short c1;
- unsigned short c2;
- unsigned short next;
- unsigned short prev;
-};
-struct combchar **combchars;
-
-void
-AddUtf8(c)
-int c;
-{
- ASSERT(D_encoding == UTF8);
- if (c >= 0xd800 && c < 0xe000 && combchars && combchars[c - 0xd800])
- {
- AddUtf8(combchars[c - 0xd800]->c1);
- c = combchars[c - 0xd800]->c2;
- }
- if (c >= 0x800)
- {
- AddChar((c & 0xf000) >> 12 | 0xe0);
- c = (c & 0x0fff) | 0x1000;
- }
- if (c >= 0x80)
- {
- AddChar((c & 0x1fc0) >> 6 ^ 0xc0);
- c = (c & 0x3f) | 0x80;
- }
- AddChar(c);
-}
-
-int
-ToUtf8_comb(p, c)
-char *p;
-int c;
-{
- int l;
-
- if (c >= 0xd800 && c < 0xe000 && combchars && combchars[c - 0xd800])
- {
- l = ToUtf8_comb(p, combchars[c - 0xd800]->c1);
- return l + ToUtf8(p ? p + l : 0, combchars[c - 0xd800]->c2);
- }
- return ToUtf8(p, c);
-}
-
-int
-ToUtf8(p, c)
-char *p;
-int c;
-{
- int l = 1;
- if (c >= 0x800)
- {
- if (p)
- *p++ = (c & 0xf000) >> 12 | 0xe0;
- l++;
- c = (c & 0x0fff) | 0x1000;
- }
- if (c >= 0x80)
- {
- if (p)
- *p++ = (c & 0x1fc0) >> 6 ^ 0xc0;
- l++;
- c = (c & 0x3f) | 0x80;
- }
- if (p)
- *p++ = c;
- return l;
-}
-
-/*
- * returns:
- * -1: need more bytes, sequence not finished
- * -2: corrupt sequence found, redo last char
- * >= 0: decoded character
- */
-int
-FromUtf8(c, utf8charp)
-int c, *utf8charp;
-{
- int utf8char = *utf8charp;
- if (utf8char)
- {
- if ((c & 0xc0) != 0x80)
- {
- *utf8charp = 0;
- return -2; /* corrupt sequence! */
- }
- else
- c = (c & 0x3f) | (utf8char << 6);
- if (!(utf8char & 0x40000000))
- {
- /* check for overlong sequences */
- if ((c & 0x820823e0) == 0x80000000)
- c = 0xfdffffff;
- else if ((c & 0x020821f0) == 0x02000000)
- c = 0xfff7ffff;
- else if ((c & 0x000820f8) == 0x00080000)
- c = 0xffffd000;
- else if ((c & 0x0000207c) == 0x00002000)
- c = 0xffffff70;
- }
- }
- else
- {
- /* new sequence */
- if (c >= 0xfe)
- c = UCS_REPL;
- else if (c >= 0xfc)
- c = (c & 0x01) | 0xbffffffc; /* 5 bytes to follow */
- else if (c >= 0xf8)
- c = (c & 0x03) | 0xbfffff00; /* 4 */
- else if (c >= 0xf0)
- c = (c & 0x07) | 0xbfffc000; /* 3 */
- else if (c >= 0xe0)
- c = (c & 0x0f) | 0xbff00000; /* 2 */
- else if (c >= 0xc2)
- c = (c & 0x1f) | 0xfc000000; /* 1 */
- else if (c >= 0xc0)
- c = 0xfdffffff; /* overlong */
- else if (c >= 0x80)
- c = UCS_REPL;
- }
- *utf8charp = utf8char = (c & 0x80000000) ? c : 0;
- if (utf8char)
- return -1;
- if (c & 0xffff0000)
- c = UCS_REPL; /* sorry, only know 16bit Unicode */
- if (c >= 0xd800 && (c <= 0xdfff || c == 0xfffe || c == 0xffff))
- c = UCS_REPL; /* illegal code */
- return c;
-}
-
-
-void
-WinSwitchEncoding(p, encoding)
-struct win *p;
-int encoding;
-{
- int i, j, c;
- struct mline *ml;
- struct display *d;
- struct canvas *cv;
- struct layer *oldflayer;
-
- if ((p->w_encoding == UTF8) == (encoding == UTF8))
- {
- p->w_encoding = encoding;
- return;
- }
- oldflayer = flayer;
- for (d = displays; d; d = d->d_next)
- for (cv = d->d_cvlist; cv; cv = cv->c_next)
- if (p == Layer2Window(cv->c_layer))
- {
- flayer = cv->c_layer;
- while(flayer->l_next)
- {
- if (oldflayer == flayer)
- oldflayer = flayer->l_next;
- ExitOverlayPage();
- }
- }
- flayer = oldflayer;
- for (j = 0; j < p->w_height + p->w_histheight; j++)
- {
-#ifdef COPY_PASTE
- ml = j < p->w_height ? &p->w_mlines[j] : &p->w_hlines[j - p->w_height];
-#else
- ml = &p->w_mlines[j];
-#endif
- if (ml->font == null && encodings[p->w_encoding].deffont == 0)
- continue;
- for (i = 0; i < p->w_width; i++)
- {
- c = ml->image[i] | (ml->font[i] << 8);
- if (p->w_encoding != UTF8 && c < 256)
- c |= encodings[p->w_encoding].deffont << 8;
- if (c < 256)
- continue;
- if (ml->font == null)
- {
- if ((ml->font = (unsigned char *)malloc(p->w_width + 1)) == 0)
- {
- ml->font = null;
- break;
- }
- bzero(ml->font, p->w_width + 1);
- }
-#ifdef DW_CHARS
- if ((p->w_encoding != UTF8 && (c & 0x1f00) != 0 && (c & 0xe000) == 0) || (p->w_encoding == UTF8 && utf8_isdouble(c)))
- {
- if (i + 1 == p->w_width)
- c = '?';
- else
- {
- int c2;
- i++;
- c2 = ml->image[i] | (ml->font[i] << 8);
- c = recode_char_dw_to_encoding(c, &c2, encoding);
- ml->font[i - 1] = c >> 8 & 255;
- ml->image[i - 1] = c & 255;
- c = c2;
- }
- }
- else
-#endif
- c = recode_char_to_encoding(c, encoding);
- ml->image[i] = c & 255;
- ml->font[i] = c >> 8 & 255;
- }
- }
- p->w_encoding = encoding;
- return;
-}
-
-#ifdef DW_CHARS
-int
-utf8_isdouble(c)
-int c;
-{
- return
- (c >= 0x1100 &&
- (c <= 0x115f || /* Hangul Jamo init. consonants */
- (c >= 0x2e80 && c <= 0xa4cf && (c & ~0x0011) != 0x300a &&
- c != 0x303f) || /* CJK ... Yi */
- (c >= 0xac00 && c <= 0xd7a3) || /* Hangul Syllables */
- (c >= 0xdf00 && c <= 0xdfff) || /* dw combining sequence */
- (c >= 0xf900 && c <= 0xfaff) || /* CJK Compatibility Ideographs */
- (c >= 0xfe30 && c <= 0xfe6f) || /* CJK Compatibility Forms */
- (c >= 0xff00 && c <= 0xff5f) || /* Fullwidth Forms */
- (c >= 0xffe0 && c <= 0xffe6) ||
- (c >= 0x20000 && c <= 0x2ffff)));
-}
-#endif
-
-int
-utf8_iscomb(c)
-int c;
-{
- /* taken from Markus Kuhn's wcwidth */
- static struct {
- unsigned short first;
- unsigned short last;
- } combining[] = {
- { 0x0300, 0x034F }, { 0x0360, 0x036F }, { 0x0483, 0x0486 },
- { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 },
- { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
- { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 },
- { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
- { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
- { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C },
- { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 },
- { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC },
- { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 },
- { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 },
- { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 },
- { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 },
- { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 },
- { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 },
- { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 },
- { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 },
- { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 },
- { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
- { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA },
- { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 },
- { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 },
- { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD },
- { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 },
- { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 },
- { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC },
- { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 },
- { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 },
- { 0x1160, 0x11FF }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 },
- { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B7, 0x17BD },
- { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x180B, 0x180E },
- { 0x18A9, 0x18A9 }, { 0x200B, 0x200F }, { 0x202A, 0x202E },
- { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EA },
- { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xFB1E, 0xFB1E },
- { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF },
- { 0xFFF9, 0xFFFB }
- };
- int mid, min = 0, max = sizeof(combining)/sizeof(*combining) - 1;
-
- if (c < 0x0300 || c > 0xfffb)
- return 0;
- while (max >= min)
- {
- mid = (min + max) / 2;
- if (c > combining[mid].last)
- min = mid + 1;
- else if (c < combining[mid].first)
- max = mid - 1;
- else
- return 1;
- }
- return 0;
-}
-
-static void
-comb_tofront(root, i)
-int root, i;
-{
- for (;;)
- {
- debug1("bring to front: %x\n", i);
- combchars[combchars[i]->prev]->next = combchars[i]->next;
- combchars[combchars[i]->next]->prev = combchars[i]->prev;
- combchars[i]->next = combchars[root]->next;
- combchars[i]->prev = root;
- combchars[combchars[root]->next]->prev = i;
- combchars[root]->next = i;
- i = combchars[i]->c1;
- if (i < 0xd800 || i >= 0xe000)
- return;
- i -= 0xd800;
- }
-}
-
-void
-utf8_handle_comb(c, mc)
-int c;
-struct mchar *mc;
-{
- int root, i, c1;
- int isdouble;
-
- c1 = mc->image | (mc->font << 8);
- isdouble = c1 >= 0x1100 && utf8_isdouble(c1);
- if (!combchars)
- {
- combchars = (struct combchar **)malloc(sizeof(struct combchar *) * 0x802);
- if (!combchars)
- return;
- bzero((char *)combchars, sizeof(struct combchar *) * 0x802);
- combchars[0x800] = (struct combchar *)malloc(sizeof(struct combchar));
- combchars[0x801] = (struct combchar *)malloc(sizeof(struct combchar));
- if (!combchars[0x800] || !combchars[0x801])
- {
- if (combchars[0x800])
- free(combchars[0x800]);
- if (combchars[0x801])
- free(combchars[0x801]);
- free(combchars);
- return;
- }
- combchars[0x800]->c1 = 0x000;
- combchars[0x800]->c2 = 0x700;
- combchars[0x800]->next = 0x800;
- combchars[0x800]->prev = 0x800;
- combchars[0x801]->c1 = 0x700;
- combchars[0x801]->c2 = 0x800;
- combchars[0x801]->next = 0x801;
- combchars[0x801]->prev = 0x801;
- }
- root = isdouble ? 0x801 : 0x800;
- for (i = combchars[root]->c1; i < combchars[root]->c2; i++)
- {
- if (!combchars[i])
- break;
- if (combchars[i]->c1 == c1 && combchars[i]->c2 == c)
- break;
- }
- if (i == combchars[root]->c2)
- {
- /* full, recycle old entry */
- if (c1 >= 0xd800 && c1 < 0xe000)
- comb_tofront(root, c1);
- i = combchars[root]->prev;
- /* FIXME: delete old char from all buffers */
- }
- else if (!combchars[i])
- {
- combchars[i] = (struct combchar *)malloc(sizeof(struct combchar));
- if (!combchars[i])
- return;
- combchars[i]->prev = i;
- combchars[i]->next = i;
- }
- combchars[i]->c1 = c1;
- combchars[i]->c2 = c;
- mc->image = i & 0xff;
- mc->font = (i >> 8) + 0xd8;
- debug3("combinig char %x %x -> %x\n", c1, c, i + 0xd800);
- comb_tofront(root, i);
-}
-
-#else /* !UTF8 */
-
-void
-WinSwitchEncoding(p, encoding)
-struct win *p;
-int encoding;
-{
- p->w_encoding = encoding;
- return;
-}
-
-#endif /* UTF8 */
-
-static int
-encmatch(s1, s2)
-char *s1;
-char *s2;
-{
- int c1, c2;
- do
- {
- c1 = (unsigned char)*s1;
- if (c1 >= 'A' && c1 <= 'Z')
- c1 += 'a' - 'A';
- if (!(c1 >= 'a' && c1 <= 'z') && !(c1 >= '0' && c1 <= '9'))
- {
- s1++;
- continue;
- }
- c2 = (unsigned char)*s2;
- if (c2 >= 'A' && c2 <= 'Z')
- c2 += 'a' - 'A';
- if (!(c2 >= 'a' && c2 <= 'z') && !(c2 >= '0' && c2 <= '9'))
- {
- s2++;
- continue;
- }
- if (c1 != c2)
- return 0;
- s1++;
- s2++;
- }
- while(c1);
- return 1;
-}
-
-int
-FindEncoding(name)
-char *name;
-{
- int encoding;
-
- debug1("FindEncoding %s\n", name);
- if (name == 0 || *name == 0)
- return 0;
- if (encmatch(name, "euc"))
- name = "eucJP";
- if (encmatch(name, "off") || encmatch(name, "iso8859-1"))
- return 0;
-#ifndef UTF8
- if (encmatch(name, "UTF-8"))
- return -1;
-#endif
- for (encoding = 0; encoding < (int)(sizeof(encodings)/sizeof(*encodings)); encoding++)
- if (encmatch(name, encodings[encoding].name))
- {
-#ifdef UTF8
- LoadFontTranslationsForEncoding(encoding);
-#endif
- return encoding;
- }
- return -1;
-}
-
-char *
-EncodingName(encoding)
-int encoding;
-{
- if (encoding >= (int)(sizeof(encodings)/sizeof(*encodings)))
- return 0;
- return encodings[encoding].name;
-}
-
-int
-EncodingDefFont(encoding)
-int encoding;
-{
- return encodings[encoding].deffont;
-}
-
-void
-ResetEncoding(p)
-struct win *p;
-{
- char *c;
- int encoding = p->w_encoding;
-
- c = encodings[encoding].charsets;
- if (c)
- SetCharsets(p, c);
-#ifdef UTF8
- LoadFontTranslationsForEncoding(encoding);
-#endif
- if (encodings[encoding].usegr)
- {
- p->w_gr = 2;
- p->w_FontE = encodings[encoding].charsets[1];
- }
- else
- p->w_FontE = 0;
- if (encodings[encoding].noc1)
- p->w_c1 = 0;
-}
-
-int
-DecodeChar(c, encoding, statep)
-int c;
-int encoding;
-int *statep;
-{
- int t;
-
- debug2("Decoding char %02x for encoding %d\n", c, encoding);
-#ifdef UTF8
- if (encoding == UTF8)
- return FromUtf8(c, statep);
-#endif
- if (encoding == SJIS)
- {
- if (!*statep)
- {
- if ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xef))
- {
- *statep = c;
- return -1;
- }
- return c | (KANA << 16);
- }
- t = c;
- c = *statep;
- *statep = 0;
- if (0x40 <= t && t <= 0xfc && t != 0x7f)
- {
- if (c <= 0x9f) c = (c - 0x81) * 2 + 0x21;
- else c = (c - 0xc1) * 2 + 0x21;
- if (t <= 0x7e) t -= 0x1f;
- else if (t <= 0x9e) t -= 0x20;
- else t -= 0x7e, c++;
- return (c << 8) | t | (KANJI << 16);
- }
- return t;
- }
- if (encoding == EUC_JP || encoding == EUC_KR || encoding == EUC_CN)
- {
- if (!*statep)
- {
- if (c & 0x80)
- {
- *statep = c;
- return -1;
- }
- return c;
- }
- t = c;
- c = *statep;
- *statep = 0;
- if (encoding == EUC_JP)
- {
- if (c == 0x8e)
- return t | (KANA << 16);
- if (c == 0x8f)
- {
- *statep = t | (KANJI0212 << 8);
- return -1;
- }
- }
- c &= 0xff7f;
- t &= 0x7f;
- c = c << 8 | t;
- if (encoding == EUC_KR)
- return c | (3 << 16);
- if (encoding == EUC_CN)
- return c | (1 << 16);
- if (c & (KANJI0212 << 16))
- return c;
- else
- return c | (KANJI << 16);
- }
- if (encoding == BIG5 || encoding == GBK)
- {
- if (!*statep)
- {
- if (c & 0x80)
- {
- if (encoding == GBK && c == 0x80)
- return 0xa4 | (('b'|0x80) << 16);
- *statep = c;
- return -1;
- }
- return c;
- }
- t = c;
- c = *statep;
- *statep = 0;
- c &= 0x7f;
- return c << 8 | t | (encoding == BIG5 ? 030 << 16 : 031 << 16);
- }
- return c | (encodings[encoding].deffont << 16);
-}
-
-int
-EncodeChar(bp, c, encoding, fontp)
-char *bp;
-int c;
-int encoding;
-int *fontp;
-{
- int t, f, l;
-
- debug2("Encoding char %02x for encoding %d\n", c, encoding);
- if (c == -1 && fontp)
- {
- if (*fontp == 0)
- return 0;
- if (bp)
- {
- *bp++ = 033;
- *bp++ = '(';
- *bp++ = 'B';
- }
- return 3;
- }
- f = c >> 16;
-
-#ifdef UTF8
- if (encoding == UTF8)
- {
- if (f)
- {
-# ifdef DW_CHARS
- if (is_dw_font(f))
- {
- int c2 = c & 0xff;
- c = (c >> 8 & 0xff) | (f << 8);
- c = recode_char_dw_to_encoding(c, &c2, encoding);
- }
- else
-# endif
- {
- c = (c & 0xff) | (f << 8);
- c = recode_char_to_encoding(c, encoding);
- }
- }
- return ToUtf8(bp, c);
- }
- if ((c & 0xff00) && f == 0) /* is_utf8? */
- {
-# ifdef DW_CHARS
- if (utf8_isdouble(c))
- {
- int c2 = 0xffff;
- c = recode_char_dw_to_encoding(c, &c2, encoding);
- c = (c << 8) | (c2 & 0xff);
- }
- else
-# endif
- {
- c = recode_char_to_encoding(c, encoding);
- c = ((c & 0xff00) << 8) | (c & 0xff);
- }
- debug1("Encode: char mapped from utf8 to %x\n", c);
- f = c >> 16;
- }
-#endif
- if (f & 0x80) /* map special 96-fonts to latin1 */
- f = 0;
-
- if (encoding == SJIS)
- {
- if (f == KANA)
- c = (c & 0xff) | 0x80;
- else if (f == KANJI)
- {
- if (!bp)
- return 2;
- t = c & 0xff;
- c = (c >> 8) & 0xff;
- t += (c & 1) ? ((t <= 0x5f) ? 0x1f : 0x20) : 0x7e;
- c = (c - 0x21) / 2 + ((c < 0x5f) ? 0x81 : 0xc1);
- *bp++ = c;
- *bp++ = t;
- return 2;
- }
- }
- if (encoding == EUC)
- {
- if (f == KANA)
- {
- if (bp)
- {
- *bp++ = 0x8e;
- *bp++ = c;
- }
- return 2;
- }
- if (f == KANJI)
- {
- if (bp)
- {
- *bp++ = (c >> 8) | 0x80;
- *bp++ = c | 0x80;
- }
- return 2;
- }
- if (f == KANJI0212)
- {
- if (bp)
- {
- *bp++ = 0x8f;
- *bp++ = c >> 8;
- *bp++ = c;
- }
- return 3;
- }
- }
- if ((encoding == EUC_KR && f == 3) || (encoding == EUC_CN && f == 1))
- {
- if (bp)
- {
- *bp++ = (c >> 8) | 0x80;
- *bp++ = c | 0x80;
- }
- return 2;
- }
- if ((encoding == BIG5 && f == 030) || (encoding == GBK && f == 031))
- {
- if (bp)
- {
- *bp++ = (c >> 8) | 0x80;
- *bp++ = c;
- }
- return 2;
- }
- if (encoding == GBK && f == 0 && c == 0xa4)
- c = 0x80;
-
- l = 0;
- if (fontp && f != *fontp)
- {
- *fontp = f;
- if (f && f < ' ')
- {
- if (bp)
- {
- *bp++ = 033;
- *bp++ = '$';
- if (f > 2)
- *bp++ = '(';
- *bp++ = '@' + f;
- }
- l += f > 2 ? 4 : 3;
- }
- else if (f < 128)
- {
- if (f == 0)
- f = 'B';
- if (bp)
- {
- *bp++ = 033;
- *bp++ = '(';
- *bp++ = f;
- }
- l += 3;
- }
- }
- if (c & 0xff00)
- {
- if (bp)
- *bp++ = c >> 8;
- l++;
- }
- if (bp)
- *bp++ = c;
- return l + 1;
-}
-
-int
-CanEncodeFont(encoding, f)
-int encoding, f;
-{
- switch(encoding)
- {
-#ifdef UTF8
- case UTF8:
- return 1;
-#endif
- case SJIS:
- return f == KANJI || f == KANA;
- case EUC:
- return f == KANJI || f == KANA || f == KANJI0212;
- case EUC_KR:
- return f == 3;
- case EUC_CN:
- return f == 1;
- case BIG5:
- return f == 030;
- case GBK:
- return f == 031;
- default:
- break;
- }
- return 0;
-}
-
-#ifdef DW_CHARS
-int
-PrepareEncodedChar(c)
-int c;
-{
- int encoding;
- int t = 0;
- int f;
-
- encoding = D_encoding;
- f = D_rend.font;
- t = D_mbcs;
- if (encoding == SJIS)
- {
- if (f == KANA)
- return c | 0x80;
- else if (f == KANJI)
- {
- t += (c & 1) ? ((t <= 0x5f) ? 0x1f : 0x20) : 0x7e;
- c = (c - 0x21) / 2 + ((c < 0x5f) ? 0x81 : 0xc1);
- D_mbcs = t;
- }
- return c;
- }
- if (encoding == EUC)
- {
- if (f == KANA)
- {
- AddChar(0x8e);
- return c | 0x80;
- }
- if (f == KANJI)
- {
- D_mbcs = t | 0x80;
- return c | 0x80;
- }
- if (f == KANJI0212)
- {
- AddChar(0x8f);
- D_mbcs = t | 0x80;
- return c | 0x80;
- }
- }
- if ((encoding == EUC_KR && f == 3) || (encoding == EUC_CN && f == 1))
- {
- D_mbcs = t | 0x80;
- return c | 0x80;
- }
- if ((encoding == BIG5 && f == 030) || (encoding == GBK && f == 031))
- return c | 0x80;
- return c;
-}
-#endif
-
-int
-RecodeBuf(fbuf, flen, fenc, tenc, tbuf)
-unsigned char *fbuf;
-int flen;
-int fenc, tenc;
-unsigned char *tbuf;
-{
- int c, i, j;
- int decstate = 0, font = 0;
-
- for (i = j = 0; i < flen; i++)
- {
- c = fbuf[i];
- c = DecodeChar(c, fenc, &decstate);
- if (c == -2)
- i--;
- if (c < 0)
- continue;
- j += EncodeChar(tbuf ? (char *)tbuf + j : 0, c, tenc, &font);
- }
- j += EncodeChar(tbuf ? (char *)tbuf + j : 0, -1, tenc, &font);
- return j;
-}
-
-#ifdef UTF8
-int
-ContainsSpecialDeffont(ml, xs, xe, encoding)
-struct mline *ml;
-int xs, xe;
-int encoding;
-{
- unsigned char *f, *i;
- int c, x, dx;
-
- if (encoding == UTF8 || encodings[encoding].deffont == 0)
- return 0;
- i = ml->image + xs;
- f = ml->font + xs;
- dx = xe - xs + 1;
- while (dx-- > 0)
- {
- if (*f++)
- continue;
- c = *i++;
- x = recode_char_to_encoding(c | (encodings[encoding].deffont << 8), UTF8);
- if (c != x)
- {
- debug2("ContainsSpecialDeffont: yes %02x != %02x\n", c, x);
- return 1;
- }
- }
- debug("ContainsSpecialDeffont: no\n");
- return 0;
-}
-
-
-int
-LoadFontTranslation(font, file)
-int font;
-char *file;
-{
- char buf[1024], *myfile;
- FILE *f;
- int i;
- int fo;
- int x, u, c, ok;
- unsigned short (*p)[2], (*tab)[2];
-
- myfile = file;
- if (myfile == 0)
- {
- if (font == 0 || screenencodings == 0)
- return -1;
- if (strlen(screenencodings) > sizeof(buf) - 10)
- return -1;
- sprintf(buf, "%s/%02x", screenencodings, font & 0xff);
- myfile = buf;
- }
- debug1("LoadFontTranslation: trying %s\n", myfile);
- if ((f = secfopen(myfile, "r")) == 0)
- return -1;
- i = ok = 0;
- for (;;)
- {
- for(; i < 12; i++)
- if (getc(f) != "ScreenI2UTF8"[i])
- break;
- if (getc(f) != 0) /* format */
- break;
- fo = getc(f); /* id */
- if (fo == EOF)
- break;
- if (font != -1 && font != fo)
- break;
- i = getc(f);
- x = getc(f);
- if (x == EOF)
- break;
- i = i << 8 | x;
- getc(f);
- while ((x = getc(f)) && x != EOF)
- getc(f); /* skip font name (padded to 2 bytes) */
- if ((p = malloc(sizeof(*p) * (i + 1))) == 0)
- break;
- tab = p;
- while(i > 0)
- {
- x = getc(f);
- x = x << 8 | getc(f);
- u = getc(f);
- c = getc(f);
- u = u << 8 | c;
- if (c == EOF)
- break;
- (*p)[0] = x;
- (*p)[1] = u;
- p++;
- i--;
- }
- (*p)[0] = 0;
- (*p)[1] = 0;
- if (i || (tab[0][0] & 0x8000))
- {
- free(tab);
- break;
- }
- if (recodetabs[fo].tab && (recodetabs[fo].flags & RECODETAB_ALLOCED) != 0)
- free(recodetabs[fo].tab);
- recodetabs[fo].tab = tab;
- recodetabs[fo].flags = RECODETAB_ALLOCED;
- debug1("Successful load of recodetab %02x\n", fo);
- c = getc(f);
- if (c == EOF)
- {
- ok = 1;
- break;
- }
- if (c != 'S')
- break;
- i = 1;
- }
- fclose(f);
- if (font != -1 && file == 0 && recodetabs[font].flags == 0)
- recodetabs[font].flags = RECODETAB_TRIED;
- return ok ? 0 : -1;
-}
-
-void
-LoadFontTranslationsForEncoding(encoding)
-int encoding;
-{
- char *c;
- int f;
-
- debug1("LoadFontTranslationsForEncoding: encoding %d\n", encoding);
- if ((c = encodings[encoding].fontlist) != 0)
- while ((f = (unsigned char)*c++) != 0)
- if (recodetabs[f].flags == 0)
- LoadFontTranslation(f, 0);
- f = encodings[encoding].deffont;
- if (f > 0 && recodetabs[f].flags == 0)
- LoadFontTranslation(f, 0);
-}
-
-#endif /* UTF8 */
-
-#else /* !ENCODINGS */
-
-/* Simple version of EncodeChar to encode font changes for
- * copy/paste mode
- */
-int
-EncodeChar(bp, c, encoding, fontp)
-char *bp;
-int c;
-int encoding;
-int *fontp;
-{
- int f, l;
- f = (c == -1) ? 0 : c >> 16;
- l = 0;
- if (fontp && f != *fontp)
- {
- *fontp = f;
- if (f && f < ' ')
- {
- if (bp)
- {
- *bp++ = 033;
- *bp++ = '$';
- if (f > 2)
- *bp++ = '(';
- *bp++ = '@' + f;
- }
- l += f > 2 ? 4 : 3;
- }
- else if (f < 128)
- {
- if (f == 0)
- f = 'B';
- if (bp)
- {
- *bp++ = 033;
- *bp++ = '(';
- *bp++ = f;
- }
- l += 3;
- }
- }
- if (c == -1)
- return l;
- if (c & 0xff00)
- {
- if (bp)
- *bp++ = c >> 8;
- l++;
- }
- if (bp)
- *bp++ = c;
- return l + 1;
-}
-
-#endif /* ENCODINGS */
diff --git a/src/extern.h b/src/extern.h
deleted file mode 100644
index 3010670..0000000
--- a/src/extern.h
+++ /dev/null
@@ -1,492 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-#if !defined(__GNUC__) || __GNUC__ < 2
-#undef __attribute__
-#define __attribute__(x)
-#endif
-
-/* screen.c */
-extern int main __P((int, char **));
-extern sigret_t SigHup __P(SIGPROTOARG);
-extern void eexit __P((int));
-extern void Detach __P((int));
-extern void Hangup __P((void));
-extern void Kill __P((int, int));
-#ifdef USEVARARGS
-extern void Msg __P((int, char *, ...)) __attribute__((format(printf, 2, 3)));
-extern void Panic __P((int, char *, ...)) __attribute__((format(printf, 2, 3)));
-#else
-extern void Msg __P(());
-extern void Panic __P(());
-#endif
-extern void Finit __P((int));
-extern void MakeNewEnv __P((void));
-extern char *MakeWinMsg __P((char *, struct win *, int));
-extern char *MakeWinMsgEv __P((char *, struct win *, int, int, struct event *, int));
-extern int PutWinMsg __P((char *, int, int));
-extern void WindowDied __P((struct win *));
-extern void setbacktick __P((int, int, int, char **));
-
-/* ansi.c */
-extern void ResetAnsiState __P((struct win *));
-extern void ResetWindow __P((struct win *));
-extern void ResetCharsets __P((struct win *));
-extern void WriteString __P((struct win *, char *, int));
-extern void ChangeAKA __P((struct win *, char *, int));
-extern void SetCharsets __P((struct win *, char *));
-extern int GetAnsiStatus __P((struct win *, char *));
-extern void WNewAutoFlow __P((struct win *, int));
-extern void WBell __P((struct win *, int));
-extern void WMsg __P((struct win *, int, char *));
-extern void WChangeSize __P((struct win *, int, int));
-extern void WindowChanged __P((struct win *, int));
-extern int MFindUsedLine __P((struct win *, int, int));
-
-/* fileio.c */
-extern void StartRc __P((char *));
-extern void FinishRc __P((char *));
-extern void RcLine __P((char *, int));
-extern FILE *secfopen __P((char *, char *));
-extern int secopen __P((char *, int, int));
-extern void WriteFile __P((struct acluser *, char *, int));
-extern char *ReadFile __P((char *, int *));
-extern void KillBuffers __P((void));
-extern int printpipe __P((struct win *, char *));
-extern int readpipe __P((char **));
-extern void RunBlanker __P((char **));
-extern void do_source __P((char *));
-
-/* tty.c */
-extern int OpenTTY __P((char *, char *));
-extern void InitTTY __P((struct mode *, int));
-extern void GetTTY __P((int, struct mode *));
-extern void SetTTY __P((int, struct mode *));
-extern void SetMode __P((struct mode *, struct mode *, int, int));
-extern void SetFlow __P((int));
-extern void SendBreak __P((struct win *, int, int));
-extern int TtyGrabConsole __P((int, int, char *));
-extern char *TtyGetModemStatus __P((int, char *));
-#ifdef DEBUG
-extern void DebugTTY __P((struct mode *));
-#endif /* DEBUG */
-extern int fgtty __P((int));
-extern void brktty __P((int));
-extern struct baud_values *lookup_baud __P((int bps));
-extern int SetBaud __P((struct mode *, int, int));
-extern int SttyMode __P((struct mode *, char *));
-
-
-/* mark.c */
-extern int GetHistory __P((void));
-extern void MarkRoutine __P((void));
-extern void revto_line __P((int, int, int));
-extern void revto __P((int, int));
-extern int InMark __P((void));
-extern void MakePaster __P((struct paster *, char *, int, int));
-extern void FreePaster __P((struct paster *));
-
-/* search.c */
-extern void Search __P((int));
-extern void ISearch __P((int));
-
-/* input.c */
-extern void inp_setprompt __P((char *, char *));
-extern void Input __P((char *, int, int, void (*)(char *, int, char *), char *));
-extern int InInput __P((void));
-
-/* help.c */
-extern void exit_with_usage __P((char *, char *, char *));
-extern void display_help __P((char *, struct action *));
-extern void display_copyright __P((void));
-extern void display_displays __P((void));
-extern void display_bindkey __P((char *, struct action *));
-extern void display_wlist __P((int, int));
-extern int InWList __P((void));
-extern void WListUpdatecv __P((struct canvas *, struct win *));
-extern void WListLinkChanged __P((void));
-#ifdef ZMODEM
-extern void ZmodemPage __P((void));
-#endif
-
-/* window.c */
-extern int MakeWindow __P((struct NewWindow *));
-extern int RemakeWindow __P((struct win *));
-extern void FreeWindow __P((struct win *));
-#ifdef PSEUDOS
-extern int winexec __P((char **));
-extern void FreePseudowin __P((struct win *));
-#endif
-extern void nwin_compose __P((struct NewWindow *, struct NewWindow *, struct NewWindow *));
-extern int DoStartLog __P((struct win *, char *, int));
-extern int ReleaseAutoWritelock __P((struct display *, struct win *));
-extern int ObtainAutoWritelock __P((struct display *, struct win *));
-extern void CloseDevice __P((struct win *));
-#ifdef ZMODEM
-extern void zmodem_abort __P((struct win *, struct display *));
-#endif
-extern void execvpe __P((char *, char **, char **));
-
-/* utmp.c */
-#ifdef UTMPOK
-extern void InitUtmp __P((void));
-extern void RemoveLoginSlot __P((void));
-extern void RestoreLoginSlot __P((void));
-extern int SetUtmp __P((struct win *));
-extern int RemoveUtmp __P((struct win *));
-#endif /* UTMPOK */
-extern void SlotToggle __P((int));
-#ifdef USRLIMIT
-extern int CountUsers __P((void));
-#endif
-#ifdef CAREFULUTMP
-extern void CarefulUtmp __P((void));
-#else
-# define CarefulUtmp() /* nothing */
-#endif /* CAREFULUTMP */
-
-
-/* loadav.c */
-#ifdef LOADAV
-extern void InitLoadav __P((void));
-extern void AddLoadav __P((char *));
-#endif
-
-/* pty.c */
-extern int OpenPTY __P((char **));
-extern void InitPTY __P((int));
-
-/* process.c */
-extern void InitKeytab __P((void));
-extern void ProcessInput __P((char *, int));
-#ifdef MAPKEYS
-extern void ProcessInput2 __P((char *, int));
-#endif
-extern void DoProcess __P((struct win *, char **, int *, struct paster *));
-extern void DoAction __P((struct action *, int));
-extern int FindCommnr __P((char *));
-extern void DoCommand __P((char **, int *));
-extern void Activate __P((int));
-extern void KillWindow __P((struct win *));
-extern void SetForeWindow __P((struct win *));
-extern int Parse __P((char *, int, char **, int *));
-extern void SetEscape __P((struct acluser *, int, int));
-extern void DoScreen __P((char *, char **));
-extern int IsNumColon __P((char *, int, char *, int));
-extern void ShowWindows __P((int));
-extern char *AddWindows __P((char *, int, int, int));
-extern char *AddWindowFlags __P((char *, int, struct win *));
-extern char *AddOtherUsers __P((char *, int, struct win *));
-extern int WindowByNoN __P((char *));
-extern struct win *FindNiceWindow __P((struct win *, char *));
-#ifdef COPY_PASTE
-extern int CompileKeys __P((char *, int, unsigned char *));
-#endif
-#ifdef RXVT_OSC
-extern void RefreshXtermOSC __P((void));
-#endif
-extern int ParseSaveStr __P((struct action *act, char **));
-extern int ParseNum __P((struct action *act, int *));
-extern int ParseSwitch __P((struct action *, int *));
-extern int ParseAttrColor __P((char *, char *, int));
-extern void ApplyAttrColor __P((int, struct mchar *));
-extern void SwitchWindow __P((int));
-extern int StuffKey __P((int));
-
-/* termcap.c */
-extern int InitTermcap __P((int, int));
-extern char *MakeTermcap __P((int));
-extern char *gettermcapstring __P((char *));
-#ifdef MAPKEYS
-extern int remap __P((int, int));
-extern void CheckEscape __P((void));
-#endif
-extern int CreateTransTable __P((char *));
-extern void FreeTransTable __P((void));
-
-/* attacher.c */
-extern int Attach __P((int));
-extern void Attacher __P((void));
-extern sigret_t AttacherFinit __P(SIGPROTOARG);
-extern void SendCmdMessage __P((char *, char *, char **));
-
-/* display.c */
-extern struct display *MakeDisplay __P((char *, char *, char *, int, int, struct mode *));
-extern void FreeDisplay __P((void));
-extern void DefProcess __P((char **, int *));
-extern void DefRedisplayLine __P((int, int, int, int));
-extern void DefClearLine __P((int, int, int, int));
-extern int DefRewrite __P((int, int, int, struct mchar *, int));
-extern int DefResize __P((int, int));
-extern void DefRestore __P((void));
-extern void AddCStr __P((char *));
-extern void AddCStr2 __P((char *, int));
-extern void InitTerm __P((int));
-extern void FinitTerm __P((void));
-extern void PUTCHAR __P((int));
-extern void PUTCHARLP __P((int));
-extern void ClearAll __P((void));
-extern void ClearArea __P((int, int, int, int, int, int, int, int));
-extern void ClearLine __P((struct mline *, int, int, int, int));
-extern void RefreshAll __P((int));
-extern void RefreshArea __P((int, int, int, int, int));
-extern void RefreshLine __P((int, int, int, int));
-extern void Redisplay __P((int));
-extern void RedisplayDisplays __P((int));
-extern void ShowHStatus __P((char *));
-extern void RefreshHStatus __P((void));
-extern void DisplayLine __P((struct mline *, struct mline *, int, int, int));
-extern void GotoPos __P((int, int));
-extern int CalcCost __P((char *));
-extern void ScrollH __P((int, int, int, int, int, struct mline *));
-extern void ScrollV __P((int, int, int, int, int, int));
-extern void PutChar __P((struct mchar *, int, int));
-extern void InsChar __P((struct mchar *, int, int, int, struct mline *));
-extern void WrapChar __P((struct mchar *, int, int, int, int, int, int, int));
-extern void ChangeScrollRegion __P((int, int));
-extern void InsertMode __P((int));
-extern void KeypadMode __P((int));
-extern void CursorkeysMode __P((int));
-extern void ReverseVideo __P((int));
-extern void CursorVisibility __P((int));
-extern void MouseMode __P((int));
-extern void SetFont __P((int));
-extern void SetAttr __P((int));
-extern void SetColor __P((int, int));
-extern void SetRendition __P((struct mchar *));
-extern void SetRenditionMline __P((struct mline *, int));
-extern void MakeStatus __P((char *));
-extern void RemoveStatus __P((void));
-extern int ResizeDisplay __P((int, int));
-extern void AddStr __P((char *));
-extern void AddStrn __P((char *, int));
-extern void Flush __P((void));
-extern void freetty __P((void));
-extern void Resize_obuf __P((void));
-#ifdef AUTO_NUKE
-extern void NukePending __P((void));
-#endif
-extern void SetCanvasWindow __P((struct canvas *, struct win *));
-extern int MakeDefaultCanvas __P((void));
-extern int AddCanvas __P((void));
-extern void RemCanvas __P((void));
-extern void OneCanvas __P((void));
-extern int RethinkDisplayViewports __P((void));
-extern void RethinkViewportOffsets __P((struct canvas *));
-#ifdef RXVT_OSC
-extern void ClearAllXtermOSC __P((void));
-extern void SetXtermOSC __P((int, char *));
-#endif
-#ifdef COLOR
-extern int color256to16 __P((int));
-# ifdef COLORS256
-extern int color256to88 __P((int));
-# endif
-#endif
-extern void ResetIdle __P((void));
-extern void KillBlanker __P((void));
-extern void DisplaySleep1000 __P((int, int));
-
-/* resize.c */
-extern int ChangeWindowSize __P((struct win *, int, int, int));
-extern void ChangeScreenSize __P((int, int, int));
-extern void CheckScreenSize __P((int));
-extern char *xrealloc __P((char *, int));
-extern void ResizeLayersToCanvases __P((void));
-extern void ResizeLayer __P((struct layer *, int, int, struct display *));
-extern int MayResizeLayer __P((struct layer *));
-extern void FreeAltScreen __P((struct win *));
-extern void EnterAltScreen __P((struct win *));
-extern void LeaveAltScreen __P((struct win *));
-
-/* sched.c */
-extern void evenq __P((struct event *));
-extern void evdeq __P((struct event *));
-extern void SetTimeout __P((struct event *, int));
-extern void sched __P((void));
-
-/* socket.c */
-extern int FindSocket __P((int *, int *, int *, char *));
-extern int MakeClientSocket __P((int));
-extern int MakeServerSocket __P((void));
-extern int RecoverSocket __P((void));
-extern int chsock __P((void));
-extern void ReceiveMsg __P((void));
-extern void SendCreateMsg __P((char *, struct NewWindow *));
-extern int SendErrorMsg __P((char *, char *));
-
-/* misc.c */
-extern char *SaveStr __P((const char *));
-extern char *SaveStrn __P((const char *, int));
-extern char *InStr __P((char *, const char *));
-#ifndef HAVE_STRERROR
-extern char *strerror __P((int));
-#endif
-extern void centerline __P((char *, int));
-extern void leftline __P((char *, int));
-extern char *Filename __P((char *));
-extern char *stripdev __P((char *));
-#ifdef NEED_OWN_BCOPY
-extern void xbcopy __P((char *, char *, int));
-#endif
-extern void bclear __P((char *, int));
-extern void closeallfiles __P((int));
-extern int UserContext __P((void));
-extern void UserReturn __P((int));
-extern int UserStatus __P((void));
-#if defined(POSIX) || defined(hpux)
-extern void (*xsignal __P((int, void (*)SIGPROTOARG))) __P(SIGPROTOARG);
-#endif
-#ifndef HAVE_RENAME
-extern int rename __P((char *, char *));
-#endif
-#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID)
-extern void xseteuid __P((int));
-extern void xsetegid __P((int));
-#endif
-extern int AddXChar __P((char *, int));
-extern int AddXChars __P((char *, int, char *));
-extern void xsetenv __P((char *, char *));
-extern void sleep1000 __P((int));
-#ifdef DEBUG
-extern void opendebug __P((int, int));
-#endif
-#ifdef USEVARARGS
-# ifndef HAVE_VSNPRINTF
-extern int xvsnprintf __P((char *, int, char *, va_list));
-# endif
-#else
-extern int xsnprintf __P(());
-#endif
-
-
-/* acl.c */
-#ifdef MULTIUSER
-extern int AclCheckPermWin __P((struct acluser *, int, struct win *));
-extern int AclCheckPermCmd __P((struct acluser *, int, struct comm *));
-extern int AclSetPerm __P((struct acluser *, struct acluser *, char *, char *));
-extern int AclUmask __P((struct acluser *, char *, char **));
-extern int UsersAcl __P((struct acluser *, int, char **));
-extern void AclWinSwap __P((int, int));
-extern int NewWindowAcl __P((struct win *, struct acluser *));
-extern void FreeWindowAcl __P((struct win *));
-extern char *DoSu __P((struct acluser **, char *, char *, char *));
-extern int AclLinkUser __P((char *, char *));
-#endif /* MULTIUSER */
-extern int UserFreeCopyBuffer __P((struct acluser *));
-extern struct acluser **FindUserPtr __P((char *));
-extern int UserAdd __P((char *, char *, struct acluser **));
-extern int UserDel __P((char *, struct acluser **));
-
-
-/* braile.c */
-#ifdef HAVE_BRAILLE
-extern void InitBraille __P((void));
-extern void RefreshBraille __P((void));
-extern void DoBrailleAction __P((struct action *, int));
-extern void BGotoPos __P((struct layer *, int, int));
-extern void BPutChar __P((struct layer *, struct mchar *, int, int));
-extern void BPutStr __P((struct layer *, char *, int, struct mchar *, int, int));
-extern void BCDisplayLine __P((struct layer *, struct mline *, int, int, int, int));
-#endif
-
-
-
-
-/* layer.c */
-extern void LGotoPos __P((struct layer *, int, int));
-extern void LPutChar __P((struct layer *, struct mchar *, int, int));
-extern void LInsChar __P((struct layer *, struct mchar *, int, int, struct mline *));
-extern void LPutStr __P((struct layer *, char *, int, struct mchar *, int, int));
-extern void LPutWinMsg __P((struct layer *, char *, int, struct mchar *, int, int));
-extern void LScrollH __P((struct layer *, int, int, int, int, int, struct mline *));
-extern void LScrollV __P((struct layer *, int, int, int, int));
-extern void LClearAll __P((struct layer *, int));
-extern void LClearArea __P((struct layer *, int, int, int, int, int, int));
-extern void LClearLine __P((struct layer *, int, int, int, int, struct mline *));
-extern void LRefreshAll __P((struct layer *, int));
-extern void LCDisplayLine __P((struct layer *, struct mline *, int, int, int, int));
-extern void LCDisplayLineWrap __P((struct layer *, struct mline *, int, int, int, int));
-extern void LSetRendition __P((struct layer *, struct mchar *));
-extern void LWrapChar __P((struct layer *, struct mchar *, int, int, int, int));
-extern void LCursorVisibility __P((struct layer *, int));
-extern void LSetFlow __P((struct layer *, int));
-extern void LKeypadMode __P((struct layer *, int));
-extern void LCursorkeysMode __P((struct layer *, int));
-extern void LMouseMode __P((struct layer *, int));
-#ifdef USEVARARGS
-extern void LMsg __P((int, char *, ...)) __attribute__((format(printf, 2, 3)));
-#else
-extern void LMsg __P(());
-#endif
-extern void KillLayerChain __P((struct layer *));
-extern int InitOverlayPage __P((int, struct LayFuncs *, int));
-extern void ExitOverlayPage __P((void));
-
-/* teln.c */
-#ifdef BUILTIN_TELNET
-extern int TelOpen __P((char **));
-extern int TelConnect __P((struct win *));
-extern int TelIsline __P((struct win *p));
-extern void TelProcessLine __P((char **, int *));
-extern int DoTelnet __P((char *, int *, int));
-extern int TelIn __P((struct win *, char *, int, int));
-extern void TelBreak __P((struct win *));
-extern void TelWindowSize __P((struct win *));
-extern void TelStatus __P((struct win *, char *, int));
-#endif
-
-/* nethack.c */
-extern char *DoNLS __P((char *));
-
-/* encoding.c */
-#ifdef ENCODINGS
-# ifdef UTF8
-extern void InitBuiltinTabs __P((void));
-extern struct mchar *recode_mchar __P((struct mchar *, int, int));
-extern struct mline *recode_mline __P((struct mline *, int, int, int));
-extern int FromUtf8 __P((int, int *));
-extern void AddUtf8 __P((int));
-extern int ToUtf8 __P((char *, int));
-extern int ToUtf8_comb __P((char *, int));
-extern int utf8_isdouble __P((int));
-extern int utf8_iscomb __P((int));
-extern void utf8_handle_comb __P((int, struct mchar *));
-extern int ContainsSpecialDeffont __P((struct mline *, int, int, int));
-extern int LoadFontTranslation __P((int, char *));
-extern void LoadFontTranslationsForEncoding __P((int));
-# endif /* UTF8 */
-extern void WinSwitchEncoding __P((struct win *, int));
-extern int FindEncoding __P((char *));
-extern char *EncodingName __P((int));
-extern int EncodingDefFont __P((int));
-extern void ResetEncoding __P((struct win *));
-extern int CanEncodeFont __P((int, int));
-extern int DecodeChar __P((int, int, int *));
-extern int RecodeBuf __P((unsigned char *, int, int, int, unsigned char *));
-# ifdef DW_CHARS
-extern int PrepareEncodedChar __P((int));
-# endif
-#endif
-extern int EncodeChar __P((char *, int, int, int *));
diff --git a/src/fileio.c b/src/fileio.c
deleted file mode 100644
index ab5e9c7..0000000
--- a/src/fileio.c
+++ /dev/null
@@ -1,836 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#ifndef SIGINT
-# include <signal.h>
-#endif
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-extern struct display *display, *displays;
-extern struct win *fore;
-extern struct layer *flayer;
-extern int real_uid, eff_uid;
-extern int real_gid, eff_gid;
-extern char *extra_incap, *extra_outcap;
-extern char *home, *RcFileName;
-extern char SockPath[], *SockName;
-#ifdef COPY_PASTE
-extern char *BufferFile;
-#endif
-extern int hardcopy_append;
-extern char *hardcopydir;
-
-static char *CatExtra __P((char *, char *));
-static char *findrcfile __P((char *));
-
-
-char *rc_name = "";
-int rc_recursion = 0;
-
-static char *
-CatExtra(str1, str2)
-register char *str1, *str2;
-{
- register char *cp;
- register int len1, len2, add_colon;
-
- len1 = strlen(str1);
- if (len1 == 0)
- return str2;
- add_colon = (str1[len1 - 1] != ':');
- if (str2)
- {
- len2 = strlen(str2);
- if ((cp = realloc(str2, (unsigned) len1 + len2 + add_colon + 1)) == NULL)
- Panic(0, strnomem);
- bcopy(cp, cp + len1 + add_colon, len2 + 1);
- }
- else
- {
- if (len1 == 0)
- return 0;
- if ((cp = malloc((unsigned) len1 + add_colon + 1)) == NULL)
- Panic(0, strnomem);
- cp[len1 + add_colon] = '\0';
- }
- bcopy(str1, cp, len1);
- if (add_colon)
- cp[len1] = ':';
-
- return cp;
-}
-
-static char *
-findrcfile(rcfile)
-char *rcfile;
-{
- char buf[256];
- char *p;
-
- if (rcfile)
- {
- char *rcend = rindex(rc_name, '/');
- if (*rcfile != '/' && rcend && (rcend - rc_name) + strlen(rcfile) + 2 < sizeof(buf))
- {
- strncpy(buf, rc_name, rcend - rc_name + 1);
- strcpy(buf + (rcend - rc_name) + 1, rcfile);
- if (access(buf, R_OK) == 0)
- return SaveStr(buf);
- }
- debug1("findrcfile: you specified '%s'\n", rcfile);
- return SaveStr(rcfile);
- }
- debug("findrcfile: you specified nothing...\n");
- if ((p = getenv("SCREENRC")) != NULL && *p != '\0')
- {
- debug1(" $SCREENRC has: '%s'\n", p);
- return SaveStr(p);
- }
- else
- {
- debug(" ...nothing in $SCREENRC, defaulting $HOME/.screenrc\n");
- if (strlen(home) > sizeof(buf) - 12)
- Panic(0, "Rc: home too large");
- sprintf(buf, "%s/.screenrc", home);
- return SaveStr(buf);
- }
-}
-
-/*
- * this will be called twice:
- * 1) rcfilename = "/etc/screenrc"
- * 2) rcfilename = RcFileName
- */
-void
-StartRc(rcfilename)
-char *rcfilename;
-{
- register int argc, len;
- register char *p, *cp;
- char buf[2048];
- char *args[MAXARGS];
- int argl[MAXARGS];
- FILE *fp;
- char *oldrc_name = rc_name;
-
- /* always fix termcap/info capabilities */
- extra_incap = CatExtra("TF", extra_incap);
-
- /* Special settings for vt100 and others */
- if (display && (!strncmp(D_termname, "vt", 2) || !strncmp(D_termname, "xterm", 5)))
- extra_incap = CatExtra("xn:f0=\033Op:f1=\033Oq:f2=\033Or:f3=\033Os:f4=\033Ot:f5=\033Ou:f6=\033Ov:f7=\033Ow:f8=\033Ox:f9=\033Oy:f.=\033On:f,=\033Ol:fe=\033OM:f+=\033Ok:f-=\033Om:f*=\033Oj:f/=\033Oo:fq=\033OX", extra_incap);
-
- rc_name = findrcfile(rcfilename);
-
- if ((fp = secfopen(rc_name, "r")) == NULL)
- {
- if (!rc_recursion && RcFileName && !strcmp(RcFileName, rc_name))
- {
- /*
- * User explicitly gave us that name,
- * this is the only case, where we get angry, if we can't read
- * the file.
- */
- debug3("StartRc: '%s','%s', '%s'\n", RcFileName, rc_name, rcfilename);
- Panic(0, "Unable to open \"%s\".", rc_name);
- /* NOTREACHED */
- }
- debug1("StartRc: '%s' no good. ignored\n", rc_name);
- Free(rc_name);
- rc_name = oldrc_name;
- return;
- }
- while (fgets(buf, sizeof buf, fp) != NULL)
- {
- if ((p = rindex(buf, '\n')) != NULL)
- *p = '\0';
- if ((argc = Parse(buf, sizeof buf, args, argl)) == 0)
- continue;
- if (strcmp(args[0], "echo") == 0)
- {
- if (!display)
- continue;
- if (argc < 2 || (argc == 3 && strcmp(args[1], "-n")) || argc > 3)
- {
- Msg(0, "%s: 'echo [-n] \"string\"' expected.", rc_name);
- continue;
- }
- AddStr(args[argc - 1]);
- if (argc != 3)
- {
- AddStr("\r\n");
- Flush();
- }
- }
- else if (strcmp(args[0], "sleep") == 0)
- {
- if (!display)
- continue;
- debug("sleeeeeeep\n");
- if (argc != 2)
- {
- Msg(0, "%s: sleep: one numeric argument expected.", rc_name);
- continue;
- }
- DisplaySleep1000(1000 * atoi(args[1]), 1);
- }
-#ifdef TERMINFO
- else if (!strcmp(args[0], "termcapinfo") || !strcmp(args[0], "terminfo"))
-#else
- else if (!strcmp(args[0], "termcapinfo") || !strcmp(args[0], "termcap"))
-#endif
- {
- if (!display)
- continue;
- if (argc < 3 || argc > 4)
- {
- Msg(0, "%s: %s: incorrect number of arguments.", rc_name, args[0]);
- continue;
- }
- for (p = args[1]; p && *p; p = cp)
- {
- if ((cp = index(p, '|')) != 0)
- *cp++ = '\0';
- len = strlen(p);
- if (p[len - 1] == '*')
- {
- if (!(len - 1) || !strncmp(p, D_termname, len - 1))
- break;
- }
- else if (!strcmp(p, D_termname))
- break;
- }
- if (!(p && *p))
- continue;
- extra_incap = CatExtra(args[2], extra_incap);
- if (argc == 4)
- extra_outcap = CatExtra(args[3], extra_outcap);
- }
- else if (!strcmp(args[0], "source"))
- {
- if (rc_recursion <= 10)
- {
- rc_recursion++;
- StartRc(args[1]);
- rc_recursion--;
- }
- }
- }
- fclose(fp);
- Free(rc_name);
- rc_name = oldrc_name;
-}
-
-void
-FinishRc(rcfilename)
-char *rcfilename;
-{
- char buf[2048];
- FILE *fp;
- char *oldrc_name = rc_name;
-
- rc_name = findrcfile(rcfilename);
-
- if ((fp = secfopen(rc_name, "r")) == NULL)
- {
- if (rc_recursion)
- Msg(errno, "%s: source %s", oldrc_name, rc_name);
- else if (RcFileName && !strcmp(RcFileName, rc_name))
- {
- /*
- * User explicitly gave us that name,
- * this is the only case, where we get angry, if we can't read
- * the file.
- */
- debug3("FinishRc:'%s','%s','%s'\n", RcFileName, rc_name, rcfilename);
- Panic(0, "Unable to open \"%s\".", rc_name);
- /* NOTREACHED */
- }
- debug1("FinishRc: '%s' no good. ignored\n", rc_name);
- Free(rc_name);
- rc_name = oldrc_name;
- return;
- }
-
- debug("finishrc is going...\n");
- while (fgets(buf, sizeof buf, fp) != NULL)
- RcLine(buf, sizeof buf);
- (void) fclose(fp);
- Free(rc_name);
- rc_name = oldrc_name;
-}
-
-void
-do_source(rcfilename)
-char *rcfilename;
-{
- if (rc_recursion > 10)
- {
- Msg(0, "%s: source: recursion limit reached", rc_name);
- return;
- }
- rc_recursion++;
- FinishRc(rcfilename);
- rc_recursion--;
-}
-
-
-/*
- * Running a Command Line in the environment determined by the display.
- * The fore window is taken from the display as well as the user.
- * This is bad when we run detached.
- */
-void
-RcLine(ubuf, ubufl)
-char *ubuf;
-int ubufl;
-{
- char *args[MAXARGS];
- int argl[MAXARGS];
-#ifdef MULTIUSER
- extern struct acluser *EffectiveAclUser; /* acl.c */
- extern struct acluser *users; /* acl.c */
-#endif
-
- if (display)
- {
- fore = D_fore;
- flayer = D_forecv->c_layer;
- }
- else
- flayer = fore ? fore->w_savelayer : 0;
- if (Parse(ubuf, ubufl, args, argl) <= 0)
- return;
-#ifdef MULTIUSER
- if (!display)
- {
- /* the session owner does it, when there is no display here */
- EffectiveAclUser = users;
- debug("RcLine: WARNING, no display no user! Session owner executes command\n");
- }
-#endif
- DoCommand(args, argl);
-#ifdef MULTIUSER
- EffectiveAclUser = 0;
-#endif
-}
-
-/*
- * needs display for copybuffer access and termcap dumping
- */
-void
-WriteFile(user, fn, dump)
-struct acluser *user;
-char *fn;
-int dump;
-{
- /* dump==0: create .termcap,
- * dump==1: hardcopy,
- * #ifdef COPY_PASTE
- * dump==2: BUFFERFILE
- * #endif COPY_PASTE
- * dump==1: scrollback,
- */
- register int i, j, k;
- register char *p;
- register FILE *f;
- char fnbuf[1024];
- char *mode = "w";
-#ifdef COPY_PASTE
- int public = 0;
-# ifdef _MODE_T
- mode_t old_umask;
-# else
- int old_umask;
-# endif
-# ifdef HAVE_LSTAT
- struct stat stb, stb2;
- int fd, exists = 0;
-# endif
-#endif
-
- switch (dump)
- {
- case DUMP_TERMCAP:
- if (fn == 0)
- {
- i = SockName - SockPath;
- if (i > (int)sizeof(fnbuf) - 9)
- i = 0;
- strncpy(fnbuf, SockPath, i);
- strcpy(fnbuf + i, ".termcap");
- fn = fnbuf;
- }
- break;
- case DUMP_HARDCOPY:
- case DUMP_SCROLLBACK:
- if (fn == 0)
- {
- if (fore == 0)
- return;
- if (hardcopydir && *hardcopydir && strlen(hardcopydir) < sizeof(fnbuf) - 21)
- sprintf(fnbuf, "%s/hardcopy.%d", hardcopydir, fore->w_number);
- else
- sprintf(fnbuf, "hardcopy.%d", fore->w_number);
- fn = fnbuf;
- }
- if (hardcopy_append && !access(fn, W_OK))
- mode = "a";
- break;
-#ifdef COPY_PASTE
- case DUMP_EXCHANGE:
- if (fn == 0)
- {
- strncpy(fnbuf, BufferFile, sizeof(fnbuf) - 1);
- fnbuf[sizeof(fnbuf) - 1] = 0;
- fn = fnbuf;
- }
- public = !strcmp(fn, DEFAULT_BUFFERFILE);
-# ifdef HAVE_LSTAT
- exists = !lstat(fn, &stb);
- if (public && exists && (S_ISLNK(stb.st_mode) || stb.st_nlink > 1))
- {
- Msg(0, "No write to links, please.");
- return;
- }
-# endif
- break;
-#endif
- }
-
- debug2("WriteFile(%d) %s\n", dump, fn);
- if (UserContext() > 0)
- {
- debug("Writefile: usercontext\n");
-#ifdef COPY_PASTE
- if (dump == DUMP_EXCHANGE && public)
- {
- old_umask = umask(0);
-# ifdef HAVE_LSTAT
- if (exists)
- {
- if ((fd = open(fn, O_WRONLY, 0666)) >= 0)
- {
- if (fstat(fd, &stb2) == 0 && stb.st_dev == stb2.st_dev && stb.st_ino == stb2.st_ino)
- ftruncate(fd, 0);
- else
- {
- close(fd);
- fd = -1;
- }
- }
- }
- else
- fd = open(fn, O_WRONLY|O_CREAT|O_EXCL, 0666);
- f = fd >= 0 ? fdopen(fd, mode) : 0;
-# else
- f = fopen(fn, mode);
-# endif
- umask(old_umask);
- }
- else
-#endif /* COPY_PASTE */
- f = fopen(fn, mode);
- if (f == NULL)
- {
- debug2("WriteFile: fopen(%s,\"%s\") failed\n", fn, mode);
- UserReturn(0);
- }
- else
- {
- switch (dump)
- {
- case DUMP_HARDCOPY:
- case DUMP_SCROLLBACK:
- if (!fore)
- break;
- if (*mode == 'a')
- {
- putc('>', f);
- for (j = fore->w_width - 2; j > 0; j--)
- putc('=', f);
- fputs("<\n", f);
- }
- if (dump == DUMP_SCROLLBACK)
- {
- for (i = 0; i < fore->w_histheight; i++)
- {
- p = (char *)(WIN(i)->image);
- for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--)
- ;
- for (j = 0; j <= k; j++)
- putc(p[j], f);
- putc('\n', f);
- }
- }
- for (i = 0; i < fore->w_height; i++)
- {
- p = (char *)fore->w_mlines[i].image;
- for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--)
- ;
- for (j = 0; j <= k; j++)
- putc(p[j], f);
- putc('\n', f);
- }
- break;
- case DUMP_TERMCAP:
- if ((p = index(MakeTermcap(fore->w_aflag), '=')) != NULL)
- {
- fputs(++p, f);
- putc('\n', f);
- }
- break;
-#ifdef COPY_PASTE
- case DUMP_EXCHANGE:
- p = user->u_plop.buf;
- for (i = user->u_plop.len; i-- > 0; p++)
- if (*p == '\r' && (i == 0 || p[1] != '\n'))
- putc('\n', f);
- else
- putc(*p, f);
- break;
-#endif
- }
- (void) fclose(f);
- UserReturn(1);
- }
- }
- if (UserStatus() <= 0)
- Msg(0, "Cannot open \"%s\"", fn);
- else if (display && !*rc_name)
- {
- switch (dump)
- {
- case DUMP_TERMCAP:
- Msg(0, "Termcap entry written to \"%s\".", fn);
- break;
- case DUMP_HARDCOPY:
- case DUMP_SCROLLBACK:
- Msg(0, "Screen image %s to \"%s\".",
- (*mode == 'a') ? "appended" : "written", fn);
- break;
-#ifdef COPY_PASTE
- case DUMP_EXCHANGE:
- Msg(0, "Copybuffer written to \"%s\".", fn);
-#endif
- }
- }
-}
-
-#ifdef COPY_PASTE
-
-/*
- * returns an allocated buffer which holds a copy of the file named fn.
- * lenp (if nonzero) points to a location, where the buffer size should be
- * stored.
- */
-char *
-ReadFile(fn, lenp)
-char *fn;
-int *lenp;
-{
- int i, l, size;
- char c, *bp, *buf;
- struct stat stb;
-
- ASSERT(lenp);
- debug1("ReadFile(%s)\n", fn);
- if ((i = secopen(fn, O_RDONLY, 0)) < 0)
- {
- Msg(errno, "no %s -- no slurp", fn);
- return NULL;
- }
- if (fstat(i, &stb))
- {
- Msg(errno, "no good %s -- no slurp", fn);
- close(i);
- return NULL;
- }
- size = stb.st_size;
- if ((buf = malloc(size)) == NULL)
- {
- close(i);
- Msg(0, strnomem);
- return NULL;
- }
- errno = 0;
- if ((l = read(i, buf, size)) != size)
- {
- if (l < 0)
- l = 0;
- Msg(errno, "Got only %d bytes from %s", l, fn);
- close(i);
- }
- else
- {
- if (read(i, &c, 1) > 0)
- Msg(0, "Slurped only %d characters (of %d) into buffer - try again",
- l, size);
- else
- Msg(0, "Slurped %d characters into buffer", l);
- }
- close(i);
- *lenp = l;
- for (bp = buf; l-- > 0; bp++)
- if (*bp == '\n' && (bp == buf || bp[-1] != '\r'))
- *bp = '\r';
- return buf;
-}
-
-void
-KillBuffers()
-{
- if (UserContext() > 0)
- UserReturn(unlink(BufferFile) ? errno : 0);
- errno = UserStatus();
- Msg(errno, "%s %sremoved", BufferFile, errno ? "not " : "");
-}
-#endif /* COPY_PASTE */
-
-
-/*
- * (Almost) secure open and fopen...
- */
-
-FILE *
-secfopen(name, mode)
-char *name;
-char *mode;
-{
- FILE *fi;
-#ifndef USE_SETEUID
- int flags, fd;
-#endif
-
- debug2("secfopen(%s, %s)\n", name, mode);
-#ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
- fi = fopen(name, mode);
- xseteuid(eff_uid);
- xsetegid(eff_gid);
- return fi;
-#else
- if (eff_uid == real_uid)
- return fopen(name, mode);
- if (mode[0] && mode[1] == '+')
- flags = O_RDWR;
- else
- flags = (mode[0] == 'r') ? O_RDONLY : O_WRONLY;
- if (mode[0] == 'w')
- flags |= O_CREAT | O_TRUNC;
- else if (mode[0] == 'a')
- flags |= O_CREAT | O_APPEND;
- else if (mode[0] != 'r')
- {
- errno = EINVAL;
- return 0;
- }
- if ((fd = secopen(name, flags, 0666)) < 0)
- return 0;
- if ((fi = fdopen(fd, mode)) == 0)
- {
- close(fd);
- return 0;
- }
- return fi;
-#endif
-}
-
-
-int
-secopen(name, flags, mode)
-char *name;
-int flags;
-int mode;
-{
- int fd;
-#ifndef USE_SETEUID
- int q;
- struct stat stb;
-#endif
-
- debug3("secopen(%s, 0x%x, 0%03o)\n", name, flags, mode);
-#ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
- fd = open(name, flags, mode);
- xseteuid(eff_uid);
- xsetegid(eff_gid);
- return fd;
-#else
- if (eff_uid == real_uid)
- return open(name, flags, mode);
- /* Truncation/creation is done in UserContext */
- if ((flags & O_TRUNC) || ((flags & O_CREAT) && access(name, F_OK)))
- {
- if (UserContext() > 0)
- {
- if ((fd = open(name, flags, mode)) >= 0)
- {
- close(fd);
- UserReturn(0);
- }
- if (errno == 0)
- errno = EACCES;
- UserReturn(errno);
- }
- if ((q = UserStatus()))
- {
- if (q > 0)
- errno = q;
- return -1;
- }
- }
- if (access(name, F_OK))
- return -1;
- if ((fd = open(name, flags & ~(O_TRUNC | O_CREAT), 0)) < 0)
- return -1;
- debug("open successful\n");
- if (fstat(fd, &stb))
- {
- close(fd);
- return -1;
- }
- debug("fstat successful\n");
- if (stb.st_uid != real_uid)
- {
- switch (flags & (O_RDONLY | O_WRONLY | O_RDWR))
- {
- case O_RDONLY:
- q = 0004;
- break;
- case O_WRONLY:
- q = 0002;
- break;
- default:
- q = 0006;
- break;
- }
- if ((stb.st_mode & q) != q)
- {
- debug1("secopen: permission denied (%03o)\n", stb.st_mode & 07777);
- close(fd);
- errno = EACCES;
- return -1;
- }
- }
- debug1("secopen ok - returning %d\n", fd);
- return fd;
-#endif
-}
-
-
-int
-printpipe(p, cmd)
-struct win *p;
-char *cmd;
-{
- int pi[2];
- if (pipe(pi))
- {
- WMsg(p, errno, "printing pipe");
- return -1;
- }
- switch (fork())
- {
- case -1:
- WMsg(p, errno, "printing fork");
- return -1;
- case 0:
- display = p->w_pdisplay;
- displays = 0;
-#ifdef DEBUG
- if (dfp && dfp != stderr)
- fclose(dfp);
-#endif
- close(0);
- dup(pi[0]);
- closeallfiles(0);
- if (setgid(real_gid) || setuid(real_uid))
- Panic(errno, "printpipe setuid");
-#ifdef SIGPIPE
- signal(SIGPIPE, SIG_DFL);
-#endif
- execl("/bin/sh", "sh", "-c", cmd, 0);
- Panic(errno, "/bin/sh");
- default:
- break;
- }
- close(pi[0]);
- return pi[1];
-}
-
-int
-readpipe(cmdv)
-char **cmdv;
-{
- int pi[2];
-
- if (pipe(pi))
- {
- Msg(errno, "pipe");
- return -1;
- }
- switch (fork())
- {
- case -1:
- Msg(errno, "fork");
- return -1;
- case 0:
- displays = 0;
-#ifdef DEBUG
- if (dfp && dfp != stderr)
- fclose(dfp);
-#endif
- close(1);
- if (dup(pi[1]) != 1)
- {
- close(pi[1]);
- Panic(0, "dup");
- }
- closeallfiles(1);
- if (setgid(real_gid) || setuid(real_uid))
- {
- close(1);
- Panic(errno, "setuid/setgid");
- }
-#ifdef SIGPIPE
- signal(SIGPIPE, SIG_DFL);
-#endif
- execvp(*cmdv, cmdv);
- close(1);
- Panic(errno, *cmdv);
- default:
- break;
- }
- close(pi[1]);
- return pi[0];
-}
diff --git a/src/help.c b/src/help.c
deleted file mode 100644
index 6df0c4e..0000000
--- a/src/help.c
+++ /dev/null
@@ -1,1628 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-
-#include "screen.h"
-#include "extern.h"
-
-char version[40]; /* initialised by main() */
-
-extern struct layer *flayer;
-extern struct display *display, *displays;
-extern struct win *windows;
-extern char *noargs[];
-extern struct mchar mchar_blank, mchar_so;
-extern unsigned char *blank;
-extern struct win *wtab[];
-
-static void PadStr __P((char *, int, int, int));
-
-extern char *wliststr;
-extern char *wlisttit;
-
-void
-exit_with_usage(myname, message, arg)
-char *myname, *message, *arg;
-{
- printf("Use: %s [-opts] [cmd [args]]\n", myname);
- printf(" or: %s -r [host.tty]\n\nOptions:\n", myname);
- printf("-a Force all capabilities into each window's termcap.\n");
- printf("-A -[r|R] Adapt all windows to the new display width & height.\n");
- printf("-c file Read configuration file instead of '.screenrc'.\n");
-#ifdef REMOTE_DETACH
- printf("-d (-r) Detach the elsewhere running screen (and reattach here).\n");
- printf("-dmS name Start as daemon: Screen session in detached mode.\n");
- printf("-D (-r) Detach and logout remote (and reattach here).\n");
- printf("-D -RR Do whatever is needed to get a screen session.\n");
-#endif
- printf("-e xy Change command characters.\n");
- printf("-f Flow control on, -fn = off, -fa = auto.\n");
- printf("-h lines Set the size of the scrollback history buffer.\n");
- printf("-i Interrupt output sooner when flow control is on.\n");
-#if defined(LOGOUTOK) && defined(UTMPOK)
- printf("-l Login mode on (update %s), -ln = off.\n", UTMPFILE);
-#endif
- printf("-list or -ls. Do nothing, just list our SockDir.\n");
- printf("-L Turn on output logging.\n");
- printf("-m ignore $STY variable, do create a new screen session.\n");
- printf("-O Choose optimal output rather than exact vt100 emulation.\n");
- printf("-p window Preselect the named window if it exists.\n");
- printf("-q Quiet startup. Exits with non-zero return code if unsuccessful.\n");
- printf("-r Reattach to a detached screen process.\n");
- printf("-R Reattach if possible, otherwise start a new session.\n");
- printf("-s shell Shell to execute rather than $SHELL.\n");
- printf("-S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>.\n");
- printf("-t title Set title. (window's name).\n");
- printf("-T term Use term as $TERM for windows, rather than \"screen\".\n");
-#ifdef UTF8
- printf("-U Tell screen to use UTF-8 encoding.\n");
-#endif
- printf("-v Print \"Screen version %s\".\n", version);
- printf("-wipe Do nothing, just clean up SockDir.\n");
-#ifdef MULTI
- printf("-x Attach to a not detached screen. (Multi display mode).\n");
-#endif /* MULTI */
- printf("-X Execute <cmd> as a screen command in the specified session.\n");
- if (message && *message)
- {
- printf("\nError: ");
- printf(message, arg);
- printf("\n");
- }
- exit(1);
-}
-
-/*
-** Here come the help page routines
-*/
-
-extern struct comm comms[];
-extern struct action ktab[];
-
-static void HelpProcess __P((char **, int *));
-static void HelpAbort __P((void));
-static void HelpRedisplayLine __P((int, int, int, int));
-static void add_key_to_buf __P((char *, int));
-static void AddAction __P((struct action *, int, int));
-static int helppage __P((void));
-
-struct helpdata
-{
- char *class;
- struct action *ktabp;
- int maxrow, grow, numcols, numrows, num_names;
- int numskip, numpages;
- int command_search, command_bindings;
- int refgrow, refcommand_search;
- int inter, mcom, mkey;
- int nact[RC_LAST + 1];
-};
-
-#define MAXKLEN 256
-
-static struct LayFuncs HelpLf =
-{
- HelpProcess,
- HelpAbort,
- HelpRedisplayLine,
- DefClearLine,
- DefRewrite,
- DefResize,
- DefRestore
-};
-
-
-void
-display_help(class, ktabp)
-char *class;
-struct action *ktabp;
-{
- int i, n, key, mcom, mkey, l;
- struct helpdata *helpdata;
- int used[RC_LAST + 1];
-
- if (flayer->l_height < 6)
- {
- LMsg(0, "Window height too small for help page");
- return;
- }
- if (InitOverlayPage(sizeof(*helpdata), &HelpLf, 0))
- return;
-
- helpdata = (struct helpdata *)flayer->l_data;
- helpdata->class = class;
- helpdata->ktabp = ktabp;
- helpdata->num_names = helpdata->command_bindings = 0;
- helpdata->command_search = 0;
- for (n = 0; n <= RC_LAST; n++)
- used[n] = 0;
- mcom = 0;
- mkey = 0;
- for (key = 0; key < 256; key++)
- {
- n = ktabp[key].nr;
- if (n == RC_ILLEGAL)
- continue;
- if (ktabp[key].args == noargs)
- {
- used[n] += (key <= ' ' || key == 0x7f) ? 3 :
- (key > 0x7f) ? 5 : 2;
- }
- else
- helpdata->command_bindings++;
- }
- for (n = i = 0; n <= RC_LAST; n++)
- if (used[n])
- {
- l = strlen(comms[n].name);
- if (l > mcom)
- mcom = l;
- if (used[n] > mkey)
- mkey = used[n];
- helpdata->nact[i++] = n;
- }
- debug1("help: %d commands bound to keys with no arguments\n", i);
- debug2("mcom: %d mkey: %d\n", mcom, mkey);
- helpdata->num_names = i;
-
- if (mkey > MAXKLEN)
- mkey = MAXKLEN;
- helpdata->numcols = flayer->l_width / (mcom + mkey + 1);
- if (helpdata->numcols == 0)
- {
- HelpAbort();
- LMsg(0, "Width too small");
- return;
- }
- helpdata->inter = (flayer->l_width - (mcom + mkey) * helpdata->numcols) / (helpdata->numcols + 1);
- if (helpdata->inter <= 0)
- helpdata->inter = 1;
- debug1("inter: %d\n", helpdata->inter);
- helpdata->mcom = mcom;
- helpdata->mkey = mkey;
- helpdata->numrows = (helpdata->num_names + helpdata->numcols - 1) / helpdata->numcols;
- debug1("Numrows: %d\n", helpdata->numrows);
- helpdata->numskip = flayer->l_height-5 - (2 + helpdata->numrows);
- while (helpdata->numskip < 0)
- helpdata->numskip += flayer->l_height-5;
- helpdata->numskip %= flayer->l_height-5;
- debug1("Numskip: %d\n", helpdata->numskip);
- if (helpdata->numskip > flayer->l_height/3 || helpdata->numskip > helpdata->command_bindings)
- helpdata->numskip = 1;
- helpdata->maxrow = 2 + helpdata->numrows + helpdata->numskip + helpdata->command_bindings;
- helpdata->grow = 0;
-
- helpdata->numpages = (helpdata->maxrow + flayer->l_height-6) / (flayer->l_height-5);
- flayer->l_x = 0;
- flayer->l_y = flayer->l_height - 1;
- helppage();
-}
-
-static void
-HelpProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int done = 0;
-
- while (!done && *plen > 0)
- {
- switch (**ppbuf)
- {
- case ' ':
- if (helppage() == 0)
- break;
- /* FALLTHROUGH */
- case '\r':
- case '\n':
- done = 1;
- break;
- default:
- break;
- }
- ++*ppbuf;
- --*plen;
- }
- if (done)
- HelpAbort();
-}
-
-static void
-HelpAbort()
-{
- LAY_CALL_UP(LRefreshAll(flayer, 0));
- ExitOverlayPage();
-}
-
-
-static int
-helppage()
-{
- struct helpdata *helpdata;
- int col, crow, n, key, x;
- char buf[MAXKLEN], Esc_buf[5], cbuf[256];
- struct action *ktabp;
-
- helpdata = (struct helpdata *)flayer->l_data;
-
- ktabp = helpdata->ktabp;
- if (helpdata->grow >= helpdata->maxrow)
- return -1;
- helpdata->refgrow = helpdata->grow;
- helpdata->refcommand_search = helpdata->command_search;
-
- /* Clear the help screen */
- LClearAll(flayer, 0);
-
- sprintf(cbuf,"Screen key bindings, page %d of %d.", helpdata->grow / (flayer->l_height-5) + 1, helpdata->numpages);
- centerline(cbuf, 0);
- crow = 2;
-
- *Esc_buf = '\0';
- *buf = '\0';
- /* XXX fix escape character */
- if (flayer->l_cvlist && flayer->l_cvlist->c_display)
- {
- add_key_to_buf(buf, flayer->l_cvlist->c_display->d_user->u_MetaEsc);
- add_key_to_buf(Esc_buf, flayer->l_cvlist->c_display->d_user->u_Esc);
- }
- else
- {
- strcpy(Esc_buf, "??");
- strcpy(buf, "??");
- }
-
- for (; crow < flayer->l_height - 3; crow++)
- {
- if (helpdata->grow < 1)
- {
- if (ktabp == ktab)
- sprintf(cbuf,"Command key: %s Literal %s: %s", Esc_buf, Esc_buf, buf);
- else
- sprintf(cbuf,"Command class: '%.80s'", helpdata->class);
- centerline(cbuf, crow);
- helpdata->grow++;
- }
- else if (helpdata->grow >= 2 && helpdata->grow-2 < helpdata->numrows)
- {
- x = 0;
- for (col = 0; col < helpdata->numcols && (n = helpdata->numrows * col + (helpdata->grow-2)) < helpdata->num_names; col++)
- {
- x += helpdata->inter - !col;
- n = helpdata->nact[n];
- buf[0] = '\0';
- for (key = 0; key < 256; key++)
- if (ktabp[key].nr == n && ktabp[key].args == noargs && strlen(buf) < sizeof(buf) - 7)
- {
- strcat(buf, " ");
- add_key_to_buf(buf, key);
- }
- PadStr(comms[n].name, helpdata->mcom, x, crow);
- x += helpdata->mcom;
- PadStr(buf, helpdata->mkey, x, crow);
- x += helpdata->mkey;
- }
- helpdata->grow++;
- }
- else if (helpdata->grow-2-helpdata->numrows >= helpdata->numskip
- && helpdata->grow-2-helpdata->numrows-helpdata->numskip < helpdata->command_bindings)
- {
- while ((n = ktabp[helpdata->command_search].nr) == RC_ILLEGAL
- || ktabp[helpdata->command_search].args == noargs)
- {
- if (++helpdata->command_search >= 256)
- return -1;
- }
- buf[0] = '\0';
- add_key_to_buf(buf, helpdata->command_search);
- PadStr(buf, 4, 0, crow);
- AddAction(&ktabp[helpdata->command_search++], 4, crow);
- helpdata->grow++;
- }
- else
- helpdata->grow++;
- }
- sprintf(cbuf,"[Press Space %s Return to end.]",
- helpdata->grow < helpdata->maxrow ? "for next page;" : "or");
- centerline(cbuf, flayer->l_height - 2);
- LaySetCursor();
- return 0;
-}
-
-static void
-AddAction(act, x, y)
-struct action *act;
-int x, y;
-{
- char buf[256];
- int del, l;
- char *bp, *cp, **pp;
- int *lp, ll;
- int fr;
- struct mchar mchar_dol;
-
- mchar_dol = mchar_blank;
- mchar_dol.image = '$';
-
- fr = flayer->l_width - 1 - x;
- if (fr <= 0)
- return;
- l = strlen(comms[act->nr].name);
-
- if (l + 1 > fr)
- l = fr - 1;
- PadStr(comms[act->nr].name, l, x, y);
- x += l;
- fr -= l + 1;
- LPutChar(flayer, fr ? &mchar_blank : &mchar_dol, x++, y);
-
- pp = act->args;
- lp = act->argl;
- while (pp && (cp = *pp) != NULL)
- {
- del = 0;
- bp = buf;
- ll = *lp++;
- if (!ll || (index(cp, ' ') != NULL))
- {
- if (index(cp, '\'') != NULL)
- *bp++ = del = '"';
- else
- *bp++ = del = '\'';
- }
- while (ll-- && bp < buf + 250)
- bp += AddXChar(bp, *(unsigned char *)cp++);
- if (del)
- *bp++ = del;
- *bp = 0;
- if ((fr -= (bp - buf) + 1) < 0)
- {
- fr += bp - buf;
- if (fr > 0)
- PadStr(buf, fr, x, y);
- if (fr == 0)
- LPutChar(flayer, &mchar_dol, x, y);
- return;
- }
- PadStr(buf, strlen(buf), x, y);
- x += strlen(buf);
- pp++;
- if (*pp)
- LPutChar(flayer, fr ? &mchar_blank : &mchar_dol, x++, y);
- }
-}
-
-static void
-add_key_to_buf(buf, key)
-char *buf;
-int key;
-{
- buf += strlen(buf);
- if (key < 0)
- strcpy(buf, "unset");
- else if (key == ' ')
- strcpy(buf, "sp");
- else
- buf[AddXChar(buf, key)] = 0;
-}
-
-
-static void
-HelpRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- if (y < 0)
- {
- struct helpdata *helpdata;
-
- helpdata = (struct helpdata *)flayer->l_data;
- helpdata->grow = helpdata->refgrow;
- helpdata->command_search = helpdata->refcommand_search;
- helppage();
- return;
- }
- if (y != 0 && y != flayer->l_height - 1)
- return;
- if (!isblank)
- LClearArea(flayer, xs, y, xe, y, 0, 0);
-}
-
-
-/*
-**
-** here is all the copyright stuff
-**
-*/
-
-static void CopyrightProcess __P((char **, int *));
-static void CopyrightRedisplayLine __P((int, int, int, int));
-static void CopyrightAbort __P((void));
-static void copypage __P((void));
-
-struct copydata
-{
- char *cps, *savedcps; /* position in the message */
- char *refcps, *refsavedcps; /* backup for redisplaying */
-};
-
-static struct LayFuncs CopyrightLf =
-{
- CopyrightProcess,
- CopyrightAbort,
- CopyrightRedisplayLine,
- DefClearLine,
- DefRewrite,
- DefResize,
- DefRestore
-};
-
-static const char cpmsg[] = "\
-\n\
-Screen version %v\n\
-\n\
-Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder\n\
-Copyright (c) 1987 Oliver Laumann\n\
-\n\
-This program is free software; you can redistribute it and/or \
-modify it under the terms of the GNU General Public License as published \
-by the Free Software Foundation; either version 2, or (at your option) \
-any later version.\n\
-\n\
-This program is distributed in the hope that it will be useful, \
-but WITHOUT ANY WARRANTY; without even the implied warranty of \
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \
-GNU General Public License for more details.\n\
-\n\
-You should have received a copy of the GNU General Public License \
-along with this program (see the file COPYING); if not, write to the \
-Free Software Foundation, Inc., \
-59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\
-\n\
-Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to \
-screen@uni-erlangen.de\n";
-
-
-static void
-CopyrightProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int done = 0;
- struct copydata *copydata;
-
- copydata = (struct copydata *)flayer->l_data;
- while (!done && *plen > 0)
- {
- switch (**ppbuf)
- {
- case ' ':
- if (*copydata->cps)
- {
- copypage();
- break;
- }
- /* FALLTHROUGH */
- case '\r':
- case '\n':
- CopyrightAbort();
- done = 1;
- break;
- default:
- break;
- }
- ++*ppbuf;
- --*plen;
- }
-}
-
-static void
-CopyrightAbort()
-{
- LAY_CALL_UP(LRefreshAll(flayer, 0));
- ExitOverlayPage();
-}
-
-void
-display_copyright()
-{
- struct copydata *copydata;
-
- if (flayer->l_width < 10 || flayer->l_height < 5)
- {
- LMsg(0, "Window size too small for copyright page");
- return;
- }
- if (InitOverlayPage(sizeof(*copydata), &CopyrightLf, 0))
- return;
- copydata = (struct copydata *)flayer->l_data;
- copydata->cps = (char *)cpmsg;
- copydata->savedcps = 0;
- flayer->l_x = 0;
- flayer->l_y = flayer->l_height - 1;
- copypage();
-}
-
-static void
-copypage()
-{
- register char *cps;
- char *ws;
- int x, y, l;
- char cbuf[80];
- struct copydata *copydata;
-
- ASSERT(flayer);
- copydata = (struct copydata *)flayer->l_data;
-
- LClearAll(flayer, 0);
- x = y = 0;
- cps = copydata->cps;
- copydata->refcps = cps;
- copydata->refsavedcps = copydata->savedcps;
- while (*cps && y < flayer->l_height - 3)
- {
- ws = cps;
- while (*cps == ' ')
- cps++;
- if (strncmp(cps, "%v", 2) == 0)
- {
- copydata->savedcps = cps + 2;
- cps = version;
- continue;
- }
- while (*cps && *cps != ' ' && *cps != '\n')
- cps++;
- l = cps - ws;
- cps = ws;
- if (l > flayer->l_width - 1)
- l = flayer->l_width - 1;
- if (x && x + l >= flayer->l_width - 2)
- {
- x = 0;
- y++;
- continue;
- }
- if (x)
- {
- LPutChar(flayer, &mchar_blank, x, y);
- x++;
- }
- if (l)
- LPutStr(flayer, ws, l, &mchar_blank, x, y);
- x += l;
- cps += l;
- if (*cps == 0 && copydata->savedcps)
- {
- cps = copydata->savedcps;
- copydata->savedcps = 0;
- }
- if (*cps == '\n')
- {
- x = 0;
- y++;
- }
- if (*cps == ' ' || *cps == '\n')
- cps++;
- }
- while (*cps == '\n')
- cps++;
- sprintf(cbuf,"[Press Space %s Return to end.]",
- *cps ? "for next page;" : "or");
- centerline(cbuf, flayer->l_height - 2);
- copydata->cps = cps;
- LaySetCursor();
-}
-
-static void
-CopyrightRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- ASSERT(flayer);
- if (y < 0)
- {
- struct copydata *copydata;
-
- copydata = (struct copydata *)flayer->l_data;
- copydata->cps = copydata->refcps;
- copydata->savedcps = copydata->refsavedcps;
- copypage();
- return;
- }
- if (y != 0 && y != flayer->l_height - 1)
- return;
- if (isblank)
- return;
- LClearArea(flayer, xs, y, xe, y, 0, 0);
-}
-
-
-
-/*
-**
-** here is all the displays stuff
-**
-*/
-
-#ifdef MULTI
-
-static void DisplaysProcess __P((char **, int *));
-static void DisplaysRedisplayLine __P((int, int, int, int));
-static void displayspage __P((void));
-
-struct displaysdata
-{
- int dummy_element_for_solaris;
-};
-
-static struct LayFuncs DisplaysLf =
-{
- DisplaysProcess,
- HelpAbort,
- DisplaysRedisplayLine,
- DefClearLine,
- DefRewrite,
- DefResize,
- DefRestore
-};
-
-static void
-DisplaysProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int done = 0;
-
- ASSERT(flayer);
- while (!done && *plen > 0)
- {
- switch (**ppbuf)
- {
- case ' ':
- displayspage();
- break;
- case '\r':
- case '\n':
- HelpAbort();
- done = 1;
- break;
- default:
- break;
- }
- ++*ppbuf;
- --*plen;
- }
-}
-
-
-void
-display_displays()
-{
- if (flayer->l_width < 10 || flayer->l_height < 5)
- {
- LMsg(0, "Window size too small for displays page");
- return;
- }
- if (InitOverlayPage(sizeof(struct displaysdata), &DisplaysLf, 0))
- return;
- flayer->l_x = 0;
- flayer->l_y = flayer->l_height - 1;
- displayspage();
-}
-
-/*
- * layout of the displays page is as follows:
-
-xterm 80x42 jnweiger@/dev/ttyp4 0(m11) &rWx
-facit 80x24 nb mlschroe@/dev/ttyhf 11(tcsh) rwx
-xterm 80x42 jnhollma@/dev/ttyp5 0(m11) &R.x
-
- | | | | | | | | ¦___ window permissions
- | | | | | | | | (R. is locked r-only,
- | | | | | | | | W has wlock)
- | | | | | | | |___ Window is shared
- | | | | | | |___ Name/Title of window
- | | | | | |___ Number of window
- | | | | |___ Name of the display (the attached device)
- | | | |___ Username who is logged in at the display
- | | |___ Display is in nonblocking mode. Shows 'NB' if obuf is full.
- | |___ Displays geometry as width x height.
- |___ the terminal type known by screen for this display.
-
- */
-
-static void
-displayspage()
-{
- int y, l;
- char tbuf[80];
- struct display *d;
- struct win *w;
- static char *blockstates[5] = {"nb", "NB", "Z<", "Z>", "BL"};
-
- LClearAll(flayer, 0);
-
- leftline("term-type size user interface window", 0);
- leftline("---------- ------- ---------- ----------------- ----------", 1);
- y = 2;
-
- for (d = displays; d; d = d->d_next)
- {
- w = d->d_fore;
-
- if (y >= flayer->l_height - 3)
- break;
- sprintf(tbuf, "%-10.10s%4dx%-4d%10.10s@%-16.16s%s",
- d->d_termname, d->d_width, d->d_height, d->d_user->u_name,
- d->d_usertty,
- (d->d_blocked || d->d_nonblock >= 0) && d->d_blocked <= 4 ? blockstates[d->d_blocked] : " ");
-
- if (w)
- {
- l = 10 - strlen(w->w_title);
- if (l < 0)
- l = 0;
- sprintf(tbuf + strlen(tbuf), "%3d(%.10s)%*s%c%c%c%c",
- w->w_number, w->w_title, l, "",
- /* w->w_dlist->next */ 0 ? '&' : ' ',
- /*
- * The rwx triple:
- * -,r,R no read, read, read only due to foreign wlock
- * -,.,w,W no write, write suppressed by foreign wlock,
- * write, own wlock
- * -,x no execute, execute
- */
-#ifdef MULTIUSER
- (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' :
- ((w->w_wlock == WLOCK_OFF || d->d_user == w->w_wlockuser) ?
- 'r' : 'R')),
- (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' :
- ((w->w_wlock == WLOCK_OFF) ? 'w' :
- ((d->d_user == w->w_wlockuser) ? 'W' : 'v'))),
- (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' : 'x')
-#else
- 'r', 'w', 'x'
-#endif
- );
- }
- leftline(tbuf, y);
- y++;
- }
- sprintf(tbuf,"[Press Space %s Return to end.]",
- 1 ? "to refresh;" : "or");
- centerline(tbuf, flayer->l_height - 2);
- LaySetCursor();
-}
-
-static void
-DisplaysRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- ASSERT(flayer);
- if (y < 0)
- {
- displayspage();
- return;
- }
- if (y != 0 && y != flayer->l_height - 1)
- return;
- if (isblank)
- return;
- LClearArea(flayer, xs, y, xe, y, 0, 0);
- /* To be filled in... */
-}
-
-#endif /* MULTI */
-
-
-/*
-**
-** here is the windowlist
-**
-*/
-
-struct wlistdata;
-
-static void WListProcess __P((char **, int *));
-static void WListRedisplayLine __P((int, int, int, int));
-static void wlistpage __P((void));
-static void WListLine __P((int, int, int, int));
-static void WListLines __P((int, int));
-static void WListMove __P((int, int));
-static void WListUpdate __P((struct win *));
-static int WListNormalize __P((void));
-static int WListResize __P((int, int));
-static int WListNext __P((struct wlistdata *, int, int));
-
-struct wlistdata {
- int pos;
- int ypos;
- int npos;
- int numwin;
- int first;
- int last;
- int start;
- int order;
-};
-
-static struct LayFuncs WListLf =
-{
- WListProcess,
- HelpAbort,
- WListRedisplayLine,
- DefClearLine,
- DefRewrite,
- WListResize,
- DefRestore
-};
-
-static int
-WListResize(wi, he)
-int wi, he;
-{
- struct wlistdata *wlistdata;
- if (wi < 10 || he < 5)
- return -1;
- wlistdata = (struct wlistdata *)flayer->l_data;
- flayer->l_width = wi;
- flayer->l_height = he;
- wlistdata->numwin = he - 3;
- if (wlistdata->ypos >= wlistdata->numwin)
- wlistdata->ypos = wlistdata->numwin - 1;
- flayer->l_y = he - 1;
- return 0;
-}
-
-static void
-WListProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int done = 0;
- struct wlistdata *wlistdata;
- struct display *olddisplay = display;
- int h;
-
- ASSERT(flayer);
- wlistdata = (struct wlistdata *)flayer->l_data;
- h = wlistdata->numwin;
- while (!done && *plen > 0)
- {
- if ((unsigned char)**ppbuf >= '0' && (unsigned char)**ppbuf <= '9')
- {
- int n = (unsigned char)**ppbuf - '0';
- int d = 0;
- if (n < MAXWIN && wtab[n])
- {
- int i;
- for (d = -wlistdata->npos, i = WListNext(wlistdata, -1, 0); i != n; i = WListNext(wlistdata, i, 1), d++)
- ;
- }
- if (d)
- WListMove(d, -1);
- }
- switch ((unsigned char)**ppbuf)
- {
- case 0220: /* up */
- case 16: /* ^P like emacs */
- case 'k':
- WListMove(-1, -1);
- break;
- case 0216: /* down */
- case 14: /* ^N like emacs */
- case 'j':
- WListMove(1, -1);
- break;
- case '\025':
- WListMove(-(h / 2), wlistdata->ypos);
- break;
- case '\004':
- WListMove(h / 2, wlistdata->ypos);
- break;
- case 0002:
- case 'b':
- WListMove(-h, -1);
- break;
- case 0006:
- case 'f':
- WListMove(h, -1);
- break;
- case 0201: /* home */
- WListMove(-wlistdata->pos, -1);
- break;
- case 0205: /* end */
- WListMove(MAXWIN, -1);
- break;
- case '\r':
- case '\n':
- case ' ':
- done = 1;
- h = wlistdata->pos;
- if (!display || !wtab[h] || wtab[h] == D_fore || (flayer->l_cvlist && flayer->l_cvlist->c_lnext))
- HelpAbort();
-#ifdef MULTIUSER
- else if (AclCheckPermWin(D_user, ACL_READ, wtab[h]))
- HelpAbort();
-#endif
- else
- ExitOverlayPage(); /* no need to redisplay */
- /* restore display, don't switch wrong user */
- display = olddisplay;
- SwitchWindow(h);
- break;
- case 0033:
- case 0007:
- h = wlistdata->start;
- HelpAbort();
- display = olddisplay;
- if (h >= 0 && wtab[h])
- SwitchWindow(h);
- else if (h == -2)
- {
- struct win *p = FindNiceWindow(display ? D_other : (struct win *)0, 0);
- if (p)
- SwitchWindow(p->w_number);
- }
- done = 1;
- break;
- default:
- break;
- }
- ++*ppbuf;
- --*plen;
- }
-}
-
-static void
-WListLine(y, i, pos, isblank)
-int y, i;
-int pos;
-int isblank;
-{
- char *str;
- int n;
-
- display = 0;
- str = MakeWinMsgEv(wliststr, wtab[i], '%', flayer->l_width, (struct event *)0, 0);
- n = strlen(str);
- if (i != pos && isblank)
- while (n && str[n - 1] == ' ')
- n--;
- LPutWinMsg(flayer, str, (i == pos || !isblank) ? flayer->l_width : n, i == pos ? &mchar_so : &mchar_blank, 0, y + 2);
-#if 0
- LPutStr(flayer, str, n, i == pos ? &mchar_so : &mchar_blank, 0, y + 2);
- if (i == pos || !isblank)
- while(n < flayer->l_width)
- LPutChar(flayer, i == pos ? &mchar_so : &mchar_blank, n++, y + 2);
-#endif
- return;
-}
-
-static int
-WListNext(wlistdata, old, delta)
-struct wlistdata *wlistdata;
-int old, delta;
-{
- int i, j;
-
- if (old == MAXWIN)
- return MAXWIN;
- if (wlistdata->order == WLIST_NUM)
- {
- if (old == -1)
- {
- for (old = 0; old < MAXWIN; old++)
- if (wtab[old])
- break;
- if (old == MAXWIN)
- return old;
- }
- if (!wtab[old])
- return MAXWIN;
- i = old;
- while (delta > 0 && i < MAXWIN - 1)
- if (wtab[++i])
- {
- old = i;
- delta--;
- }
- while (delta < 0 && i > 0)
- if (wtab[--i])
- {
- old = i;
- delta++;
- }
- }
- else
- {
- if (old == -1)
- old = windows->w_number;
- if (!wtab[old])
- return MAXWIN;
- for (; delta > 0; delta--)
- if (wtab[old]->w_next)
- old = wtab[old]->w_next->w_number;
- if (delta < 0)
- {
- for (j = i = windows->w_number; j != old; )
- {
- if (delta++ >= 0 && wtab[i]->w_next)
- i = wtab[i]->w_next->w_number;
- if (wtab[j]->w_next)
- j = wtab[j]->w_next->w_number;
- }
- old = i;
- }
- }
- return old;
-}
-
-static void
-WListLines(up, oldpos)
-int up, oldpos;
-{
- struct wlistdata *wlistdata;
- int ypos, pos;
- int y, i, oldi;
-
- wlistdata = (struct wlistdata *)flayer->l_data;
- ypos = wlistdata->ypos;
- pos = wlistdata->pos;
-
- i = WListNext(wlistdata, pos, -ypos);
- for (y = 0; y < wlistdata->numwin; y++)
- {
- if (i == MAXWIN || !wtab[i])
- return;
- if (y == 0)
- wlistdata->first = i;
- wlistdata->last = i;
- if (((i == oldpos || i == pos) && pos != oldpos) || (up > 0 && y >= wlistdata->numwin - up) || (up < 0 && y < -up))
- WListLine(y, i, pos, i != oldpos);
- if (i == pos)
- wlistdata->ypos = y;
- oldi = i;
- i = WListNext(wlistdata, i, 1);
- if (i == MAXWIN || i == oldi)
- break;
- }
-}
-
-static int
-WListNormalize()
-{
- struct wlistdata *wlistdata;
- int i, oldi, n;
- int ypos, pos;
-
- wlistdata = (struct wlistdata *)flayer->l_data;
- ypos = wlistdata->ypos;
- pos = wlistdata->pos;
- if (ypos < 0)
- ypos = 0;
- if (ypos >= wlistdata->numwin)
- ypos = wlistdata->numwin - 1;
- for (n = 0, oldi = MAXWIN, i = pos; i != MAXWIN && i != oldi && n < wlistdata->numwin; oldi = i, i = WListNext(wlistdata, i, 1))
- n++;
- if (ypos < wlistdata->numwin - n)
- ypos = wlistdata->numwin - n;
- for (n = 0, oldi = MAXWIN, i = WListNext(wlistdata, -1, 0); i != MAXWIN && i != oldi && i != pos; oldi = i, i = WListNext(wlistdata, i, 1))
- n++;
- if (ypos > n)
- ypos = n;
- wlistdata->ypos = ypos;
- wlistdata->npos = n;
- return ypos;
-}
-
-static void
-WListMove(num, ypos)
-int num;
-int ypos;
-{
- struct wlistdata *wlistdata;
- int oldpos, oldypos, oldnpos;
- int pos, up;
-
- wlistdata = (struct wlistdata *)flayer->l_data;
- oldpos = wlistdata->pos;
- oldypos = wlistdata->ypos;
- oldnpos = wlistdata->npos;
- wlistdata->ypos = ypos == -1 ? oldypos + num : ypos;
- pos = WListNext(wlistdata, oldpos, num);
- wlistdata->pos = pos;
- ypos = WListNormalize();
- up = wlistdata->npos - ypos - (oldnpos - oldypos);
- if (up)
- {
- LScrollV(flayer, up, 2, 2 + wlistdata->numwin - 1, 0);
- WListLines(up, oldpos);
- LaySetCursor();
- return;
- }
- if (pos == oldpos)
- return;
- WListLine(oldypos, oldpos, pos, 0);
- WListLine(ypos, pos, pos, 1);
- LaySetCursor();
-}
-
-static void
-WListRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- ASSERT(flayer);
- if (y < 0)
- {
- wlistpage();
- return;
- }
- if (y != 0 && y != flayer->l_height - 1)
- return;
- if (!isblank)
- LClearArea(flayer, xs, y, xe, y, 0, 0);
-}
-
-void
-display_wlist(onblank, order)
-int onblank;
-int order;
-{
- struct win *p;
- struct wlistdata *wlistdata;
-
- if (flayer->l_width < 10 || flayer->l_height < 5)
- {
- LMsg(0, "Window size too small for window list page");
- return;
- }
- if (onblank)
- {
- debug3("flayer %x %d %x\n", flayer, flayer->l_width, flayer->l_height);
- if (!display)
- {
- LMsg(0, "windowlist -b: display required");
- return;
- }
- p = D_fore;
- SetForeWindow((struct win *)0);
- Activate(0);
- if (flayer->l_width < 10 || flayer->l_height < 5)
- {
- LMsg(0, "Window size too small for window list page");
- return;
- }
- debug3("flayer %x %d %x\n", flayer, flayer->l_width, flayer->l_height);
- }
- else
- p = Layer2Window(flayer);
- if (InitOverlayPage(sizeof(*wlistdata), &WListLf, 0))
- return;
- wlistdata = (struct wlistdata *)flayer->l_data;
- flayer->l_x = 0;
- flayer->l_y = flayer->l_height - 1;
- wlistdata->start = onblank && p ? p->w_number : -1;
- wlistdata->order = order;
- wlistdata->pos = p ? p->w_number : WListNext(wlistdata, -1, 0);
- wlistdata->ypos = wlistdata->npos = 0;
- wlistdata->numwin= flayer->l_height - 3;
- wlistpage();
-}
-
-static void
-wlistpage()
-{
- struct wlistdata *wlistdata;
- char *str;
- int pos;
-
- wlistdata = (struct wlistdata *)flayer->l_data;
-
- LClearAll(flayer, 0);
- if (wlistdata->start >= 0 && wtab[wlistdata->start] == 0)
- wlistdata->start = -2;
-
- pos = wlistdata->pos;
- if (wtab[pos] == 0)
- {
- if (wlistdata->order == WLIST_MRU)
- pos = WListNext(wlistdata, -1, wlistdata->npos);
- else
- {
- /* find new position */
- while(++pos < MAXWIN)
- if (wtab[pos])
- break;
- if (pos == MAXWIN)
- while (--pos > 0)
- if (wtab[pos])
- break;
- }
- }
- wlistdata->pos = pos;
-
- display = 0;
- str = MakeWinMsgEv(wlisttit, (struct win *)0, '%', flayer->l_width, (struct event *)0, 0);
- LPutWinMsg(flayer, str, strlen(str), &mchar_blank, 0, 0);
- WListNormalize();
- WListLines(wlistdata->numwin, -1);
- LaySetCursor();
-}
-
-static void
-WListUpdate(p)
-struct win *p;
-{
- struct wlistdata *wlistdata;
- int i, n, y;
-
- if (p == 0)
- {
- wlistpage();
- return;
- }
- wlistdata = (struct wlistdata *)flayer->l_data;
- n = p->w_number;
- if (wlistdata->order == WLIST_NUM && (n < wlistdata->first || n > wlistdata->last))
- return;
- i = wlistdata->first;
- for (y = 0; y < wlistdata->numwin; y++)
- {
- if (i == n)
- break;
- i = WListNext(wlistdata, i, 1);
- }
- if (y == wlistdata->numwin)
- return;
- WListLine(y, i, wlistdata->pos, 0);
- LaySetCursor();
-}
-
-void
-WListUpdatecv(cv, p)
-struct canvas *cv;
-struct win *p;
-{
- if (cv->c_layer->l_layfn != &WListLf)
- return;
- CV_CALL(cv, WListUpdate(p));
-}
-
-void
-WListLinkChanged()
-{
- struct display *olddisplay = display;
- struct canvas *cv;
- struct wlistdata *wlistdata;
-
- for (display = displays; display; display = display->d_next)
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- if (cv->c_layer->l_layfn != &WListLf)
- continue;
- wlistdata = (struct wlistdata *)cv->c_layer->l_data;
- if (wlistdata->order != WLIST_MRU)
- continue;
- CV_CALL(cv, WListUpdate(0));
- }
- display = olddisplay;
-}
-
-int
-InWList()
-{
- if (flayer && flayer->l_layfn == &WListLf)
- return 1;
- return 0;
-}
-
-
-
-/*
-**
-** The bindkey help page
-**
-*/
-
-#ifdef MAPKEYS
-
-extern struct term term[];
-extern struct kmap_ext *kmap_exts;
-extern int kmap_extn;
-extern struct action dmtab[];
-extern struct action mmtab[];
-
-
-static void BindkeyProcess __P((char **, int *));
-static void BindkeyAbort __P((void));
-static void BindkeyRedisplayLine __P((int, int, int, int));
-static void bindkeypage __P((void));
-
-struct bindkeydata
-{
- char *title;
- struct action *tab;
- int pos;
- int last;
- int page;
- int pages;
-};
-
-static struct LayFuncs BindkeyLf =
-{
- BindkeyProcess,
- BindkeyAbort,
- BindkeyRedisplayLine,
- DefClearLine,
- DefRewrite,
- DefResize,
- DefRestore
-};
-
-
-void
-display_bindkey(title, tab)
-char *title;
-struct action *tab;
-{
- struct bindkeydata *bindkeydata;
- int i, n;
-
- if (flayer->l_height < 6)
- {
- LMsg(0, "Window height too small for bindkey page");
- return;
- }
- if (InitOverlayPage(sizeof(*bindkeydata), &BindkeyLf, 0))
- return;
-
- bindkeydata = (struct bindkeydata *)flayer->l_data;
- bindkeydata->title = title;
- bindkeydata->tab = tab;
-
- n = 0;
- for (i = 0; i < KMAP_KEYS+KMAP_AKEYS+kmap_extn; i++)
- {
- if (tab[i].nr != RC_ILLEGAL)
- n++;
- }
- bindkeydata->pos = 0;
- bindkeydata->page = 1;
- bindkeydata->pages = (n + flayer->l_height - 6) / (flayer->l_height - 5);
- if (bindkeydata->pages == 0)
- bindkeydata->pages = 1;
- flayer->l_x = 0;
- flayer->l_y = flayer->l_height - 1;
- bindkeypage();
-}
-
-static void
-BindkeyAbort()
-{
- LAY_CALL_UP(LRefreshAll(flayer, 0));
- ExitOverlayPage();
-}
-
-static void
-bindkeypage()
-{
- struct bindkeydata *bindkeydata;
- struct kmap_ext *kme;
- char tbuf[256];
- int del, i, y, sl;
- struct action *act;
- char *xch, *s, *p;
-
- bindkeydata = (struct bindkeydata *)flayer->l_data;
-
- LClearAll(flayer, 0);
-
- sprintf(tbuf, "%s key bindings, page %d of %d.", bindkeydata->title, bindkeydata->page, bindkeydata->pages);
- centerline(tbuf, 0);
- y = 2;
- for (i = bindkeydata->pos; i < KMAP_KEYS+KMAP_AKEYS+kmap_extn && y < flayer->l_height - 3; i++)
- {
- p = tbuf;
- xch = " ";
- if (i < KMAP_KEYS)
- {
- act = &bindkeydata->tab[i];
- if (act->nr == RC_ILLEGAL)
- continue;
- del = *p++ = ':';
- s = term[i + T_CAPS].tcname;
- sl = s ? strlen(s) : 0;
- }
- else if (i < KMAP_KEYS+KMAP_AKEYS)
- {
- act = &bindkeydata->tab[i];
- if (act->nr == RC_ILLEGAL)
- continue;
- del = *p++ = ':';
- s = term[i + (T_CAPS - T_OCAPS + T_CURSOR)].tcname;
- sl = s ? strlen(s) : 0;
- xch = "[A]";
- }
- else
- {
- kme = kmap_exts + (i - (KMAP_KEYS+KMAP_AKEYS));
- del = 0;
- s = kme->str;
- sl = kme->fl & ~KMAP_NOTIMEOUT;
- if ((kme->fl & KMAP_NOTIMEOUT) != 0)
- xch = "[T]";
- act = bindkeydata->tab == dmtab ? &kme->dm : bindkeydata->tab == mmtab ? &kme->mm : &kme->um;
- if (act->nr == RC_ILLEGAL)
- continue;
- }
- while (sl-- > 0)
- p += AddXChar(p, *(unsigned char *)s++);
- if (del)
- *p++ = del;
- *p++ = ' ';
- while (p < tbuf + 15)
- *p++ = ' ';
- sprintf(p, "%s -> ", xch);
- p += 7;
- if (p - tbuf > flayer->l_width - 1)
- {
- tbuf[flayer->l_width - 2] = '$';
- tbuf[flayer->l_width - 1] = 0;
- }
- PadStr(tbuf, strlen(tbuf), 0, y);
- AddAction(act, strlen(tbuf), y);
- y++;
- }
- y++;
- bindkeydata->last = i;
- sprintf(tbuf,"[Press Space %s Return to end.]", bindkeydata->page < bindkeydata->pages ? "for next page;" : "or");
- centerline(tbuf, flayer->l_height - 2);
- LaySetCursor();
-}
-
-static void
-BindkeyProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int done = 0;
- struct bindkeydata *bindkeydata;
-
- bindkeydata = (struct bindkeydata *)flayer->l_data;
- while (!done && *plen > 0)
- {
- switch (**ppbuf)
- {
- case ' ':
- if (bindkeydata->page < bindkeydata->pages)
- {
- bindkeydata->pos = bindkeydata->last;
- bindkeydata->page++;
- bindkeypage();
- break;
- }
- /* FALLTHROUGH */
- case '\r':
- case '\n':
- done = 1;
- break;
- default:
- break;
- }
- ++*ppbuf;
- --*plen;
- }
- if (done)
- BindkeyAbort();
-}
-
-static void
-BindkeyRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- if (y < 0)
- {
- bindkeypage();
- return;
- }
- if (y != 0 && y != flayer->l_height - 1)
- return;
- if (!isblank)
- LClearArea(flayer, xs, y, xe, y, 0, 0);
-}
-
-#endif /* MAPKEYS */
-
-
-/*
-**
-** The zmodem active page
-**
-*/
-
-#ifdef ZMODEM
-
-static void ZmodemRedisplayLine __P((int, int, int, int));
-static int ZmodemResize __P((int, int));
-
-static struct LayFuncs ZmodemLf =
-{
- DefProcess,
- 0,
- ZmodemRedisplayLine,
- DefClearLine,
- DefRewrite,
- ZmodemResize,
- DefRestore
-};
-
-/*ARGSUSED*/
-static int
-ZmodemResize(wi, he)
-int wi, he;
-{
- flayer->l_width = wi;
- flayer->l_height = he;
- flayer->l_x = flayer->l_width > 32 ? 32 : 0;
- return 0;
-}
-
-static void
-ZmodemRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- DefRedisplayLine(y, xs, xe, isblank);
- if (y == 0 && xs == 0)
- LPutStr(flayer, "Zmodem active on another display", flayer->l_width > 32 ? 32 : flayer->l_width, &mchar_blank, 0, 0);
-}
-
-void
-ZmodemPage()
-{
- if (InitOverlayPage(1, &ZmodemLf, 1))
- return;
- LRefreshAll(flayer, 0);
- flayer->l_x = flayer->l_width > 32 ? 32 : 0;
- flayer->l_y = 0;
-}
-
-#endif
-
-
-
-static void
-PadStr(str, n, x, y)
-char *str;
-int n, x, y;
-{
- int l;
-
- l = strlen(str);
- if (l > n)
- l = n;
- LPutStr(flayer, str, l, &mchar_blank, x, y);
- if (l < n)
- LPutStr(flayer, (char *)blank, n - l, &mchar_blank, x + l, y);
-}
diff --git a/src/image.h b/src/image.h
deleted file mode 100644
index 34df3be..0000000
--- a/src/image.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-
-#undef IFFONT
-#undef IFCOLOR
-
-#ifdef FONT
-# define IFFONT(x) x
-#else
-# define IFFONT(x)
-#endif
-
-#ifdef COLOR
-# define IFCOLOR(x) x
-#else
-# define IFCOLOR(x)
-#endif
-
-#if defined(COLOR) && defined(COLORS16) && defined(COLORS256)
-# define IFCOLORX(x) x
-#else
-# define IFCOLORX(x)
-#endif
-
-#ifdef DW_CHARS
-# define IFDWCHAR(x) x
-#else
-# define IFDWCHAR(x)
-#endif
-
-struct mchar {
- unsigned char image;
- unsigned char attr;
-IFFONT( unsigned char font; )
-IFCOLOR( unsigned char color; )
-IFCOLORX(unsigned char colorx; )
-IFDWCHAR(unsigned char mbcs; )
-};
-
-struct mline {
- unsigned char *image;
- unsigned char *attr;
-IFFONT( unsigned char *font; )
-IFCOLOR( unsigned char *color; )
-IFCOLORX(unsigned char *colorx; )
-};
-
-
-
-#define save_mline(ml, n) do { \
- bcopy((char *)(ml)->image, (char *)mline_old.image, (n)); \
- bcopy((char *)(ml)->attr, (char *)mline_old.attr, (n)); \
-IFFONT( bcopy((char *)(ml)->font, (char *)mline_old.font, (n)); ) \
-IFCOLOR( bcopy((char *)(ml)->color, (char *)mline_old.color, (n)); ) \
-IFCOLORX(bcopy((char *)(ml)->colorx, (char *)mline_old.colorx, (n)); ) \
-} while (0)
-
-#define bcopy_mline(ml, xf, xt, n) do { \
- bcopy((char *)(ml)->image + (xf), (char *)(ml)->image + (xt), (n)); \
- bcopy((char *)(ml)->attr + (xf), (char *)(ml)->attr + (xt), (n)); \
-IFFONT( bcopy((char *)(ml)->font + (xf), (char *)(ml)->font + (xt), (n)); ) \
-IFCOLOR( bcopy((char *)(ml)->color + (xf), (char *)(ml)->color + (xt), (n)); ) \
-IFCOLORX(bcopy((char *)(ml)->colorx + (xf), (char *)(ml)->colorx + (xt), (n));) \
-} while (0)
-
-#define clear_mline(ml, x, n) do { \
- bclear((char *)(ml)->image + (x), (n)); \
- if ((ml)->attr != null) bzero((char *)(ml)->attr + (x), (n)); \
-IFFONT( if ((ml)->font != null) bzero((char *)(ml)->font + (x), (n)); ) \
-IFCOLOR( if ((ml)->color!= null) bzero((char *)(ml)->color + (x), (n)); ) \
-IFCOLORX(if ((ml)->colorx!= null) bzero((char *)(ml)->colorx + (x), (n)); ) \
-} while (0)
-
-#define cmp_mline(ml1, ml2, x) ( \
- (ml1)->image[x] == (ml2)->image[x] \
- && (ml1)->attr[x] == (ml2)->attr[x] \
-IFFONT( && (ml1)->font[x] == (ml2)->font[x] ) \
-IFCOLOR( && (ml1)->color[x] == (ml2)->color[x] ) \
-IFCOLORX(&& (ml1)->colorx[x] == (ml2)->colorx[x] ) \
-)
-
-#define cmp_mchar(mc1, mc2) ( \
- (mc1)->image == (mc2)->image \
- && (mc1)->attr == (mc2)->attr \
-IFFONT( && (mc1)->font == (mc2)->font ) \
-IFCOLOR( && (mc1)->color == (mc2)->color ) \
-IFCOLORX(&& (mc1)->colorx == (mc2)->colorx ) \
-)
-
-#define cmp_mchar_mline(mc, ml, x) ( \
- (mc)->image == (ml)->image[x] \
- && (mc)->attr == (ml)->attr[x] \
-IFFONT( && (mc)->font == (ml)->font[x] ) \
-IFCOLOR( && (mc)->color == (ml)->color[x] ) \
-IFCOLORX(&& (mc)->colorx == (ml)->colorx[x] ) \
-)
-
-#define copy_mchar2mline(mc, ml, x) do { \
- (ml)->image[x] = (mc)->image; \
- (ml)->attr[x] = (mc)->attr; \
-IFFONT( (ml)->font[x] = (mc)->font; ) \
-IFCOLOR( (ml)->color[x] = (mc)->color; ) \
-IFCOLORX((ml)->colorx[x] = (mc)->colorx; ) \
-} while (0)
-
-#define copy_mline2mchar(mc, ml, x) do { \
- (mc)->image = (ml)->image[x]; \
- (mc)->attr = (ml)->attr[x]; \
-IFFONT( (mc)->font = (ml)->font[x]; ) \
-IFCOLOR( (mc)->color = (ml)->color[x]; ) \
-IFCOLORX((mc)->colorx = (ml)->colorx[x]; ) \
-IFDWCHAR((mc)->mbcs = 0; ) \
-} while (0)
-
-#ifdef COLOR
-# ifdef COLORS16
-# ifdef COLORS256
-# define rend_getbg(mc) (((mc)->color & 0xf0) >> 4 | ((mc)->attr & A_BBG ? 0x100 : 0) | ((mc)->colorx & 0xf0))
-# define rend_setbg(mc, c) ((mc)->color = ((mc)->color & 0x0f) | (c << 4 & 0xf0), (mc)->colorx = ((mc)->colorx & 0x0f) | (c & 0xf0), (mc)->attr = ((mc)->attr | A_BBG) ^ (c & 0x100 ? 0 : A_BBG))
-# define rend_getfg(mc) (((mc)->color & 0x0f) | ((mc)->attr & A_BFG ? 0x100 : 0) | (((mc)->colorx & 0x0f) << 4))
-# define rend_setfg(mc, c) ((mc)->color = ((mc)->color & 0xf0) | (c & 0x0f), (mc)->colorx = ((mc)->colorx & 0xf0) | ((c & 0xf0) >> 4), (mc)->attr = ((mc)->attr | A_BFG) ^ (c & 0x100 ? 0 : A_BFG))
-# define rend_setdefault(mc) ((mc)->color = (mc)->colorx = 0, (mc)->attr &= ~(A_BBG|A_BFG))
-# else
-# define rend_getbg(mc) (((mc)->color & 0xf0) >> 4 | ((mc)->attr & A_BBG ? 0x100 : 0))
-# define rend_setbg(mc, c) ((mc)->color = ((mc)->color & 0x0f) | (c << 4 & 0xf0), (mc)->attr = ((mc)->attr | A_BBG) ^ (c & 0x100 ? 0 : A_BBG))
-# define rend_getfg(mc) (((mc)->color & 0x0f) | ((mc)->attr & A_BFG ? 0x100 : 0))
-# define rend_setfg(mc, c) ((mc)->color = ((mc)->color & 0xf0) | (c & 0x0f), (mc)->attr = ((mc)->attr | A_BFG) ^ (c & 0x100 ? 0 : A_BFG))
-# define rend_setdefault(mc) ((mc)->color = 0, (mc)->attr &= ~(A_BBG|A_BFG))
-# endif
-# define coli2e(c) ((((c) & 0x1f8) == 0x108 ? (c) ^ 0x108 : (c & 0xff)) ^ 9)
-# define cole2i(c) ((c) >= 8 && (c) < 16 ? (c) ^ 0x109 : (c) ^ 9)
-# else
-# define rend_getbg(mc) (((mc)->color & 0xf0) >> 4)
-# define rend_setbg(mc, c) ((mc)->color = ((mc)->color & 0x0f) | (c << 4 & 0xf0))
-# define rend_getfg(mc) ((mc)->color & 0x0f)
-# define rend_setfg(mc, c) ((mc)->color = ((mc)->color & 0xf0) | (c & 0x0f))
-# define rend_setdefault(mc) ((mc)->color = 0)
-# define coli2e(c) ((c) ^ 9)
-# define cole2i(c) ((c) ^ 9)
-# endif
-#endif
diff --git a/src/input.c b/src/input.c
deleted file mode 100644
index 7dadc0c..0000000
--- a/src/input.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#define INPUTLINE (flayer->l_height - 1)
-
-static void InpProcess __P((char **, int *));
-static void InpAbort __P((void));
-static void InpRedisplayLine __P((int, int, int, int));
-
-extern struct layer *flayer;
-extern struct display *display;
-extern struct mchar mchar_blank, mchar_so;
-
-struct inpline
-{
- char buf[101]; /* text buffer */
- int len; /* length of the editible string */
- int pos; /* cursor position in editable string */
-};
-
-static struct inpline inphist; /* XXX: should be a dynamic list */
-
-
-struct inpdata
-{
- struct inpline inp;
- int inpmaxlen; /* 100, or less, if caller has shorter buffer */
- char *inpstring; /* the prompt */
- int inpstringlen; /* length of the prompt */
- int inpmode; /* INP_NOECHO, INP_RAW, INP_EVERY */
- void (*inpfinfunc) __P((char *buf, int len, char *priv));
- char *priv; /* private data for finfunc */
-};
-
-static struct LayFuncs InpLf =
-{
- InpProcess,
- InpAbort,
- InpRedisplayLine,
- DefClearLine,
- DefRewrite,
- DefResize,
- DefRestore
-};
-
-/*
-** Here is the input routine
-*/
-
-/* called once, after InitOverlayPage in Input() or Isearch() */
-void
-inp_setprompt(p, s)
-char *p, *s;
-{
- struct inpdata *inpdata;
-
- inpdata = (struct inpdata *)flayer->l_data;
- if (p)
- {
- inpdata->inpstringlen = strlen(p);
- inpdata->inpstring = p;
- }
- if (s)
- {
- if (s != inpdata->inp.buf)
- strncpy(inpdata->inp.buf, s, sizeof(inpdata->inp.buf) - 1);
- inpdata->inp.buf[sizeof(inpdata->inp.buf) - 1] = 0;
- inpdata->inp.pos = inpdata->inp.len = strlen(inpdata->inp.buf);
- }
- InpRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0);
-}
-
-/*
- * We dont use HS status line with Input().
- * If we would use it, then we should check e_tgetflag("es") if
- * we are allowed to use esc sequences there.
- *
- * mode is an OR of
- * INP_NOECHO == suppress echoing of characters.
- * INP_RAW == raw mode. call finfunc after each character typed.
- * INP_EVERY == digraph mode.
- */
-void
-Input(istr, len, mode, finfunc, data)
-char *istr;
-int len;
-int mode;
-void (*finfunc) __P((char *buf, int len, char *data));
-char *data;
-{
- int maxlen;
- struct inpdata *inpdata;
-
- if (len > 100)
- len = 100;
- if (!(mode & INP_NOECHO))
- {
- maxlen = flayer->l_width - 1 - strlen(istr);
- if (len > maxlen)
- len = maxlen;
- }
- if (len < 0)
- {
- LMsg(0, "Width %d chars too small", -len);
- return;
- }
- if (InitOverlayPage(sizeof(*inpdata), &InpLf, 1))
- return;
- inpdata = (struct inpdata *)flayer->l_data;
- inpdata->inpmaxlen = len;
- inpdata->inpfinfunc = finfunc;
- inpdata->inp.pos = inpdata->inp.len = 0;
- inpdata->inpmode = mode;
- inpdata->priv = data;
- inp_setprompt(istr, (char *)NULL);
- flayer->l_x = inpdata->inpstringlen;
- flayer->l_y = INPUTLINE;
-}
-
-static void
-InpProcess(ppbuf, plen)
-char **ppbuf;
-int *plen;
-{
- int len, x;
- char *pbuf;
- char ch;
- struct inpdata *inpdata;
- struct display *inpdisplay;
-
- inpdata = (struct inpdata *)flayer->l_data;
- inpdisplay = display;
-
- LGotoPos(flayer, inpdata->inpstringlen + (inpdata->inpmode & INP_NOECHO ? 0 : inpdata->inp.pos), INPUTLINE);
- if (ppbuf == 0)
- {
- InpAbort();
- return;
- }
- x = inpdata->inpstringlen + inpdata->inp.pos;
- len = *plen;
- pbuf = *ppbuf;
- while (len)
- {
- char *p = inpdata->inp.buf + inpdata->inp.pos;
-
- ch = *pbuf++;
- len--;
- if (inpdata->inpmode & INP_EVERY)
- {
- inpdata->inp.buf[inpdata->inp.len] = ch;
- inpdata->inp.buf[inpdata->inp.len + 1] = ch; /* gross */
- display = inpdisplay;
- (*inpdata->inpfinfunc)(inpdata->inp.buf, inpdata->inp.len, inpdata->priv);
- ch = inpdata->inp.buf[inpdata->inp.len];
- }
- else if (inpdata->inpmode & INP_RAW)
- {
- display = inpdisplay;
- (*inpdata->inpfinfunc)(&ch, 1, inpdata->priv); /* raw */
- if (ch)
- continue;
- }
- if (((unsigned char)ch & 0177) >= ' ' && ch != 0177 && inpdata->inp.len < inpdata->inpmaxlen)
- {
- if (inpdata->inp.len > inpdata->inp.pos)
- bcopy(p, p+1, inpdata->inp.len - inpdata->inp.pos);
- inpdata->inp.buf[inpdata->inp.pos++] = ch;
- inpdata->inp.len++;
-
- if (!(inpdata->inpmode & INP_NOECHO))
- {
- struct mchar mc;
- mc = mchar_so;
- mc.image = *p++;
- LPutChar(flayer, &mc, x, INPUTLINE);
- x++;
- if (p < inpdata->inp.buf+inpdata->inp.len)
- {
- while (p < inpdata->inp.buf+inpdata->inp.len)
- {
- mc.image = *p++;
- LPutChar(flayer, &mc, x++, INPUTLINE);
- }
- x = inpdata->inpstringlen + inpdata->inp.pos;
- LGotoPos(flayer, x, INPUTLINE);
- }
- }
- }
- else if ((ch == '\b' || ch == 0177) && inpdata->inp.pos > 0)
- {
- if (inpdata->inp.len > inpdata->inp.pos)
- bcopy(p, p-1, inpdata->inp.len - inpdata->inp.pos);
- inpdata->inp.len--;
- inpdata->inp.pos--;
- p--;
-
- if (!(inpdata->inpmode & INP_NOECHO))
- {
- struct mchar mc;
- mc = mchar_so;
- x--;
- while (p < inpdata->inp.buf+inpdata->inp.len)
- {
- mc.image = *p++;
- LPutChar(flayer, &mc, x++, INPUTLINE);
- }
- LPutChar(flayer, &mchar_blank, x, INPUTLINE);
- x = inpdata->inpstringlen + inpdata->inp.pos;
- LGotoPos(flayer, x, INPUTLINE);
- }
- }
- else if (ch == '\025') /* CTRL-U */
- {
- x = inpdata->inpstringlen;
- if (inpdata->inp.len && !(inpdata->inpmode & INP_NOECHO))
- {
- LClearArea(flayer, x, INPUTLINE, x + inpdata->inp.len - 1, INPUTLINE, 0, 0);
- LGotoPos(flayer, x, INPUTLINE);
- }
- inpdata->inp.len = inpdata->inp.pos = 0;
- }
- else if (ch == '\013') /* CTRL-K */
- {
- x = inpdata->inpstringlen + inpdata->inp.pos;
- if (inpdata->inp.len > inpdata->inp.pos && !(inpdata->inpmode & INP_NOECHO))
- {
- LClearArea(flayer, x, INPUTLINE, x + inpdata->inp.len - inpdata->inp.pos - 1, INPUTLINE, 0, 0);
- LGotoPos(flayer, x, INPUTLINE);
- }
- inpdata->inp.len = inpdata->inp.pos;
- }
- else if (ch == '\001' || (unsigned char)ch == 0201) /* CTRL-A */
- {
- LGotoPos(flayer, x -= inpdata->inp.pos, INPUTLINE);
- inpdata->inp.pos = 0;
- }
- else if ((ch == '\002' || (unsigned char)ch == 0202) && inpdata->inp.pos > 0) /* CTRL-B */
- {
- LGotoPos(flayer, --x, INPUTLINE);
- inpdata->inp.pos--;
- }
- else if (ch == '\005' || (unsigned char)ch == 0205) /* CTRL-E */
- {
- LGotoPos(flayer, x += inpdata->inp.len - inpdata->inp.pos, INPUTLINE);
- inpdata->inp.pos = inpdata->inp.len;
- }
- else if ((ch == '\006' || (unsigned char)ch == 0206) && inpdata->inp.pos < inpdata->inp.len) /* CTRL-F */
- {
- LGotoPos(flayer, ++x, INPUTLINE);
- inpdata->inp.pos++;
- }
- else if (ch == '\020' || (unsigned char)ch == 0220) /* CTRL-P */
- {
- struct mchar mc;
- mc = mchar_so;
- if (inpdata->inp.len && !(inpdata->inpmode & INP_NOECHO))
- LClearArea(flayer, inpdata->inpstringlen, INPUTLINE, inpdata->inpstringlen + inpdata->inp.len - 1, INPUTLINE, 0, 0);
-
- inpdata->inp = inphist; /* structure copy */
- if (inpdata->inp.len > inpdata->inpmaxlen)
- inpdata->inp.len = inpdata->inpmaxlen;
- if (inpdata->inp.pos > inpdata->inp.len)
- inpdata->inp.pos = inpdata->inp.len;
-
- x = inpdata->inpstringlen;
- p = inpdata->inp.buf;
-
- if (!(inpdata->inpmode & INP_NOECHO))
- {
- while (p < inpdata->inp.buf+inpdata->inp.len)
- {
- mc.image = *p++;
- LPutChar(flayer, &mc, x++, INPUTLINE);
- }
- }
- x = inpdata->inpstringlen + inpdata->inp.pos;
- LGotoPos(flayer, x, INPUTLINE);
- }
-
- else if (ch == '\004' || ch == '\003' || ch == '\007' || ch == '\033' ||
- ch == '\000' || ch == '\n' || ch == '\r')
- {
- if (ch != '\004' && ch != '\n' && ch != '\r')
- inpdata->inp.len = 0;
- inpdata->inp.buf[inpdata->inp.len] = 0;
-
- if (inpdata->inp.len && inpdata->inpmode == 0)
- inphist = inpdata->inp; /* structure copy */
-
- flayer->l_data = 0;
- InpAbort(); /* redisplays... */
- *ppbuf = pbuf;
- *plen = len;
- display = inpdisplay;
- if ((inpdata->inpmode & INP_RAW) == 0)
- (*inpdata->inpfinfunc)(inpdata->inp.buf, inpdata->inp.len, inpdata->priv);
- else
- (*inpdata->inpfinfunc)(pbuf - 1, 0, inpdata->priv);
- free((char *)inpdata);
- return;
- }
- }
- if (!(inpdata->inpmode & INP_RAW))
- {
- flayer->l_x = inpdata->inpstringlen + (inpdata->inpmode & INP_NOECHO ? 0 : inpdata->inp.pos);
- flayer->l_y = INPUTLINE;
- }
- *ppbuf = pbuf;
- *plen = len;
-}
-
-static void
-InpAbort()
-{
- LAY_CALL_UP(LayRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0));
- ExitOverlayPage();
-}
-
-static void
-InpRedisplayLine(y, xs, xe, isblank)
-int y, xs, xe, isblank;
-{
- int q, r, s, l, v;
- struct inpdata *inpdata;
-
- inpdata = (struct inpdata *)flayer->l_data;
- if (y != INPUTLINE)
- {
- LAY_CALL_UP(LayRedisplayLine(y, xs, xe, isblank));
- return;
- }
- inpdata->inp.buf[inpdata->inp.len] = 0;
- q = xs;
- v = xe - xs + 1;
- s = 0;
- r = inpdata->inpstringlen;
- if (v > 0 && q < r)
- {
- l = v;
- if (l > r - q)
- l = r - q;
- LPutStr(flayer, inpdata->inpstring + q - s, l, &mchar_so, q, y);
- q += l;
- v -= l;
- }
- s = r;
- r += inpdata->inp.len;
- if (!(inpdata->inpmode & INP_NOECHO) && v > 0 && q < r)
- {
- l = v;
- if (l > r - q)
- l = r - q;
- LPutStr(flayer, inpdata->inp.buf + q - s, l, &mchar_so, q, y);
- q += l;
- v -= l;
- }
- s = r;
- r = flayer->l_width;
- if (!isblank && v > 0 && q < r)
- {
- l = v;
- if (l > r - q)
- l = r - q;
- LClearArea(flayer, q, y, q + l - 1, y, 0, 0);
- q += l;
- }
-}
-
-int
-InInput()
-{
- if (flayer && flayer->l_layfn == &InpLf)
- return 1;
- return 0;
-}
-
diff --git a/src/install.sh b/src/install.sh
deleted file mode 100755
index 8c07c50..0000000
--- a/src/install.sh
+++ /dev/null
@@ -1,119 +0,0 @@
-#! /bin/sh
-
-#
-# install - install a program, script, or datafile
-# This comes from X11R5; it is not part of GNU.
-#
-# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-#
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-
-instcmd="$mvprog"
-chmodcmd=""
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd="$stripprog"
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- dst=$1
- fi
- shift
- continue;;
- esac
-done
-
-if [ x"$src" = x ]
-then
- echo "install: no input file specified"
- exit 1
-fi
-
-if [ x"$dst" = x ]
-then
- echo "install: no destination specified"
- exit 1
-fi
-
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-if [ -d $dst ]
-then
- dst="$dst"/`basename $src`
-fi
-
-# Make a temp file name in the proper directory.
-
-dstdir=`dirname $dst`
-dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-$doit $instcmd $src $dsttmp
-
-# and set any options; do chmod last to preserve setuid bits
-
-if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
-if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
-if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
-if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
-
-# Now rename the file to the real destination.
-
-$doit $rmcmd $dst
-$doit $mvcmd $dsttmp $dst
-
-
-exit 0
diff --git a/src/kmapdef.c.dist b/src/kmapdef.c.dist
deleted file mode 100644
index 71a5b53..0000000
--- a/src/kmapdef.c.dist
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * This file is automagically created from term.c -- DO NOT EDIT
- */
-
-#include "config.h"
-
-#ifdef MAPKEYS
-
-char *kmapdef[] = {
-"\033[10~",
-"\033OP",
-"\033OQ",
-"\033OR",
-"\033OS",
-"\033[15~",
-"\033[17~",
-"\033[18~",
-"\033[19~",
-"\033[20~",
-"\033[21~",
-"\033[23~",
-"\033[24~",
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-"\033[1~",
-0,
-"\033[4~",
-0,
-"\033[6~",
-"\033[5~",
-"\033[2~",
-"\033[3~",
-"\033[A",
-"\033[B",
-"\033[C",
-"\033[D",
-"0",
-"1",
-"2",
-"3",
-"4",
-"5",
-"6",
-"7",
-"8",
-"9",
-"+",
-"-",
-"*",
-"/",
-"=",
-".",
-",",
-"\015"
-};
-
-char *kmapadef[] = {
-"\033OA",
-"\033OB",
-"\033OC",
-"\033OD",
-"\033Op",
-"\033Oq",
-"\033Or",
-"\033Os",
-"\033Ot",
-"\033Ou",
-"\033Ov",
-"\033Ow",
-"\033Ox",
-"\033Oy",
-"\033Ok",
-"\033Om",
-"\033Oj",
-"\033Oo",
-"\033OX",
-"\033On",
-"\033Ol",
-"\033OM"
-};
-
-char *kmapmdef[] = {
-"\004",
-0,
-0,
-"\025",
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-0,
-"\201",
-0,
-"\205",
-0,
-"\006",
-"\002",
-0,
-0,
-"\220",
-"\216",
-"\206",
-"\202"
-};
-
-#endif
diff --git a/src/layer.c b/src/layer.c
deleted file mode 100644
index cc98f78..0000000
--- a/src/layer.c
+++ /dev/null
@@ -1,1114 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-#include "screen.h"
-#include "mark.h"
-#include "extern.h"
-#include "braille.h"
-
-extern struct display *display, *displays;
-
-extern struct mline mline_blank, mline_null;
-extern struct mchar mchar_blank, mchar_null;
-
-extern struct layer *flayer; /* sigh */
-extern struct LayFuncs WinLf;
-extern struct LayFuncs BlankLf;
-
-
-static struct mline *mloff __P((struct mline *, int));
-
-/*
- * Layer subsystem.
- *
- * ...here is all the clipping code... beware!
- *
- * XXX: add some speedup code!
- *
- */
-
-static struct mline *
-mloff(ml, off)
-struct mline *ml;
-int off;
-{
- static struct mline mml;
-
- if (ml == 0)
- return 0;
- mml.image = ml->image + off;
- mml.attr = ml->attr + off;
-#ifdef FONT
- mml.font = ml->font + off;
-#endif
-#ifdef COLOR
- mml.color = ml->color + off;
-# ifdef COLORS256
- mml.colorx = ml->colorx + off;
-# endif
-#endif
- return &mml;
-}
-
-#ifdef UTF8
-# define RECODE_MCHAR(mc) ((l->l_encoding == UTF8) != (D_encoding == UTF8) ? recode_mchar(mc, l->l_encoding, D_encoding) : (mc))
-# define RECODE_MLINE(ml) ((l->l_encoding == UTF8) != (D_encoding == UTF8) ? recode_mline(ml, l->l_width, l->l_encoding, D_encoding) : (ml))
-#else
-# define RECODE_MCHAR(mc) (mc)
-# define RECODE_MLINE(ml) (ml)
-#endif
-
-
-void
-LGotoPos(l, x, y)
-struct layer *l;
-int x, y;
-{
- struct canvas *cv;
- struct viewport *vp;
- int x2, y2;
-
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- return;
-#endif
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- if (cv != D_forecv)
- continue;
- x2 = x + cv->c_xoff;
- y2 = y + cv->c_yoff;
- debug2("---LGotoPos %d %d\n", x2, y2);
- if (x2 < cv->c_xs)
- x2 = cv->c_xs;
- if (y2 < cv->c_ys)
- y2 = cv->c_ys;
- if (x2 > cv->c_xe)
- x2 = cv->c_xe;
- if (y2 > cv->c_ye)
- y2 = cv->c_ye;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- if (x2 < vp->v_xs || x2 > vp->v_xe)
- continue;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- GotoPos(x2, y2);
- break;
- }
- }
-}
-
-void
-LScrollH(l, n, y, xs, xe, bce, ol)
-struct layer *l;
-int n, y, xs, xe;
-int bce;
-struct mline *ol;
-{
- struct canvas *cv;
- struct viewport *vp;
- int y2, xs2, xe2;
-
- if (n == 0)
- return;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- xs2 = xs + vp->v_xoff;
- xe2 = xe + vp->v_xoff;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
- ScrollH(y2, xs2, xe2, n, bce, ol ? mloff(ol, -vp->v_xoff) : 0);
- if (xe2 - xs2 == xe - xs)
- continue;
- if (n > 0)
- {
- xs2 = xe2 + 1 - n;
- xe2 = xe + vp->v_xoff - n;
- }
- else
- {
- xe2 = xs2 - 1 - n;
- xs2 = xs + vp->v_xoff - n;
- }
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 <= xe2)
- RefreshArea(xs2, y2, xe2, y2, 1);
- }
-}
-
-void
-LScrollV(l, n, ys, ye, bce)
-struct layer *l;
-int n;
-int ys, ye;
-int bce;
-{
- struct canvas *cv;
- struct viewport *vp;
- int ys2, ye2, xs2, xe2;
- if (n == 0)
- return;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- xs2 = vp->v_xoff;
- xe2 = l->l_width - 1 + vp->v_xoff;
- ys2 = ys + vp->v_yoff;
- ye2 = ye + vp->v_yoff;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (ys2 < vp->v_ys)
- ys2 = vp->v_ys;
- if (ye2 > vp->v_ye)
- ye2 = vp->v_ye;
- if (ys2 > ye2 || xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
-#if 0
- ScrollV(xs2, ys2, xe2, ye2, n, bce);
-#else
- ScrollV(vp->v_xs, ys2, vp->v_xe, ye2, n, bce);
-#endif
- debug2("LScrollV: %d %d", ys, ye);
- debug2(" -> %d %d\n", ys2, ye2);
- if (ye2 - ys2 == ye - ys)
- continue;
- if (n > 0)
- {
- ys2 = ye2 + 1 - n;
- ye2 = ye + vp->v_yoff - n;
- }
- else
- {
- ye2 = ys2 - 1 - n;
- ys2 = ys + vp->v_yoff - n;
- }
- debug2("LScrollV: - %d %d\n", ys2, ye2);
- if (ys2 < vp->v_ys)
- ys2 = vp->v_ys;
- if (ye2 > vp->v_ye)
- ye2 = vp->v_ye;
- debug2("LScrollV: - %d %d\n", ys2, ye2);
- if (ys2 <= ye2)
- RefreshArea(xs2, ys2, xe2, ye2, 1);
- }
-}
-
-void
-LInsChar(l, c, x, y, ol)
-struct layer *l;
-struct mchar *c;
-int x, y;
-struct mline *ol;
-{
- struct canvas *cv;
- struct viewport *vp;
- int xs2, xe2, y2, f;
- struct mchar *c2, cc;
- struct mline *rol;
-
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- xs2 = x + vp->v_xoff;
- xe2 = l->l_width - 1 + vp->v_xoff;
- c2 = c;
- f = 0;
- if (xs2 < vp->v_xs)
- {
- xs2 = vp->v_xs;
- c2 = &mchar_blank;
- if (ol)
- {
- int i;
- i = xs2 - vp->v_xoff - 1;
- if (i >= 0 && i < l->l_width)
- {
- copy_mline2mchar(&cc, ol, i);
- c2 = &cc;
- }
- }
- else
- f = 1;
- }
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
- rol = RECODE_MLINE(ol);
- InsChar(RECODE_MCHAR(c2), xs2, xe2, y2, mloff(rol, -vp->v_xoff));
- if (f)
- RefreshArea(xs2, y2, xs2, y2, 1);
- }
-}
-
-void
-LPutChar(l, c, x, y)
-struct layer *l;
-struct mchar *c;
-int x, y;
-{
- struct canvas *cv;
- struct viewport *vp;
- int x2, y2;
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- {
- BPutChar(l, c, x, y);
- return;
- }
-#endif
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- x2 = x + vp->v_xoff;
- if (x2 < vp->v_xs || x2 > vp->v_xe)
- continue;
- PutChar(RECODE_MCHAR(c), x2, y2);
- break;
- }
- }
-}
-
-void
-LPutStr(l, s, n, r, x, y)
-struct layer *l;
-char *s;
-int n;
-struct mchar *r;
-int x, y;
-{
- struct canvas *cv;
- struct viewport *vp;
- char *s2;
- int xs2, xe2, y2;
-
- if (x + n > l->l_width)
- n = l->l_width - x;
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- {
- BPutStr(l, s, n, r, x, y);
- return;
- }
-#endif
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- xs2 = x + vp->v_xoff;
- xe2 = xs2 + n - 1;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
- GotoPos(xs2, y2);
- SetRendition(r);
- s2 = s + xs2 - x - vp->v_xoff;
-#ifdef UTF8
- if (D_encoding == UTF8 && l->l_encoding != UTF8 && (r->font || l->l_encoding))
- {
- struct mchar mc;
- mc = *r;
- while (xs2 <= xe2)
- {
- mc.image = *s2++;
- PutChar(RECODE_MCHAR(&mc), xs2++, y2);
- }
- continue;
- }
-#endif
- while (xs2++ <= xe2)
- PUTCHARLP(*s2++);
- }
-}
-
-void
-LPutWinMsg(l, s, n, r, x, y)
-struct layer *l;
-char *s;
-int n;
-struct mchar *r;
-int x, y;
-{
- struct canvas *cv;
- struct viewport *vp;
- char *s2;
- int xs2, xe2, y2, len, len2;
- struct mchar or;
-
- if (x + n > l->l_width)
- n = l->l_width - x;
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- {
- BPutStr(l, s, n, r, x, y);
- return;
- }
-#endif
- len = strlen(s);
- if (len > n)
- len = n;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- xs2 = x + vp->v_xoff;
- xe2 = xs2 + n - 1;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
- GotoPos(xs2, y2);
- SetRendition(r);
- len2 = xe2 - (x + vp->v_xoff) + 1;
- if (len2 > len)
- len2 = len;
- if (!PutWinMsg(s, xs2 - x - vp->v_xoff, len2))
- {
- s2 = s + xs2 - x - vp->v_xoff;
- while (len2-- > 0)
- {
- PUTCHARLP(*s2++);
- xs2++;
- }
- }
- else
- xs2 = x + vp->v_xoff + len2;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- or = D_rend;
- GotoPos(xs2, y2);
- SetRendition(&or);
- while (xs2++ <= xe2)
- PUTCHARLP(' ');
- }
-}
-
-void
-LClearLine(l, y, xs, xe, bce, ol)
-struct layer *l;
-int xs, xe, bce;
-struct mline *ol;
-{
- struct canvas *cv;
- struct viewport *vp;
- int y2, xs2, xe2;
-
- /* check for magic margin condition */
- if (xs >= l->l_width)
- xs = l->l_width - 1;
- if (xe >= l->l_width)
- xe = l->l_width - 1;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- xs2 = xs + vp->v_xoff;
- xe2 = xe + vp->v_xoff;
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- if (D_blocked)
- continue;
- ClearLine(ol ? mloff(RECODE_MLINE(ol), -vp->v_xoff) : (struct mline *)0, y2, xs2, xe2, bce);
- }
-}
-
-void
-LClearArea(l, xs, ys, xe, ye, bce, uself)
-struct layer *l;
-int xs, ys, xe, ye;
-int bce;
-int uself;
-{
- struct canvas *cv;
- struct viewport *vp;
- int xs2, ys2, xe2, ye2;
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- return;
-#endif
- /* check for magic margin condition */
- if (xs >= l->l_width)
- xs = l->l_width - 1;
- if (xe >= l->l_width)
- xe = l->l_width - 1;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- xs2 = xs + vp->v_xoff;
- xe2 = xe + vp->v_xoff;
- ys2 = ys + vp->v_yoff;
- ye2 = ye + vp->v_yoff;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > vp->v_xe)
- ys2++;
- if (xe2 < vp->v_xs)
- ye2--;
- if (ys2 < vp->v_ys)
- ys2 = vp->v_ys;
- if (ye2 > vp->v_ye)
- ye2 = vp->v_ye;
- if (ys2 > ye2)
- continue;
-#if 0
- xcs = vp->v_xoff;
- xce = l->l_width - 1 + vp->v_xoff;
- if (xcs < vp->v_xs)
- xcs = vp->v_xs;
- if (xce > vp->v_xe)
- xce = vp->v_xe;
- if (xcs > xce)
- continue;
- if (ys2 != ys + vp->v_yoff)
- xs2 = xcs;
- if (ye2 != ye + vp->v_yoff)
- xe2 = xce;
- display = cv->c_display;
- ClearArea(xs2, ys2, xcs, xce, xe2, ye2, bce, uself);
-#else
- if (xs == 0 || ys2 != ys + vp->v_yoff)
- xs2 = vp->v_xs;
- if (xe == l->l_width - 1 || ye2 != ye + vp->v_yoff)
- xe2 = vp->v_xe;
- display = cv->c_display;
- ClearArea(xs2, ys2, vp->v_xs, vp->v_xe, xe2, ye2, bce, uself);
-#endif
- }
- }
-}
-
-void
-LCDisplayLine(l, ml, y, xs, xe, isblank)
-struct layer *l;
-struct mline *ml;
-int y, xs, xe;
-int isblank;
-{
- struct canvas *cv;
- struct viewport *vp;
- int xs2, xe2, y2;
-#ifdef HAVE_BRAILLE
- if (bd.bd_refreshing)
- {
- BCDisplayLine(l, ml, y, xs, xe, isblank);
- return;
- }
-#endif
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- xs2 = xs + vp->v_xoff;
- xe2 = xe + vp->v_xoff;
- y2 = y + vp->v_yoff;
- if (y2 < vp->v_ys || y2 > vp->v_ye)
- continue;
- if (xs2 < vp->v_xs)
- xs2 = vp->v_xs;
- if (xe2 > vp->v_xe)
- xe2 = vp->v_xe;
- if (xs2 > xe2)
- continue;
- display = cv->c_display;
- debug3("LCDisplayLine: DisplayLine %d, %d-%d", y2, xs2, xe2);
- debug1(" mloff = %d\n", -vp->v_xoff);
- DisplayLine(isblank ? &mline_blank : &mline_null, mloff(RECODE_MLINE(ml), -vp->v_xoff), y2, xs2, xe2);
- }
- }
-}
-
-void
-LCDisplayLineWrap(l, ml, y, from, to, isblank)
-struct layer *l;
-struct mline *ml;
-int y, from, to;
-int isblank;
-{
- struct mchar nc;
- copy_mline2mchar(&nc, ml, 0);
-#ifdef DW_CHARS
- if (dw_left(ml, 0, l->l_encoding))
- {
- nc.mbcs = ml->image[1];
- from++;
- }
-#endif
- LWrapChar(l, &nc, y - 1, -1, -1, 0);
- from++;
- if (from <= to)
- LCDisplayLine(l, ml, y, from, to, isblank);
-}
-
-void
-LSetRendition(l, r)
-struct layer *l;
-struct mchar *r;
-{
- struct canvas *cv;
-
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- SetRendition(r);
- }
-}
-
-void
-LWrapChar(l, c, y, top, bot, ins)
-struct layer *l;
-struct mchar *c;
-int y, top, bot;
-int ins;
-{
- struct canvas *cv, *cvlist, *cvlnext;
- struct viewport *vp, *evp, **vpp;
- int yy, y2, yy2, top2, bot2;
- int bce;
-
-#ifdef COLOR
- bce = rend_getbg(c);
-#else
- bce = 0;
-#endif
- if (y != bot)
- {
- /* simple case: no scrolling */
-
- /* cursor after wrapping */
- yy = y == l->l_height - 1 ? y : y + 1;
-
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- y2 = 0; /* gcc -Wall */
- display = cv->c_display;
- if (D_blocked)
- continue;
- /* find the viewport of the wrapped character */
- for (vp = cv->c_vplist; vp; vp = vp->v_next)
- {
- y2 = y + vp->v_yoff;
- yy2 = yy + vp->v_yoff;
- if (yy2 >= vp->v_ys && yy2 <= vp->v_ye && vp->v_xoff >= vp->v_xs && vp->v_xoff <= vp->v_xe)
- break;
- }
- if (vp == 0)
- continue; /* nothing to do, character not visible */
- /* find the viewport of the character at the end of the line*/
- for (evp = cv->c_vplist; evp; evp = evp->v_next)
- if (y2 >= evp->v_ys && y2 <= evp->v_ye && evp->v_xoff + l->l_width - 1 >= evp->v_xs && evp->v_xoff + l->l_width - 1 <= evp->v_xe)
- break; /* gotcha! */
- if (evp == 0 || (ins && vp->v_xoff + l->l_width - 1 > vp->v_ye))
- {
- /* no wrapping possible */
- debug("LWrap: can't wrap!\n");
- cvlist = l->l_cvlist;
- cvlnext = cv->c_lnext;
- l->l_cvlist = cv;
- cv->c_lnext = 0;
- if (ins)
- LInsChar(l, c, 0, yy, 0);
- else
- LPutChar(l, c, 0, yy);
- l->l_cvlist = cvlist;
- cv->c_lnext = cvlnext;
- }
- else
- {
- WrapChar(RECODE_MCHAR(c), vp->v_xoff + l->l_width, y2, vp->v_xoff, -1, vp->v_xoff + l->l_width - 1, -1, ins);
- }
- }
- }
- else
- {
- /* hard case: scroll up*/
-
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- /* search for wrap viewport */
- for (vpp = &cv->c_vplist; (vp = *vpp); vpp = &vp->v_next)
- {
- yy2 = bot + vp->v_yoff;
- if (yy2 >= vp->v_ys && yy2 <= vp->v_ye && vp->v_xoff >= vp->v_xs && vp->v_xoff + l->l_width - 1 <= vp->v_xe)
- break;
- }
-
- if (vp)
- {
- /* great, can use Wrap on the vp */
- /* temporarily remove vp from cvlist */
- *vpp = vp->v_next;
- }
- if (cv->c_vplist)
- {
- /* scroll all viewports != vp */
- cvlist = l->l_cvlist;
- cvlnext = cv->c_lnext;
- l->l_cvlist = cv;
- cv->c_lnext = 0;
- LScrollV(l, 1, top, bot, bce);
- if (!vp)
- {
- if (ins)
- LInsChar(l, c, 0, bot, 0);
- else
- LPutChar(l, c, 0, bot);
- }
- l->l_cvlist = cvlist;
- cv->c_lnext = cvlnext;
- }
- if (vp)
- {
- /* add vp back to cvlist */
- *vpp = vp;
- top2 = top + vp->v_yoff;
- bot2 = bot + vp->v_yoff;
- if (top2 < vp->v_ys)
- top2 = vp->v_ys;
- WrapChar(RECODE_MCHAR(c), vp->v_xoff + l->l_width, bot2, vp->v_xoff, top2, vp->v_xoff + l->l_width - 1, bot2, ins);
- }
- }
- }
-}
-
-
-void
-LCursorVisibility(l, vis)
-struct layer *l;
-int vis;
-{
- struct canvas *cv;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- if (cv != D_forecv)
- continue;
- CursorVisibility(vis);
- }
-}
-
-void
-LSetFlow(l, flow)
-struct layer *l;
-int flow;
-{
- struct canvas *cv;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (cv != D_forecv)
- continue;
- SetFlow(flow);
- }
-}
-
-void
-LKeypadMode(l, on)
-struct layer *l;
-int on;
-{
- struct canvas *cv;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- if (cv != D_forecv)
- continue;
- KeypadMode(on);
- }
-}
-
-void
-LCursorkeysMode(l, on)
-struct layer *l;
-int on;
-{
- struct canvas *cv;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- if (cv != D_forecv)
- continue;
- CursorkeysMode(on);
- }
-}
-
-void
-LMouseMode(l, on)
-struct layer *l;
-int on;
-{
- struct canvas *cv;
- for (cv = l->l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_blocked)
- continue;
- if (cv != D_forecv)
- continue;
- MouseMode(on);
- }
-}
-
-
-/*******************************************************************/
-
-void
-LClearAll(l, uself)
-struct layer *l;
-int uself;
-{
- LClearArea(l, 0, 0, l->l_width - 1, l->l_height - 1, 0, uself);
-}
-
-void
-LRefreshAll(l, isblank)
-struct layer *l;
-int isblank;
-{
- struct layer *oldflayer;
- int y;
-
- debug1("LRefreshAll isblank=%d\n", isblank);
- oldflayer = flayer;
- flayer = l;
- if (!isblank)
- LClearArea(l, 0, 0, l->l_width - 1, l->l_height - 1, 0, 0);
- /* signal full refresh */
- LayRedisplayLine(-1, -1, -1, 1);
- for (y = 0; y < l->l_height; y++)
- LayRedisplayLine(y, 0, l->l_width - 1, 1);
- flayer = oldflayer;
-}
-
-
-void
-KillLayerChain(lay)
-struct layer *lay;
-{
- struct canvas *cv, *ncv;
- struct layer *l, *oldflayer;
-
- oldflayer = flayer;
- debug1("KillLayerChain %#x\n", lay);
- for (l = lay; l; l = l->l_next)
- {
- if (l->l_layfn == &WinLf || l->l_layfn == &BlankLf)
- break;
- debug1("- killing %#x\n", l);
- if (oldflayer == l)
- oldflayer = 0;
- for (cv = l->l_cvlist; cv; cv = ncv)
- {
- ncv = cv->c_lnext;
- cv->c_layer = 0;
- cv->c_lnext = 0;
- }
- }
- flayer = lay;
- while (flayer != l)
- ExitOverlayPage();
- flayer = oldflayer;
-}
-
-
-/*******************************************************************/
-/*******************************************************************/
-
-/*
- * Layer creation / removal
- */
-
-int
-InitOverlayPage(datasize, lf, block)
-int datasize;
-struct LayFuncs *lf;
-int block;
-{
- char *data;
- struct layer *newlay;
- struct canvas *cv, *cvp, **cvpp;
- struct win *p;
-
- ASSERT(flayer);
-
- cv = 0;
- if (display && D_forecv->c_layer == flayer)
- cv = D_forecv; /* work only on this cv! */
-
- if ((newlay = (struct layer *)calloc(1, sizeof(struct layer))) == 0)
- {
- Msg(0, "No memory for layer struct");
- return -1;
- }
- debug2("Entering new layer on top of %#x: %#x\n", (unsigned int)flayer, newlay);
- data = 0;
- if (datasize)
- {
- if ((data = malloc(datasize)) == 0)
- {
- free((char *)newlay);
- Msg(0, "No memory for layer data");
- return -1;
- }
- bzero(data, datasize);
- }
-
- p = Layer2Window(flayer);
-
- if (p && (p->w_savelayer == flayer || (block && flayer->l_next == 0)))
- {
- if (p->w_savelayer && p->w_savelayer != flayer && p->w_savelayer->l_cvlist == 0)
- KillLayerChain(p->w_savelayer);
- p->w_savelayer = newlay;
- }
-
- if (cv && flayer->l_next == 0 && !block)
- {
- struct display *olddisplay = display;
- display = cv->c_display;
- RemoveStatus();
- display = olddisplay;
-
- /* new branch -> just get canvas vps */
- for (cvpp = &flayer->l_cvlist; (cvp = *cvpp); cvpp = &cvp->c_lnext)
- if (cvp == cv)
- break;
- ASSERT(cvp);
- *cvpp = cv->c_lnext;
- newlay->l_cvlist = cv;
- cv->c_lnext = 0;
- cv->c_layer = newlay;
- }
- else
- {
- LAY_DISPLAYS(flayer, RemoveStatus());
- if (block)
- debug("layer is blocking\n");
- if (block && flayer->l_layfn == &WinLf)
- {
- debug("...and is first, so window gets blocked\n");
- ASSERT(p->w_blocked == 0);
- p->w_blocked++;
- newlay->l_blocking = 1;
- }
- /* change all canvases */
- newlay->l_cvlist = flayer->l_cvlist;
- for (cvp = newlay->l_cvlist; cvp; cvp = cvp->c_lnext)
- cvp->c_layer = newlay;
- flayer->l_cvlist = 0;
- }
- newlay->l_width = flayer->l_width;
- newlay->l_height = flayer->l_height;
- newlay->l_encoding = 0;
- newlay->l_layfn = lf;
- newlay->l_data = data;
- newlay->l_next = flayer;
- newlay->l_bottom = flayer->l_bottom;
- flayer = newlay;
- LayRestore();
- return 0;
-}
-
-void
-ExitOverlayPage()
-{
- struct layer *oldlay;
- struct win *p;
- int doredisplay = 0;
- struct canvas *cv, *ocv;
-
- ASSERT(flayer);
- debug1("Exiting layer %#x\n", (unsigned int)flayer);
- oldlay = flayer;
- if (oldlay->l_data)
- free(oldlay->l_data);
-
- p = Layer2Window(flayer);
-
- flayer = oldlay->l_next;
- if (flayer->l_layfn == &WinLf)
- {
- if (oldlay->l_blocking)
- {
- ASSERT(p->w_blocked > 0);
- p->w_blocked--;
- debug1("layer was blocking, -> w_blocked now %d\n", p->w_blocked);
- }
- /* don't warp dead layers: check cvlist */
- if (p->w_blocked && p->w_savelayer && p->w_savelayer != flayer && oldlay->l_cvlist)
- {
- debug("warping to top of blocking chain!\n");
- /* warp ourself into savelayer */
- flayer = p->w_savelayer;
- doredisplay = 1;
- }
- }
- if (p && p->w_savelayer == oldlay)
- p->w_savelayer = flayer;
-#ifdef COPY_PASTE
- if (p && oldlay == p->w_paster.pa_pastelayer)
- p->w_paster.pa_pastelayer = 0;
-#endif
-
- /* add all canvases back into next layer's canvas list */
- for (ocv = 0, cv = oldlay->l_cvlist; cv; cv = cv->c_lnext)
- {
- cv->c_layer = flayer;
- ocv = cv;
- }
- if (ocv)
- {
- cv = flayer->l_cvlist;
- ocv->c_lnext = 0;
- flayer->l_cvlist = oldlay->l_cvlist;
- /* redisplay only the warped cvs */
- if (doredisplay)
- LRefreshAll(flayer, 0);
- ocv->c_lnext = cv;
- }
- oldlay->l_cvlist = 0;
- free((char *)oldlay);
- LayRestore();
- LaySetCursor();
-}
-
-void
-/*VARARGS2*/
-#if defined(USEVARARGS) && defined(__STDC__)
-LMsg(int err, char *fmt, VA_DOTS)
-#else
-LMsg(err, fmt, VA_DOTS)
-int err;
-char *fmt;
-VA_DECL
-#endif
-{
- VA_LIST(ap)
- char buf[MAXPATHLEN*2];
- char *p = buf;
- struct canvas *cv;
-
- VA_START(ap, fmt);
- fmt = DoNLS(fmt);
- (void)vsnprintf(p, sizeof(buf) - 100, fmt, VA_ARGS(ap));
- VA_END(ap);
- if (err)
- {
- p += strlen(p);
- *p++ = ':';
- *p++ = ' ';
- strncpy(p, strerror(err), buf + sizeof(buf) - p - 1);
- buf[sizeof(buf) - 1] = 0;
- }
- debug2("LMsg('%s') (%#x);\n", buf, (unsigned int)flayer);
- for (display = displays; display; display = display->d_next)
- {
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (cv->c_layer == flayer)
- break;
- if (cv == 0)
- continue;
- MakeStatus(buf);
- }
-}
-
diff --git a/src/layer.h b/src/layer.h
deleted file mode 100644
index 4c4c172..0000000
--- a/src/layer.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Copyright (c) 1995-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-/*
- * This is the overlay structure. It is used to create a seperate
- * layer over the current windows.
- */
-
-struct mchar; /* forward declaration */
-
-struct LayFuncs
-{
- void (*lf_LayProcess) __P((char **, int *));
- void (*lf_LayAbort) __P((void));
- void (*lf_LayRedisplayLine) __P((int, int, int, int));
- void (*lf_LayClearLine) __P((int, int, int, int));
- int (*lf_LayRewrite) __P((int, int, int, struct mchar *, int));
- int (*lf_LayResize) __P((int, int));
- void (*lf_LayRestore) __P((void));
-};
-
-struct layer
-{
- struct canvas *l_cvlist; /* list of canvases displaying layer */
- int l_width;
- int l_height;
- int l_x; /* cursor position */
- int l_y;
- int l_encoding;
- struct LayFuncs *l_layfn;
- char *l_data;
-
- struct layer *l_next; /* layer stack, should be in data? */
- struct layer *l_bottom; /* bottom element of layer stack */
- int l_blocking;
-};
-
-#define LayProcess (*flayer->l_layfn->lf_LayProcess)
-#define LayAbort (*flayer->l_layfn->lf_LayAbort)
-#define LayRedisplayLine (*flayer->l_layfn->lf_LayRedisplayLine)
-#define LayClearLine (*flayer->l_layfn->lf_LayClearLine)
-#define LayRewrite (*flayer->l_layfn->lf_LayRewrite)
-#define LayResize (*flayer->l_layfn->lf_LayResize)
-#define LayRestore (*flayer->l_layfn->lf_LayRestore)
-
-#define LaySetCursor() LGotoPos(flayer, flayer->l_x, flayer->l_y)
-#define LayCanResize(l) (l->l_layfn->LayResize != DefResize)
-
-/* XXX: AArgh! think again! */
-
-#define LAY_CALL_UP(fn) do \
- { \
- struct layer *oldlay = flayer; \
- struct canvas *oldcvlist, *cv; \
- debug("LayCallUp\n"); \
- flayer = flayer->l_next; \
- oldcvlist = flayer->l_cvlist; \
- debug1("oldcvlist: %x\n", oldcvlist); \
- flayer->l_cvlist = oldlay->l_cvlist; \
- for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \
- cv->c_layer = flayer; \
- fn; \
- flayer = oldlay; \
- for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \
- cv->c_layer = flayer; \
- flayer->l_next->l_cvlist = oldcvlist; \
- } while(0)
-
-#define LAY_DISPLAYS(l, fn) do \
- { \
- struct display *olddisplay = display; \
- struct canvas *cv; \
- for (display = displays; display; display = display->d_next) \
- { \
- for (cv = D_cvlist; cv; cv = cv->c_next) \
- if (cv->c_layer == l) \
- break; \
- if (cv == 0) \
- continue; \
- fn; \
- } \
- display = olddisplay; \
- } while(0)
-
diff --git a/src/loadav.c b/src/loadav.c
deleted file mode 100644
index 8b7c44d..0000000
--- a/src/loadav.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <fcntl.h>
-#ifdef ultrix
-# include <sys/fixpoint.h>
-#endif
-
-/* mach stuff included here to prevent index macro conflict */
-#ifdef NeXT
-# include <sys/version.h>
-# if KERNEL_MAJOR_VERSION > 2
-# include <mach/mach.h>
-# else
-# include <mach.h>
-# endif
-#endif
-
-#include "config.h"
-#include "screen.h"
-
-#include "extern.h"
-
-#ifdef LOADAV
-
-static int GetLoadav __P((void));
-
-static LOADAV_TYPE loadav[LOADAV_NUM];
-static int loadok;
-
-
-
-/***************************************************************/
-
-#if defined(linux) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-/*
- * This is the easy way. It relies in /proc being mounted.
- * For the big and ugly way refer to previous screen version.
- */
-void
-InitLoadav()
-{
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- FILE *fp;
- char buf[128], *s;
- int i;
- double d, e;
-
- if ((fp = secfopen("/proc/loadavg", "r")) == NULL)
- return 0;
- *buf = 0;
- fgets(buf, sizeof(buf), fp);
- fclose(fp);
- /* can't use fscanf because the decimal point symbol depends on
- * the locale but the kernel uses always '.'.
- */
- s = buf;
- for (i = 0; i < (LOADAV_NUM > 3 ? 3 : LOADAV_NUM); i++)
- {
- d = e = 0;
- while(*s == ' ')
- s++;
- if (*s == 0)
- break;
- for(;;)
- {
- if (*s == '.')
- e = 1;
- else if (*s >= '0' && *s <= '9')
- {
- d = d * 10 + (*s - '0');
- if (e)
- e *= 10;
- }
- else
- break;
- s++;
- }
- loadav[i] = e ? d / e : d;
- }
- return i;
-}
-#endif /* linux */
-
-/***************************************************************/
-
-#if defined(LOADAV_GETLOADAVG) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-void
-InitLoadav()
-{
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- return getloadavg(loadav, LOADAV_NUM);
-}
-#endif
-
-/***************************************************************/
-
-#if defined(apollo) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-void
-InitLoadav()
-{
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- proc1_$get_loadav(loadav);
- return LOADAV_NUM;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(NeXT) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-
-static processor_set_t default_set;
-
-void
-InitLoadav()
-{
- kern_return_t error;
-
- error = processor_set_default(host_self(), &default_set);
- if (error != KERN_SUCCESS)
- mach_error("Error calling processor_set_default", error);
- else
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- unsigned int info_count;
- struct processor_set_basic_info info;
- host_t host;
-
- info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
- if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO, &host, (processor_set_info_t)&info, &info_count) != KERN_SUCCESS)
- return 0;
- loadav[0] = (float)info.load_average / LOAD_SCALE;
- return 1;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(sun) && defined(SVR4) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-
-#include <kstat.h>
-
-static kstat_ctl_t *kc;
-
-void
-InitLoadav()
-{
- loadok = (kc = kstat_open()) != 0;
-}
-
-static int
-GetLoadav()
-{
- kstat_t *ks;
- kstat_named_t *avgs[3];
- int i;
-
- kstat_chain_update(kc);
- if ((ks = kstat_lookup(kc, "unix", -1, "system_misc")) == 0 || kstat_read(kc, ks, (void *)0) == -1)
- return (loadok = 0);
- avgs[0] = kstat_data_lookup(ks, "avenrun_1min");
- avgs[1] = kstat_data_lookup(ks, "avenrun_5min");
- avgs[2] = kstat_data_lookup(ks, "avenrun_15min");
- for (i = 0; i < 3; i++)
- {
- if (avgs[i] == 0 || avgs[i]->data_type != KSTAT_DATA_ULONG)
- return (loadok = 0);
- loadav[i] = avgs[i]->value.ul;
- }
- return 3;
-}
-
-#endif
-
-/***************************************************************/
-
-#if defined(__osf__) && defined(__alpha) && !defined(LOADAV_DONE)
-#define LOADAV_DONE
-
-struct rtentry; struct mbuf; /* shut up gcc on OSF/1 4.0 */
-#include <sys/table.h>
-
-void
-InitLoadav()
-{
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- struct tbl_loadavg tbl;
- int i;
-
- if (table(TBL_LOADAVG, 0, &tbl, 1, sizeof(struct tbl_loadavg)) != 1)
- return 0;
-
- if (tbl.tl_lscale)
- {
- /* in long */
- for (i = 0; i < LOADAV_NUM; i++)
- loadav[i] = (double) tbl.tl_avenrun.l[i] / tbl.tl_lscale;
- }
- else
- {
- /* in double */
- for (i = 0; i < LOADAV_NUM; i++)
- loadav[i] = tbl.tl_avenrun.d[i];
- }
- return LOADAV_NUM;
-}
-#endif
-
-/***************************************************************/
-
-#if !defined(LOADAV_DONE)
-/*
- * The old fashion way: open kernel and read avenrun
- *
- * Header File includes
- */
-
-# ifdef NLIST_STRUCT
-# include <nlist.h>
-# else
-# include <a.out.h>
-# endif
-# ifndef NLIST_DECLARED
-extern int nlist __P((char *, struct nlist *));
-# endif
-
-#ifdef LOADAV_USE_NLIST64
-# define nlist nlist64
-#endif
-
-static struct nlist nl[2];
-static int kmemf;
-
-#ifdef _IBMR2
-# define nlist(u,l) knlist(l,1,sizeof(*l))
-#endif
-
-void
-InitLoadav()
-{
- debug("Init Kmem...\n");
- if ((kmemf = open("/dev/kmem", O_RDONLY)) == -1)
- return;
-# if !defined(_AUX_SOURCE) && !defined(AUX)
-# ifdef NLIST_NAME_UNION
- nl[0].n_un.n_name = LOADAV_AVENRUN;
-# else
- nl[0].n_name = LOADAV_AVENRUN;
-# endif
-# else
- strncpy(nl[0].n_name, LOADAV_AVENRUN, sizeof(nl[0].n_name));
-# endif
- debug2("Searching in %s for %s\n", LOADAV_UNIX, nl[0].n_name);
- nlist(LOADAV_UNIX, nl);
- if (nl[0].n_value == 0)
- {
- close(kmemf);
- return;
- }
-# if 0 /* no longer needed (Al.Smith@aeschi.ch.eu.org) */
-# ifdef sgi
- nl[0].n_value &= (unsigned long)-1 >> 1; /* clear upper bit */
-# endif /* sgi */
-# endif
- debug1("AvenrunSym found (0x%lx)!!\n", nl[0].n_value);
- loadok = 1;
-}
-
-static int
-GetLoadav()
-{
- if (lseek(kmemf, (off_t) nl[0].n_value, 0) == (off_t)-1)
- return 0;
- if (read(kmemf, (char *) loadav, sizeof(loadav)) != sizeof(loadav))
- return 0;
- return LOADAV_NUM;
-}
-#endif
-
-/***************************************************************/
-
-#ifndef FIX_TO_DBL
-#define FIX_TO_DBL(l) ((double)(l) / LOADAV_SCALE)
-#endif
-
-void
-AddLoadav(p)
-char *p;
-{
- int i, j;
- if (loadok == 0)
- return;
- j = GetLoadav();
- for (i = 0; i < j; i++)
- {
- sprintf(p, " %2.2f" + !i, FIX_TO_DBL(loadav[i]));
- p += strlen(p);
- }
-}
-
-#endif /* LOADAV */
diff --git a/src/logfile.c b/src/logfile.c
deleted file mode 100644
index d2eacce..0000000
--- a/src/logfile.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h> /* dev_t, ino_t, off_t, ... */
-#include <sys/stat.h> /* struct stat */
-#include <fcntl.h> /* O_WRONLY for logfile_reopen */
-
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-#include "logfile.h"
-
-static void changed_logfile __P((struct logfile *));
-static struct logfile *lookup_logfile __P((char *));
-static int stolen_logfile __P((struct logfile *));
-
-static struct logfile *logroot = NULL;
-
-static void
-changed_logfile(l)
-struct logfile *l;
-{
- struct stat o, *s = l->st;
-
- if (fstat(fileno(l->fp), &o) < 0) /* get trouble later */
- return;
- if (o.st_size > s->st_size) /* aha, appended text */
- {
- s->st_size = o.st_size; /* this should have changed */
- s->st_mtime = o.st_mtime; /* only size and mtime */
- }
-}
-
-/*
- * Requires fd to be open and need_fd to be closed.
- * If possible, need_fd will be open afterwards and refer to
- * the object originally reffered by fd. fd will be closed then.
- * Works just like ``fcntl(fd, DUPFD, need_fd); close(fd);''
- *
- * need_fd is returned on success, else -1 is returned.
- */
-int
-lf_move_fd(fd, need_fd)
-int need_fd, fd;
-{
- int r = -1;
-
- if (fd == need_fd)
- return fd;
- if (fd >=0 && fd < need_fd)
- r = lf_move_fd(dup(fd), need_fd);
- close(fd);
- return r;
-}
-
-static int
-logfile_reopen(name, wantfd, l)
-char *name;
-int wantfd;
-struct logfile *l;
-{
- int got_fd;
-
- close(wantfd);
- if (((got_fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666)) < 0) ||
- lf_move_fd(got_fd, wantfd) < 0)
- {
- logfclose(l);
- debug1("logfile_reopen: failed for %s\n", name);
- return -1;
- }
- changed_logfile(l);
- debug2("logfile_reopen: %d = %s\n", wantfd, name);
- return 0;
-}
-
-static int (* lf_reopen_fn)() = logfile_reopen;
-
-/*
- * Whenever logfwrite discoveres that it is required to close and
- * reopen the logfile, the function registered here is called.
- * If you do not register anything here, the above logfile_reopen()
- * will be used instead.
- * Your function should perform the same steps as logfile_reopen():
- * a) close the original filedescriptor without flushing any output
- * b) open a new logfile for future output on the same filedescriptor number.
- * c) zero out st_dev, st_ino to tell the stolen_logfile() indcator to
- * reinitialise itself.
- * d) return 0 on success.
- */
-void
-logreopen_register(fn)
-int (*fn) __P((char *, int, struct logfile *));
-{
- lf_reopen_fn = fn ? fn : logfile_reopen;
-}
-
-/*
- * If the logfile has been removed, truncated, unlinked or the like,
- * return nonzero.
- * The l->st structure initialised by logfopen is updated
- * on every call.
- */
-static int
-stolen_logfile(l)
-struct logfile *l;
-{
- struct stat o, *s = l->st;
-
- o = *s;
- if (fstat(fileno(l->fp), s) < 0) /* remember that stat failed */
- s->st_ino = s->st_dev = 0;
- ASSERT(s == l->st);
- if (!o.st_dev && !o.st_ino) /* nothing to compare with */
- return 0;
-
- if ((!s->st_dev && !s->st_ino) || /* stat failed, that's new! */
- !s->st_nlink || /* red alert: file unlinked */
- (s->st_size < o.st_size) || /* file truncated */
- (s->st_mtime != o.st_mtime) || /* file modified */
- ((s->st_ctime != o.st_ctime) && /* file changed (moved) */
- !(s->st_mtime == s->st_ctime && /* and it was not a change */
- o.st_ctime < s->st_ctime))) /* due to delayed nfs write */
- {
- debug1("stolen_logfile: %s stolen!\n", l->name);
- debug3("st_dev %d, st_ino %d, st_nlink %d\n",
- (int)s->st_dev, (int)s->st_ino, (int)s->st_nlink);
- debug2("s->st_size %d, o.st_size %d\n", (int)s->st_size, (int)o.st_size);
- debug2("s->st_mtime %d, o.st_mtime %d\n",
- (int)s->st_mtime, (int)o.st_mtime);
- debug2("s->st_ctime %d, o.st_ctime %d\n",
- (int)s->st_ctime, (int)o.st_ctime);
- return -1;
- }
-
- debug1("stolen_logfile: %s o.k.\n", l->name);
- return 0;
-}
-
-static struct logfile *
-lookup_logfile(name)
-char *name;
-{
- struct logfile *l;
-
- for (l = logroot; l; l = l->next)
- if (!strcmp(name, l->name))
- return l;
- return NULL;
-}
-
-struct logfile *
-logfopen(name, fp)
-char *name;
-FILE *fp;
-{
- struct logfile *l;
-
- if (!fp)
- {
- if (!(l = lookup_logfile(name)))
- return NULL;
- l->opencount++;
- return l;
- }
-
- if (!(l = (struct logfile *)malloc(sizeof(struct logfile))))
- return NULL;
- if (!(l->st = (struct stat *)malloc(sizeof(struct stat))))
- {
- free((char *)l);
- return NULL;
- }
-
- if (!(l->name = SaveStr(name)))
- {
- free((char *)l->st);
- free((char *)l);
- return NULL;
- }
- l->fp = fp;
- l->opencount = 1;
- l->writecount = 0;
- l->flushcount = 0;
- changed_logfile(l);
-
- l->next = logroot;
- logroot = l;
- return l;
-}
-
-int
-islogfile(name)
-char *name;
-{
- if (!name)
- return logroot ? 1 : 0;
- return lookup_logfile(name) ? 1 : 0;
-}
-
-int
-logfclose(l)
-struct logfile *l;
-{
- struct logfile **lp;
-
- for (lp = &logroot; *lp; lp = &(*lp)->next)
- if (*lp == l)
- break;
-
- if (!*lp)
- return -1;
-
- if ((--l->opencount) > 0)
- return 0;
- if (l->opencount < 0)
- abort();
-
- *lp = l->next;
- fclose(l->fp);
- free(l->name);
- free((char *)l);
- return 0;
-}
-
-/*
- * XXX
- * write and flush both *should* check the file's stat, if it disappeared
- * or changed, re-open it.
- */
-int
-logfwrite(l, buf, n)
-struct logfile *l;
-char *buf;
-int n;
-{
- int r;
-
- if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l))
- return -1;
- r = fwrite(buf, n, 1, l->fp);
- l->writecount += l->flushcount + 1;
- l->flushcount = 0;
- changed_logfile(l);
- return r;
-}
-
-int
-logfflush(l)
-struct logfile *l;
-{
- int r = 0;
-
- if (!l)
- for (l = logroot; l; l = l->next)
- {
- if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l))
- return -1;
- r |= fflush(l->fp);
- l->flushcount++;
- changed_logfile(l);
- }
- else
- {
- if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l))
- return -1;
- r = fflush(l->fp);
- l->flushcount++;
- changed_logfile(l);
- }
- return r;
-}
-
diff --git a/src/logfile.h b/src/logfile.h
deleted file mode 100644
index 55dd5f7..0000000
--- a/src/logfile.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-struct logfile
-{
- struct logfile *next;
- FILE *fp; /* a hopefully uniq filepointer to the log file */
- char *name; /* the name. used to reopen, when stat fails. */
- int opencount; /* synchronize logfopen() and logfclose() */
- int writecount; /* increments at logfwrite(), counts write() and fflush() */
- int flushcount; /* increments at logfflush(), zeroed at logfwrite() */
- struct stat *st; /* how the file looks like */
-};
-
-/*
- * open a logfile, The second argument must be NULL, when the named file
- * is already a logfile or must be a appropriatly opened file pointer
- * otherwise.
- * example: l = logfopen(name, islogfile(name) : NULL ? fopen(name, "a"));
- */
-struct logfile *logfopen __P((char *name, FILE *fp));
-
-/*
- * lookup a logfile by name. This is useful, so that we can provide
- * logfopen with a nonzero second argument, exactly when needed.
- * islogfile(NULL); returns nonzero if there are any open logfiles at all.
- */
-int islogfile __P((char *name));
-
-/*
- * logfclose does free()
- */
-int logfclose __P((struct logfile *));
-int logfwrite __P((struct logfile *, char *, int));
-
-/*
- * logfflush should be called periodically. If no argument is passed,
- * all logfiles are flushed, else the specified file
- * the number of flushed filepointers is returned
- */
-int logfflush __P((struct logfile *ifany));
-
-/*
- * a reopen function may be registered here, in case you want to bring your
- * own (more secure open), it may come along with a private data pointer.
- * this function is called, whenever logfwrite/logfflush detect that the
- * file has been (re)moved, truncated or changed by someone else.
- * if you provide NULL as parameter to logreopen_register, the builtin
- * reopen function will be reactivated.
- */
-void logreopen_register __P((int (*fn) __P((char *, int, struct logfile *)) ));
-
-/*
- * Your custom reopen function is required to reuse the exact
- * filedescriptor.
- * See logfile.c for further specs and an example.
- *
- * lf_move_fd may help you here, if you do not have dup2(2).
- * It closes fd and opens wantfd to access whatever fd accessed.
- */
-int lf_move_fd __P((int fd, int wantfd));
diff --git a/src/mark.c b/src/mark.c
deleted file mode 100644
index c69c6ff..0000000
--- a/src/mark.c
+++ /dev/null
@@ -1,1379 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-#include "screen.h"
-#include "mark.h"
-#include "extern.h"
-
-#ifdef COPY_PASTE
-
-/*
- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- *
- * WARNING: these routines use the global variables "fore" and
- * "flayer" to make things easier.
- *
- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- */
-
-static int is_letter __P((int));
-static void nextword __P((int *, int *, int, int));
-static int linestart __P((int));
-static int lineend __P((int));
-static int rem __P((int, int , int , int , int , char *, int));
-static int eq __P((int, int ));
-static int MarkScrollDownDisplay __P((int));
-static int MarkScrollUpDisplay __P((int));
-
-static void MarkProcess __P((char **, int *));
-static void MarkAbort __P((void));
-static void MarkRedisplayLine __P((int, int, int, int));
-static int MarkRewrite __P((int, int, int, struct mchar *, int));
-
-extern struct layer *flayer;
-extern struct display *display, *displays;
-extern struct win *fore;
-extern struct mline mline_blank, mline_null;
-extern struct mchar mchar_so;
-
-#ifdef FONT
-int pastefont = 1;
-#endif
-
-static struct LayFuncs MarkLf =
-{
- MarkProcess,
- MarkAbort,
- MarkRedisplayLine,
- DefClearLine,
- MarkRewrite,
- DefResize,
- DefRestore
-};
-
-int join_with_cr = 0;
-int compacthist = 0;
-
-unsigned char mark_key_tab[256]; /* this array must be initialised first! */
-
-static struct markdata *markdata;
-
-
-/*
- * VI like is_letter: 0 - whitespace
- * 1 - letter
- * 2 - other
- */
-static int is_letter(c)
-char c;
-{
- if ((c >= 'a' && c <= 'z') ||
- (c >= 'A' && c <= 'Z') ||
- (c >= '0' && c <= '9') ||
- c == '_' || c == '.' ||
- c == '@' || c == ':' ||
- c == '%' || c == '!' ||
- c == '-' || c == '+')
- /* thus we can catch email-addresses as a word :-) */
- return 1;
- else if (c != ' ')
- return 2;
- return 0;
-}
-
-static int
-linestart(y)
-int y;
-{
- register int x;
- register unsigned char *i;
-
- for (x = markdata->left_mar, i = WIN(y)->image + x; x < fore->w_width - 1; x++)
- if (*i++ != ' ')
- break;
- if (x == fore->w_width - 1)
- x = markdata->left_mar;
- return x;
-}
-
-static int
-lineend(y)
-int y;
-{
- register int x;
- register unsigned char *i;
-
- for (x = markdata->right_mar, i = WIN(y)->image + x; x >= 0; x--)
- if (*i-- != ' ')
- break;
- if (x < 0)
- x = markdata->left_mar;
- return x;
-}
-
-
-/*
- * nextword calculates the cursor position of the num'th word.
- * If the cursor is on a word, it counts as the first.
- * NW_BACK: search backward
- * NW_ENDOFWORD: find the end of the word
- * NW_MUSTMOVE: move at least one char
- * NW_BIG: match WORDs not words
- */
-
-#define NW_BACK (1<<0)
-#define NW_ENDOFWORD (1<<1)
-#define NW_MUSTMOVE (1<<2)
-#define NW_BIG (1<<3)
-
-static void
-nextword(xp, yp, flags, num)
-int *xp, *yp, flags, num;
-{
- int xx = fore->w_width, yy = fore->w_histheight + fore->w_height;
- register int sx, oq, q, x, y;
- struct mline *ml;
-
- x = *xp;
- y = *yp;
- sx = (flags & NW_BACK) ? -1 : 1;
- if ((flags & NW_ENDOFWORD) && (flags & NW_MUSTMOVE))
- x += sx;
- ml = WIN(y);
- for (oq = -1; ; x += sx, oq = q)
- {
- if (x >= xx || x < 0)
- q = 0;
- else if (flags & NW_BIG)
- q = ml->image[x] == ' ';
- else
- q = is_letter(ml->image[x]);
- if (oq >= 0 && oq != q)
- {
- if (oq == 0 || !(flags & NW_ENDOFWORD))
- *xp = x;
- else
- *xp = x-sx;
- *yp = y;
- if ((!(flags & NW_ENDOFWORD) && q) ||
- ((flags & NW_ENDOFWORD) && oq))
- {
- if (--num <= 0)
- return;
- }
- }
- if (x == xx)
- {
- x = -1;
- if (++y >= yy)
- return;
- ml = WIN(y);
- }
- else if (x < 0)
- {
- x = xx;
- if (--y < 0)
- return;
- ml = WIN(y);
- }
- }
-}
-
-
-/*
- * y1, y2 are WIN coordinates
- *
- * redisplay: 0 - just copy
- * 1 - redisplay + copy
- * 2 - count + copy, don't redisplay
- */
-
-static int
-rem(x1, y1, x2, y2, redisplay, pt, yend)
-int x1, y1, x2, y2, redisplay, yend;
-char *pt;
-{
- int i, j, from, to, ry, c;
- int l = 0;
- unsigned char *im;
- struct mline *ml;
-#ifdef FONT
- int cf, font;
- unsigned char *fo;
-#endif
-
- markdata->second = 0;
- if (y2 < y1 || ((y2 == y1) && (x2 < x1)))
- {
- i = y2;
- y2 = y1;
- y1 = i;
- i = x2;
- x2 = x1;
- x1 = i;
- }
- ry = y1 - markdata->hist_offset;
-
- i = y1;
- if (redisplay != 2 && pt == 0 && ry <0)
- {
- i -= ry;
- ry = 0;
- }
- for (; i <= y2; i++, ry++)
- {
- if (redisplay != 2 && pt == 0 && ry > yend)
- break;
- ml = WIN(i);
- from = (i == y1) ? x1 : 0;
- if (from < markdata->left_mar)
- from = markdata->left_mar;
- for (to = fore->w_width, im = ml->image + to; to >= 0; to--)
- if (*im-- != ' ')
- break;
- if (i == y2 && x2 < to)
- to = x2;
- if (to > markdata->right_mar)
- to = markdata->right_mar;
- if (redisplay == 1 && from <= to && ry >=0 && ry <= yend)
- MarkRedisplayLine(ry, from, to, 0);
- if (redisplay != 2 && pt == 0) /* don't count/copy */
- continue;
- j = from;
-#ifdef DW_CHARS
- if (dw_right(ml, j, fore->w_encoding))
- j--;
-#endif
- im = ml->image + j;
-#ifdef FONT
- fo = ml->font + j;
- font = ASCII;
-#endif
- for (; j <= to; j++)
- {
- c = (unsigned char)*im++;
-#ifdef FONT
- cf = (unsigned char)*fo++;
-# ifdef UTF8
- if (fore->w_encoding == UTF8)
- {
- c |= cf << 8;
- if (c == UCS_HIDDEN)
- continue;
- c = ToUtf8_comb(pt, c);
- l += c;
- if (pt)
- pt += c;
- continue;
- }
-# endif
-# ifdef DW_CHARS
- if (is_dw_font(cf))
- {
- c = c << 8 | (unsigned char)*im++;
- fo++;
- j++;
- }
-# endif
- if (pastefont)
- {
- c = EncodeChar(pt, c | cf << 16, fore->w_encoding, &font);
- l += c;
- if (pt)
- pt += c;
- continue;
- }
-#endif /* FONT */
- if (pt)
- *pt++ = c;
- l++;
- }
-#ifdef FONT
- if (pastefont && font != ASCII)
- {
- if (pt)
- {
- strcpy(pt, "\033(B");
- pt += 3;
- }
- l += 3;
- }
-#endif
- if (i != y2 && (to != fore->w_width - 1 || ml->image[to + 1] == ' '))
- {
- /*
- * this code defines, what glues lines together
- */
- switch (markdata->nonl)
- {
- case 0: /* lines separated by newlines */
- if (pt)
- *pt++ = '\r';
- l++;
- if (join_with_cr)
- {
- if (pt)
- *pt++ = '\n';
- l++;
- }
- break;
- case 1: /* nothing to separate lines */
- break;
- case 2: /* lines separated by blanks */
- if (pt)
- *pt++ = ' ';
- l++;
- break;
- case 3: /* seperate by comma, for csh junkies */
- if (pt)
- *pt++ = ',';
- l++;
- break;
- }
- }
- }
- return l;
-}
-
-/* Check if two chars are identical. All digits are treated
- * as same. Used for GetHistory()
- */
-
-static int
-eq(a, b)
-int a, b;
-{
- if (a == b)
- return 1;
- if (a == 0 || b == 0)
- return 1;
- if (a <= '9' && a >= '0' && b <= '9' && b >= '0')
- return 1;
- return 0;
-}
-
-
-/**********************************************************************/
-
-int
-GetHistory() /* return value 1 if copybuffer changed */
-{
- int i = 0, q = 0, xx, yy, x, y;
- unsigned char *linep;
- struct mline *ml;
-
- ASSERT(display && fore);
- x = fore->w_x;
- if (x >= fore->w_width)
- x = fore->w_width - 1;
- y = fore->w_y + fore->w_histheight;
- debug2("cursor is at x=%d, y=%d\n", x, y);
- ml = WIN(y);
- for (xx = x - 1, linep = ml->image + xx; xx >= 0; xx--)
- if ((q = *linep--) != ' ' )
- break;
- debug3("%c at (%d,%d)\n", q, xx, y);
- for (yy = y - 1; yy >= 0; yy--)
- {
- ml = WIN(yy);
- linep = ml->image;
- if (xx < 0 || eq(linep[xx], q))
- { /* line is matching... */
- for (i = fore->w_width - 1, linep += i; i >= x; i--)
- if (*linep-- != ' ')
- break;
- if (i >= x)
- break;
- }
- }
- if (yy < 0)
- return 0;
- if (D_user->u_plop.buf)
- UserFreeCopyBuffer(D_user);
- if ((D_user->u_plop.buf = (char *)malloc((unsigned) (i - x + 2))) == NULL)
- {
- LMsg(0, "Not enough memory... Sorry.");
- return 0;
- }
- bcopy((char *)linep - i + x + 1, D_user->u_plop.buf, i - x + 1);
- D_user->u_plop.len = i - x + 1;
-#ifdef ENCODINGS
- D_user->u_plop.enc = fore->w_encoding;
-#endif
- return 1;
-}
-
-/**********************************************************************/
-
-
-void
-MarkRoutine()
-{
- int x, y;
-
- ASSERT(fore && display && D_user);
-
- debug2("MarkRoutine called: fore nr %d, display %s\n",
- fore->w_number, D_usertty);
-
- if (InitOverlayPage(sizeof(*markdata), &MarkLf, 1))
- return;
- flayer->l_encoding = fore->w_encoding;
- markdata = (struct markdata *)flayer->l_data;
- markdata->md_user = D_user; /* XXX: Correct? */
- markdata->md_window = fore;
- markdata->second = 0;
- markdata->rep_cnt = 0;
- markdata->append_mode = 0;
- markdata->write_buffer = 0;
- markdata->nonl = 0;
- markdata->left_mar = 0;
- markdata->right_mar = fore->w_width - 1;
- markdata->hist_offset = fore->w_histheight;
- x = fore->w_x;
- y = D2W(fore->w_y);
- if (x >= fore->w_width)
- x = fore->w_width - 1;
-
- LGotoPos(flayer, x, W2D(y));
- LMsg(0, "Copy mode - Column %d Line %d(+%d) (%d,%d)",
- x + 1, W2D(y + 1), fore->w_histheight, fore->w_width, fore->w_height);
- markdata->cx = markdata->x1 = x;
- markdata->cy = markdata->y1 = y;
- flayer->l_x = x;
- flayer->l_y = W2D(y);
-}
-
-static void
-MarkProcess(inbufp,inlenp)
-char **inbufp;
-int *inlenp;
-{
- char *inbuf, *pt;
- int inlen;
- int cx, cy, x2, y2, j, yend;
- int newcopylen = 0, od;
- int in_mark;
- int rep_cnt;
- struct acluser *md_user;
-
-/*
- char *extrap = 0, extrabuf[100];
-*/
-
- markdata = (struct markdata *)flayer->l_data;
- fore = markdata->md_window;
- md_user = markdata->md_user;
- if (inbufp == 0)
- {
- MarkAbort();
- return;
- }
-
- LGotoPos(flayer, markdata->cx, W2D(markdata->cy));
- inbuf= *inbufp;
- inlen= *inlenp;
- pt = inbuf;
- in_mark = 1;
- while (in_mark && (inlen /* || extrap */))
- {
-/*
- if (extrap)
- {
- od = *extrap++;
- if (*extrap == 0)
- extrap = 0;
- }
- else
-*/
- {
- od = mark_key_tab[(int)(unsigned char)*pt++];
- inlen--;
- }
- rep_cnt = markdata->rep_cnt;
- if (od >= '0' && od <= '9')
- {
- if (rep_cnt < 1001 && (od != '0' || rep_cnt != 0))
- {
- markdata->rep_cnt = 10 * rep_cnt + od - '0';
- continue;
- /*
- * Now what is that 1001 here? Well, we have a screen with
- * 25 * 80 = 2000 characters. Movement is at most across the full
- * screen. This we do with word by word movement, as character by
- * character movement never steps over line boundaries. The most words
- * we can place on the screen are 1000 single letter words. Thus 1001
- * is sufficient. Users with bigger screens never write in single letter
- * words, as they should be more advanced. jw.
- * Oh, wrong. We still give even the experienced user a factor of ten.
- */
- }
- }
- cx = markdata->cx;
- cy = markdata->cy;
- switch (od)
- {
- case 'o':
- case 'x':
- if (!markdata->second)
- break;
- markdata->cx = markdata->x1;
- markdata->cy = markdata->y1;
- markdata->x1 = cx;
- markdata->y1 = cy;
- revto(markdata->cx, markdata->cy);
- break;
- case '\014': /* CTRL-L Redisplay */
- Redisplay(0);
- LGotoPos(flayer, cx, W2D(cy));
- break;
- case 0202: /* M-C-b */
- case '\010': /* CTRL-H Backspace */
- case 'h':
- if (rep_cnt == 0)
- rep_cnt = 1;
- revto(cx - rep_cnt, cy);
- break;
- case 0216: /* M-C-p */
- case '\016': /* CTRL-N */
- case 'j':
- if (rep_cnt == 0)
- rep_cnt = 1;
- revto(cx, cy + rep_cnt);
- break;
- case '+':
- if (rep_cnt == 0)
- rep_cnt = 1;
- j = cy + rep_cnt;
- if (j > fore->w_histheight + fore->w_height - 1)
- j = fore->w_histheight + fore->w_height - 1;
- revto(linestart(j), j);
- break;
- case '-':
- if (rep_cnt == 0)
- rep_cnt = 1;
- cy -= rep_cnt;
- if (cy < 0)
- cy = 0;
- revto(linestart(cy), cy);
- break;
- case '^':
- revto(linestart(cy), cy);
- break;
- case '\n':
- revto(markdata->left_mar, cy + 1);
- break;
- case 0220: /* M-C-p */
- case '\020': /* CTRL-P */
- case 'k':
- if (rep_cnt == 0)
- rep_cnt = 1;
- revto(cx, cy - rep_cnt);
- break;
- case 0206: /* M-C-f */
- case 'l':
- if (rep_cnt == 0)
- rep_cnt = 1;
- revto(cx + rep_cnt, cy);
- break;
- case '\001': /* CTRL-A from tcsh/emacs */
- case '0':
- revto(markdata->left_mar, cy);
- break;
- case '\004': /* CTRL-D down half screen */
- if (rep_cnt == 0)
- rep_cnt = (fore->w_height + 1) >> 1;
- revto_line(cx, cy + rep_cnt, W2D(cy));
- break;
- case '$':
- revto(lineend(cy), cy);
- break;
- case '\022': /* CTRL-R emacs style backwards search */
- ISearch(-1);
- in_mark = 0;
- break;
- case '\023': /* CTRL-S emacs style search */
- ISearch(1);
- in_mark = 0;
- break;
- case '\025': /* CTRL-U up half screen */
- if (rep_cnt == 0)
- rep_cnt = (fore->w_height + 1) >> 1;
- revto_line(cx, cy - rep_cnt, W2D(cy));
- break;
- case '\007': /* CTRL-G show cursorpos */
- if (markdata->left_mar == 0 && markdata->right_mar == fore->w_width - 1)
- LMsg(0, "Column %d Line %d(+%d)", cx+1, W2D(cy)+1,
- markdata->hist_offset);
- else
- LMsg(0, "Column %d(%d..%d) Line %d(+%d)", cx+1,
- markdata->left_mar+1, markdata->right_mar+1, W2D(cy)+1, markdata->hist_offset);
- break;
- case '\002': /* CTRL-B back one page */
- if (rep_cnt == 0)
- rep_cnt = 1;
- rep_cnt *= fore->w_height;
- revto(cx, cy - rep_cnt);
- break;
- case '\006': /* CTRL-F forward one page */
- if (rep_cnt == 0)
- rep_cnt = 1;
- rep_cnt *= fore->w_height;
- revto(cx, cy + rep_cnt);
- break;
- case '\005': /* CTRL-E scroll up */
- if (rep_cnt == 0)
- rep_cnt = 1;
- rep_cnt = MarkScrollUpDisplay(rep_cnt);
- if (cy < D2W(0))
- revto(cx, D2W(0));
- else
- LGotoPos(flayer, cx, W2D(cy));
- break;
- case '\031': /* CTRL-Y scroll down */
- if (rep_cnt == 0)
- rep_cnt = 1;
- rep_cnt = MarkScrollDownDisplay(rep_cnt);
- if (cy > D2W(fore->w_height-1))
- revto(cx, D2W(fore->w_height-1));
- else
- LGotoPos(flayer, cx, W2D(cy));
- break;
- case '@':
- /* it may be usefull to have a key that does nothing */
- break;
- case '%':
- rep_cnt--;
- /* rep_cnt is a percentage for the history buffer */
- if (rep_cnt < 0)
- rep_cnt = 0;
- if (rep_cnt > 100)
- rep_cnt = 100;
- revto_line(markdata->left_mar, (rep_cnt * (fore->w_histheight + fore->w_height)) / 100, (fore->w_height - 1) / 2);
- break;
- case 0201:
- case 'g':
- rep_cnt = 1;
- /* FALLTHROUGH */
- case 0205:
- case 'G':
- /* rep_cnt is here the WIN line number */
- if (rep_cnt == 0)
- rep_cnt = fore->w_histheight + fore->w_height;
- revto_line(markdata->left_mar, --rep_cnt, (fore->w_height - 1) / 2);
- break;
- case 'H':
- revto(markdata->left_mar, D2W(0));
- break;
- case 'M':
- revto(markdata->left_mar, D2W((fore->w_height - 1) / 2));
- break;
- case 'L':
- revto(markdata->left_mar, D2W(fore->w_height - 1));
- break;
- case '|':
- revto(--rep_cnt, cy);
- break;
- case 'w':
- if (rep_cnt == 0)
- rep_cnt = 1;
- nextword(&cx, &cy, NW_MUSTMOVE, rep_cnt);
- revto(cx, cy);
- break;
- case 'e':
- case 'E':
- if (rep_cnt == 0)
- rep_cnt = 1;
- nextword(&cx, &cy, NW_ENDOFWORD|NW_MUSTMOVE | (od == 'E' ? NW_BIG : 0), rep_cnt);
- revto(cx, cy);
- break;
- case 'b':
- case 'B':
- if (rep_cnt == 0)
- rep_cnt = 1;
- nextword(&cx, &cy, NW_BACK|NW_ENDOFWORD|NW_MUSTMOVE | (od == 'B' ? NW_BIG : 0), rep_cnt);
- revto(cx, cy);
- break;
- case 'a':
- markdata->append_mode = 1 - markdata->append_mode;
- debug1("append mode %d--\n", markdata->append_mode);
- LMsg(0, (markdata->append_mode) ? ":set append" : ":set noappend");
- break;
- case 'v':
- case 'V':
- /* this sets start column to column 9 for VI :set nu users */
- if (markdata->left_mar == 8)
- rep_cnt = 1;
- else
- rep_cnt = 9;
- /* FALLTHROUGH */
- case 'c':
- case 'C':
- /* set start column (c) and end column (C) */
- if (markdata->second)
- {
- rem(markdata->x1, markdata->y1, cx, cy, 1, (char *)0, fore->w_height-1); /* Hack */
- markdata->second = 1; /* rem turns off second */
- }
- rep_cnt--;
- if (rep_cnt < 0)
- rep_cnt = cx;
- if (od != 'C')
- {
- markdata->left_mar = rep_cnt;
- if (markdata->left_mar > markdata->right_mar)
- markdata->left_mar = markdata->right_mar;
- }
- else
- {
- markdata->right_mar = rep_cnt;
- if (markdata->left_mar > markdata->right_mar)
- markdata->right_mar = markdata->left_mar;
- }
- if (markdata->second)
- {
- markdata->cx = markdata->x1; markdata->cy = markdata->y1;
- revto(cx, cy);
- }
- if (od == 'v' || od == 'V')
- LMsg(0, (markdata->left_mar != 8) ? ":set nonu" : ":set nu");
- break;
- case 'J':
- /* how do you join lines in VI ? */
- markdata->nonl = (markdata->nonl + 1) % 4;
- switch (markdata->nonl)
- {
- case 0:
- if (join_with_cr)
- LMsg(0, "Multiple lines (CR/LF)");
- else
- LMsg(0, "Multiple lines (LF)");
- break;
- case 1:
- LMsg(0, "Lines joined");
- break;
- case 2:
- LMsg(0, "Lines joined with blanks");
- break;
- case 3:
- LMsg(0, "Lines joined with comma");
- break;
- }
- break;
- case '/':
- Search(1);
- in_mark = 0;
- break;
- case '?':
- Search(-1);
- in_mark = 0;
- break;
- case 'n':
- Search(0);
- break;
- case 'y':
- case 'Y':
- if (markdata->second == 0)
- {
- revto(linestart(cy), cy);
- markdata->second++;
- cx = markdata->x1 = markdata->cx;
- cy = markdata->y1 = markdata->cy;
- }
- if (--rep_cnt > 0)
- revto(cx, cy + rep_cnt);
- revto(lineend(markdata->cy), markdata->cy);
- if (od == 'y')
- break;
- /* FALLTHROUGH */
- case 'W':
- if (od == 'W')
- {
- if (rep_cnt == 0)
- rep_cnt = 1;
- if (!markdata->second)
- {
- nextword(&cx, &cy, NW_BACK|NW_ENDOFWORD, 1);
- revto(cx, cy);
- markdata->second++;
- cx = markdata->x1 = markdata->cx;
- cy = markdata->y1 = markdata->cy;
- }
- nextword(&cx, &cy, NW_ENDOFWORD, rep_cnt);
- revto(cx, cy);
- }
- cx = markdata->cx;
- cy = markdata->cy;
- /* FALLTHROUGH */
- case 'A':
- if (od == 'A')
- markdata->append_mode = 1;
- /* FALLTHROUGH */
- case '>':
- if (od == '>')
- markdata->write_buffer = 1;
- /* FALLTHROUGH */
- case ' ':
- case '\r':
- if (!markdata->second)
- {
- markdata->second++;
- markdata->x1 = cx;
- markdata->y1 = cy;
- revto(cx, cy);
- LMsg(0, "First mark set - Column %d Line %d", cx+1, W2D(cy)+1);
- break;
- }
- else
- {
- int append_mode = markdata->append_mode;
- int write_buffer = markdata->write_buffer;
-
- x2 = cx;
- y2 = cy;
- newcopylen = rem(markdata->x1, markdata->y1, x2, y2, 2, (char *)0, 0); /* count */
- if (md_user->u_plop.buf && !append_mode)
- UserFreeCopyBuffer(md_user);
- yend = fore->w_height - 1;
- if (fore->w_histheight - markdata->hist_offset < fore->w_height)
- {
- markdata->second = 0;
- yend -= MarkScrollUpDisplay(fore->w_histheight - markdata->hist_offset);
- }
- if (newcopylen > 0)
- {
- /* the +3 below is for : cr + lf + \0 */
- if (md_user->u_plop.buf)
- md_user->u_plop.buf = realloc(md_user->u_plop.buf,
- (unsigned) (md_user->u_plop.len + newcopylen + 3));
- else
- {
- md_user->u_plop.len = 0;
- md_user->u_plop.buf = malloc((unsigned) (newcopylen + 3));
- }
- if (!md_user->u_plop.buf)
- {
- MarkAbort();
- in_mark = 0;
- LMsg(0, "Not enough memory... Sorry.");
- md_user->u_plop.len = 0;
- md_user->u_plop.buf = 0;
- break;
- }
- if (append_mode)
- {
- switch (markdata->nonl)
- {
- /*
- * this code defines, what glues lines together
- */
- case 0:
- if (join_with_cr)
- {
- md_user->u_plop.buf[md_user->u_plop.len] = '\r';
- md_user->u_plop.len++;
- }
- md_user->u_plop.buf[md_user->u_plop.len] = '\n';
- md_user->u_plop.len++;
- break;
- case 1:
- break;
- case 2:
- md_user->u_plop.buf[md_user->u_plop.len] = ' ';
- md_user->u_plop.len++;
- break;
- case 3:
- md_user->u_plop.buf[md_user->u_plop.len] = ',';
- md_user->u_plop.len++;
- break;
- }
- }
- md_user->u_plop.len += rem(markdata->x1, markdata->y1, x2, y2,
- markdata->hist_offset == fore->w_histheight,
- md_user->u_plop.buf + md_user->u_plop.len, yend);
-#ifdef ENCODINGS
- md_user->u_plop.enc = fore->w_encoding;
-#endif
- }
- if (markdata->hist_offset != fore->w_histheight)
- {
- LAY_CALL_UP(LRefreshAll(flayer, 0));
- }
- ExitOverlayPage();
- if (append_mode)
- LMsg(0, "Appended %d characters to buffer",
- newcopylen);
- else
- LMsg(0, "Copied %d characters into buffer", md_user->u_plop.len);
- if (write_buffer)
- WriteFile(md_user, (char *)0, DUMP_EXCHANGE);
- in_mark = 0;
- break;
- }
- default:
- MarkAbort();
- LMsg(0, "Copy mode aborted");
- in_mark = 0;
- break;
- }
- if (in_mark) /* markdata may be freed */
- markdata->rep_cnt = 0;
- }
- if (in_mark)
- {
- flayer->l_x = markdata->cx;
- flayer->l_y = W2D(markdata->cy);
- }
- *inbufp = pt;
- *inlenp = inlen;
-}
-
-void revto(tx, ty)
-int tx, ty;
-{
- revto_line(tx, ty, -1);
-}
-
-/* tx, ty: WINDOW, line: DISPLAY */
-void revto_line(tx, ty, line)
-int tx, ty, line;
-{
- int fx, fy;
- int x, y, t, revst, reven, qq, ff, tt, st, en, ce = 0;
- int ystart = 0, yend = fore->w_height-1;
- int i, ry;
- unsigned char *wi;
- struct mline *ml;
- struct mchar mc;
-
- if (tx < 0)
- tx = 0;
- else if (tx > fore->w_width - 1)
- tx = fore->w_width -1;
- if (ty < 0)
- ty = 0;
- else if (ty > fore->w_histheight + fore->w_height - 1)
- ty = fore->w_histheight + fore->w_height - 1;
-
- fx = markdata->cx; fy = markdata->cy;
-
-#ifdef DW_CHARS
- /* don't just move inside of a kanji, the user wants to see something */
- ml = WIN(ty);
- if (ty == fy && fx + 1 == tx && dw_right(ml, tx, fore->w_encoding) && tx < D_width - 1)
- tx++;
- if (ty == fy && fx - 1 == tx && dw_right(ml, fx, fore->w_encoding) && tx)
- tx--;
-#endif
-
- markdata->cx = tx; markdata->cy = ty;
-
- /*
- * if we go to a position that is currently offscreen
- * then scroll the screen
- */
- i = 0;
- if (line >= 0 && line < fore->w_height)
- i = W2D(ty) - line;
- else if (ty < markdata->hist_offset)
- i = ty - markdata->hist_offset;
- else if (ty > markdata->hist_offset + (fore->w_height - 1))
- i = ty - markdata->hist_offset - (fore->w_height - 1);
- if (i > 0)
- yend -= MarkScrollUpDisplay(i);
- else if (i < 0)
- ystart += MarkScrollDownDisplay(-i);
-
- if (markdata->second == 0)
- {
- LGotoPos(flayer, tx, W2D(ty));
- return;
- }
-
- qq = markdata->x1 + markdata->y1 * fore->w_width;
- ff = fx + fy * fore->w_width; /* "from" offset in WIN coords */
- tt = tx + ty * fore->w_width; /* "to" offset in WIN coords*/
-
- if (ff > tt)
- {
- st = tt; en = ff;
- x = tx; y = ty;
- }
- else
- {
- st = ff; en = tt;
- x = fx; y = fy;
- }
- if (st > qq)
- {
- st++;
- x++;
- }
- if (en < qq)
- en--;
- if (tt > qq)
- {
- revst = qq; reven = tt;
- }
- else
- {
- revst = tt; reven = qq;
- }
- ry = y - markdata->hist_offset;
- if (ry < ystart)
- {
- y += (ystart - ry);
- x = 0;
- st = y * fore->w_width;
- ry = ystart;
- }
- ml = WIN(y);
- for (t = st; t <= en; t++, x++)
- {
- if (x >= fore->w_width)
- {
- x = 0;
- y++, ry++;
- ml = WIN(y);
- }
- if (ry > yend)
- break;
- if (t == st || x == 0)
- {
- wi = ml->image + fore->w_width;
- for (ce = fore->w_width; ce >= 0; ce--, wi--)
- if (*wi != ' ')
- break;
- }
- if (x <= ce && x >= markdata->left_mar && x <= markdata->right_mar)
- {
-#ifdef DW_CHARS
- if (dw_right(ml, x, fore->w_encoding))
- {
- if (t == revst)
- revst--;
- t--;
- x--;
- }
-#endif
- if (t >= revst && t <= reven)
- {
- mc = mchar_so;
-#ifdef FONT
- if (pastefont)
- mc.font = ml->font[x];
-#endif
- mc.image = ml->image[x];
- }
- else
- copy_mline2mchar(&mc, ml, x);
-#ifdef DW_CHARS
- if (dw_left(ml, x, fore->w_encoding))
- {
- mc.mbcs = ml->image[x + 1];
- LPutChar(flayer, &mc, x, W2D(y));
- t++;
- }
-#endif
- LPutChar(flayer, &mc, x, W2D(y));
-#ifdef DW_CHARS
- if (dw_left(ml, x, fore->w_encoding))
- x++;
-#endif
- }
- }
- LGotoPos(flayer, tx, W2D(ty));
-}
-
-static void
-MarkAbort()
-{
- int yend, redisp;
-
- debug("MarkAbort\n");
- markdata = (struct markdata *)flayer->l_data;
- fore = markdata->md_window;
- yend = fore->w_height - 1;
- redisp = markdata->second;
- if (fore->w_histheight - markdata->hist_offset < fore->w_height)
- {
- markdata->second = 0;
- yend -= MarkScrollUpDisplay(fore->w_histheight - markdata->hist_offset);
- }
- if (markdata->hist_offset != fore->w_histheight)
- {
- LAY_CALL_UP(LRefreshAll(flayer, 0));
- }
- else
- {
- rem(markdata->x1, markdata->y1, markdata->cx, markdata->cy, redisp, (char *)0, yend);
- }
- ExitOverlayPage();
-}
-
-
-static void
-MarkRedisplayLine(y, xs, xe, isblank)
-int y; /* NOTE: y is in DISPLAY coords system! */
-int xs, xe;
-int isblank;
-{
- int wy, x, i, rm;
- int sta, sto, cp; /* NOTE: these 3 are in WINDOW coords system */
- unsigned char *wi;
- struct mline *ml;
- struct mchar mchar_marked;
-
- if (y < 0) /* No special full page handling */
- return;
-
- markdata = (struct markdata *)flayer->l_data;
- fore = markdata->md_window;
-
- mchar_marked = mchar_so;
-
- wy = D2W(y);
- ml = WIN(wy);
-
- if (markdata->second == 0)
- {
- if (dw_right(ml, xs, fore->w_encoding) && xs > 0)
- xs--;
- if (dw_left(ml, xe, fore->w_encoding) && xe < fore->w_width - 1)
- xe++;
- if (xs == 0 && y > 0 && wy > 0 && WIN(wy - 1)->image[flayer->l_width] == 0)
- LCDisplayLineWrap(flayer, ml, y, xs, xe, isblank);
- else
- LCDisplayLine(flayer, ml, y, xs, xe, isblank);
- return;
- }
-
- sta = markdata->y1 * fore->w_width + markdata->x1;
- sto = markdata->cy * fore->w_width + markdata->cx;
- if (sta > sto)
- {
- i=sta; sta=sto; sto=i;
- }
- cp = wy * fore->w_width + xs;
-
- rm = markdata->right_mar;
- for (x = fore->w_width, wi = ml->image + fore->w_width; x >= 0; x--, wi--)
- if (*wi != ' ')
- break;
- if (x < rm)
- rm = x;
-
- for (x = xs; x <= xe; x++, cp++)
- if (cp >= sta && x >= markdata->left_mar)
- break;
-#ifdef DW_CHARS
- if (dw_right(ml, x, fore->w_encoding))
- x--;
-#endif
- if (x > xs)
- LCDisplayLine(flayer, ml, y, xs, x - 1, isblank);
- for (; x <= xe; x++, cp++)
- {
- if (cp > sto || x > rm)
- break;
-#ifdef FONT
- if (pastefont)
- mchar_marked.font = ml->font[x];
-#endif
- mchar_marked.image = ml->image[x];
-#ifdef DW_CHARS
- mchar_marked.mbcs = 0;
- if (dw_left(ml, x, fore->w_encoding))
- {
- mchar_marked.mbcs = ml->image[x + 1];
- cp++;
- }
-#endif
- LPutChar(flayer, &mchar_marked, x, y);
-#ifdef DW_CHARS
- if (dw_left(ml, x, fore->w_encoding))
- x++;
-#endif
- }
- if (x <= xe)
- LCDisplayLine(flayer, ml, y, x, xe, isblank);
-}
-
-
-/*
- * This ugly routine is to speed up GotoPos()
- */
-static int
-MarkRewrite(ry, xs, xe, rend, doit)
-int ry, xs, xe, doit;
-struct mchar *rend;
-{
- int dx, x, y, st, en, t, rm;
- unsigned char *i;
- struct mline *ml;
- struct mchar mchar_marked;
-
- mchar_marked = mchar_so;
-
- debug3("MarkRewrite %d, %d-%d\n", ry, xs, xe);
- markdata = (struct markdata *)flayer->l_data;
- fore = markdata->md_window;
- y = D2W(ry);
- ml = WIN(y);
-#ifdef UTF8
- if (fore->w_encoding && fore->w_encoding != UTF8 && D_encoding == UTF8 && ContainsSpecialDeffont(ml, xs, xe, fore->w_encoding))
- return EXPENSIVE;
-#endif
- dx = xe - xs + 1;
- if (doit)
- {
- i = ml->image + xs;
- while (dx--)
- PUTCHAR(*i++);
- return 0;
- }
-
- if (markdata->second == 0)
- st = en = -1;
- else
- {
- st = markdata->y1 * fore->w_width + markdata->x1;
- en = markdata->cy * fore->w_width + markdata->cx;
- if (st > en)
- {
- t = st; st = en; en = t;
- }
- }
- t = y * fore->w_width + xs;
- for (rm = fore->w_width, i = ml->image + fore->w_width; rm >= 0; rm--)
- if (*i-- != ' ')
- break;
- if (rm > markdata->right_mar)
- rm = markdata->right_mar;
- x = xs;
- while (dx--)
- {
- if (t >= st && t <= en && x >= markdata->left_mar && x <= rm)
- {
-#ifdef FONT
- if (pastefont)
- mchar_marked.font = ml->font[x];
-#endif
- rend->image = mchar_marked.image;
- if (!cmp_mchar(rend, &mchar_marked))
- return EXPENSIVE;
- }
- else
- {
- rend->image = ml->image[x];
- if (!cmp_mchar_mline(rend, ml, x))
- return EXPENSIVE;
- }
- x++;
- }
- return xe - xs + 1;
-}
-
-
-/*
- * scroll the screen contents up/down.
- */
-static int MarkScrollUpDisplay(n)
-int n;
-{
- int i;
-
- debug1("MarkScrollUpDisplay(%d)\n", n);
- if (n <= 0)
- return 0;
- if (n > fore->w_histheight - markdata->hist_offset)
- n = fore->w_histheight - markdata->hist_offset;
- markdata->hist_offset += n;
- i = (n < flayer->l_height) ? n : (flayer->l_height);
- LScrollV(flayer, i, 0, flayer->l_height - 1, 0);
- while (i-- > 0)
- MarkRedisplayLine(flayer->l_height - i - 1, 0, flayer->l_width - 1, 1);
- return n;
-}
-
-static int
-MarkScrollDownDisplay(n)
-int n;
-{
- int i;
-
- debug1("MarkScrollDownDisplay(%d)\n", n);
- if (n <= 0)
- return 0;
- if (n > markdata->hist_offset)
- n = markdata->hist_offset;
- markdata->hist_offset -= n;
- i = (n < flayer->l_height) ? n : (flayer->l_height);
- LScrollV(flayer, -i, 0, fore->w_height - 1, 0);
- while (i-- > 0)
- MarkRedisplayLine(i, 0, flayer->l_width - 1, 1);
- return n;
-}
-
-int
-InMark()
-{
- if (flayer && flayer->l_layfn == &MarkLf)
- return 1;
- return 0;
-}
-
-void
-MakePaster(pa, buf, len, bufiscopy)
-struct paster *pa;
-char *buf;
-int len;
-int bufiscopy;
-{
- FreePaster(pa);
- pa->pa_pasteptr = buf;
- pa->pa_pastelen = len;
- if (bufiscopy)
- pa->pa_pastebuf = buf;
- pa->pa_pastelayer = flayer;
- DoProcess(Layer2Window(flayer), &pa->pa_pasteptr, &pa->pa_pastelen, pa);
-}
-
-void
-FreePaster(pa)
-struct paster *pa;
-{
- if (pa->pa_pastebuf)
- free(pa->pa_pastebuf);
- pa->pa_pastebuf = 0;
- pa->pa_pasteptr = 0;
- pa->pa_pastelen = 0;
- pa->pa_pastelayer = 0;
- evdeq(&pa->pa_slowev);
-}
-
-#endif /* COPY_PASTE */
-
diff --git a/src/mark.h b/src/mark.h
deleted file mode 100644
index de35b9f..0000000
--- a/src/mark.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-struct markdata
-{
- struct win *md_window;/* pointer to window we are working on */
- struct acluser *md_user; /* The user who brought us up */
- int cx, cy; /* cursor Position in WIN coords*/
- int x1, y1; /* first mark in WIN coords */
- int second; /* first mark dropped flag */
- int left_mar, right_mar, nonl;
- int rep_cnt; /* number of repeats */
- int append_mode; /* shall we overwrite or append to copybuffer */
- int write_buffer; /* shall we do a KEY_WRITE_EXCHANGE right away? */
- int hist_offset; /* how many lines are on top of the screen */
- char isstr[100]; /* string we are searching for */
- int isstrl;
- char isistr[200]; /* string of chars user has typed */
- int isistrl;
- int isdir; /* current search direction */
- int isstartpos; /* position where isearch was started */
- int isstartdir; /* direction when isearch was started */
-};
-
-
-#define W2D(y) ((y) - markdata->hist_offset)
-#define D2W(y) ((y) + markdata->hist_offset)
-
diff --git a/src/misc.c b/src/misc.c
deleted file mode 100644
index 0ff7df8..0000000
--- a/src/misc.c
+++ /dev/null
@@ -1,798 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h> /* mkdir() declaration */
-#include <signal.h>
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#ifdef SVR4
-# include <sys/resource.h>
-#endif
-
-extern struct layer *flayer;
-
-extern int eff_uid, real_uid;
-extern int eff_gid, real_gid;
-extern struct mline mline_old;
-extern struct mchar mchar_blank;
-extern unsigned char *null, *blank;
-
-#ifdef HAVE_FDWALK
-static int close_func __P((void *, int));
-#endif
-
-char *
-SaveStr(str)
-register const char *str;
-{
- register char *cp;
-
- if ((cp = malloc(strlen(str) + 1)) == NULL)
- Panic(0, strnomem);
- else
- strcpy(cp, str);
- return cp;
-}
-
-char *
-SaveStrn(str, n)
-register const char *str;
-int n;
-{
- register char *cp;
-
- if ((cp = malloc(n + 1)) == NULL)
- Panic(0, strnomem);
- else
- {
- bcopy((char *)str, cp, n);
- cp[n] = 0;
- }
- return cp;
-}
-
-/* cheap strstr replacement */
-char *
-InStr(str, pat)
-char *str;
-const char *pat;
-{
- int npat = strlen(pat);
- for (;*str; str++)
- if (!strncmp(str, pat, npat))
- return str;
- return 0;
-}
-
-#ifndef HAVE_STRERROR
-char *
-strerror(err)
-int err;
-{
- extern int sys_nerr;
- extern char *sys_errlist[];
-
- static char er[20];
- if (err > 0 && err < sys_nerr)
- return sys_errlist[err];
- sprintf(er, "Error %d", err);
- return er;
-}
-#endif
-
-void
-centerline(str, y)
-char *str;
-int y;
-{
- int l, n;
-
- ASSERT(flayer);
- n = strlen(str);
- if (n > flayer->l_width - 1)
- n = flayer->l_width - 1;
- l = (flayer->l_width - 1 - n) / 2;
- LPutStr(flayer, str, n, &mchar_blank, l, y);
-}
-
-void
-leftline(str, y)
-char *str;
-int y;
-{
- int l, n;
- struct mchar mchar_dol;
-
- mchar_dol = mchar_blank;
- mchar_dol.image = '$';
-
- ASSERT(flayer);
- l = n = strlen(str);
- if (n > flayer->l_width - 1)
- n = flayer->l_width - 1;
- LPutStr(flayer, str, n, &mchar_blank, 0, y);
- if (n != l)
- LPutChar(flayer, &mchar_dol, n, y);
-}
-
-
-char *
-Filename(s)
-char *s;
-{
- register char *p = s;
-
- if (p)
- while (*p)
- if (*p++ == '/')
- s = p;
- return s;
-}
-
-char *
-stripdev(nam)
-char *nam;
-{
-#ifdef apollo
- char *p;
-
- if (nam == NULL)
- return NULL;
-# ifdef SVR4
- /* unixware has /dev/pts012 as synonym for /dev/pts/12 */
- if (!strncmp(nam, "/dev/pts", 8) && nam[8] >= '0' && nam[8] <= '9')
- {
- static char b[13];
- sprintf(b, "pts/%d", atoi(nam + 8));
- return b;
- }
-# endif /* SVR4 */
- if (p = strstr(nam,"/dev/"))
- return p + 5;
-#else /* apollo */
- if (nam == NULL)
- return NULL;
- if (strncmp(nam, "/dev/", 5) == 0)
- return nam + 5;
-#endif /* apollo */
- return nam;
-}
-
-
-/*
- * Signal handling
- */
-
-#ifdef POSIX
-sigret_t (*xsignal(sig, func))
-# ifndef __APPLE__
- __P(SIGPROTOARG)
-# else
-()
-# endif
-int sig;
-sigret_t (*func) __P(SIGPROTOARG);
-{
- struct sigaction osa, sa;
- sa.sa_handler = func;
- (void)sigemptyset(&sa.sa_mask);
-#ifdef SA_RESTART
- sa.sa_flags = (sig == SIGCHLD ? SA_RESTART : 0);
-#else
- sa.sa_flags = 0;
-#endif
- if (sigaction(sig, &sa, &osa))
- return (sigret_t (*)__P(SIGPROTOARG))-1;
- return osa.sa_handler;
-}
-
-#else
-# ifdef hpux
-/*
- * hpux has berkeley signal semantics if we use sigvector,
- * but not, if we use signal, so we define our own signal() routine.
- */
-void (*xsignal(sig, func)) __P(SIGPROTOARG)
-int sig;
-void (*func) __P(SIGPROTOARG);
-{
- struct sigvec osv, sv;
-
- sv.sv_handler = func;
- sv.sv_mask = sigmask(sig);
- sv.sv_flags = SV_BSDSIG;
- if (sigvector(sig, &sv, &osv) < 0)
- return (void (*)__P(SIGPROTOARG))(BADSIG);
- return osv.sv_handler;
-}
-# endif /* hpux */
-#endif /* POSIX */
-
-
-/*
- * uid/gid handling
- */
-
-#ifdef HAVE_SETEUID
-
-void
-xseteuid(euid)
-int euid;
-{
- if (seteuid(euid) == 0)
- return;
- seteuid(0);
- if (seteuid(euid))
- Panic(errno, "seteuid");
-}
-
-void
-xsetegid(egid)
-int egid;
-{
- if (setegid(egid))
- Panic(errno, "setegid");
-}
-
-#else /* HAVE_SETEUID */
-# ifdef HAVE_SETREUID
-
-void
-xseteuid(euid)
-int euid;
-{
- int oeuid;
-
- oeuid = geteuid();
- if (oeuid == euid)
- return;
- if ((int)getuid() != euid)
- oeuid = getuid();
- if (setreuid(oeuid, euid))
- Panic(errno, "setreuid");
-}
-
-void
-xsetegid(egid)
-int egid;
-{
- int oegid;
-
- oegid = getegid();
- if (oegid == egid)
- return;
- if ((int)getgid() != egid)
- oegid = getgid();
- if (setregid(oegid, egid))
- Panic(errno, "setregid");
-}
-
-# endif /* HAVE_SETREUID */
-#endif /* HAVE_SETEUID */
-
-
-
-#ifdef NEED_OWN_BCOPY
-void
-xbcopy(s1, s2, len)
-register char *s1, *s2;
-register int len;
-{
- if (s1 < s2 && s2 < s1 + len)
- {
- s1 += len;
- s2 += len;
- while (len-- > 0)
- *--s2 = *--s1;
- }
- else
- while (len-- > 0)
- *s2++ = *s1++;
-}
-#endif /* NEED_OWN_BCOPY */
-
-void
-bclear(p, n)
-char *p;
-int n;
-{
- bcopy((char *)blank, p, n);
-}
-
-
-void
-Kill(pid, sig)
-int pid, sig;
-{
- if (pid < 2)
- return;
- (void) kill(pid, sig);
-}
-
-#ifdef HAVE_FDWALK
-/*
- * Modern versions of Solaris include fdwalk(3c) which allows efficient
- * implementation of closing open descriptors; this is helpful because
- * the default file descriptor limit has risen to 65k.
- */
-static int
-close_func(cb_data, fd)
-void *cb_data;
-int fd;
-{
- int except = *(int *)cb_data;
- if (fd > 2 && fd != except)
- (void)close(fd);
- return (0);
-}
-
-void
-closeallfiles(except)
-int except;
-{
- (void)fdwalk(close_func, &except);
-}
-
-#else /* HAVE_FDWALK */
-
-void
-closeallfiles(except)
-int except;
-{
- int f;
-#ifdef SVR4
- struct rlimit rl;
-
- if ((getrlimit(RLIMIT_NOFILE, &rl) == 0) && rl.rlim_max != RLIM_INFINITY)
- f = rl.rlim_max;
- else
-#endif /* SVR4 */
-#if defined(SYSV) && defined(NOFILE) && !defined(ISC)
- f = NOFILE;
-#else /* SYSV && !ISC */
- f = getdtablesize();
-#endif /* SYSV && !ISC */
- while (--f > 2)
- if (f != except)
- close(f);
-}
-
-#endif /* HAVE_FDWALK */
-
-
-/*
- * Security - switch to real uid
- */
-
-#ifndef USE_SETEUID
-static int UserPID;
-static sigret_t (*Usersigcld)__P(SIGPROTOARG);
-#endif
-static int UserSTAT;
-
-int
-UserContext()
-{
-#ifndef USE_SETEUID
- if (eff_uid == real_uid && eff_gid == real_gid)
- return 1;
- Usersigcld = signal(SIGCHLD, SIG_DFL);
- debug("UserContext: forking.\n");
- switch (UserPID = fork())
- {
- case -1:
- Msg(errno, "fork");
- return -1;
- case 0:
- signal(SIGHUP, SIG_DFL);
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_DFL);
- signal(SIGTERM, SIG_DFL);
-# ifdef BSDJOBS
- signal(SIGTTIN, SIG_DFL);
- signal(SIGTTOU, SIG_DFL);
-# endif
- setuid(real_uid);
- setgid(real_gid);
- return 1;
- default:
- return 0;
- }
-#else
- xseteuid(real_uid);
- xsetegid(real_gid);
- return 1;
-#endif
-}
-
-void
-UserReturn(val)
-int val;
-{
-#ifndef USE_SETEUID
- if (eff_uid == real_uid && eff_gid == real_gid)
- UserSTAT = val;
- else
- _exit(val);
-#else
- xseteuid(eff_uid);
- xsetegid(eff_gid);
- UserSTAT = val;
-#endif
-}
-
-int
-UserStatus()
-{
-#ifndef USE_SETEUID
- int i;
-# ifdef BSDWAIT
- union wait wstat;
-# else
- int wstat;
-# endif
-
- if (eff_uid == real_uid && eff_gid == real_gid)
- return UserSTAT;
- if (UserPID < 0)
- return -1;
- while ((errno = 0, i = wait(&wstat)) != UserPID)
- if (i < 0 && errno != EINTR)
- break;
- (void) signal(SIGCHLD, Usersigcld);
- if (i == -1)
- return -1;
- return WEXITSTATUS(wstat);
-#else
- return UserSTAT;
-#endif
-}
-
-#ifndef HAVE_RENAME
-int
-rename (old, new)
-char *old;
-char *new;
-{
- if (link(old, new) < 0)
- return -1;
- return unlink(old);
-}
-#endif
-
-
-int
-AddXChar(buf, ch)
-char *buf;
-int ch;
-{
- char *p = buf;
-
- if (ch < ' ' || ch == 0x7f)
- {
- *p++ = '^';
- *p++ = ch ^ 0x40;
- }
- else if (ch >= 0x80)
- {
- *p++ = '\\';
- *p++ = (ch >> 6 & 7) + '0';
- *p++ = (ch >> 3 & 7) + '0';
- *p++ = (ch >> 0 & 7) + '0';
- }
- else
- *p++ = ch;
- return p - buf;
-}
-
-int
-AddXChars(buf, len, str)
-char *buf, *str;
-int len;
-{
- char *p;
-
- if (str == 0)
- {
- *buf = 0;
- return 0;
- }
- len -= 4; /* longest sequence produced by AddXChar() */
- for (p = buf; p < buf + len && *str; str++)
- {
- if (*str == ' ')
- *p++ = *str;
- else
- p += AddXChar(p, *str);
- }
- *p = 0;
- return p - buf;
-}
-
-
-#ifdef DEBUG
-void
-opendebug(new, shout)
-int new, shout;
-{
- char buf[256];
-
-#ifdef _MODE_T
- mode_t oumask = umask(0);
-#else
- int oumask = umask(0);
-#endif
-
- ASSERT(!dfp);
-
- (void) mkdir(DEBUGDIR, 0777);
- sprintf(buf, shout ? "%s/SCREEN.%d" : "%s/screen.%d", DEBUGDIR, getpid());
- if (!(dfp = fopen(buf, new ? "w" : "a")))
- dfp = stderr;
- else
- (void)chmod(buf, 0666);
-
- (void)umask(oumask);
- debug("opendebug: done.\n");
-}
-#endif /* DEBUG */
-
-void
-sleep1000(msec)
-int msec;
-
-{
- struct timeval t;
-
- t.tv_sec = (long) (msec / 1000);
- t.tv_usec = (long) ((msec % 1000) * 1000);
- select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
-}
-
-
-/*
- * This uses either setenv() or putenv(). If it is putenv() we cannot dare
- * to free the buffer after putenv(), unless it it the one found in putenv.c
- */
-void
-xsetenv(var, value)
-char *var;
-char *value;
-{
-#ifndef USESETENV
- char *buf;
- int l;
-
- if ((buf = (char *)malloc((l = strlen(var)) +
- strlen(value) + 2)) == NULL)
- {
- Msg(0, strnomem);
- return;
- }
- strcpy(buf, var);
- buf[l] = '=';
- strcpy(buf + l + 1, value);
- putenv(buf);
-# ifdef NEEDPUTENV
- /*
- * we use our own putenv(), knowing that it does a malloc()
- * the string space, we can free our buf now.
- */
- free(buf);
-# else /* NEEDSETENV */
- /*
- * For all sysv-ish systems that link a standard putenv()
- * the string-space buf is added to the environment and must not
- * be freed, or modified.
- * We are sorry to say that memory is lost here, when setting
- * the same variable again and again.
- */
-# endif /* NEEDSETENV */
-#else /* USESETENV */
-# if defined(linux) || defined(__convex__) || (BSD >= 199103)
- setenv(var, value, 1);
-# else
- setenv(var, value);
-# endif /* linux || convex || BSD >= 199103 */
-#endif /* USESETENV */
-}
-
-#ifdef TERMINFO
-/*
- * This is a replacement for the buggy _delay function from the termcap
- * emulation of libcurses, which ignores ospeed.
- */
-int
-_delay(delay, outc)
-register int delay;
-int (*outc) __P((int));
-{
- int pad;
- extern short ospeed;
- static short osp2pad[] = {
- 0,2000,1333,909,743,666,500,333,166,83,55,41,20,10,5,2,1,1
- };
-
- if (ospeed <= 0 || ospeed >= (int)(sizeof(osp2pad)/sizeof(*osp2pad)))
- return 0;
- pad =osp2pad[ospeed];
- delay = (delay + pad / 2) / pad;
- while (delay-- > 0)
- (*outc)(0);
- return 0;
-}
-
-# ifdef linux
-
-/* stupid stupid linux ncurses! It won't to padding with
- * zeros but sleeps instead. This breaks CalcCost, of course.
- * Also, the ncurses wait functions use a global variable
- * to store the current outc function. Oh well...
- */
-
-int (*save_outc) __P((int));
-
-# undef tputs
-
-void
-xtputs(str, affcnt, outc)
-char *str;
-int affcnt;
-int (*outc) __P((int));
-{
- extern int tputs __P((const char *, int, int (*)(int)));
- save_outc = outc;
- tputs(str, affcnt, outc);
-}
-
-int
-_nc_timed_wait(mode, ms, tlp)
-int mode, ms, *tlp;
-{
- _delay(ms * 10, save_outc);
- return 0;
-}
-
-# endif /* linux */
-
-#endif /* TERMINFO */
-
-
-
-#ifndef USEVARARGS
-
-# define xva_arg(s, t, tn) (*(t *)(s += xsnoff(tn, 0, 0), s - xsnoff(tn, 0, 0)))
-# define xva_list char *
-
-static int
-xsnoff(a, b, c)
-int a;
-char *b;
-int c;
-{
- return a ? (char *)&c - (char *)&b : (char *)&b - (char *)&a;
-}
-
-int
-xsnprintf(s, n, fmt, p1, p2, p3, p4, p5, p6)
-char *s;
-int n;
-char *fmt;
-unsigned long p1, p2, p3, p4, p5, p6;
-{
- int xvsnprintf __P((char *, int, char *, xva_list));
- return xvsnprintf(s, n, fmt, (char *)&fmt + xsnoff(1, 0, 0));
-}
-
-#else
-
-# define xva_arg(s, t, tn) va_arg(s, t)
-# define xva_list va_list
-
-#endif
-
-
-#if !defined(USEVARARGS) || !defined(HAVE_VSNPRINTF)
-
-int
-xvsnprintf(s, n, fmt, stack)
-char *s;
-int n;
-char *fmt;
-xva_list stack;
-{
- char *f, *sf = 0;
- int i, on, argl = 0;
- char myf[10], buf[20];
- char *arg, *myfp;
-
- on = n;
- f = fmt;
- arg = 0;
- while(arg || (sf = index(f, '%')) || (sf = f + strlen(f)))
- {
- if (arg == 0)
- {
- arg = f;
- argl = sf - f;
- }
- if (argl)
- {
- i = argl > n - 1 ? n - 1 : argl;
- strncpy(s, arg, i);
- s += i;
- n -= i;
- if (i < argl)
- {
- *s = 0;
- return on;
- }
- }
- arg = 0;
- if (sf == 0)
- continue;
- f = sf;
- sf = 0;
- if (!*f)
- break;
- myfp = myf;
- *myfp++ = *f++;
- while (((*f >= '0' && *f <='9') || *f == '#') && myfp - myf < 8)
- *myfp++ = *f++;
- *myfp++ = *f;
- *myfp = 0;
- if (!*f++)
- break;
- switch(f[-1])
- {
- case '%':
- arg = "%";
- break;
- case 'c':
- case 'o':
- case 'd':
- case 'x':
- i = xva_arg(stack, int, 0);
- sprintf(buf, myf, i);
- arg = buf;
- break;
- case 's':
- arg = xva_arg(stack, char *, 1);
- if (arg == 0)
- arg = "NULL";
- break;
- default:
- arg = "";
- break;
- }
- argl = strlen(arg);
- }
- *s = 0;
- return on - n;
-}
-
-#endif
diff --git a/src/nethack.c b/src/nethack.c
deleted file mode 100644
index 585dc43..0000000
--- a/src/nethack.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include "config.h"
-#include "screen.h"
-
-#ifdef NETHACK
-extern int nethackflag;
-#endif
-
-struct nlstrans {
- char *from;
- char *to;
-};
-
-#ifdef NETHACK
-static struct nlstrans nethacktrans[] = {
-{"Cannot lock terminal - fork failed",
- "Cannot fork terminal - lock failed"},
-{"Got only %d bytes from %s",
- "You choke on your food: %d bytes from %s"},
-{"Copy mode - Column %d Line %d(+%d) (%d,%d)",
- "Welcome to hacker's treasure zoo - Column %d Line %d(+%d) (%d,%d)"},
-{"First mark set - Column %d Line %d",
- "You drop a magic marker - Column %d Line %d"},
-{"Copy mode aborted",
- "You escaped the dungeon."},
-{"Filter removed.",
- "You have a sad feeling for a moment..."},
-{"Window %d (%s) killed.",
- "You destroy poor window %d (%s)."},
-{"Window %d (%s) is now being monitored for all activity.",
- "You feel like someone is watching you..."},
-{"Window %d (%s) is no longer being monitored for activity.",
- "You no longer sense the watcher's presence."},
-{"empty buffer",
- "Nothing happens."},
-{"switched to audible bell.",
- "Suddenly you can't see your bell!"},
-{"switched to visual bell.",
- "Your bell is no longer invisible."},
-{"The window is now being monitored for %d sec. silence.",
- "You feel like someone is waiting for %d sec. silence..."},
-{"The window is no longer being monitored for silence.",
- "You no longer sense the watcher's silence."},
-{"No other window.",
- "You cannot escape from window %d!"},
-{"Logfile \"%s\" closed.",
- "You put away your scroll of logging named \"%s\"." },
-{"Error opening logfile \"%s\"",
- "You don't seem to have a scroll of logging named \"%s\"."},
-{"Creating logfile \"%s\".",
- "You start writing on your scroll of logging named \"%s\"."},
-{"Appending to logfile \"%s\".",
- "You add to your scroll of logging named \"%s\"."},
-{"Detach aborted.",
- "The blast of disintegration whizzes by you!"},
-{"Empty register.",
- "Nothing happens."},
-{"[ Passwords don't match - checking turned off ]",
- "[ Passwords don't match - your armor crumbles away ]"},
-{"Aborted because of window size change.",
- "KAABLAMM!!! You triggered a land mine!"},
-{"Out of memory.",
- "Who was that Maude person anyway?"},
-{"getpwuid() can't identify your account!",
- "An alarm sounds through the dungeon...\nThe Keystone Kops are after you!"},
-{"Must be connected to a terminal.",
- "You must play from a terminal."},
-{"No Sockets found in %s.\n",
- "This room is empty (%s).\n"},
-{"New screen...",
- "Be careful! New screen tonight."},
-{"Child has been stopped, restarting.",
- "You regain consciousness."},
-{"There are screens on:",
- "Your inventory:"},
-{"There is a screen on:",
- "Your inventory:"},
-{"There are several screens on:",
- "Prove thyself worthy or perish:"},
-{"There is a suitable screen on:",
- "You see here a good looking screen:"},
-{"There are several suitable screens on:",
- "You may wish for a screen, what do you want?"},
-{"%d socket%s wiped out.",
- "You hear %d distant explosion%s."},
-{"Remove dead screens with 'screen -wipe'.",
- "The dead screen%s touch%s you. Try 'screen -wipe'."},
-{"Illegal reattach attempt from terminal %s.",
- "'%s' tries to touch your session, but fails."},
-{"Could not write %s",
- "%s is too hard to dig in"},
-{0, 0}
-};
-#endif
-
-char *
-DoNLS(from)
-char *from;
-{
-#ifdef NETHACK
- struct nlstrans *t;
-
- if (nethackflag)
- {
- for (t = nethacktrans; t->from; t++)
- if (strcmp(from, t->from) == 0)
- return t->to;
- }
-#endif
- return from;
-}
diff --git a/src/os.h b/src/os.h
deleted file mode 100644
index f4aa8fc..0000000
--- a/src/os.h
+++ /dev/null
@@ -1,533 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-#include <stdio.h>
-#include <errno.h>
-
-#include <sys/param.h>
-
-/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */
-#if defined(__hpux) && !defined(hpux)
-# define hpux
-#endif
-
-#if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux)
-# include <signal.h>
-#endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */
-
-#ifdef ISC
-# ifdef ENAMETOOLONG
-# undef ENAMETOOLONG
-# endif
-# ifdef ENOTEMPTY
-# undef ENOTEMPTY
-# endif
-# include <sys/bsdtypes.h>
-# include <net/errno.h>
-#endif
-
-#ifdef sun
-# define getpgrp __getpgrp
-# define exit __exit
-#endif
-#ifdef POSIX
-# include <unistd.h>
-# if defined(__STDC__)
-# include <stdlib.h>
-# endif /* __STDC__ */
-#endif /* POSIX */
-#ifdef sun
-# undef getpgrp
-# undef exit
-#endif /* sun */
-
-#ifndef linux /* all done in <errno.h> */
-extern int errno;
-#endif /* linux */
-#ifndef HAVE_STRERROR
-/* No macros, please */
-#undef strerror
-#endif
-
-#if !defined(SYSV) && !defined(linux)
-# ifdef NEWSOS
-# define strlen ___strlen___
-# include <strings.h>
-# undef strlen
-# else /* NEWSOS */
-# include <strings.h>
-# endif /* NEWSOS */
-#else /* SYSV */
-# if defined(SVR4) || defined(NEWSOS)
-# define strlen ___strlen___
-# include <string.h>
-# undef strlen
-# if !defined(NEWSOS) && !defined(__hpux)
- extern size_t strlen(const char *);
-# endif
-# else /* SVR4 */
-# include <string.h>
-# endif /* SVR4 */
-#endif /* SYSV */
-
-#ifdef USEVARARGS
-# if defined(__STDC__)
-# include <stdarg.h>
-# define VA_LIST(var) va_list var;
-# define VA_DOTS ...
-# define VA_DECL
-# define VA_START(ap, fmt) va_start(ap, fmt)
-# define VA_ARGS(ap) ap
-# define VA_END(ap) va_end(ap)
-# else
-# include <varargs.h>
-# define VA_LIST(var) va_list var;
-# define VA_DOTS va_alist
-# define VA_DECL va_dcl
-# define VA_START(ap, fmt) va_start(ap)
-# define VA_ARGS(ap) ap
-# define VA_END(ap) va_end(ap)
-# endif
-#else
-# define VA_LIST(var)
-# define VA_DOTS p1, p2, p3, p4, p5, p6
-# define VA_DECL unsigned long VA_DOTS;
-# define VA_START(ap, fmt)
-# define VA_ARGS(ap) VA_DOTS
-# define VA_END(ap)
-# undef vsnprintf
-# define vsnprintf xsnprintf
-#endif
-
-#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
-# include <time.h>
-#endif
-#include <sys/time.h>
-
-#ifdef M_UNIX /* SCO */
-# include <sys/stream.h>
-# include <sys/ptem.h>
-# define ftruncate(fd, s) chsize(fd, s)
-#endif
-
-#ifdef SYSV
-# define index strchr
-# define rindex strrchr
-# define bzero(poi,len) memset(poi,0,len)
-# define bcmp memcmp
-# define killpg(pgrp,sig) kill( -(pgrp), sig)
-#endif
-
-#ifndef HAVE_GETCWD
-# define getcwd(b,l) getwd(b)
-#endif
-
-#ifndef USEBCOPY
-# ifdef USEMEMMOVE
-# define bcopy(s,d,len) memmove(d,s,len)
-# else
-# ifdef USEMEMCPY
-# define bcopy(s,d,len) memcpy(d,s,len)
-# else
-# define NEED_OWN_BCOPY
-# define bcopy xbcopy
-# endif
-# endif
-#endif
-
-#ifdef hpux
-# define setreuid(ruid, euid) setresuid(ruid, euid, -1)
-# define setregid(rgid, egid) setresgid(rgid, egid, -1)
-#endif
-
-#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID)
-# define USE_SETEUID
-#endif
-
-#if !defined(HAVE__EXIT) && !defined(_exit)
-#define _exit(x) exit(x)
-#endif
-
-#ifndef HAVE_UTIMES
-# define utimes utime
-#endif
-#ifndef HAVE_VSNPRINTF
-# define vsnprintf xvsnprintf
-#endif
-
-#ifdef BUILTIN_TELNET
-# include <netinet/in.h>
-# include <arpa/inet.h>
-#endif
-
-#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME))
-# undef USE_LOCALE
-#endif
-
-/*****************************************************************
- * terminal handling
- */
-
-#ifdef POSIX
-# include <termios.h>
-# ifdef hpux
-# include <bsdtty.h>
-# endif /* hpux */
-# ifdef NCCS
-# define MAXCC NCCS
-# else
-# define MAXCC 256
-# endif
-#else /* POSIX */
-# ifdef TERMIO
-# include <termio.h>
-# ifdef NCC
-# define MAXCC NCC
-# else
-# define MAXCC 256
-# endif
-# ifdef CYTERMIO
-# include <cytermio.h>
-# endif
-# else /* TERMIO */
-# include <sgtty.h>
-# endif /* TERMIO */
-#endif /* POSIX */
-
-#ifndef VDISABLE
-# ifdef _POSIX_VDISABLE
-# define VDISABLE _POSIX_VDISABLE
-# else
-# define VDISABLE 0377
-# endif /* _POSIX_VDISABLE */
-#endif /* !VDISABLE */
-
-
-/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD)
- * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE)
- * to hold the whole packet at first read().
- * (Marc Boucher)
- *
- * matthew green:
- * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100
- *
- * Joe Traister: On AIX4, programs like irc won't work if screen
- * uses TIOCPKT (select fails to return on pty read).
- */
-#if defined(sgi) || defined(DGUX) || defined(_IBMR2)
-# undef TIOCPKT
-#endif
-
-/* linux ncurses is broken, we have to use our own tputs */
-#if defined(linux) && defined(TERMINFO)
-# define tputs xtputs
-#endif
-
-/* Alexandre Oliva: SVR4 style ptys don't work with osf */
-#ifdef __osf__
-# undef HAVE_SVR4_PTYS
-#endif
-
-/*****************************************************************
- * utmp handling
- */
-
-#ifdef GETUTENT
- typedef char *slot_t;
-#else
- typedef int slot_t;
-#endif
-
-#if defined(UTMPOK) || defined(BUGGYGETLOGIN)
-# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux)
-# include <utmpx.h>
-# define UTMPFILE UTMPX_FILE
-# define utmp utmpx
-# define getutent getutxent
-# define getutid getutxid
-# define getutline getutxline
-# define pututline pututxline
-# define setutent setutxent
-# define endutent endutxent
-# define ut_time ut_xtime
-# else /* SVR4 */
-# include <utmp.h>
-# endif /* SVR4 */
-# ifdef apollo
- /*
- * We don't have GETUTENT, so we dig into utmp ourselves.
- * But we save the permanent filedescriptor and
- * open utmp just when we need to.
- * This code supports an unsorted utmp. jw.
- */
-# define UTNOKEEP
-# endif /* apollo */
-
-# ifndef UTMPFILE
-# ifdef UTMP_FILE
-# define UTMPFILE UTMP_FILE
-# else
-# ifdef _PATH_UTMP
-# define UTMPFILE _PATH_UTMP
-# else
-# define UTMPFILE "/etc/utmp"
-# endif /* _PATH_UTMP */
-# endif
-# endif
-
-#endif /* UTMPOK || BUGGYGETLOGIN */
-
-#if !defined(UTMPOK) && defined(USRLIMIT)
-# undef USRLIMIT
-#endif
-
-#ifdef LOGOUTOK
-# ifndef LOGINDEFAULT
-# define LOGINDEFAULT 0
-# endif
-#else
-# ifdef LOGINDEFAULT
-# undef LOGINDEFAULT
-# endif
-# define LOGINDEFAULT 1
-#endif
-
-
-/*****************************************************************
- * file stuff
- */
-
-#ifndef F_OK
-#define F_OK 0
-#endif
-#ifndef X_OK
-#define X_OK 1
-#endif
-#ifndef W_OK
-#define W_OK 2
-#endif
-#ifndef R_OK
-#define R_OK 4
-#endif
-
-#ifndef S_IFIFO
-#define S_IFIFO 0010000
-#endif
-#ifndef S_IREAD
-#define S_IREAD 0000400
-#endif
-#ifndef S_IWRITE
-#define S_IWRITE 0000200
-#endif
-#ifndef S_IEXEC
-#define S_IEXEC 0000100
-#endif
-
-#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO)
-#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
-#endif
-#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK)
-#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
-#endif
-#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR)
-#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
-#endif
-#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR)
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-#endif
-#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK)
-#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
-#endif
-
-/*
- * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK:
- *
- * O_NONBLOCK Same as O_NDELAY above.
- *
- * on the very same SunOS 4.1.3, I traced the open system call and found
- * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked,
- * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through.
- *
- * For this simple reason I now favour O_NDELAY. jw. 4.5.95
- */
-#if defined(sun) && !defined(SVR4)
-# undef O_NONBLOCK
-#endif
-
-#if !defined(O_NONBLOCK) && defined(O_NDELAY)
-# define O_NONBLOCK O_NDELAY
-#endif
-
-#if !defined(FNBLOCK) && defined(FNONBLOCK)
-# define FNBLOCK FNONBLOCK
-#endif
-#if !defined(FNBLOCK) && defined(FNDELAY)
-# define FNBLOCK FNDELAY
-#endif
-#if !defined(FNBLOCK) && defined(O_NONBLOCK)
-# define FNBLOCK O_NONBLOCK
-#endif
-
-#ifndef POSIX
-#undef mkfifo
-#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0)
-#endif
-
-#if !defined(HAVE_LSTAT) && !defined(lstat)
-# define lstat stat
-#endif
-
-/*****************************************************************
- * signal handling
- */
-
-#ifdef SIGVOID
-# define SIGRETURN
-# define sigret_t void
-#else
-# define SIGRETURN return 0;
-# define sigret_t int
-#endif
-
-/* Geeeee, reverse it? */
-#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT)
-# define SIGHASARG
-#endif
-
-#ifdef SIGHASARG
-# define SIGPROTOARG (int)
-# define SIGDEFARG (sigsig) int sigsig;
-# define SIGARG 0
-#else
-# define SIGPROTOARG (void)
-# define SIGDEFARG ()
-# define SIGARG
-#endif
-
-#ifndef SIGCHLD
-#define SIGCHLD SIGCLD
-#endif
-
-#if defined(POSIX) || defined(hpux)
-# define signal xsignal
-#else
-# ifdef USESIGSET
-# define signal sigset
-# endif /* USESIGSET */
-#endif
-
-/* used in screen.c and attacher.c */
-#ifndef NSIG /* kbeal needs these w/o SYSV */
-# define NSIG 32
-#endif /* !NSIG */
-
-
-/*****************************************************************
- * Wait stuff
- */
-
-#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX)
-# include <sys/wait.h>
-#endif
-
-#ifndef WTERMSIG
-# ifndef BSDWAIT /* if wait is NOT a union: */
-# define WTERMSIG(status) (status & 0177)
-# else
-# define WTERMSIG(status) status.w_T.w_Termsig
-# endif
-#endif
-
-#ifndef WSTOPSIG
-# ifndef BSDWAIT /* if wait is NOT a union: */
-# define WSTOPSIG(status) ((status >> 8) & 0377)
-# else
-# define WSTOPSIG(status) status.w_S.w_Stopsig
-# endif
-#endif
-
-/* NET-2 uses WCOREDUMP */
-#if defined(WCOREDUMP) && !defined(WIFCORESIG)
-# define WIFCORESIG(status) WCOREDUMP(status)
-#endif
-
-#ifndef WIFCORESIG
-# ifndef BSDWAIT /* if wait is NOT a union: */
-# define WIFCORESIG(status) (status & 0200)
-# else
-# define WIFCORESIG(status) status.w_T.w_Coredump
-# endif
-#endif
-
-#ifndef WEXITSTATUS
-# ifndef BSDWAIT /* if wait is NOT a union: */
-# define WEXITSTATUS(status) ((status >> 8) & 0377)
-# else
-# define WEXITSTATUS(status) status.w_T.w_Retcode
-# endif
-#endif
-
-
-/*****************************************************************
- * select stuff
- */
-
-#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_)
-#include <sys/select.h> /* for timeval + FD... */
-#endif
-
-/*
- * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93
- * tschmidt@vax.micron.com
- */
-#ifndef FD_SET
-# ifndef SUNOS3
-typedef struct fd_set { int fds_bits[1]; } fd_set;
-# endif
-# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0)
-# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b))
-# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b))
-# define FD_SETSIZE 32
-#endif
-
-
-/*****************************************************************
- * user defineable stuff
- */
-
-#ifndef TERMCAP_BUFSIZE
-# define TERMCAP_BUFSIZE 2048
-#endif
-
-#ifndef MAXPATHLEN
-# define MAXPATHLEN 1024
-#endif
-
-/*
- * you may try to vary this value. Use low values if your (VMS) system
- * tends to choke when pasting. Use high values if you want to test
- * how many characters your pty's can buffer.
- */
-#define IOSIZE 4096
-
diff --git a/src/osdef.h.in b/src/osdef.h.in
deleted file mode 100644
index 1f9120c..0000000
--- a/src/osdef.h.in
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Copyright (c) 1993-2000
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-/****************************************************************
- * Thanks to Christos S. Zoulas (christos@ee.cornell.edu) who
- * mangled the screen source through 'gcc -Wall'.
- ****************************************************************
- */
-
-extern int printf __P((char *, ...));
-extern int fprintf __P((FILE *, char *, ...));
-extern int sprintf __P((char *, char *, ...));
-#ifdef USEVARARGS
-extern int vsprintf __P((char *, char *, char *));
-#endif
-
-#ifdef LOG_NOTICE
-extern int openlog __P((char *, int, int));
-extern int syslog __P((int, char *, ... ));
-extern int closelog __P((void));
-#endif
-
-#if defined(sun) || defined(_SEQUENT_)
-extern int _flsbuf __P((int, FILE *));
-#endif
-
-#ifdef SYSV
-extern char *strchr __P((char *, int));
-extern char *strrchr __P((char *, int));
-extern char *memset __P((char *, int, int));
-extern int memcmp __P((char *, char *, int));
-#else
-extern char *index __P((char *, int));
-extern char *rindex __P((char *, int));
-extern void bzero __P((char *, int));
-extern int bcmp __P((char *, char *, int));
-extern int killpg __P((int, int));
-#endif
-
-#ifndef USEBCOPY
-# ifdef USEMEMCPY
-extern void memcpy __P((char *, char *, int));
-# else
-# ifdef USEMEMMOVE
-extern void memmove __P((char *, char *, int));
-# else
-extern void bcopy __P((char *, char *, int));
-# endif
-# endif
-#else
-extern void bcopy __P((char *, char *, int));
-#endif
-
-#ifdef BSDWAIT
-struct rusage; /* for wait3 __P */
-union wait; /* for wait3 __P */
-extern int wait3 __P((union wait *, int, struct rusage *));
-#else
-extern int waitpid __P((int, int *, int));
-#endif
-
-extern int getdtablesize __P((void));
-
-#ifdef HAVE_SETREUID
-# ifdef hpux
-extern int setresuid __P((int, int, int));
-extern int setresgid __P((int, int, int));
-# else
-extern int setreuid __P((int, int));
-extern int setregid __P((int, int));
-# endif
-#endif
-#ifdef HAVE_SETEUID
-extern int seteuid __P((int));
-extern int setegid __P((int));
-#endif
-
-extern char *crypt __P((char *, char *));
-extern int putenv __P((char *));
-
-extern int tgetent __P((char *, char *));
-extern char *tgetstr __P((char *, char **));
-extern int tgetnum __P((char *));
-extern int tgetflag __P((char *));
-extern void tputs __P((char *, int, int (*)(int)));
-extern char *tgoto __P((char *, int, int));
-
-#ifdef POSIX
-extern int setsid __P((void));
-extern int setpgid __P((int, int));
-extern int tcsetpgrp __P((int, int));
-#endif
-extern int ioctl __P((int, int, char *));
-
-extern int kill __P((int, int));
-
-extern int getpid __P((void));
-extern int getuid __P((void));
-extern int geteuid __P((void));
-extern int getgid __P((void));
-extern int getegid __P((void));
-struct passwd; /* for getpwuid __P */
-extern struct passwd *getpwuid __P((int));
-extern struct passwd *getpwnam __P((char *));
-extern int isatty __P((int));
-extern int chown __P((char *, int, int));
-extern int rename __P((char *, char *));
-
-extern int gethostname __P((char *, int));
-extern int lseek __P((int, int, int));
-extern void exit __P((int));
-extern char *getwd __P((char *));
-extern char *getenv __P((char *));
-extern time_t time __P((time_t *));
-
-extern char *getpass __P((char *));
-extern char *getlogin __P((void));
-extern char *ttyname __P((int));
-
-extern int fputs __P((char *, FILE *));
-extern int fwrite __P((char *, int, int, FILE *));
-extern int fflush __P((FILE *));
-extern int fclose __P((FILE *));
-
-extern char *malloc __P((int));
-extern char *realloc __P((char *, int));
-extern void free __P((char *));
-
-#ifdef NAMEDPIPE
-extern int mknod __P((char *, int, int));
-#else
-struct sockaddr; /* for connect __P */
-extern int socket __P((int, int, int));
-extern int connect __P((int, struct sockaddr *, int));
-extern int bind __P((int, struct sockaddr *, int));
-extern int listen __P((int, int));
-extern int accept __P((int, struct sockaddr *, int *));
-#endif
-
-#if defined(UTMPOK) && defined(GETUTENT)
-extern void setutent __P((void));
-#endif
-
-#if defined(sequent) || defined(_SEQUENT_)
-extern int getpseudotty __P((char **, char **));
-#ifdef _SEQUENT_
-extern int fvhangup __P((char *));
-#endif
-#endif
-
-struct timeval; /* for select __P */
-extern int select __P((int, fd_set *, fd_set *, fd_set *, struct timeval *));
-#ifdef HAVE_UTIMES
-extern int utimes __P((char *, struct timeval *));
-#endif
-
-extern void unsetenv __P((char *));
-
-# if defined(GETTTYENT) && !defined(GETUTENT) && !defined(UTNOKEEP)
-struct ttyent; /* for getttyent __P */
-extern void setttyent __P((void));
-extern struct ttyent *getttyent __P((void));
-# endif
-
-#ifdef SVR4
-struct rlimit; /* for getrlimit __P */
-extern int getrlimit __P((int, struct rlimit *));
-#endif
-
-struct stat;
-extern int stat __P((char *, struct stat *));
-extern int lstat __P((char *, struct stat *));
-extern int fstat __P((int, struct stat *));
-extern int fchmod __P((int, int));
-extern int fchown __P((int, int, int));
-
-#if defined(LOADAV) && defined(LOADAV_GETLOADAVG)
-extern int getloadavg(double *, int);
-#endif
-
diff --git a/src/osdef.sh b/src/osdef.sh
deleted file mode 100644
index b281175..0000000
--- a/src/osdef.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-#! /bin/sh
-
-if test -z "$CPP"; then
- CPP="cc -E"
-fi
-if test -z "$srcdir"; then
- srcdir=.
-fi
-
-rm -f core*
-
-sed < $srcdir/osdef.h.in -n -e '/^extern/s@.*[)* ][)* ]*\([^ *]*\) __P.*@/[)*, ]\1[ (]/i\\\
-\\/\\[^a-zA-Z_\\]\1 __P\\/d@p' > osdef1.sed
-cat << EOF > osdef0.c
-#include "config.h"
-#include <sys/types.h>
-#include <stdio.h>
-#include <signal.h>
-#include <sys/stat.h>
-#include <pwd.h>
-#ifdef SHADOWPW
-#include <shadow.h>
-#endif
-#ifndef sun
-#include <sys/ioctl.h>
-#endif
-#ifdef linux
-#include <string.h>
-#include <stdlib.h>
-#endif
-#ifndef NAMEDPIPE
-#include <sys/socket.h>
-#endif
-#ifndef NOSYSLOG
-#include <syslog.h>
-#endif
-#include "os.h"
-#if defined(UTMPOK) && defined (GETTTYENT) && !defined(GETUTENT)
-#include <ttyent.h>
-#endif
-#ifdef SVR4
-# include <sys/resource.h>
-#endif
-EOF
-cat << EOF > osdef2.sed
-1i\\
-/*
-1i\\
- * This file is automagically created from osdef.sh -- DO NOT EDIT
-1i\\
- */
-EOF
-$CPP -I. -I$srcdir osdef0.c | sed -n -f osdef1.sed >> osdef2.sed
-sed -f osdef2.sed < $srcdir/osdef.h.in > osdef.h
-rm osdef0.c osdef1.sed osdef2.sed
-
-if test -f core*; then
- file core*
- echo " Sorry, your sed is broken. Call the system administrator."
- echo " Meanwhile, you may try to compile screen with an empty osdef.h file."
- echo " But if your compiler needs to have all functions declared, you should"
- echo " retry 'make' now and only remove offending lines from osdef.h later."
- exit 1
-fi
-if eval test "`diff osdef.h $srcdir/osdef.h.in | wc -l`" -eq 4; then
- echo " Hmm, sed is very pessimistic about your system header files."
- echo " But it did not dump core -- strange! Let's continue carefully..."
- echo " If this fails, you may want to remove offending lines from osdef.h"
- echo " or try with an empty osdef.h file, if your compiler can do without"
- echo " function declarations."
-fi
diff --git a/src/patchlevel.h b/src/patchlevel.h
deleted file mode 100644
index 3bc2517..0000000
--- a/src/patchlevel.h
+++ /dev/null
@@ -1,529 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-/****************************************************************
- *
- * patchlevel.h: Our life story.
- *
- * 08.07.91 -- 3.00.01 -wipe and a 'setenv TERM dumb' bugfix.
- * 17.07.91 -- 3.00.02 another patchlevel by Wayne Davison
- * 31.07.91 -- 3.00.03 E0, S0, C0 for flexible semi-graphics, nonblocking
- * window title input and 'C-a :' command input.
- * 10.08.91 -- 3.00.04 scrollback, markkeys and some bugfixes.
- * 13.08.91 -- 3.00.05 mark routine improved, ansi prototypes added.
- * 20.08.91 -- 3.00.06 screen -h, faster GotoPos in overlay, termcap %.
- * instead of %c
- * 28.08.91 -- 3.00.07 environment variable support. security. terminfo.
- * pyramid and ultrix support.
- * 07.09.91 -- 3.00.99 secopen(), MIPS support, SVR4 support.
- * 09.09.91 -- 3.01.00 backspace bug fixed.
- * 03.10.91 -- 3.01.01 ansi.c: null-ptr fixed, CLS now saves to scrollback.
- * Using setresuid on hpux. Memory leak fixed.
- * Better GotoPos(). Support for IC. Another resize bug.
- * Detach() w/o fore crashed. -T and -A(dapt) option.
- * GNU copyleft.
- * 19.12.91 -- 3.01.02 flow now really automatic (autoflow killed).
- * 7 bit restriction removed from WriteString().
- * 09.01.92 -- 3.01.03 flow reattach bug fixed. VDISCARD bug fixed.
- * 13.01.92 -- 3.01.04 new flow concept: ^Af toggles now three states
- * 21.01.92 -- 3.01.05 '^A:screen 11' bug fixed. aflag in DoScreen().
- * Some code cleanup. attach_tty and display_tty[]
- * added.
- * 26.01.92 -- 3.01.06 apollo support, "hardcopy_append on", "bufferfile",
- * SECURITY PROBLEM cleared..
- * 28.01.92 -- 3.01.07 screen after su allowed. Pid became part of
- * SockName. sysvish 14 character restriction considered.
- * 31.01.92 -- 3.02.00 Ultrix port, Irix 3.3 SGI port, shadow pw support,
- * data loss on stdin overflow fixed. "refresh off".
- * 12.02.92 -- 3.02.02 stripdev() moved, -S introduced, bufferfile improved,
- * ShellProg coredump cleared. SVR4 bugfixes.
- * I/O code speedup added.
- * 24.04.92 -- 3.02.03 perfectly stackable overlays. One scrollback per window,
- * not per display.
- * 05.05.92 -- 3.02.04 very nasty initialisation bug fixed.
- * 09.05.92 -- 3.02.05 parsing for $:cl: termcap strings and \012 octal notation
- * in screenrc file. More structuring. Detached startup
- * with 'screen -d -m -S...' bugfixed.
- * 11.05.92 -- 3.02.06 setreuid() bugs cleared, C-a : setenv added.
- * "xn" capability in TERMCAP needed since "am" is there.
- * 25.06.92 -- 3.02.07 The multi display test version. Have merci.
- * 15.07.92 -- 3.02.08 :B8: supports automatic charset switching for 8-bit
- * 26.09.92 -- 3.02.09 Ported to linux. Ignoring bad files in $SCREENDIR
- * 22.10.92 -- 3.02.10 screen.c/ansi.c splitted in several pieces.
- * Better ISearch. Cleanup of loadav.c
- * 29.10.92 -- 3.02.11 Key mechanism rewritten. New command names.
- * New iscreenrc syntax.
- * 02.11.92 -- 3.02.12 'bind g copy_reg' and 'bind x ins_reg' as suggested by
- * stillson@tsfsrv.mitre.org (Ken Stillson).
- * 03.11.92 -- 3.02.13 Ported to SunOs 4.1.2. Gulp. Some NULL ptrs fixed and
- * misc. braindamage fixed.
- * 03.11.92 -- 3.02.14 Argument number checking, AKA fixed.
- * 05.11.92 -- 3.02.15 Memory leaks in Detach() and KillWindow() fixed.
- * Lockprg powerdetaches on SIGHUP.
- * 12.11.92 -- 3.02.16 Introduced two new termcaps: "CS" and "CE".
- * (Switch cursorkeys in application mode)
- * Tim's async output patch.
- * Fixed an ugly bug in WriteString().
- * New command: 'process'
- * 16.11.92 -- 3.02.17 Nuking unsent tty output is now optional, (toxic
- * ESC radiation).
- * 30.11.92 -- 3.02.18 Lots of multi display bugs fixed. New layer
- * function 'Restore'. MULTIUSER code cleanup.
- * Rudimental acls added for multiuser.
- * No more error output, when output gives write errors.
- * 02.12.92 -- 3.02.19 BROKEN_PIPE and SOCK_NOT_IN_FS defines added for
- * braindead systems. Bug in recover socket code fixed.
- * Can create windows again from shell.
- * 22.12.92 -- 3.02.20 Made a superb configure script. STY and break fixed.
- * 01.02.93 -- 3.02.21 Coredump bug fixed: 8-bit output in background windows.
- * Console grabbing somewhat more useable.
- * 23.02.93 -- 3.02.22 Added ^:exec command, but not tested at all.
- * 23.02.93 -- 3.02.23 Added 'hardcopydir' and 'logdir' commands.
- * 11.03.93 -- 3.02.24 Prefixed display and window structure elements.
- * Screen now handles autowrapped lines correctly
- * in the redisplay and mark function.
- * 19.03.93 -- 3.03.00 Patched for BSD386. pseudos work.
- * 31.03.93 -- 3.03.01 Don't allocate so much empty attr and font lines.
- * 04.04.93 -- 3.03.02 fixed :exec !..| less and :|less, patched BELL_DONE &
- * ^B/^F. Fixed auto_nuke attribute resetting. Better linux
- * configure. ^AW shows '&' when window has other attacher.
- * MAXWIN > 10 patch. KEEP_UNDEF in config.h.in, shellaka
- * bug fixed. dec alpha port. Solaris port.
- * 02.05.93 -- 3.03.03 Configure tweaked for sgi. Update environment with
- * setenv command. Silence on|off, silencewait <sec>,
- * defautonuke commands added. Manual page updated.
- * 13.05.93 -- 3.03.04 exit in newsyntax script, finished _CX_UX port.
- * Texinfo page added by Jason Merrill. Much longish debug
- * output removed. Select window by title (or number).
- * 16.06.93 -- 3.04.00 Replaced ^A- by ^A^H to be complementary to ^A SPACE.
- * Moved into CVS. Yacc.
- * 28.06.93 -- 3.04.01 Fixed selecting windows with numeric title. Silence
- * now works without nethackoption set.
- * 01.07.93 -- 3.04.02 Implementing real acls.
- * 22.07.93 -- 3.05.00 Fixed SVR4, some multiuser bugs, -- DISTRIBUTED
- * 05.08.93 -- 3.05.01 ${srcdir} feature added. Shellprog bug fixed.
- * Motorola reattach bug fixed. Writelock bug fixed.
- * Copybuffer moved into struct acluser. Configure.in
- * uglified for Autoconf1.5. Paste may now have an
- * argument. Interactive setenv. Right margin bug
- * fixed. IRIX 5 patches. -- DISTRIBUTED
- * 13.08.93 -- 3.05.02 ultrix support added. expand_vars removed from
- * register function. Paste bug fixed.
- * sysmacros.h now included in pty.c on sgis
- * Strange hpux hack added for TTYCMP.
- * Zombie feature improved.
- * 08.09.93 -- 3.05.03 Makefile and OSF1 fine tuning. Eased attach to
- * multi sessions. Writelock now obeys acl write
- * permissions. UserDel() now preserves defaults.
- * acladd/aclchg syntax improved. Updated
- * documentation. Bug in at command fixed.
- * MakeWindow() now obeys perm defaults.
- * 03.10.93 -- 3.05.90 Multiple displays can now share the same window.
- * Layers now belong to Windows. "Select -" yields a blank
- * page. Debug output can be switched on/off at runtime.
- * Number command changes window number and utmp-slot.
- * 14.10.93 -- 3.05.91 Mechanism to find the "best" window added. Much
- * debugging done and still needed. Slowpaste setting now
- * per window. Preserving fore AND other window when
- * detached. Per user settings for `monitor' and `silence'.
- * New command `su'. BlankWindow performs now ColonInput.
- * History command fixed, it depended on paste code that
- * was previously changed to allow concatenation of buffers.
- * Fixing umask problem with WriteFile() reported by Jamie
- * Mason.
- * 30.11.93 -- 3.05.04 Kanji support added. New keymap feature:
- * bindkey and various map commands. GR and C1
- * flags now define the character processing.
- * 30.11.93 -- 3.05.92 Kanji support added. New keymap feature:
- * bindkey and various map commands. GR and C1
- * flags now define the character processing.
- * 17.12.93 -- 3.05.93 Tcon authentification mechanism. AddChar macro broken up
- * into 2 functions. Acl.c, network.c, misc.c, termcap.c
- * and tty.c are now display free!
- * 27.12.93 -- 3.05.94 Telnet login works, can export one window per mux.
- * Acl-groups added. Export rights is an acl.
- * connect works, can create shadow window thus import
- * command channel and switch windows. Can detach sessions
- * from each other. Can renumber imported and exported
- * windows. DL_LOOP prevents now SEGV, sessions have names
- * and can be connected to very flexible.
- * 03.01.94 -- 3.05.95 Import and export of any number of channels works,
- * except a small bug with margin handling when exporting.
- * Window titles are forwarded, break is forwarded and
- * tcon learned the mux protocoll. A few more bugs in
- * network.c fixed. Tcon has Mux arrays, Protocoll is '\0'
- * free.
- * 08.01.94 -- 3.05.96 More tcon work. Solaris debugging.
- *
- * 14.01.94 -- 3.05.05 New FindSocket() code. Nicer socket handling.
- * 20.01.94 -- 3.05.06 New attribute handling code. NeXT fixes.
- * 04.02.94 -- 3.05.07 Ugly bug in ScrollH fixed. Keymap defaults.
- * 10.03.94 -- 3.05.97 'defsilence' by Lloyd Zusman. Zombie resurrekt key.
- * -b, -p options. Fixed Compilekeys(), gulp. config.h
- * allows choice of VMIN/VTIME/NDELAY for ttys.
- * 13.04.94 -- 3.05.08 Kanji bug fixed. POSIX sigaction support.
- * os.h cleanup. UTNOKEEP splitted into
- * UT_CLOSE and UT_UNSORTED. linux no longer
- * implies UT_CLOSE. "struct display" name
- * convention change: _d_ to d_ and d_ to D_.
- * 20.04.94 -- 3.05.09 configure.in ptyrange bug fixed. Upgraded
- * to autoconf-1.8
- * 27.04.94 -- 3.05.10 97801 obscure code support. Linux long
- * password workaround.
- * 09.05.94 -- 3.05.11 seteuid() support added. Security fixes.
- * _IBMR2 kludge makes call to sleep obsolete.
- * Small fixes in uname() code. djm suggests replace of
- * BSDI by __bsdi__.
- * 27.07.94 -- 3.05.12 seteuid attacher bug fixed. ks/ke changed
- * in termcap/info and termcap.c
- * 01.09.94 -- 3.05.58 (There are a few more patches to come, subtracted 40)
- * breaktype command to select how we cause breaks.
- * Testing logfile.c. Manual and texinfo documentation
- * updated to explain all new commands except keymapping.
- * Added modem lines to info of plain ttys. Using
- * cfset{i,o}speed() for POSIX is better, much better.
- * 07.09.94 -- 3.05.59 Flushing logfiles every 5 seconds. Testing new
- * resize linewrap code. Resize with care.
- * Resurrect now displays its command string.
- * 11.09.94 -- 3.05.60 Lines are now correctly wrapped, when window size
- * changes; this prevents loss of text.
- * 15.09.94 -- 3.05.61 umask renamed to aclumask, bell renamed to bell_msg.
- * *_msg commands show message when called w/o parameter.
- * Many changes in the manual, thanks to Sven Guckes.
- * -O removed.
- * 27.09.94 -- 3.05.13 defwlock stupidity fixed. MakeTermcap ks/ke
- * ':' removed. Termcap entry improved.
- * copy_reg and ins_reg obsoleted by better paste command:
- * paste => paste .
- * copy_reg r => paste . r
- * ins_reg r => paste r
- * ins_reg => paste
- * 18.10.94 -- 3.05.62 breaktype changed. -L option added to enable logging
- * from both command line and screenrc. SIGXFSZ ignored.
- * 28.11.94 -- 3.05.63 ACL's sharpened. No user has any rights, unless
- * explicitly given. Only two exceptions: 1) "acladd user"
- * without further parameters. 2) Evry user has a default
- * umask that gives himself all permissions on the windows
- * he creates. Bug with colon input on shared windows fixed.
- * The commad is now executed by the user typing the final
- * Enter-Key rather by a random user.
- * 30.11.94 -- 3.05.64 On demand grabbing of pending auto writelocks.
- * Solaris troubles us with kill(pid, 0) ... not fixed...
- * defbreaktype added. (breaktype is also global, still...)
- * SIGARGHACK cleared, to pamper poor little Ultrix4.4 cfe.
- * defescape added.
- * w_status changed to w_hstatus, it's a #define in
- * Domain/OS reported by ejackson@iastate.edu.
- * 05.12.94 -- 3.05.17 SVR4 pty bug fixed, don't update window status
- * line if not changed, onyx support. Manual
- * pages updated.
- * 14.12.94 -- 3.05.18 w_status changed to w_hstatus, it's a #define in
- * Domain/OS reported by ejackson@iastate.edu.
- * Screen manpage patches by larry.
- * Ugly seteuid bug in ForkWindow() fixed.
- * 20.12.94 -- 3.06.00 Solaris has broken seteuid().
- * osf loadav patches. -- DISTRIBUTED
- * 08.01.95 -- 3.05.65 Bug with LOGOUTOK and -ln fixed. redundant secfopen()
- * avoided, when logfflush() looks at delayed nfs updates.
- * Option parser now allowes condensed options. -A fixed.
- * New commands 'preselect' and 'defpreselect'. New option
- * -WdmS starts a detached screen session with watchdog.
- * 16.01.95 -- 3.06.01 KANJI patch. doc/Makefile.in fixed.
- * Install now calls doc/Makefile install.
- * Don't use 'ds' too often, breaks MSkermit.
- * undef'd LOGOUTOK logs in now.
- * Ultrix is broken, too (seteuid).
- * Use \r (not \n) to join lines in pastebuf.
- * bindkey can now remove sequences.
- * InitTTY fixed for PLAIN. -- DISTRIBUTED
- * 06.02.95 -- 3.05.66 DisplayLine() does now clipping to reduce coredump-
- * frequency. Window size is adapted to the display that
- * types input, to reduce multi-user confusion. Scrollback
- * mode still may get the wrong size.
- * 07.02.95 -- 3.05.67 WinRewrite() also needs to clip. Users without unix
- * account, but with screen password allowed. Chacl
- * allows password change, su prompts for user name too.
- * 01.03.95 -- 3.05.68 Leaving a window may now cause a resize to match a
- * remaining display. Simple ESC-CR fix in the vt100
- * state machine.
- * 26.03.95 -- 3.05.69 Markroutine() needs to resize the window to avoid
- * coredumps, just like WinProcess() already does.
- * More NEED_ flags added in comm.c to avoid coredumps.
- * 04.04.95 -- 3.06.02 Simple ESC-CR fix in the vt100 state machine.
- * Now compiles again with all extras disabled.
- * Zombie resurrect added. defc1, defgr, defkanji
- * added. Screen now replies to a secondary DA
- * query. Some missing NEED_XXX added in comm.c.
- * Better default tty permissions/group test.
- * More AUX support, now compiles with POSIX.
- * Function keycodes xtermified (F11, F12).
- * Paste bug fixed (only worked with KANJI).
- * Check bcopy before memcpy/memmove.
- * FindSocket code much fixed & improved.
- * 10.04.95 -- 3.05.70 Display_displays() now shows the users permissions on
- * the currently displayed window, this is easier than a
- * full featured lsacl, but also helps. chacl can now copy
- * users, but we need to copy windows.
- * 26.04.95 -- 3.05.71 Multi digit screen numbers in utmp. MakeWindow() now
- * echoes what it does, just like RemakeWindow() when
- * 'verbose on' (default off).
- * `screen -ls myname/' will find own(!) non-multi sessions.
- * Command line option -q improved and documented.
- * 'debug off' also shuts attacher debugging off now.
- * 03.05.95 -- 3.05.72 'connect' command bugfixed. colon prompt improved.
- * open(O_NONBLOCK) does not work on 4.1.3, using O_NDELAY.
- * There are writes to exp_wid2chan[-1], XXX I just added
- * fillers to the mux structure, please debug this ASAP!
- * WindowByName() prefers exact matches now. Esc forwarding
- * from Frontend to Backend suppressed unless specified.
- * 26.06.95 -- 3.05.73 Improving the combination of dflag and rflag: If both
- * are set, a screen session is reattached, regardless
- * if it was previously detached or attached elseewhere.
- * "screen -D -RR" is thus most powerful: Give me my screen
- * session here and now. No matter, if this means creating
- * a new session (due to the second R without warning
- * message), detching the session first (and due to the
- * capitalised D logging out), or simply attaching to it.
- * 13.07.95 -- 3.05.74 Markroutine learned new join mode: comma seperated.
- * Can disable the detach feature from config.h.
- * Configure.in now calls etc/toolcheck. Password is no
- * longer a static array.
- * 30.07.95 -- 3.05.75 Karl Heuer wants to install with a relative symlink.
- * Command line option -k removed (try -t).
- * 31.08.95 -- 3.06.03 Color support, digraph command, code
- * cleanup (struct mchar/mline added).
- * 03.09.95 -- 3.06.04 SetRendition display check. Solaris unblock
- * SIGHUP. w_curchar->w_rend, lintified.
- * Shadow-password code moved and rewritten
- * (includes sun C2).
- * 06.09.95 -- 3.05.76 Added support for braille displays (by Hadi Bargi Rangin
- * and Bill Barry, {bargy,barryb}@dots.physics.orst.edu
- * Added baud, cs8, istrip, ixon, ixoff options for plain
- * tty windows. Untested.
- * 09.09.95 -- 3.07.99 Merged 3.7.76 back into the main distribution but
- * without network, blankwindow and dlist support.
- * Global variable Password removed.
- * Resize code completely rewritten.
- * New commands: sorendition, (def)charset.
- * strftime-like message generation.
- * 26.09.95 -- 3.06.05 resize code completely rewritten.
- * Very visible cursor added. vbell sequence
- * \Eb added. _delay for terminfo libs added
- * to make the padding work for the first time.
- * New ProcessInput() makes "command command"
- * work. '[def]escape ""' clears escape chars.
- * Changed logdir command to logfile. It now uses
- * MakeWinMsg() to create the filename.
- * Updated the manuals.
- * 03.10.95 -- 3.08.00 Merged 3.07.99 back into my 3.06.05.
- * pause removed. NONROOT now in config.h.
- * sysV68 configure test. Socket protocol got
- * revision number. New command termcapinfo.
- * Screenrcs, docs & configure.in updated
- * 18.10.95 -- 3.08.01 Info shows parser state.
- * Very visible cursor added. vbell sequence
- * \Eb added. _delay for terminfo libs added
- * to make the padding work for the first time.
- * Braille code almost completely reworked.
- * New ProcessInput() makes "command command"
- * work. '[def]escape ""' clears escape chars.
- * Command logdir -> logfile and uses MakeWinMsg.
- * Updated the manuals. New mark command 'x'.
- * stuff has new "-k" parameter.
- * 28.10.95 -- 3.06.06 Added new 'XC' capability to provide
- * a method for character translation.
- * 17.11.95 -- 3.07.00 Added CheckEscape() function.
- * acl -> acls because of hpux10 nameclash
- * /stand/vmunix added to kernel list (hpux10)
- * stripdev changed to translate
- * /dev/pts<n> to /dev/pts/<n> (unixware)
- * -lgen added to GETUTENT configure test.
- * 20.11.95 -- 3.07.01 corrected vbell null ptr reference.
- * -- DISTRIBUTED
- * 27.11.95 -- 3.08.02 Added CheckEscape() function.
- * acl -> acls because of hpux10 nameclash
- * /stand/vmunix added to kernel list (hpux10)
- * stripdev changed to translate
- * /dev/pts<n> to /dev/pts/<n> (unixware)
- * -lgen added to GETUTENT configure test.
- * corrected vbell null ptr reference
- * -- 3.08.03 etc/toolcheck is now shouting louder.
- * Solaris 2.5 has /kernel/genunix.
- * Touching socket when detach/attach.
- * FindWindow corrected. AIX4 patch
- * from robert@mayday.cix.co.uk.
- * 1.09.96 -- 3.07.02 added #ifdef MAPKEYS for CheckEscape.
- * etc/toolcheck is now shouting louder.
- * Touching socket when detach/attach.
- * Linux tcflush hack. Linux md5 password suport.
- * USE_SGR support for dumb (wyse) terminals.
- * "at" and "reset" commands improved.
- * Now sensitive to broken AIX4 TIOCPKT.
- * tek patch unapplied.
- * linux utmp patch: set slot to DEAD_PROCESS.
- * include signal.h for killpg if hpux10.10.
- * linux: elf, but no SVR4, check for utmpx.
- * hpux10.10 libcurses breaks select()!
- * -- DISTRIBUTED
- * 27.09.96 -- 3.07.03 ncurses tgetflag returns -1 if cap not valid.
- * autonuke fix: reset application mode. An init
- * string may have cleared it.
- * Small UTMPOK patch from Douglas B. Jones.
- * 23.06.97 -- 3.07.04 Some bugfixes. Kanji fixed.
- * Code update from 3.8.6: Colon line editing added.
- * Digraph made line-editing resistant.
- * DEC ALPHA ut_user[0] = 0;
- * Added error messages to exit_with_usage.
- * FindSocket code improved (the MULTIUSER part).
- * Use utimes() if available. Power-detached start.
- * vsnprintf() support. exit -> _exit in window.c.
- * AddXChars now tolerates NULL string.
- * -- DISTRIBUTED
- * 10.11.98 -- 3.07.05 Wayne's resize.c patch to keep the cursor
- * onscreen. FindWindow corrected. AIX4 patch
- * from robert@mayday.cix.co.uk.
- * Fixed kanji am & markcursor bugs.
- * SCO support (Gert Doering).
- * Wayne's statusline extra space. New flag nospc
- * for MakeWinMsg. New TF capability: add missing
- * termcap/info caps. screen-exchange security
- * fix. Use kstat for Solaris' loadavg.
- * Check for mode 775 if screen runs setgid.
- * Fixed typo in silence command.
- * Allow detach with no tty. HPUX10.20 ltchars
- * hack. Use @1/@7 as replacement for kh/kH.
- * Use seteuid before calling tgetent.
- * Check for displays in Msg().
- * Linux ncurses hack: redefine _nc_timed_wait.
- * Configure check for ncurses (sigh).
- * ITOH Yasufumi: kanji fixes, osf support,
- * bug fixes. More secure Rewrite().
- * Increased line buffer size to 2048 bytes.
- * SCO-5 Fixes (Brian L. Gentry).
- * 25.11.98 -- 3.07.06 resize code now handles tabs correctly.
- * -- DISTRIBUTED
- * -- 3.09.00 loads'o'bugs fixed, 3.8 merged with 3.7.
- * new region clip code.
- * Many new features (see NEWS file).
- * 3.08.99 -- 3.09.02 -- DISTRIBUTED
- * 11.08.99 -- 3.09.04 small utmp fix, BSD chflags fix, tty mode fix
- * -- DISTRIBUTED
- * 1.09.99 -- 3.09.05 linux SVR4_PTYS fixes, better ShowWindos(),
- * Panic() displays bug fixed, strerror fixed,
- * missing $srcdir & bad prefix in Makefiles.
- * console grabbing with SRIOCSREDIR.
- * linux utmp workaround added. Some KANJI bugs
- * fixed. Stupid StuffKey() bug fixed.
- * -- DISTRIBUTED
- * 24.07.00 -- 3.09.06 kanji fixes. lock escape char fix.
- * removed delayed message hack.
- * resize command & focus subcomands by joze.
- * fix for solaris' utmp_helper bug.
- * linux tty handling fix.
- * mousetracking, rxvt osc sequences.
- * background color erase support.
- * don't log user in after hangup.
- * hstatus escape update bug fixed.
- * 1.09.00 -- 3.09.08 -- DISTRIBUTED
- * 25.05.01 -- 3.09.09 use $DESTDIR in Makefiles.
- * renamed struct user to acluser to fix hpux
- * problem for good. utf8 support. 16 color
- * support. New -X option and escape sequence
- * to send screen commands.
- * New commands: attrcolor, defutf8, dinfo, utf8.
- * Extended commands: width, height, readbuf,
- * writebuf. Better nlist64 detection.
- * New config.h option SOCKDIR_IS_LOCAL_TO_HOST.
- * Don't call tputs with an empty string.
- * New string escape %{ for attr/color changes.
- * LRefreshAll bug fixed (0 instead of -1 as bce).
- * New quote handling in Parse(). Workaround for
- * some bad termcap/info entries added. Set BE
- * for all xtermish emulators. Added '0x' and
- * 'U+' prefix in digraph command. LOADAV_TYPE
- * detection fixed.
- * -- DISTRIBUTED
- * 4.09.01 -- 3.09.10 '-R' security fix. Fixed array in MScrollV().
- * -- DISTRIBUTED
- * Reset charset after 'me'.
- * 14.02.02 -- 3.09.11 Support for other encodings. Double width
- * utf-8 chars. 'L' modifier for %D, %M, %w
- * and %W. New %= (hfill), %H (hostname),
- * %f (flags), %F (focus) escapes. New commands
- * source, windowlist, deflog. Command key classes.
- * New login state: always. Time format
- * changeable. 256 color support.
- * Updated digraph table. Ignorecase.
- * Windowlist resizeable on blank window.
- * Added encoding to paste buffers.
- * Hpux loadtype detection fixed.
- * Disabled im/ic warning. Fixed a bug that
- * could cause window lockups in rare
- * circumstances. Made hangup signal to the
- * backend process detach all displays.
- * New escapes %< %>, + and - flag for %w.
- * Added eval command, added -h option to detach.
- * Also set flayer when processing -X commands.
- * use getpt() on linux systems. doc patches from
- * Adam Lazur. tty flow/intr cleanup.
- * -- DISTRIBUTED
- * 29.08.2002 3.09.12 Port to POSIX 1003.1-2001 hosts (Paul Eggert).
- * Fixed encoding for reattach password test.
- * Fixed NUL characters when encodings are active.
- * Fixed silly encodings bugs. Fixed bogus
- * oldflayer when a window gets freed.
- * Altscreen support by Gurusamy Sarathy.
- * Reuse old password in builtin_screenlock.
- * -- DISTRIBUTED
- * 05.09.2002 3.09.13 added missing break statement that broke
- * the eval command.
- * -- DISTRIBUTED
- * 13.03.2003 3.09.15 Console workaround for linux. Scrolling-region
- * reset fix. GBK encoding added.
- * support for unicode combining characters added.
- * openpty() support added (thomas@xs4all.nl).
- * preselect of blank window ('-') or window
- * list ('=') added. Added %` string escape
- * and backtick command.
- * -- DISTRIBUTED
- * 08.09.2003 4.00.00 rewrote nonblock command, added defnonblock.
- * added zmodem support (catch & passthrough).
- * added screenblanker.
- * fixed a couple of GBK bugs.
- * rewrote command parsing.
- * added -m option to windowlist (Felix Rosencrantz)
- * -- DISTRIBUTED
- * 18.09.2003 4.00.01 fixed two small bugs in the new parser.
- * -- DISTRIBUTED
- * 05.12.2003 4.00.02 fixed a bug in the ansi parser. fixed execs
- * on ttys. fixed hardstatus line on blanked screen.
- * -- DISTRIBUTED
- */
-
-#define ORIGIN "FAU"
-#define REV 4
-#define VERS 0
-#define PATCHLEVEL 2
-#define DATE "5-Dec-03"
-#define STATE ""
diff --git a/src/process.c b/src/process.c
deleted file mode 100644
index 7f1a6e1..0000000
--- a/src/process.c
+++ /dev/null
@@ -1,6220 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <fcntl.h>
-#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
-# include <time.h>
-#endif
-#include <sys/time.h>
-#ifndef sun
-#include <sys/ioctl.h>
-#endif
-
-
-#include "config.h"
-
-/* for solaris 2.1, Unixware (SVR4.2) and possibly others: */
-#ifdef SVR4
-# include <sys/stropts.h>
-#endif
-
-#include "screen.h"
-#include "extern.h"
-#include "logfile.h"
-
-extern struct comm comms[];
-extern char *rc_name;
-extern char *RcFileName, *home;
-extern char *BellString, *ActivityString, *ShellProg, *ShellArgs[];
-extern char *hstatusstring, *captionstring, *timestring;
-extern char *wliststr, *wlisttit;
-extern int captionalways;
-extern char *hardcopydir, *screenlogfile, *logtstamp_string;
-extern int log_flush, logtstamp_on, logtstamp_after;
-extern char *VisualBellString;
-extern int VBellWait, MsgWait, MsgMinWait, SilenceWait;
-extern char SockPath[], *SockName;
-extern int TtyMode, auto_detach, use_altscreen;
-extern int iflag, maxwin;
-extern int use_hardstatus, visual_bell;
-#ifdef COLOR
-extern int attr2color[][4];
-extern int nattr2color;
-#endif
-extern int hardstatusemu;
-extern char *printcmd;
-extern int default_startup;
-extern int defobuflimit;
-extern int defnonblock;
-extern int ZombieKey_destroy;
-extern int ZombieKey_resurrect;
-#ifdef AUTO_NUKE
-extern int defautonuke;
-#endif
-extern int separate_sids;
-extern struct NewWindow nwin_default, nwin_undef;
-#ifdef COPY_PASTE
-extern int join_with_cr;
-extern int compacthist;
-extern int search_ic;
-# ifdef FONT
-extern int pastefont;
-# endif
-extern unsigned char mark_key_tab[];
-extern char *BufferFile;
-#endif
-#ifdef POW_DETACH
-extern char *BufferFile, *PowDetachString;
-#endif
-#ifdef MULTIUSER
-extern struct acluser *EffectiveAclUser; /* acl.c */
-#endif
-extern struct term term[]; /* terminal capabilities */
-#ifdef MAPKEYS
-extern char *kmapdef[];
-extern char *kmapadef[];
-extern char *kmapmdef[];
-#endif
-extern struct mchar mchar_so, mchar_null;
-extern int VerboseCreate;
-#ifdef UTF8
-extern char *screenencodings;
-#endif
-
-static int CheckArgNum __P((int, char **));
-static void ClearAction __P((struct action *));
-static void SaveAction __P((struct action *, int, char **, int *));
-static int NextWindow __P((void));
-static int PreviousWindow __P((void));
-static int MoreWindows __P((void));
-static void LogToggle __P((int));
-static void ShowInfo __P((void));
-static void ShowDInfo __P((void));
-static struct win *WindowByName __P((char *));
-static int WindowByNumber __P((char *));
-static int ParseOnOff __P((struct action *, int *));
-static int ParseWinNum __P((struct action *, int *));
-static int ParseBase __P((struct action *, char *, int *, int, char *));
-static int ParseNum1000 __P((struct action *, int *));
-static char **SaveArgs __P((char **));
-static int IsNum __P((char *, int));
-static void Colonfin __P((char *, int, char *));
-static void InputSelect __P((void));
-static void InputSetenv __P((char *));
-static void InputAKA __P((void));
-#ifdef MULTIUSER
-static int InputSu __P((struct win *, struct acluser **, char *));
-static void su_fin __P((char *, int, char *));
-#endif
-static void AKAfin __P((char *, int, char *));
-#ifdef COPY_PASTE
-static void copy_reg_fn __P((char *, int, char *));
-static void ins_reg_fn __P((char *, int, char *));
-#endif
-static void process_fn __P((char *, int, char *));
-#ifdef PASSWORD
-static void pass1 __P((char *, int, char *));
-static void pass2 __P((char *, int, char *));
-#endif
-#ifdef POW_DETACH
-static void pow_detach_fn __P((char *, int, char *));
-#endif
-static void digraph_fn __P((char *, int, char *));
-static void confirm_fn __P((char *, int, char *));
-static int IsOnDisplay __P((struct win *));
-static void ResizeRegions __P((char*));
-static void ResizeFin __P((char *, int, char *));
-static struct action *FindKtab __P((char *, int));
-
-
-extern struct layer *flayer;
-extern struct display *display, *displays;
-extern struct win *fore, *console_window, *windows;
-extern struct acluser *users;
-
-extern char screenterm[], HostName[], version[];
-extern struct NewWindow nwin_undef, nwin_default;
-extern struct LayFuncs WinLf;
-
-extern int Z0width, Z1width;
-extern int real_uid, real_gid;
-
-#ifdef NETHACK
-extern int nethackflag;
-#endif
-
-
-struct win *wtab[MAXWIN]; /* window table, should be dynamic */
-
-#ifdef MULTIUSER
-extern char *multi;
-extern int maxusercount;
-#endif
-char NullStr[] = "";
-
-struct plop plop_tab[MAX_PLOP_DEFS];
-
-#ifndef PTYMODE
-# define PTYMODE 0622
-#endif
-
-int TtyMode = PTYMODE;
-int hardcopy_append = 0;
-int all_norefresh = 0;
-#ifdef ZMODEM
-int zmodem_mode = 0;
-char *zmodem_sendcmd;
-char *zmodem_recvcmd;
-static char *zmodes[4] = {"off", "auto", "catch", "pass"};
-#endif
-
-int idletimo;
-struct action idleaction;
-#ifdef BLANKER_PRG
-char **blankerprg;
-#endif
-
-struct action ktab[256]; /* command key translation table */
-struct kclass {
- struct kclass *next;
- char *name;
- struct action ktab[256];
-};
-struct kclass *kclasses;
-
-#ifdef MAPKEYS
-struct action umtab[KMAP_KEYS+KMAP_AKEYS];
-struct action dmtab[KMAP_KEYS+KMAP_AKEYS];
-struct action mmtab[KMAP_KEYS+KMAP_AKEYS];
-struct kmap_ext *kmap_exts;
-int kmap_extn;
-static int maptimeout = 300;
-#endif
-
-
-/* digraph table taken from old vim and rfc1345 */
-static const unsigned char digraphs[][3] = {
- {' ', ' ', 160}, /*   */
- {'N', 'S', 160}, /*   */
- {'~', '!', 161}, /* ¡ */
- {'!', '!', 161}, /* ¡ */
- {'!', 'I', 161}, /* ¡ */
- {'c', '|', 162}, /* ¢ */
- {'c', 't', 162}, /* ¢ */
- {'$', '$', 163}, /* £ */
- {'P', 'd', 163}, /* £ */
- {'o', 'x', 164}, /* ¤ */
- {'C', 'u', 164}, /* ¤ */
- {'C', 'u', 164}, /* ¤ */
- {'E', 'u', 164}, /* ¤ */
- {'Y', '-', 165}, /* ¥ */
- {'Y', 'e', 165}, /* ¥ */
- {'|', '|', 166}, /* ¦ */
- {'B', 'B', 166}, /* ¦ */
- {'p', 'a', 167}, /* § */
- {'S', 'E', 167}, /* § */
- {'"', '"', 168}, /* ¨ */
- {'\'', ':', 168}, /* ¨ */
- {'c', 'O', 169}, /* © */
- {'C', 'o', 169}, /* © */
- {'a', '-', 170}, /* ª */
- {'<', '<', 171}, /* « */
- {'-', ',', 172}, /* ¬ */
- {'N', 'O', 172}, /* ¬ */
- {'-', '-', 173}, /* ­ */
- {'r', 'O', 174}, /* ® */
- {'R', 'g', 174}, /* ® */
- {'-', '=', 175}, /* ¯ */
- {'\'', 'm', 175}, /* ¯ */
- {'~', 'o', 176}, /* ° */
- {'D', 'G', 176}, /* ° */
- {'+', '-', 177}, /* ± */
- {'2', '2', 178}, /* ² */
- {'2', 'S', 178}, /* ² */
- {'3', '3', 179}, /* ³ */
- {'3', 'S', 179}, /* ³ */
- {'\'', '\'', 180}, /* ´ */
- {'j', 'u', 181}, /* µ */
- {'M', 'y', 181}, /* µ */
- {'p', 'p', 182}, /* ¶ */
- {'P', 'I', 182}, /* ¶ */
- {'~', '.', 183}, /* · */
- {'.', 'M', 183}, /* · */
- {',', ',', 184}, /* ¸ */
- {'\'', ',', 184}, /* ¸ */
- {'1', '1', 185}, /* ¹ */
- {'1', 'S', 185}, /* ¹ */
- {'o', '-', 186}, /* º */
- {'>', '>', 187}, /* » */
- {'1', '4', 188}, /* ¼ */
- {'1', '2', 189}, /* ½ */
- {'3', '4', 190}, /* ¾ */
- {'~', '?', 191}, /* ¿ */
- {'?', '?', 191}, /* ¿ */
- {'?', 'I', 191}, /* ¿ */
- {'A', '`', 192}, /* À */
- {'A', '!', 192}, /* À */
- {'A', '\'', 193}, /* Á */
- {'A', '^', 194}, /* Â */
- {'A', '>', 194}, /* Â */
- {'A', '~', 195}, /* Ã */
- {'A', '?', 195}, /* Ã */
- {'A', '"', 196}, /* Ä */
- {'A', ':', 196}, /* Ä */
- {'A', '@', 197}, /* Å */
- {'A', 'A', 197}, /* Å */
- {'A', 'E', 198}, /* Æ */
- {'C', ',', 199}, /* Ç */
- {'E', '`', 200}, /* È */
- {'E', '!', 200}, /* È */
- {'E', '\'', 201}, /* É */
- {'E', '^', 202}, /* Ê */
- {'E', '>', 202}, /* Ê */
- {'E', '"', 203}, /* Ë */
- {'E', ':', 203}, /* Ë */
- {'I', '`', 204}, /* Ì */
- {'I', '!', 204}, /* Ì */
- {'I', '\'', 205}, /* Í */
- {'I', '^', 206}, /* Î */
- {'I', '>', 206}, /* Î */
- {'I', '"', 207}, /* Ï */
- {'I', ':', 207}, /* Ï */
- {'D', '-', 208}, /* Ð */
- {'N', '~', 209}, /* Ñ */
- {'N', '?', 209}, /* Ñ */
- {'O', '`', 210}, /* Ò */
- {'O', '!', 210}, /* Ò */
- {'O', '\'', 211}, /* Ó */
- {'O', '^', 212}, /* Ô */
- {'O', '>', 212}, /* Ô */
- {'O', '~', 213}, /* Õ */
- {'O', '?', 213}, /* Õ */
- {'O', '"', 214}, /* Ö */
- {'O', ':', 214}, /* Ö */
- {'/', '\\', 215}, /* × */
- {'*', 'x', 215}, /* × */
- {'O', '/', 216}, /* Ø */
- {'U', '`', 217}, /* Ù */
- {'U', '!', 217}, /* Ù */
- {'U', '\'', 218}, /* Ú */
- {'U', '^', 219}, /* Û */
- {'U', '>', 219}, /* Û */
- {'U', '"', 220}, /* Ü */
- {'U', ':', 220}, /* Ü */
- {'Y', '\'', 221}, /* Ý */
- {'I', 'p', 222}, /* Þ */
- {'T', 'H', 222}, /* Þ */
- {'s', 's', 223}, /* ß */
- {'s', '"', 223}, /* ß */
- {'a', '`', 224}, /* à */
- {'a', '!', 224}, /* à */
- {'a', '\'', 225}, /* á */
- {'a', '^', 226}, /* â */
- {'a', '>', 226}, /* â */
- {'a', '~', 227}, /* ã */
- {'a', '?', 227}, /* ã */
- {'a', '"', 228}, /* ä */
- {'a', ':', 228}, /* ä */
- {'a', 'a', 229}, /* å */
- {'a', 'e', 230}, /* æ */
- {'c', ',', 231}, /* ç */
- {'e', '`', 232}, /* è */
- {'e', '!', 232}, /* è */
- {'e', '\'', 233}, /* é */
- {'e', '^', 234}, /* ê */
- {'e', '>', 234}, /* ê */
- {'e', '"', 235}, /* ë */
- {'e', ':', 235}, /* ë */
- {'i', '`', 236}, /* ì */
- {'i', '!', 236}, /* ì */
- {'i', '\'', 237}, /* í */
- {'i', '^', 238}, /* î */
- {'i', '>', 238}, /* î */
- {'i', '"', 239}, /* ï */
- {'i', ':', 239}, /* ï */
- {'d', '-', 240}, /* ð */
- {'n', '~', 241}, /* ñ */
- {'n', '?', 241}, /* ñ */
- {'o', '`', 242}, /* ò */
- {'o', '!', 242}, /* ò */
- {'o', '\'', 243}, /* ó */
- {'o', '^', 244}, /* ô */
- {'o', '>', 244}, /* ô */
- {'o', '~', 245}, /* õ */
- {'o', '?', 245}, /* õ */
- {'o', '"', 246}, /* ö */
- {'o', ':', 246}, /* ö */
- {':', '-', 247}, /* ÷ */
- {'o', '/', 248}, /* ø */
- {'u', '`', 249}, /* ù */
- {'u', '!', 249}, /* ù */
- {'u', '\'', 250}, /* ú */
- {'u', '^', 251}, /* û */
- {'u', '>', 251}, /* û */
- {'u', '"', 252}, /* ü */
- {'u', ':', 252}, /* ü */
- {'y', '\'', 253}, /* ý */
- {'i', 'p', 254}, /* þ */
- {'t', 'h', 254}, /* þ */
- {'y', '"', 255}, /* ÿ */
- {'y', ':', 255}, /* ÿ */
- {'"', '[', 196}, /* Ä */
- {'"', '\\', 214}, /* Ö */
- {'"', ']', 220}, /* Ü */
- {'"', '{', 228}, /* ä */
- {'"', '|', 246}, /* ö */
- {'"', '}', 252}, /* ü */
- {'"', '~', 223} /* ß */
-};
-
-
-char *noargs[1];
-
-void
-InitKeytab()
-{
- register unsigned int i;
-#ifdef MAPKEYS
- char *argarr[2];
-#endif
-
- for (i = 0; i < sizeof(ktab)/sizeof(*ktab); i++)
- {
- ktab[i].nr = RC_ILLEGAL;
- ktab[i].args = noargs;
- ktab[i].argl = 0;
- }
-#ifdef MAPKEYS
- for (i = 0; i < KMAP_KEYS+KMAP_AKEYS; i++)
- {
- umtab[i].nr = RC_ILLEGAL;
- umtab[i].args = noargs;
- umtab[i].argl = 0;
- dmtab[i].nr = RC_ILLEGAL;
- dmtab[i].args = noargs;
- dmtab[i].argl = 0;
- mmtab[i].nr = RC_ILLEGAL;
- mmtab[i].args = noargs;
- mmtab[i].argl = 0;
- }
- argarr[1] = 0;
- for (i = 0; i < NKMAPDEF; i++)
- {
- if (i + KMAPDEFSTART < T_CAPS)
- continue;
- if (i + KMAPDEFSTART >= T_CAPS + KMAP_KEYS)
- continue;
- if (kmapdef[i] == 0)
- continue;
- argarr[0] = kmapdef[i];
- SaveAction(dmtab + i + (KMAPDEFSTART - T_CAPS), RC_STUFF, argarr, 0);
- }
- for (i = 0; i < NKMAPADEF; i++)
- {
- if (i + KMAPADEFSTART < T_CURSOR)
- continue;
- if (i + KMAPADEFSTART >= T_CURSOR + KMAP_AKEYS)
- continue;
- if (kmapadef[i] == 0)
- continue;
- argarr[0] = kmapadef[i];
- SaveAction(dmtab + i + (KMAPADEFSTART - T_CURSOR + KMAP_KEYS), RC_STUFF, argarr, 0);
- }
- for (i = 0; i < NKMAPMDEF; i++)
- {
- if (i + KMAPMDEFSTART < T_CAPS)
- continue;
- if (i + KMAPMDEFSTART >= T_CAPS + KMAP_KEYS)
- continue;
- if (kmapmdef[i] == 0)
- continue;
- argarr[0] = kmapmdef[i];
- argarr[1] = 0;
- SaveAction(mmtab + i + (KMAPMDEFSTART - T_CAPS), RC_STUFF, argarr, 0);
- }
-#endif
-
- ktab['h'].nr = RC_HARDCOPY;
-#ifdef BSDJOBS
- ktab['z'].nr = ktab[Ctrl('z')].nr = RC_SUSPEND;
-#endif
- ktab['c'].nr = ktab[Ctrl('c')].nr = RC_SCREEN;
- ktab[' '].nr = ktab[Ctrl(' ')].nr =
- ktab['n'].nr = ktab[Ctrl('n')].nr = RC_NEXT;
- ktab['N'].nr = RC_NUMBER;
- ktab[Ctrl('h')].nr = ktab[0177].nr = ktab['p'].nr = ktab[Ctrl('p')].nr = RC_PREV;
- ktab['k'].nr = ktab[Ctrl('k')].nr = RC_KILL;
- ktab['l'].nr = ktab[Ctrl('l')].nr = RC_REDISPLAY;
- ktab['w'].nr = ktab[Ctrl('w')].nr = RC_WINDOWS;
- ktab['v'].nr = RC_VERSION;
- ktab[Ctrl('v')].nr = RC_DIGRAPH;
- ktab['q'].nr = ktab[Ctrl('q')].nr = RC_XON;
- ktab['s'].nr = ktab[Ctrl('s')].nr = RC_XOFF;
- ktab['t'].nr = ktab[Ctrl('t')].nr = RC_TIME;
- ktab['i'].nr = ktab[Ctrl('i')].nr = RC_INFO;
- ktab['m'].nr = ktab[Ctrl('m')].nr = RC_LASTMSG;
- ktab['A'].nr = RC_TITLE;
-#if defined(UTMPOK) && defined(LOGOUTOK)
- ktab['L'].nr = RC_LOGIN;
-#endif
- ktab[','].nr = RC_LICENSE;
- ktab['W'].nr = RC_WIDTH;
- ktab['.'].nr = RC_DUMPTERMCAP;
- ktab[Ctrl('\\')].nr = RC_QUIT;
-#ifdef DETACH
- ktab['d'].nr = ktab[Ctrl('d')].nr = RC_DETACH;
-# ifdef POW_DETACH
- ktab['D'].nr = RC_POW_DETACH;
-# endif
-#endif
- ktab['r'].nr = ktab[Ctrl('r')].nr = RC_WRAP;
- ktab['f'].nr = ktab[Ctrl('f')].nr = RC_FLOW;
- ktab['C'].nr = RC_CLEAR;
- ktab['Z'].nr = RC_RESET;
- ktab['H'].nr = RC_LOG;
- ktab['M'].nr = RC_MONITOR;
- ktab['?'].nr = RC_HELP;
-#ifdef MULTI
- ktab['*'].nr = RC_DISPLAYS;
-#endif
- {
- char *args[2];
- args[0] = "-";
- args[1] = NULL;
- SaveAction(ktab + '-', RC_SELECT, args, 0);
- }
- for (i = 0; i < ((MAXWIN < 10) ? MAXWIN : 10); i++)
- {
- char *args[2], arg1[10];
- args[0] = arg1;
- args[1] = 0;
- sprintf(arg1, "%d", i);
- SaveAction(ktab + '0' + i, RC_SELECT, args, 0);
- }
- ktab['\''].nr = RC_SELECT; /* calling a window by name */
- {
- char *args[2];
- args[0] = "-b";
- args[1] = 0;
- SaveAction(ktab + '"', RC_WINDOWLIST, args, 0);
- }
- ktab[Ctrl('G')].nr = RC_VBELL;
- ktab[':'].nr = RC_COLON;
-#ifdef COPY_PASTE
- ktab['['].nr = ktab[Ctrl('[')].nr = RC_COPY;
- {
- char *args[2];
- args[0] = ".";
- args[1] = 0;
- SaveAction(ktab + ']', RC_PASTE, args, 0);
- SaveAction(ktab + Ctrl(']'), RC_PASTE, args, 0);
- }
- ktab['{'].nr = RC_HISTORY;
- ktab['}'].nr = RC_HISTORY;
- ktab['>'].nr = RC_WRITEBUF;
- ktab['<'].nr = RC_READBUF;
- ktab['='].nr = RC_REMOVEBUF;
-#endif
-#ifdef POW_DETACH
- ktab['D'].nr = RC_POW_DETACH;
-#endif
-#ifdef LOCK
- ktab['x'].nr = ktab[Ctrl('x')].nr = RC_LOCKSCREEN;
-#endif
- ktab['b'].nr = ktab[Ctrl('b')].nr = RC_BREAK;
- ktab['B'].nr = RC_POW_BREAK;
- ktab['_'].nr = RC_SILENCE;
- ktab['S'].nr = RC_SPLIT;
- ktab['Q'].nr = RC_ONLY;
- ktab['X'].nr = RC_REMOVE;
- ktab['F'].nr = RC_FIT;
- ktab['\t'].nr = RC_FOCUS;
- /* These come last; they may want overwrite others: */
- if (DefaultEsc >= 0)
- {
- ClearAction(&ktab[DefaultEsc]);
- ktab[DefaultEsc].nr = RC_OTHER;
- }
- if (DefaultMetaEsc >= 0)
- {
- ClearAction(&ktab[DefaultMetaEsc]);
- ktab[DefaultMetaEsc].nr = RC_META;
- }
-
- idleaction.nr = RC_BLANKER;
- idleaction.args = noargs;
- idleaction.argl = 0;
-}
-
-static struct action *
-FindKtab(class, create)
-char *class;
-int create;
-{
- struct kclass *kp, **kpp;
- int i;
-
- if (class == 0)
- return ktab;
- for (kpp = &kclasses; (kp = *kpp) != 0; kpp = &kp->next)
- if (!strcmp(kp->name, class))
- break;
- if (kp == 0)
- {
- if (!create)
- return 0;
- if (strlen(class) > 80)
- {
- Msg(0, "Command class name too long.");
- return 0;
- }
- kp = malloc(sizeof(*kp));
- if (kp == 0)
- {
- Msg(0, strnomem);
- return 0;
- }
- kp->name = SaveStr(class);
- for (i = 0; i < (int)(sizeof(kp->ktab)/sizeof(*kp->ktab)); i++)
- {
- kp->ktab[i].nr = RC_ILLEGAL;
- kp->ktab[i].args = noargs;
- }
- kp->next = 0;
- *kpp = kp;
- }
- return kp->ktab;
-}
-
-static void
-ClearAction(act)
-struct action *act;
-{
- char **p;
-
- if (act->nr == RC_ILLEGAL)
- return;
- act->nr = RC_ILLEGAL;
- if (act->args == noargs)
- return;
- for (p = act->args; *p; p++)
- free(*p);
- free((char *)act->args);
- act->args = noargs;
- act->argl = 0;
-}
-
-/*
- * ProcessInput: process input from display and feed it into
- * the layer on canvas D_forecv.
- */
-
-#ifdef MAPKEYS
-
-/*
- * This ProcessInput just does the keybindings and passes
- * everything else on to ProcessInput2.
- */
-
-void
-ProcessInput(ibuf, ilen)
-char *ibuf;
-int ilen;
-{
- int ch, slen;
- unsigned char *s, *q;
- int i, l;
- char *p;
-
- debug1("ProcessInput: %d bytes\n", ilen);
- if (display == 0 || ilen == 0)
- return;
- if (D_seql)
- evdeq(&D_mapev);
- slen = ilen;
- s = (unsigned char *)ibuf;
- while (ilen-- > 0)
- {
- ch = *s++;
- if (D_dontmap || !D_nseqs)
- {
- D_dontmap = 0;
- continue;
- }
- for (;;)
- {
- debug3("cmp %c %c[%d]\n", ch, *D_seqp, D_seqp - D_kmaps);
- if (*D_seqp != ch)
- {
- l = D_seqp[D_seqp[-D_seql-1] + 1];
- if (l)
- {
- D_seqp += l * 2 + 4;
- debug1("miss %d\n", D_seqp - D_kmaps);
- continue;
- }
- debug("complete miss\n");
- D_mapdefault = 0;
- l = D_seql;
- p = (char *)D_seqp - l;
- D_seql = 0;
- D_seqp = D_kmaps + 3;
- if (l == 0)
- break;
- if ((q = D_seqh) != 0)
- {
- D_seqh = 0;
- i = q[0] << 8 | q[1];
- i &= ~KMAP_NOTIMEOUT;
- debug1("Mapping former hit #%d - ", i);
- debug2("%d(%s) - ", q[2], q + 3);
- if (StuffKey(i))
- ProcessInput2((char *)q + 3, q[2]);
- if (display == 0)
- return;
- l -= q[2];
- p += q[2];
- }
- else
- D_dontmap = 1;
- debug1("flush old %d\n", l);
- ProcessInput(p, l);
- if (display == 0)
- return;
- evdeq(&D_mapev);
- continue;
- }
- if (D_seql++ == 0)
- {
- /* Finish old stuff */
- slen -= ilen + 1;
- debug1("finish old %d\n", slen);
- if (slen)
- ProcessInput2(ibuf, slen);
- if (display == 0)
- return;
- D_seqh = 0;
- }
- ibuf = (char *)s;
- slen = ilen;
- D_seqp++;
- l = D_seql;
- debug2("length am %d, want %d\n", l, D_seqp[-l - 1]);
- if (l == D_seqp[-l - 1])
- {
- if (D_seqp[l] != l)
- {
- q = D_seqp + 1 + l;
- if (D_kmaps + D_nseqs > q && q[2] > l && !bcmp(D_seqp - l, q + 3, l))
- {
- debug1("have another mapping (%s), delay execution\n", q + 3);
- D_seqh = D_seqp - 3 - l;
- D_seqp = q + 3 + l;
- break;
- }
- }
- i = D_seqp[-l - 3] << 8 | D_seqp[-l - 2];
- i &= ~KMAP_NOTIMEOUT;
- debug1("Mapping #%d - ", i);
- p = (char *)D_seqp - l;
- debug2("%d(%s) - ", l, p);
- D_seql = 0;
- D_seqp = D_kmaps + 3;
- D_seqh = 0;
- if (StuffKey(i))
- ProcessInput2(p, l);
- if (display == 0)
- return;
- }
- break;
- }
- }
- if (D_seql)
- {
- debug("am in sequence -> check for timeout\n");
- l = D_seql;
- for (s = D_seqp; ; s += i * 2 + 4)
- {
- if (s[-l-3] & KMAP_NOTIMEOUT >> 8)
- break;
- if ((i = s[s[-l-1] + 1]) == 0)
- {
- SetTimeout(&D_mapev, maptimeout);
- evenq(&D_mapev);
- break;
- }
- }
- }
- ProcessInput2(ibuf, slen);
-}
-
-#else
-# define ProcessInput2 ProcessInput
-#endif
-
-
-/*
- * Here only the screen escape commands are handled.
- */
-
-void
-ProcessInput2(ibuf, ilen)
-char *ibuf;
-int ilen;
-{
- char *s;
- int ch, slen;
- struct action *ktabp;
-
- debug1("ProcessInput2: %d bytes\n", ilen);
- while (ilen && display)
- {
- debug1(" - ilen now %d bytes\n", ilen);
- flayer = D_forecv->c_layer;
- fore = D_fore;
- slen = ilen;
- s = ibuf;
- if (!D_ESCseen)
- {
- while (ilen > 0)
- {
- if ((unsigned char)*s++ == D_user->u_Esc)
- break;
- ilen--;
- }
- slen -= ilen;
- if (slen)
- DoProcess(fore, &ibuf, &slen, 0);
- if (--ilen == 0)
- D_ESCseen = ktab;
- }
- if (ilen <= 0)
- return;
- ktabp = D_ESCseen ? D_ESCseen : ktab;
- D_ESCseen = 0;
- ch = (unsigned char)*s;
-
- /*
- * As users have different esc characters, but a common ktab[],
- * we fold back the users esc and meta-esc key to the Default keys
- * that can be looked up in the ktab[]. grmbl. jw.
- * XXX: make ktab[] a per user thing.
- */
- if (ch == D_user->u_Esc)
- ch = DefaultEsc;
- else if (ch == D_user->u_MetaEsc)
- ch = DefaultMetaEsc;
-
- if (ch >= 0)
- DoAction(&ktabp[ch], ch);
- ibuf = (char *)(s + 1);
- ilen--;
- }
-}
-
-void
-DoProcess(p, bufp, lenp, pa)
-struct win *p;
-char **bufp;
-int *lenp;
-struct paster *pa;
-{
- int oldlen;
- struct display *d = display;
-
-#ifdef COPY_PASTE
- /* XXX -> PasteStart */
- if (pa && *lenp > 1 && p && p->w_slowpaste)
- {
- /* schedule slowpaste event */
- SetTimeout(&p->w_paster.pa_slowev, p->w_slowpaste);
- evenq(&p->w_paster.pa_slowev);
- return;
- }
-#endif
- while (flayer && *lenp)
- {
-#ifdef COPY_PASTE
- if (!pa && p && p->w_paster.pa_pastelen && flayer == p->w_paster.pa_pastelayer)
- {
- debug("layer is busy - beep!\n");
- WBell(p, visual_bell);
- *bufp += *lenp;
- *lenp = 0;
- display = d;
- return;
- }
-#endif
- oldlen = *lenp;
- LayProcess(bufp, lenp);
-#ifdef COPY_PASTE
- if (pa && !pa->pa_pastelayer)
- break; /* flush rest of paste */
-#endif
- if (*lenp == oldlen)
- {
- if (pa)
- {
- display = d;
- return;
- }
- /* We're full, let's beep */
- debug("layer is full - beep!\n");
- WBell(p, visual_bell);
- break;
- }
- }
- *bufp += *lenp;
- *lenp = 0;
- display = d;
-#ifdef COPY_PASTE
- if (pa && pa->pa_pastelen == 0)
- FreePaster(pa);
-#endif
-}
-
-int
-FindCommnr(str)
-char *str;
-{
- int x, m, l = 0, r = RC_LAST;
- while (l <= r)
- {
- m = (l + r) / 2;
- x = strcmp(str, comms[m].name);
- if (x > 0)
- l = m + 1;
- else if (x < 0)
- r = m - 1;
- else
- return m;
- }
- return RC_ILLEGAL;
-}
-
-static int
-CheckArgNum(nr, args)
-int nr;
-char **args;
-{
- int i, n;
- static char *argss[] = {"no", "one", "two", "three", "four", "OOPS"};
- static char *orformat[] =
- {
- "%s: %s: %s argument%s required",
- "%s: %s: %s or %s argument%s required",
- "%s: %s: %s, %s or %s argument%s required",
- "%s: %s: %s, %s, %s or %s argument%s required"
- };
-
- n = comms[nr].flags & ARGS_MASK;
- for (i = 0; args[i]; i++)
- ;
- if (comms[nr].flags & ARGS_ORMORE)
- {
- if (i < n)
- {
- Msg(0, "%s: %s: at least %s argument%s required",
- rc_name, comms[nr].name, argss[n], n != 1 ? "s" : "");
- return -1;
- }
- }
- else if ((comms[nr].flags & ARGS_PLUS1) &&
- (comms[nr].flags & ARGS_PLUS2) &&
- (comms[nr].flags & ARGS_PLUS3))
- {
- if (i != n && i != n + 1 && i != n + 2 && i != n + 3)
- {
- Msg(0, orformat[3], rc_name, comms[nr].name, argss[n],
- argss[n + 1], argss[n + 2], argss[n + 3], "");
- return -1;
- }
- }
- else if ((comms[nr].flags & ARGS_PLUS1) &&
- (comms[nr].flags & ARGS_PLUS2))
- {
- if (i != n && i != n + 1 && i != n + 2)
- {
- Msg(0, orformat[2], rc_name, comms[nr].name, argss[n],
- argss[n + 1], argss[n + 2], "");
- return -1;
- }
- }
- else if ((comms[nr].flags & ARGS_PLUS1) &&
- (comms[nr].flags & ARGS_PLUS3))
- {
- if (i != n && i != n + 1 && i != n + 3)
- {
- Msg(0, orformat[2], rc_name, comms[nr].name, argss[n],
- argss[n + 1], argss[n + 3], "");
- return -1;
- }
- }
- else if ((comms[nr].flags & ARGS_PLUS2) &&
- (comms[nr].flags & ARGS_PLUS3))
- {
- if (i != n && i != n + 2 && i != n + 3)
- {
- Msg(0, orformat[2], rc_name, comms[nr].name, argss[n],
- argss[n + 2], argss[n + 3], "");
- return -1;
- }
- }
- else if (comms[nr].flags & ARGS_PLUS1)
- {
- if (i != n && i != n + 1)
- {
- Msg(0, orformat[1], rc_name, comms[nr].name, argss[n],
- argss[n + 1], n != 0 ? "s" : "");
- return -1;
- }
- }
- else if (comms[nr].flags & ARGS_PLUS2)
- {
- if (i != n && i != n + 2)
- {
- Msg(0, orformat[1], rc_name, comms[nr].name, argss[n],
- argss[n + 2], "s");
- return -1;
- }
- }
- else if (comms[nr].flags & ARGS_PLUS3)
- {
- if (i != n && i != n + 3)
- {
- Msg(0, orformat[1], rc_name, comms[nr].name, argss[n],
- argss[n + 3], "");
- return -1;
- }
- }
- else if (i != n)
- {
- Msg(0, orformat[0], rc_name, comms[nr].name, argss[n], n != 1 ? "s" : "");
- return -1;
- }
- return i;
-}
-
-/*ARGSUSED*/
-void
-DoAction(act, key)
-struct action *act;
-int key;
-{
- int nr = act->nr;
- char **args = act->args;
- int *argl = act->argl;
- struct win *p;
- int argc, i, n, msgok;
- char *s;
- char ch;
- struct display *odisplay = display;
- struct acluser *user;
-
- user = display ? D_user : users;
- if (nr == RC_ILLEGAL)
- {
- debug1("key '%c': No action\n", key);
- return;
- }
- n = comms[nr].flags;
- if ((n & NEED_DISPLAY) && display == 0)
- {
- Msg(0, "%s: %s: display required", rc_name, comms[nr].name);
- return;
- }
- if ((n & NEED_FORE) && fore == 0)
- {
- Msg(0, "%s: %s: window required", rc_name, comms[nr].name);
- return;
- }
- if ((n & NEED_LAYER) && flayer == 0)
- {
- Msg(0, "%s: %s: display or window required", rc_name, comms[nr].name);
- return;
- }
- if ((argc = CheckArgNum(nr, args)) < 0)
- return;
-#ifdef MULTIUSER
- if (display)
- {
- if (AclCheckPermCmd(D_user, ACL_EXEC, &comms[nr]))
- {
- Msg(0, "%s: %s: permission denied (user %s)",
- rc_name, comms[nr].name, (EffectiveAclUser ? EffectiveAclUser : D_user)->u_name);
- return;
- }
- }
-#endif /* MULTIUSER */
-
- msgok = display && !*rc_name;
- switch(nr)
- {
- case RC_SELECT:
- if (!*args)
- InputSelect();
- else if (args[0][0] == '-' && !args[0][1])
- {
- SetForeWindow((struct win *)0);
- Activate(0);
- }
- else if (args[0][0] == '.' && !args[0][1])
- {
- if (!fore)
- Msg(0, "select . needs a window");
- else
- {
- SetForeWindow(fore);
- Activate(0);
- }
- }
- else if (ParseWinNum(act, &n) == 0)
- SwitchWindow(n);
- break;
-#ifdef AUTO_NUKE
- case RC_DEFAUTONUKE:
- if (ParseOnOff(act, &defautonuke) == 0 && msgok)
- Msg(0, "Default autonuke turned %s", defautonuke ? "on" : "off");
- if (display && *rc_name)
- D_auto_nuke = defautonuke;
- break;
- case RC_AUTONUKE:
- if (ParseOnOff(act, &D_auto_nuke) == 0 && msgok)
- Msg(0, "Autonuke turned %s", D_auto_nuke ? "on" : "off");
- break;
-#endif
- case RC_DEFOBUFLIMIT:
- if (ParseNum(act, &defobuflimit) == 0 && msgok)
- Msg(0, "Default limit set to %d", defobuflimit);
- if (display && *rc_name)
- {
- D_obufmax = defobuflimit;
- D_obuflenmax = D_obuflen - D_obufmax;
- }
- break;
- case RC_OBUFLIMIT:
- if (*args == 0)
- Msg(0, "Limit is %d, current buffer size is %d", D_obufmax, D_obuflen);
- else if (ParseNum(act, &D_obufmax) == 0 && msgok)
- Msg(0, "Limit set to %d", D_obufmax);
- D_obuflenmax = D_obuflen - D_obufmax;
- break;
- case RC_DUMPTERMCAP:
- WriteFile(user, (char *)0, DUMP_TERMCAP);
- break;
- case RC_HARDCOPY:
- {
- int mode = DUMP_HARDCOPY;
-
- if (argc > 1 && !strcmp(*args, "-h"))
- {
- mode = DUMP_SCROLLBACK;
- args++;
- argc--;
- }
- if (*args && args[1])
- {
- Msg(0, "%s: hardcopy: too many arguments", rc_name);
- break;
- }
- if (fore == 0 && *args == 0)
- Msg(0, "%s: hardcopy: window required", rc_name);
- else
- WriteFile(user, *args, mode);
- }
- break;
- case RC_DEFLOG:
- (void)ParseOnOff(act, &nwin_default.Lflag);
- break;
- case RC_LOG:
- n = fore->w_log ? 1 : 0;
- ParseSwitch(act, &n);
- LogToggle(n);
- break;
-#ifdef BSDJOBS
- case RC_SUSPEND:
- Detach(D_STOP);
- break;
-#endif
- case RC_NEXT:
- if (MoreWindows())
- SwitchWindow(NextWindow());
- break;
- case RC_PREV:
- if (MoreWindows())
- SwitchWindow(PreviousWindow());
- break;
- case RC_KILL:
- {
- char *name;
-
- if (key >= 0)
- {
-#ifdef PSEUDOS
- Input(fore->w_pwin ? "Really kill this filter [y/n]" : "Really kill this window [y/n]", 1, INP_RAW, confirm_fn, (char *)RC_KILL);
-#else
- Input("Really kill this window [y/n]", 1, INP_RAW, confirm_fn, (char *)RC_KILL);
-#endif
- break;
- }
- n = fore->w_number;
-#ifdef PSEUDOS
- if (fore->w_pwin)
- {
- FreePseudowin(fore);
- Msg(0, "Filter removed.");
- break;
- }
-#endif
- name = SaveStr(fore->w_title);
- KillWindow(fore);
- Msg(0, "Window %d (%s) killed.", n, name);
- if (name)
- free(name);
- break;
- }
- case RC_QUIT:
- if (key >= 0)
- {
- Input("Really quit and kill all your windows [y/n]", 1, INP_RAW, confirm_fn, (char *)RC_QUIT);
- break;
- }
- Finit(0);
- /* NOTREACHED */
-#ifdef DETACH
- case RC_DETACH:
- if (*args && !strcmp(*args, "-h"))
- Hangup();
- else
- Detach(D_DETACH);
- break;
-# ifdef POW_DETACH
- case RC_POW_DETACH:
- if (key >= 0)
- {
- static char buf[2];
-
- buf[0] = key;
- Input(buf, 1, INP_RAW, pow_detach_fn, NULL);
- }
- else
- Detach(D_POWER); /* detach and kill Attacher's parent */
- break;
-# endif
-#endif
- case RC_DEBUG:
-#ifdef DEBUG
- if (!*args)
- {
- if (dfp)
- Msg(0, "debugging info is written to %s/", DEBUGDIR);
- else
- Msg(0, "debugging is currently off. Use 'debug on' to enable.");
- break;
- }
- if (dfp)
- {
- debug("debug: closing debug file.\n");
- fflush(dfp);
- fclose(dfp);
- dfp = NULL;
- }
- if (strcmp("off", *args))
- opendebug(0, 1);
-# ifdef SIG_NODEBUG
- else if (display)
- kill(D_userpid, SIG_NODEBUG); /* a one shot item, but hey... */
-# endif /* SIG_NODEBUG */
-#else
- if (*args == 0 || strcmp("off", *args))
- Msg(0, "Sorry, screen was compiled without -DDEBUG option.");
-#endif
- break;
-#ifdef ZMODEM
- case RC_ZMODEM:
- if (*args && !strcmp(*args, "sendcmd"))
- {
- if (args[1])
- {
- free(zmodem_sendcmd);
- zmodem_sendcmd = SaveStr(args[1]);
- }
- if (msgok)
- Msg(0, "zmodem sendcmd: %s", zmodem_sendcmd);
- break;
- }
- if (*args && !strcmp(*args, "recvcmd"))
- {
- if (args[1])
- {
- free(zmodem_recvcmd);
- zmodem_recvcmd = SaveStr(args[1]);
- }
- if (msgok)
- Msg(0, "zmodem recvcmd: %s", zmodem_recvcmd);
- break;
- }
- if (*args)
- {
- for (i = 0; i < 4; i++)
- if (!strcmp(zmodes[i], *args))
- break;
- if (i == 4 && !strcmp(*args, "on"))
- i = 1;
- if (i == 4)
- {
- Msg(0, "usage: zmodem off|auto|catch|pass");
- break;
- }
- zmodem_mode = i;
- }
- if (msgok)
- Msg(0, "zmodem mode is %s", zmodes[zmodem_mode]);
- break;
-#endif
- case RC_ZOMBIE:
- {
- if (!(s = *args))
- {
- ZombieKey_destroy = 0;
- break;
- }
- if (*argl == 0 || *argl > 2)
- {
- Msg(0, "%s:zombie: one or two characters expected.", rc_name);
- break;
- }
- ZombieKey_destroy = args[0][0];
- ZombieKey_resurrect = *argl == 2 ? args[0][1] : 0;
- }
- break;
- case RC_WALL:
-#ifdef MULTIUSER
- s = D_user->u_name;
-#else
- s = D_usertty;
-#endif
- {
- struct display *olddisplay = display;
- display = 0; /* no display will cause a broadcast */
- Msg(0, "%s: %s", s, *args);
- display = olddisplay;
- }
- break;
- case RC_AT:
- /* where this AT command comes from: */
-#ifdef MULTIUSER
- s = SaveStr(D_user->u_name);
- /* DO NOT RETURN FROM HERE WITHOUT RESETTING THIS: */
- EffectiveAclUser = D_user;
-#else
- s = SaveStr(D_usertty);
-#endif
- n = strlen(args[0]);
- if (n) n--;
- /*
- * the windows/displays loops are quite dangerous here, take extra
- * care not to trigger landmines. Things may appear/disappear while
- * we are walking along.
- */
- switch (args[0][n])
- {
- case '*': /* user */
- {
- struct display *nd;
- struct acluser *u;
-
- if (!n)
- u = D_user;
- else
- for (u = users; u; u = u->u_next)
- {
- debug3("strncmp('%s', '%s', %d)\n", *args, u->u_name, n);
- if (!strncmp(*args, u->u_name, n))
- break;
- }
- debug1("at all displays of user %s\n", u->u_name);
- for (display = displays; display; display = nd)
- {
- nd = display->d_next;
- if (D_forecv == 0)
- continue;
- flayer = D_forecv->c_layer;
- fore = D_fore;
- if (D_user != u)
- continue;
- debug1("AT display %s\n", D_usertty);
- DoCommand(args + 1, argl + 1);
- if (display)
- Msg(0, "command from %s: %s %s",
- s, args[1], args[2] ? args[2] : "");
- display = NULL;
- flayer = 0;
- fore = NULL;
- }
- break;
- }
- case '%': /* display */
- {
- struct display *nd;
-
- debug1("at display matching '%s'\n", args[0]);
- for (display = displays; display; display = nd)
- {
- nd = display->d_next;
- if (D_forecv == 0)
- continue;
- fore = D_fore;
- flayer = D_forecv->c_layer;
- if (strncmp(args[0], D_usertty, n) &&
- (strncmp("/dev/", D_usertty, 5) ||
- strncmp(args[0], D_usertty + 5, n)) &&
- (strncmp("/dev/tty", D_usertty, 8) ||
- strncmp(args[0], D_usertty + 8, n)))
- continue;
- debug1("AT display %s\n", D_usertty);
- DoCommand(args + 1, argl + 1);
- if (display)
- Msg(0, "command from %s: %s %s",
- s, args[1], args[2] ? args[2] : "");
- display = NULL;
- fore = NULL;
- flayer = 0;
- }
- break;
- }
- case '#': /* window */
- n--;
- /* FALLTHROUGH */
- default:
- {
- struct win *nw;
- int ch;
-
- n++;
- ch = args[0][n];
- args[0][n] = '\0';
- if (!*args[0] || (i = WindowByNumber(args[0])) < 0)
- {
- args[0][n] = ch; /* must restore string in case of bind */
- /* try looping over titles */
- for (fore = windows; fore; fore = nw)
- {
- nw = fore->w_next;
- if (strncmp(args[0], fore->w_title, n))
- continue;
- debug2("AT window %d(%s)\n", fore->w_number, fore->w_title);
- /*
- * consider this a bug or a feature:
- * while looping through windows, we have fore AND
- * display context. This will confuse users who try to
- * set up loops inside of loops, but often allows to do
- * what you mean, even when you adress your context wrong.
- */
- i = 0;
- /* XXX: other displays? */
- if (fore->w_layer.l_cvlist)
- display = fore->w_layer.l_cvlist->c_display;
- flayer = fore->w_savelayer ? fore->w_savelayer : &fore->w_layer;
- DoCommand(args + 1, argl + 1); /* may destroy our display */
- if (fore && fore->w_layer.l_cvlist)
- {
- display = fore->w_layer.l_cvlist->c_display;
- Msg(0, "command from %s: %s %s",
- s, args[1], args[2] ? args[2] : "");
- }
- }
- display = NULL;
- fore = NULL;
- if (i < 0)
- Msg(0, "%s: at '%s': no such window.\n", rc_name, args[0]);
- break;
- }
- else if (i < MAXWIN && (fore = wtab[i]))
- {
- args[0][n] = ch; /* must restore string in case of bind */
- debug2("AT window %d (%s)\n", fore->w_number, fore->w_title);
- if (fore->w_layer.l_cvlist)
- display = fore->w_layer.l_cvlist->c_display;
- flayer = fore->w_savelayer ? fore->w_savelayer : &fore->w_layer;
- DoCommand(args + 1, argl + 1);
- if (fore && fore->w_layer.l_cvlist)
- {
- display = fore->w_layer.l_cvlist->c_display;
- Msg(0, "command from %s: %s %s",
- s, args[1], args[2] ? args[2] : "");
- }
- display = NULL;
- fore = NULL;
- }
- else
- Msg(0, "%s: at [identifier][%%|*|#] command [args]", rc_name);
- break;
- }
- }
- free(s);
-#ifdef MULTIUSER
- EffectiveAclUser = NULL;
-#endif
- break;
-
-#ifdef COPY_PASTE
- case RC_READREG:
-#ifdef ENCODINGS
- i = fore ? fore->w_encoding : display ? display->d_encoding : 0;
- if (args[0] && args[1] && !strcmp(args[0], "-e"))
- {
- i = FindEncoding(args[1]);
- if (i == -1)
- {
- Msg(0, "%s: readreg: unknown encoding", rc_name);
- break;
- }
- args += 2;
- }
-#endif
- /*
- * Without arguments we prompt for a destination register.
- * It will receive the copybuffer contents.
- * This is not done by RC_PASTE, as we prompt for source
- * (not dest) there.
- */
- if ((s = *args) == NULL)
- {
- Input("Copy to register:", 1, INP_RAW, copy_reg_fn, NULL);
- break;
- }
- if (*argl != 1)
- {
- Msg(0, "%s: copyreg: character, ^x, or (octal) \\032 expected.", rc_name);
- break;
- }
- ch = args[0][0];
- /*
- * With two arguments we *really* read register contents from file
- */
- if (args[1])
- {
- if (args[2])
- {
- Msg(0, "%s: readreg: too many arguments", rc_name);
- break;
- }
- if ((s = ReadFile(args[1], &n)))
- {
- struct plop *pp = plop_tab + (int)(unsigned char)ch;
-
- if (pp->buf)
- free(pp->buf);
- pp->buf = s;
- pp->len = n;
-#ifdef ENCODINGS
- pp->enc = i;
-#endif
- }
- }
- else
- /*
- * with one argument we copy the copybuffer into a specified register
- * This could be done with RC_PASTE too, but is here to be consistent
- * with the zero argument call.
- */
- copy_reg_fn(&ch, 0, NULL);
- break;
-#endif
- case RC_REGISTER:
-#ifdef ENCODINGS
- i = fore ? fore->w_encoding : display ? display->d_encoding : 0;
- if (args[0] && args[1] && !strcmp(args[0], "-e"))
- {
- i = FindEncoding(args[1]);
- if (i == -1)
- {
- Msg(0, "%s: register: unknown encoding", rc_name);
- break;
- }
- args += 2;
- argc -= 2;
- }
-#endif
- if (argc != 2)
- {
- Msg(0, "%s: register: illegal number of arguments.", rc_name);
- break;
- }
- if (*argl != 1)
- {
- Msg(0, "%s: register: character, ^x, or (octal) \\032 expected.", rc_name);
- break;
- }
- ch = args[0][0];
-#ifdef COPY_PASTE
- if (ch == '.')
- {
- if (user->u_plop.buf != NULL)
- UserFreeCopyBuffer(user);
- if (args[1] && args[1][0])
- {
- user->u_plop.buf = SaveStrn(args[1], argl[1]);
- user->u_plop.len = argl[1];
-#ifdef ENCODINGS
- user->u_plop.enc = i;
-#endif
- }
- }
-#endif
- else
- {
- struct plop *plp = plop_tab + (int)(unsigned char)ch;
-
- if (plp->buf)
- free(plp->buf);
- plp->buf = SaveStrn(args[1], argl[1]);
- plp->len = argl[1];
-#ifdef ENCODINGS
- plp->enc = i;
-#endif
- }
- break;
- case RC_PROCESS:
- if ((s = *args) == NULL)
- {
- Input("Process register:", 1, INP_RAW, process_fn, NULL);
- break;
- }
- if (*argl != 1)
- {
- Msg(0, "%s: process: character, ^x, or (octal) \\032 expected.", rc_name);
- break;
- }
- ch = args[0][0];
- process_fn(&ch, 0, NULL);
- break;
- case RC_STUFF:
- s = *args;
- n = *argl;
- if (args[1])
- {
- if (strcmp(s, "-k"))
- {
- Msg(0, "%s: stuff: invalid option %s", rc_name, s);
- break;
- }
- s = args[1];
- for (i = T_CAPS; i < T_OCAPS; i++)
- if (strcmp(term[i].tcname, s) == 0)
- break;
- if (i == T_OCAPS)
- {
- Msg(0, "%s: stuff: unknown key '%s'", rc_name, s);
- break;
- }
-#ifdef MAPKEYS
- if (StuffKey(i - T_CAPS) == 0)
- break;
-#endif
- s = display ? D_tcs[i].str : 0;
- if (s == 0)
- break;
- n = strlen(s);
- }
- while(n)
- LayProcess(&s, &n);
- break;
- case RC_REDISPLAY:
- Activate(-1);
- break;
- case RC_WINDOWS:
- ShowWindows(-1);
- break;
- case RC_VERSION:
- Msg(0, "screen %s", version);
- break;
- case RC_TIME:
- if (*args)
- {
- timestring = SaveStr(*args);
- break;
- }
- Msg(0, "%s", MakeWinMsg(timestring, fore, '%'));
- break;
- case RC_INFO:
- ShowInfo();
- break;
- case RC_DINFO:
- ShowDInfo();
- break;
- case RC_COMMAND:
- {
- struct action *ktabp = ktab;
- if (argc == 2 && !strcmp(*args, "-c"))
- {
- if ((ktabp = FindKtab(args[1], 0)) == 0)
- {
- Msg(0, "Unknown command class '%s'", args[1]);
- break;
- }
- }
- if (D_ESCseen != ktab || ktabp != ktab)
- {
- D_ESCseen = ktabp;
- break;
- }
- D_ESCseen = 0;
- }
- /* FALLTHROUGH */
- case RC_OTHER:
- if (MoreWindows())
- SwitchWindow(display && D_other ? D_other->w_number : NextWindow());
- break;
- case RC_META:
- if (user->u_Esc == -1)
- break;
- ch = user->u_Esc;
- s = &ch;
- n = 1;
- LayProcess(&s, &n);
- break;
- case RC_XON:
- ch = Ctrl('q');
- s = &ch;
- n = 1;
- LayProcess(&s, &n);
- break;
- case RC_XOFF:
- ch = Ctrl('s');
- s = &ch;
- n = 1;
- LayProcess(&s, &n);
- break;
- case RC_DEFBREAKTYPE:
- case RC_BREAKTYPE:
- {
- static char *types[] = { "TIOCSBRK", "TCSBRK", "tcsendbreak", NULL };
- extern int breaktype;
-
- if (*args)
- {
- if (ParseNum(act, &n))
- for (n = 0; n < (int)(sizeof(types)/sizeof(*types)); n++)
- {
- for (i = 0; i < 4; i++)
- {
- ch = args[0][i];
- if (ch >= 'a' && ch <= 'z')
- ch -= 'a' - 'A';
- if (ch != types[n][i] && (ch + ('a' - 'A')) != types[n][i])
- break;
- }
- if (i == 4)
- break;
- }
- if (n < 0 || n >= (int)(sizeof(types)/sizeof(*types)))
- Msg(0, "%s invalid, chose one of %s, %s or %s", *args, types[0], types[1], types[2]);
- else
- {
- breaktype = n;
- Msg(0, "breaktype set to (%d) %s", n, types[n]);
- }
- }
- else
- Msg(0, "breaktype is (%d) %s", breaktype, types[breaktype]);
- }
- break;
- case RC_POW_BREAK:
- case RC_BREAK:
- n = 0;
- if (*args && ParseNum(act, &n))
- break;
- SendBreak(fore, n, nr == RC_POW_BREAK);
- break;
-#ifdef LOCK
- case RC_LOCKSCREEN:
- Detach(D_LOCK);
- break;
-#endif
- case RC_WIDTH:
- case RC_HEIGHT:
- {
- int w, h;
- int what = 0;
-
- i = 1;
- if (*args && !strcmp(*args, "-w"))
- what = 1;
- else if (*args && !strcmp(*args, "-d"))
- what = 2;
- if (what)
- args++;
- if (what == 0 && flayer && !display)
- what = 1;
- if (what == 1)
- {
- if (!flayer)
- {
- Msg(0, "%s: %s: window required", rc_name, comms[nr].name);
- break;
- }
- w = flayer->l_width;
- h = flayer->l_height;
- }
- else
- {
- if (!display)
- {
- Msg(0, "%s: %s: display required", rc_name, comms[nr].name);
- break;
- }
- w = D_width;
- h = D_height;
- }
- if (*args && args[0][0] == '-')
- {
- Msg(0, "%s: %s: unknown option %s", rc_name, comms[nr].name, *args);
- break;
- }
- if (nr == RC_HEIGHT)
- {
- if (!*args)
- {
-#define H0height 42
-#define H1height 24
- if (h == H0height)
- h = H1height;
- else if (h == H1height)
- h = H0height;
- else if (h > (H0height + H1height) / 2)
- h = H0height;
- else
- h = H1height;
- }
- else
- {
- h = atoi(*args);
- if (args[1])
- w = atoi(args[1]);
- }
- }
- else
- {
- if (!*args)
- {
- if (w == Z0width)
- w = Z1width;
- else if (w == Z1width)
- w = Z0width;
- else if (w > (Z0width + Z1width) / 2)
- w = Z0width;
- else
- w = Z1width;
- }
- else
- {
- w = atoi(*args);
- if (args[1])
- h = atoi(args[1]);
- }
- }
- if (*args && args[1] && args[2])
- {
- Msg(0, "%s: %s: too many arguments", rc_name, comms[nr].name);
- break;
- }
- if (w <= 0)
- {
- Msg(0, "Illegal width");
- break;
- }
- if (h <= 0)
- {
- Msg(0, "Illegal height");
- break;
- }
- if (what == 1)
- {
- if (flayer->l_width == w && flayer->l_height == h)
- break;
- ResizeLayer(flayer, w, h, (struct display *)0);
- break;
- }
- if (D_width == w && D_height == h)
- break;
- if (what == 2)
- {
- ChangeScreenSize(w, h, 1);
- }
- else
- {
- if (ResizeDisplay(w, h) == 0)
- {
- Activate(D_fore ? D_fore->w_norefresh : 0);
- /* autofit */
- ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, 0);
- break;
- }
- if (h == D_height)
- Msg(0, "Your termcap does not specify how to change the terminal's width to %d.", w);
- else if (w == D_width)
- Msg(0, "Your termcap does not specify how to change the terminal's height to %d.", h);
- else
- Msg(0, "Your termcap does not specify how to change the terminal's resolution to %dx%d.", w, h);
- }
- }
- break;
- case RC_TITLE:
- if (*args == 0)
- InputAKA();
- else
- ChangeAKA(fore, *args, strlen(*args));
- break;
- case RC_COLON:
- Input(":", 100, INP_COOKED, Colonfin, NULL);
- if (*args && **args)
- {
- s = *args;
- n = strlen(s);
- LayProcess(&s, &n);
- }
- break;
- case RC_LASTMSG:
- if (D_status_lastmsg)
- Msg(0, "%s", D_status_lastmsg);
- break;
- case RC_SCREEN:
- DoScreen("key", args);
- break;
- case RC_WRAP:
- if (ParseSwitch(act, &fore->w_wrap) == 0 && msgok)
- Msg(0, "%cwrap", fore->w_wrap ? '+' : '-');
- break;
- case RC_FLOW:
- if (*args)
- {
- if (args[0][0] == 'a')
- {
- fore->w_flow = (fore->w_flow & FLOW_AUTO) ? FLOW_AUTOFLAG |FLOW_AUTO|FLOW_NOW : FLOW_AUTOFLAG;
- }
- else
- {
- if (ParseOnOff(act, &n))
- break;
- fore->w_flow = (fore->w_flow & FLOW_AUTO) | n;
- }
- }
- else
- {
- if (fore->w_flow & FLOW_AUTOFLAG)
- fore->w_flow = (fore->w_flow & FLOW_AUTO) | FLOW_NOW;
- else if (fore->w_flow & FLOW_NOW)
- fore->w_flow &= ~FLOW_NOW;
- else
- fore->w_flow = fore->w_flow ? FLOW_AUTOFLAG|FLOW_AUTO|FLOW_NOW : FLOW_AUTOFLAG;
- }
- SetFlow(fore->w_flow & FLOW_NOW);
- if (msgok)
- Msg(0, "%cflow%s", (fore->w_flow & FLOW_NOW) ? '+' : '-',
- (fore->w_flow & FLOW_AUTOFLAG) ? "(auto)" : "");
- break;
-#ifdef MULTIUSER
- case RC_DEFWRITELOCK:
- if (args[0][0] == 'a')
- nwin_default.wlock = WLOCK_AUTO;
- else
- {
- if (ParseOnOff(act, &n))
- break;
- nwin_default.wlock = n ? WLOCK_ON : WLOCK_OFF;
- }
- break;
- case RC_WRITELOCK:
- if (*args)
- {
- if (args[0][0] == 'a')
- {
- fore->w_wlock = WLOCK_AUTO;
- }
- else
- {
- if (ParseOnOff(act, &n))
- break;
- fore->w_wlock = n ? WLOCK_ON : WLOCK_OFF;
- }
- /*
- * user may have permission to change the writelock setting,
- * but he may never aquire the lock himself without write permission
- */
- if (!AclCheckPermWin(D_user, ACL_WRITE, fore))
- fore->w_wlockuser = D_user;
- }
- Msg(0, "writelock %s", (fore->w_wlock == WLOCK_AUTO) ? "auto" :
- ((fore->w_wlock == WLOCK_OFF) ? "off" : "on"));
- break;
-#endif
- case RC_CLEAR:
- ResetAnsiState(fore);
- WriteString(fore, "\033[H\033[J", 6);
- break;
- case RC_RESET:
- ResetAnsiState(fore);
-#ifdef ZMODEM
- if (fore->w_zdisplay)
- zmodem_abort(fore, fore->w_zdisplay);
-#endif
- WriteString(fore, "\033c", 2);
- break;
- case RC_MONITOR:
- n = fore->w_monitor != MON_OFF;
- if (ParseSwitch(act, &n))
- break;
- if (n)
- {
-#ifdef MULTIUSER
- if (display) /* we tell only this user */
- ACLBYTE(fore->w_mon_notify, D_user->u_id) |= ACLBIT(D_user->u_id);
- else
- for (i = 0; i < maxusercount; i++)
- ACLBYTE(fore->w_mon_notify, i) |= ACLBIT(i);
-#endif
- if (fore->w_monitor == MON_OFF)
- fore->w_monitor = MON_ON;
- Msg(0, "Window %d (%s) is now being monitored for all activity.", fore->w_number, fore->w_title);
- }
- else
- {
-#ifdef MULTIUSER
- if (display) /* we remove only this user */
- ACLBYTE(fore->w_mon_notify, D_user->u_id)
- &= ~ACLBIT(D_user->u_id);
- else
- for (i = 0; i < maxusercount; i++)
- ACLBYTE(fore->w_mon_notify, i) &= ~ACLBIT(i);
- for (i = maxusercount - 1; i >= 0; i--)
- if (ACLBYTE(fore->w_mon_notify, i))
- break;
- if (i < 0)
-#endif
- fore->w_monitor = MON_OFF;
- Msg(0, "Window %d (%s) is no longer being monitored for activity.", fore->w_number, fore->w_title);
- }
- break;
-#ifdef MULTI
- case RC_DISPLAYS:
- display_displays();
- break;
-#endif
- case RC_WINDOWLIST:
- if (!*args)
- display_wlist(0, WLIST_NUM);
- else if (!strcmp(*args, "-m") && !args[1])
- display_wlist(0, WLIST_MRU);
- else if (!strcmp(*args, "-b") && !args[1])
- display_wlist(1, WLIST_NUM);
- else if (!strcmp(*args, "-b") && !strcmp(args[1], "-m") && !args[2])
- display_wlist(1, WLIST_MRU);
- else if (!strcmp(*args, "-m") && !strcmp(args[1], "-b") && !args[2])
- display_wlist(1, WLIST_MRU);
- else if (!strcmp(*args, "string"))
- {
- if (args[1])
- {
- if (wliststr)
- free(wliststr);
- wliststr = SaveStr(args[1]);
- }
- if (msgok)
- Msg(0, "windowlist string is '%s'", wliststr);
- }
- else if (!strcmp(*args, "title"))
- {
- if (args[1])
- {
- if (wlisttit)
- free(wlisttit);
- wlisttit = SaveStr(args[1]);
- }
- if (msgok)
- Msg(0, "windowlist title is '%s'", wlisttit);
- }
- else
- Msg(0, "usage: windowlist [-b] [string [string] | title [title]]");
- break;
- case RC_HELP:
- if (argc == 2 && !strcmp(*args, "-c"))
- {
- struct action *ktabp;
- if ((ktabp = FindKtab(args[1], 0)) == 0)
- {
- Msg(0, "Unknown command class '%s'", args[1]);
- break;
- }
- display_help(args[1], ktabp);
- }
- else
- display_help((char *)0, ktab);
- break;
- case RC_LICENSE:
- display_copyright();
- break;
-#ifdef COPY_PASTE
- case RC_COPY:
- if (flayer->l_layfn != &WinLf)
- {
- Msg(0, "Must be on a window layer");
- break;
- }
- MarkRoutine();
- break;
- case RC_HISTORY:
- {
- static char *pasteargs[] = {".", 0};
- static int pasteargl[] = {1};
-
- if (flayer->l_layfn != &WinLf)
- {
- Msg(0, "Must be on a window layer");
- break;
- }
- if (GetHistory() == 0)
- break;
- if (user->u_plop.buf == NULL)
- break;
- args = pasteargs;
- argl = pasteargl;
- }
- /*FALLTHROUGH*/
- case RC_PASTE:
- {
- char *ss, *dbuf, dch;
- int l = 0;
-# ifdef ENCODINGS
- int enc = -1;
-# endif
-
- /*
- * without args we prompt for one(!) register to be pasted in the window
- */
- if ((s = *args) == NULL)
- {
- Input("Paste from register:", 1, INP_RAW, ins_reg_fn, NULL);
- break;
- }
- if (args[1] == 0 && !fore) /* no window? */
- break;
- /*
- * with two arguments we paste into a destination register
- * (no window needed here).
- */
- if (args[1] && argl[1] != 1)
- {
- Msg(0, "%s: paste destination: character, ^x, or (octal) \\032 expected.",
- rc_name);
- break;
- }
-# ifdef ENCODINGS
- else if (fore)
- enc = fore->w_encoding;
-# endif
-
- /*
- * measure length of needed buffer
- */
- for (ss = s = *args; (ch = *ss); ss++)
- {
- if (ch == '.')
- {
-# ifdef ENCODINGS
- if (enc == -1)
- enc = user->u_plop.enc;
- if (enc != user->u_plop.enc)
- l += RecodeBuf((unsigned char *)user->u_plop.buf, user->u_plop.len, user->u_plop.enc, enc, (unsigned char *)0);
- else
-# endif
- l += user->u_plop.len;
- }
- else
- {
-# ifdef ENCODINGS
- if (enc == -1)
- enc = plop_tab[(int)(unsigned char)ch].enc;
- if (enc != plop_tab[(int)(unsigned char)ch].enc)
- l += RecodeBuf((unsigned char *)plop_tab[(int)(unsigned char)ch].buf, plop_tab[(int)(unsigned char)ch].len, plop_tab[(int)(unsigned char)ch].enc, enc, (unsigned char *)0);
- else
-# endif
- l += plop_tab[(int)(unsigned char)ch].len;
- }
- }
- if (l == 0)
- {
- Msg(0, "empty buffer");
- break;
- }
- /*
- * shortcut:
- * if there is only one source and the destination is a window, then
- * pass a pointer rather than duplicating the buffer.
- */
- if (s[1] == 0 && args[1] == 0)
-# ifdef ENCODINGS
- if (enc == (*s == '.' ? user->u_plop.enc : plop_tab[(int)(unsigned char)*s].enc))
-# endif
- {
- MakePaster(&fore->w_paster, *s == '.' ? user->u_plop.buf : plop_tab[(int)(unsigned char)*s].buf, l, 0);
- break;
- }
- /*
- * if no shortcut, we construct a buffer
- */
- if ((dbuf = (char *)malloc(l)) == 0)
- {
- Msg(0, strnomem);
- break;
- }
- l = 0;
- /*
- * concatenate all sources into our own buffer, copy buffer is
- * special and is skipped if no display exists.
- */
- for (ss = s; (ch = *ss); ss++)
- {
- struct plop *pp = (ch == '.' ? &user->u_plop : &plop_tab[(int)(unsigned char)ch]);
-#ifdef ENCODINGS
- if (pp->enc != enc)
- {
- l += RecodeBuf((unsigned char *)pp->buf, pp->len, pp->enc, enc, (unsigned char *)dbuf + l);
- continue;
- }
-#endif
- bcopy(pp->buf, dbuf + l, pp->len);
- l += pp->len;
- }
- /*
- * when called with one argument we paste our buffer into the window
- */
- if (args[1] == 0)
- {
- MakePaster(&fore->w_paster, dbuf, l, 1);
- }
- else
- {
- /*
- * we have two arguments, the second is already in dch.
- * use this as destination rather than the window.
- */
- dch = args[1][0];
- if (dch == '.')
- {
- if (user->u_plop.buf != NULL)
- UserFreeCopyBuffer(user);
- user->u_plop.buf = dbuf;
- user->u_plop.len = l;
-#ifdef ENCODINGS
- user->u_plop.enc = enc;
-#endif
- }
- else
- {
- struct plop *pp = plop_tab + (int)(unsigned char)dch;
- if (pp->buf)
- free(pp->buf);
- pp->buf = dbuf;
- pp->len = l;
-#ifdef ENCODINGS
- pp->enc = enc;
-#endif
- }
- }
- break;
- }
- case RC_WRITEBUF:
- if (!user->u_plop.buf)
- {
- Msg(0, "empty buffer");
- break;
- }
-#ifdef ENCODINGS
- {
- struct plop oldplop;
-
- oldplop = user->u_plop;
- if (args[0] && args[1] && !strcmp(args[0], "-e"))
- {
- int enc, l;
- char *newbuf;
-
- enc = FindEncoding(args[1]);
- if (enc == -1)
- {
- Msg(0, "%s: writebuf: unknown encoding", rc_name);
- break;
- }
- if (enc != oldplop.enc)
- {
- l = RecodeBuf((unsigned char *)oldplop.buf, oldplop.len, oldplop.enc, enc, (unsigned char *)0);
- newbuf = malloc(l + 1);
- if (!newbuf)
- {
- Msg(0, strnomem);
- break;
- }
- user->u_plop.len = RecodeBuf((unsigned char *)oldplop.buf, oldplop.len, oldplop.enc, enc, (unsigned char *)newbuf);
- user->u_plop.buf = newbuf;
- user->u_plop.enc = enc;
- }
- args += 2;
- }
-#endif
- if (args[0] && args[1])
- Msg(0, "%s: writebuf: too many arguments", rc_name);
- else
- WriteFile(user, args[0], DUMP_EXCHANGE);
-#ifdef ENCODINGS
- if (user->u_plop.buf != oldplop.buf)
- free(user->u_plop.buf);
- user->u_plop = oldplop;
- }
-#endif
- break;
- case RC_READBUF:
-#ifdef ENCODINGS
- i = fore ? fore->w_encoding : display ? display->d_encoding : 0;
- if (args[0] && args[1] && !strcmp(args[0], "-e"))
- {
- i = FindEncoding(args[1]);
- if (i == -1)
- {
- Msg(0, "%s: readbuf: unknown encoding", rc_name);
- break;
- }
- args += 2;
- }
-#endif
- if (args[0] && args[1])
- {
- Msg(0, "%s: readbuf: too many arguments", rc_name);
- break;
- }
- if ((s = ReadFile(args[0] ? args[0] : BufferFile, &n)))
- {
- if (user->u_plop.buf)
- UserFreeCopyBuffer(user);
- user->u_plop.len = n;
- user->u_plop.buf = s;
-#ifdef ENCODINGS
- user->u_plop.enc = i;
-#endif
- }
- break;
- case RC_REMOVEBUF:
- KillBuffers();
- break;
- case RC_IGNORECASE:
- (void)ParseSwitch(act, &search_ic);
- if (msgok)
- Msg(0, "Will %signore case in searches", search_ic ? "" : "not ");
- break;
-#endif /* COPY_PASTE */
- case RC_ESCAPE:
- if (*argl == 0)
- SetEscape(user, -1, -1);
- else if (*argl == 2)
- SetEscape(user, (int)(unsigned char)args[0][0], (int)(unsigned char)args[0][1]);
- else
- {
- Msg(0, "%s: two characters required after escape.", rc_name);
- break;
- }
- /* Change defescape if master user. This is because we only
- * have one ktab.
- */
- if (display && user != users)
- break;
- /* FALLTHROUGH */
- case RC_DEFESCAPE:
- if (*argl == 0)
- SetEscape(NULL, -1, -1);
- else if (*argl == 2)
- SetEscape(NULL, (int)(unsigned char)args[0][0], (int)(unsigned char)args[0][1]);
- else
- {
- Msg(0, "%s: two characters required after defescape.", rc_name);
- break;
- }
-#ifdef MAPKEYS
- CheckEscape();
-#endif
- break;
- case RC_CHDIR:
- s = *args ? *args : home;
- if (chdir(s) == -1)
- Msg(errno, "%s", s);
- break;
- case RC_SHELL:
- case RC_DEFSHELL:
- if (ParseSaveStr(act, &ShellProg) == 0)
- ShellArgs[0] = ShellProg;
- break;
- case RC_HARDCOPYDIR:
- if (*args)
- (void)ParseSaveStr(act, &hardcopydir);
- if (msgok)
- Msg(0, "hardcopydir is %s\n", hardcopydir && *hardcopydir ? hardcopydir : "<cwd>");
- break;
- case RC_LOGFILE:
- if (*args)
- {
- if (args[1] && !(strcmp(*args, "flush")))
- {
- log_flush = atoi(args[1]);
- if (msgok)
- Msg(0, "log flush timeout set to %ds\n", log_flush);
- break;
- }
- if (ParseSaveStr(act, &screenlogfile) || !msgok)
- break;
- }
- Msg(0, "logfile is '%s'", screenlogfile);
- break;
- case RC_LOGTSTAMP:
- if (!*args || !strcmp(*args, "on") || !strcmp(*args, "off"))
- {
- if (ParseSwitch(act, &logtstamp_on) == 0 && msgok)
- Msg(0, "timestamps turned %s", logtstamp_on ? "on" : "off");
- }
- else if (!strcmp(*args, "string"))
- {
- if (args[1])
- {
- if (logtstamp_string)
- free(logtstamp_string);
- logtstamp_string = SaveStr(args[1]);
- }
- if (msgok)
- Msg(0, "logfile timestamp is '%s'", logtstamp_string);
- }
- else if (!strcmp(*args, "after"))
- {
- if (args[1])
- {
- logtstamp_after = atoi(args[1]);
- if (!msgok)
- break;
- }
- Msg(0, "timestamp printed after %ds\n", logtstamp_after);
- }
- else
- Msg(0, "usage: logtstamp [after [n]|string [str]|on|off]");
- break;
- case RC_SHELLTITLE:
- (void)ParseSaveStr(act, &nwin_default.aka);
- break;
- case RC_TERMCAP:
- case RC_TERMCAPINFO:
- case RC_TERMINFO:
- if (!rc_name || !*rc_name)
- Msg(0, "Sorry, too late now. Place that in your .screenrc file.");
- break;
- case RC_SLEEP:
- break; /* Already handled */
- case RC_TERM:
- s = NULL;
- if (ParseSaveStr(act, &s))
- break;
- if (strlen(s) >= 20)
- {
- Msg(0, "%s: term: argument too long ( < 20)", rc_name);
- free(s);
- break;
- }
- strcpy(screenterm, s);
- free(s);
- debug1("screenterm set to %s\n", screenterm);
- MakeTermcap((display == 0));
- debug("new termcap made\n");
- break;
- case RC_ECHO:
- if (!msgok && (!rc_name || strcmp(rc_name, "-X")))
- break;
- /*
- * user typed ^A:echo... well, echo isn't FinishRc's job,
- * but as he wanted to test us, we show good will
- */
- if (argc > 1 && !strcmp(*args, "-n"))
- {
- args++;
- argc--;
- }
- s = *args;
- if (argc > 1 && !strcmp(*args, "-p"))
- {
- args++;
- argc--;
- s = *args;
- if (s)
- s = MakeWinMsg(s, fore, '%');
- }
- if (s)
- Msg(0, "%s", s);
- else
- Msg(0, "%s: 'echo [-n] [-p] \"string\"' expected.", rc_name);
- break;
- case RC_BELL:
- case RC_BELL_MSG:
- if (*args == 0)
- {
- char buf[256];
- AddXChars(buf, sizeof(buf), BellString);
- Msg(0, "bell_msg is '%s'", buf);
- break;
- }
- (void)ParseSaveStr(act, &BellString);
- break;
-#ifdef COPY_PASTE
- case RC_BUFFERFILE:
- if (*args == 0)
- BufferFile = SaveStr(DEFAULT_BUFFERFILE);
- else if (ParseSaveStr(act, &BufferFile))
- break;
- if (msgok)
- Msg(0, "Bufferfile is now '%s'", BufferFile);
- break;
-#endif
- case RC_ACTIVITY:
- (void)ParseSaveStr(act, &ActivityString);
- break;
-#if defined(DETACH) && defined(POW_DETACH)
- case RC_POW_DETACH_MSG:
- if (*args == 0)
- {
- char buf[256];
- AddXChars(buf, sizeof(buf), PowDetachString);
- Msg(0, "pow_detach_msg is '%s'", buf);
- break;
- }
- (void)ParseSaveStr(act, &PowDetachString);
- break;
-#endif
-#if defined(UTMPOK) && defined(LOGOUTOK)
- case RC_LOGIN:
- n = fore->w_slot != (slot_t)-1;
- if (*args && !strcmp(*args, "always"))
- {
- fore->w_lflag = 3;
- if (!displays && n)
- SlotToggle(n);
- break;
- }
- if (*args && !strcmp(*args, "attached"))
- {
- fore->w_lflag = 1;
- if (!displays && n)
- SlotToggle(0);
- break;
- }
- if (ParseSwitch(act, &n) == 0)
- SlotToggle(n);
- break;
- case RC_DEFLOGIN:
- if (!strcmp(*args, "always"))
- nwin_default.lflag |= 2;
- else if (!strcmp(*args, "attached"))
- nwin_default.lflag &= ~2;
- else
- (void)ParseOnOff(act, &nwin_default.lflag);
- break;
-#endif
- case RC_DEFFLOW:
- if (args[0] && args[1] && args[1][0] == 'i')
- {
- iflag = 1;
- for (display = displays; display; display = display->d_next)
- {
- if (!D_flow)
- continue;
-#if defined(TERMIO) || defined(POSIX)
- D_NewMode.tio.c_cc[VINTR] = D_OldMode.tio.c_cc[VINTR];
- D_NewMode.tio.c_lflag |= ISIG;
-#else /* TERMIO || POSIX */
- D_NewMode.m_tchars.t_intrc = D_OldMode.m_tchars.t_intrc;
-#endif /* TERMIO || POSIX */
- SetTTY(D_userfd, &D_NewMode);
- }
- }
- if (args[0] && args[0][0] == 'a')
- nwin_default.flowflag = FLOW_AUTOFLAG;
- else
- (void)ParseOnOff(act, &nwin_default.flowflag);
- break;
- case RC_DEFWRAP:
- (void)ParseOnOff(act, &nwin_default.wrap);
- break;
- case RC_DEFC1:
- (void)ParseOnOff(act, &nwin_default.c1);
- break;
-#ifdef COLOR
- case RC_DEFBCE:
- (void)ParseOnOff(act, &nwin_default.bce);
- break;
-#endif
- case RC_DEFGR:
- (void)ParseOnOff(act, &nwin_default.gr);
- break;
- case RC_DEFMONITOR:
- if (ParseOnOff(act, &n) == 0)
- nwin_default.monitor = (n == 0) ? MON_OFF : MON_ON;
- break;
- case RC_DEFSILENCE:
- if (ParseOnOff(act, &n) == 0)
- nwin_default.silence = (n == 0) ? SILENCE_OFF : SILENCE_ON;
- break;
- case RC_VERBOSE:
- if (!*args)
- Msg(0, "W%s echo command when creating windows.",
- VerboseCreate ? "ill" : "on't");
- else if (ParseOnOff(act, &n) == 0)
- VerboseCreate = n;
- break;
- case RC_HARDSTATUS:
- if (display)
- {
- Msg(0, "%s", ""); /* wait till mintime (keep gcc quiet) */
- RemoveStatus();
- }
- if (args[0] && strcmp(args[0], "on") && strcmp(args[0], "off"))
- {
- struct display *olddisplay = display;
- int old_use, new_use = -1;
-
- s = args[0];
- if (!strncmp(s, "always", 6))
- s += 6;
- if (!strcmp(s, "lastline"))
- new_use = HSTATUS_LASTLINE;
- else if (!strcmp(s, "ignore"))
- new_use = HSTATUS_IGNORE;
- else if (!strcmp(s, "message"))
- new_use = HSTATUS_MESSAGE;
- else if (!strcmp(args[0], "string"))
- {
- if (!args[1])
- {
- char buf[256];
- AddXChars(buf, sizeof(buf), hstatusstring);
- Msg(0, "hardstatus string is '%s'", buf);
- break;
- }
- }
- else
- {
- Msg(0, "%s: usage: hardstatus [always]lastline|ignore|message|string [string]", rc_name);
- break;
- }
- if (new_use != -1)
- {
- hardstatusemu = new_use | (s == args[0] ? 0 : HSTATUS_ALWAYS);
- for (display = displays; display; display = display->d_next)
- {
- RemoveStatus();
- new_use = hardstatusemu & ~HSTATUS_ALWAYS;
- if (D_HS && s == args[0])
- new_use = HSTATUS_HS;
- ShowHStatus((char *)0);
- old_use = D_has_hstatus;
- D_has_hstatus = new_use;
- if ((new_use == HSTATUS_LASTLINE && old_use != HSTATUS_LASTLINE) || (new_use != HSTATUS_LASTLINE && old_use == HSTATUS_LASTLINE))
- ChangeScreenSize(D_width, D_height, 1);
- RefreshHStatus();
- }
- }
- if (args[1])
- {
- if (hstatusstring)
- free(hstatusstring);
- hstatusstring = SaveStr(args[1]);
- for (display = displays; display; display = display->d_next)
- RefreshHStatus();
- }
- display = olddisplay;
- break;
- }
- (void)ParseSwitch(act, &use_hardstatus);
- if (msgok)
- Msg(0, "messages displayed on %s", use_hardstatus ? "hardstatus line" : "window");
- break;
- case RC_CAPTION:
- if (strcmp(args[0], "always") == 0 || strcmp(args[0], "splitonly") == 0)
- {
- struct display *olddisplay = display;
-
- captionalways = args[0][0] == 'a';
- for (display = displays; display; display = display->d_next)
- ChangeScreenSize(D_width, D_height, 1);
- display = olddisplay;
- }
- else if (strcmp(args[0], "string") == 0)
- {
- if (!args[1])
- {
- char buf[256];
- AddXChars(buf, sizeof(buf), captionstring);
- Msg(0, "caption string is '%s'", buf);
- break;
- }
- }
- else
- {
- Msg(0, "%s: usage: caption always|splitonly|string <string>", rc_name);
- break;
- }
- if (!args[1])
- break;
- if (captionstring)
- free(captionstring);
- captionstring = SaveStr(args[1]);
- RedisplayDisplays(0);
- break;
- case RC_CONSOLE:
- n = (console_window != 0);
- if (ParseSwitch(act, &n))
- break;
- if (TtyGrabConsole(fore->w_ptyfd, n, rc_name))
- break;
- if (n == 0)
- Msg(0, "%s: releasing console %s", rc_name, HostName);
- else if (console_window)
- Msg(0, "%s: stealing console %s from window %d (%s)", rc_name,
- HostName, console_window->w_number, console_window->w_title);
- else
- Msg(0, "%s: grabbing console %s", rc_name, HostName);
- console_window = n ? fore : 0;
- break;
- case RC_ALLPARTIAL:
- if (ParseOnOff(act, &all_norefresh))
- break;
- if (!all_norefresh && fore)
- Activate(-1);
- if (msgok)
- Msg(0, all_norefresh ? "No refresh on window change!\n" :
- "Window specific refresh\n");
- break;
- case RC_PARTIAL:
- (void)ParseSwitch(act, &n);
- fore->w_norefresh = n;
- break;
- case RC_VBELL:
- if (ParseSwitch(act, &visual_bell) || !msgok)
- break;
- if (visual_bell == 0)
- Msg(0, "switched to audible bell.");
- else
- Msg(0, "switched to visual bell.");
- break;
- case RC_VBELLWAIT:
- if (ParseNum1000(act, &VBellWait) == 0 && msgok)
- Msg(0, "vbellwait set to %.10g seconds", VBellWait/1000.);
- break;
- case RC_MSGWAIT:
- if (ParseNum1000(act, &MsgWait) == 0 && msgok)
- Msg(0, "msgwait set to %.10g seconds", MsgWait/1000.);
- break;
- case RC_MSGMINWAIT:
- if (ParseNum1000(act, &MsgMinWait) == 0 && msgok)
- Msg(0, "msgminwait set to %.10g seconds", MsgMinWait/1000.);
- break;
- case RC_SILENCEWAIT:
- if (ParseNum(act, &SilenceWait))
- break;
- if (SilenceWait < 1)
- SilenceWait = 1;
- for (p = windows; p; p = p->w_next)
- p->w_silencewait = SilenceWait;
- if (msgok)
- Msg(0, "silencewait set to %d seconds", SilenceWait);
- break;
- case RC_NUMBER:
- if (*args == 0)
- Msg(0, "This is window %d (%s).\n", fore->w_number, fore->w_title);
- else
- {
- int old = fore->w_number;
-
- if (ParseNum(act, &n) || n >= maxwin)
- break;
- p = wtab[n];
- wtab[n] = fore;
- fore->w_number = n;
- wtab[old] = p;
- if (p)
- p->w_number = old;
-#ifdef MULTIUSER
- /* exchange the acls for these windows. */
- AclWinSwap(old, n);
-#endif
-#ifdef UTMPOK
- /* exchange the utmp-slots for these windows */
- if ((fore->w_slot != (slot_t) -1) && (fore->w_slot != (slot_t) 0))
- {
- RemoveUtmp(fore);
- SetUtmp(fore);
- }
- if (p && (p->w_slot != (slot_t) -1) && (p->w_slot != (slot_t) 0))
- {
- /* XXX: first display wins? */
- display = fore->w_layer.l_cvlist ? fore->w_layer.l_cvlist->c_display : 0;
- RemoveUtmp(p);
- SetUtmp(p);
- }
-#endif
-
- WindowChanged(fore, 'n');
- WindowChanged((struct win *)0, 'w');
- WindowChanged((struct win *)0, 'W');
- WindowChanged((struct win *)0, 0);
- }
- break;
- case RC_SILENCE:
- n = fore->w_silence != 0;
- i = fore->w_silencewait;
- if (args[0] && (args[0][0] == '-' || (args[0][0] >= '0' && args[0][0] <= '9')))
- {
- if (ParseNum(act, &i))
- break;
- n = i > 0;
- }
- else if (ParseSwitch(act, &n))
- break;
- if (n)
- {
-#ifdef MULTIUSER
- if (display) /* we tell only this user */
- ACLBYTE(fore->w_lio_notify, D_user->u_id) |= ACLBIT(D_user->u_id);
- else
- for (n = 0; n < maxusercount; n++)
- ACLBYTE(fore->w_lio_notify, n) |= ACLBIT(n);
-#endif
- fore->w_silencewait = i;
- fore->w_silence = SILENCE_ON;
- SetTimeout(&fore->w_silenceev, fore->w_silencewait * 1000);
- evenq(&fore->w_silenceev);
-
- if (!msgok)
- break;
- Msg(0, "The window is now being monitored for %d sec. silence.", fore->w_silencewait);
- }
- else
- {
-#ifdef MULTIUSER
- if (display) /* we remove only this user */
- ACLBYTE(fore->w_lio_notify, D_user->u_id)
- &= ~ACLBIT(D_user->u_id);
- else
- for (n = 0; n < maxusercount; n++)
- ACLBYTE(fore->w_lio_notify, n) &= ~ACLBIT(n);
- for (i = maxusercount - 1; i >= 0; i--)
- if (ACLBYTE(fore->w_lio_notify, i))
- break;
- if (i < 0)
-#endif
- {
- fore->w_silence = SILENCE_OFF;
- evdeq(&fore->w_silenceev);
- }
- if (!msgok)
- break;
- Msg(0, "The window is no longer being monitored for silence.");
- }
- break;
-#ifdef COPY_PASTE
- case RC_DEFSCROLLBACK:
- (void)ParseNum(act, &nwin_default.histheight);
- break;
- case RC_SCROLLBACK:
- (void)ParseNum(act, &n);
- ChangeWindowSize(fore, fore->w_width, fore->w_height, n);
- if (msgok)
- Msg(0, "scrollback set to %d", fore->w_histheight);
- break;
-#endif
- case RC_SESSIONNAME:
- if (*args == 0)
- Msg(0, "This session is named '%s'\n", SockName);
- else
- {
- char buf[MAXPATHLEN];
-
- s = 0;
- if (ParseSaveStr(act, &s))
- break;
- if (!*s || strlen(s) + (SockName - SockPath) > MAXPATHLEN - 13 || index(s, '/'))
- {
- Msg(0, "%s: bad session name '%s'\n", rc_name, s);
- free(s);
- break;
- }
- strncpy(buf, SockPath, SockName - SockPath);
- sprintf(buf + (SockName - SockPath), "%d.%s", (int)getpid(), s);
- free(s);
- if ((access(buf, F_OK) == 0) || (errno != ENOENT))
- {
- Msg(0, "%s: inappropriate path: '%s'.", rc_name, buf);
- break;
- }
- if (rename(SockPath, buf))
- {
- Msg(errno, "%s: failed to rename(%s, %s)", rc_name, SockPath, buf);
- break;
- }
- debug2("rename(%s, %s) done\n", SockPath, buf);
- strcpy(SockPath, buf);
- MakeNewEnv();
- }
- break;
- case RC_SETENV:
- if (!args[0] || !args[1])
- {
- debug1("RC_SETENV arguments missing: %s\n", args[0] ? args[0] : "");
- InputSetenv(args[0]);
- }
- else
- {
- xsetenv(args[0], args[1]);
- MakeNewEnv();
- }
- break;
- case RC_UNSETENV:
- unsetenv(*args);
- MakeNewEnv();
- break;
-#ifdef COPY_PASTE
- case RC_DEFSLOWPASTE:
- (void)ParseNum(act, &nwin_default.slow);
- break;
- case RC_SLOWPASTE:
- if (*args == 0)
- Msg(0, fore->w_slowpaste ?
- "Slowpaste in window %d is %d milliseconds." :
- "Slowpaste in window %d is unset.",
- fore->w_number, fore->w_slowpaste);
- else if (ParseNum(act, &fore->w_slowpaste) == 0 && msgok)
- Msg(0, fore->w_slowpaste ?
- "Slowpaste in window %d set to %d milliseconds." :
- "Slowpaste in window %d now unset.",
- fore->w_number, fore->w_slowpaste);
- break;
- case RC_MARKKEYS:
- if (CompileKeys(*args, *argl, mark_key_tab))
- {
- Msg(0, "%s: markkeys: syntax error.", rc_name);
- break;
- }
- debug1("markkeys %s\n", *args);
- break;
-# ifdef FONT
- case RC_PASTEFONT:
- if (ParseSwitch(act, &pastefont) == 0 && msgok)
- Msg(0, "Will %spaste font settings", pastefont ? "" : "not ");
- break;
-# endif
- case RC_CRLF:
- (void)ParseSwitch(act, &join_with_cr);
- break;
- case RC_COMPACTHIST:
- if (ParseSwitch(act, &compacthist) == 0 && msgok)
- Msg(0, "%scompacting history lines", compacthist ? "" : "not ");
- break;
-#endif
-#ifdef NETHACK
- case RC_NETHACK:
- (void)ParseOnOff(act, &nethackflag);
- break;
-#endif
- case RC_HARDCOPY_APPEND:
- (void)ParseOnOff(act, &hardcopy_append);
- break;
- case RC_VBELL_MSG:
- if (*args == 0)
- {
- char buf[256];
- AddXChars(buf, sizeof(buf), VisualBellString);
- Msg(0, "vbell_msg is '%s'", buf);
- break;
- }
- (void)ParseSaveStr(act, &VisualBellString);
- debug1(" new vbellstr '%s'\n", VisualBellString);
- break;
- case RC_DEFMODE:
- if (ParseBase(act, *args, &n, 8, "octal"))
- break;
- if (n < 0 || n > 0777)
- {
- Msg(0, "%s: mode: Invalid tty mode %o", rc_name, n);
- break;
- }
- TtyMode = n;
- if (msgok)
- Msg(0, "Ttymode set to %03o", TtyMode);
- break;
- case RC_AUTODETACH:
- (void)ParseOnOff(act, &auto_detach);
- break;
- case RC_STARTUP_MESSAGE:
- (void)ParseOnOff(act, &default_startup);
- break;
-#ifdef PASSWORD
- case RC_PASSWORD:
- if (*args)
- {
- n = (*user->u_password) ? 1 : 0;
- if (user->u_password != NullStr) free((char *)user->u_password);
- user->u_password = SaveStr(*args);
- if (!strcmp(user->u_password, "none"))
- {
- if (n)
- Msg(0, "Password checking disabled");
- free(user->u_password);
- user->u_password = NullStr;
- }
- }
- else
- {
- if (!fore)
- {
- Msg(0, "%s: password: window required", rc_name);
- break;
- }
- Input("New screen password:", 100, INP_NOECHO, pass1, display ? (char *)D_user : (char *)users);
- }
- break;
-#endif /* PASSWORD */
- case RC_BIND:
- {
- struct action *ktabp = ktab;
-
- if (argc > 2 && !strcmp(*args, "-c"))
- {
- ktabp = FindKtab(args[1], 1);
- if (ktabp == 0)
- break;
- args += 2;
- argl += 2;
- }
- if (*argl != 1)
- {
- Msg(0, "%s: bind: character, ^x, or (octal) \\032 expected.", rc_name);
- break;
- }
- n = (unsigned char)args[0][0];
- if (args[1])
- {
- if ((i = FindCommnr(args[1])) == RC_ILLEGAL)
- {
- Msg(0, "%s: bind: unknown command '%s'", rc_name, args[1]);
- break;
- }
- if (CheckArgNum(i, args + 2) < 0)
- break;
- ClearAction(&ktabp[n]);
- SaveAction(ktabp + n, i, args + 2, argl + 2);
- }
- else
- ClearAction(&ktabp[n]);
- }
- break;
-#ifdef MAPKEYS
- case RC_BINDKEY:
- {
- struct action *newact;
- int newnr, fl = 0, kf = 0, af = 0, df = 0, mf = 0;
- struct display *odisp = display;
- int used = 0;
- struct kmap_ext *kme;
-
- for (; *args && **args == '-'; args++, argl++)
- {
- if (strcmp(*args, "-t") == 0)
- fl = KMAP_NOTIMEOUT;
- else if (strcmp(*args, "-k") == 0)
- kf = 1;
- else if (strcmp(*args, "-a") == 0)
- af = 1;
- else if (strcmp(*args, "-d") == 0)
- df = 1;
- else if (strcmp(*args, "-m") == 0)
- mf = 1;
- else if (strcmp(*args, "--") == 0)
- {
- args++;
- argl++;
- break;
- }
- else
- {
- Msg(0, "%s: bindkey: invalid option %s", rc_name, *args);
- return;
- }
- }
- if (df && mf)
- {
- Msg(0, "%s: bindkey: -d does not work with -m", rc_name);
- break;
- }
- if (*args == 0)
- {
- if (mf)
- display_bindkey("Edit mode", mmtab);
- else if (df)
- display_bindkey("Default", dmtab);
- else
- display_bindkey("User", umtab);
- break;
- }
- if (kf == 0)
- {
- if (af)
- {
- Msg(0, "%s: bindkey: -a only works with -k", rc_name);
- break;
- }
- if (*argl == 0)
- {
- Msg(0, "%s: bindkey: empty string makes no sense", rc_name);
- break;
- }
- for (i = 0, kme = kmap_exts; i < kmap_extn; i++, kme++)
- if (kme->str == 0)
- {
- if (args[1])
- break;
- }
- else
- if (*argl == (kme->fl & ~KMAP_NOTIMEOUT) && bcmp(kme->str, *args, *argl) == 0)
- break;
- if (i == kmap_extn)
- {
- if (!args[1])
- {
- Msg(0, "%s: bindkey: keybinding not found", rc_name);
- break;
- }
- kmap_extn += 8;
- kmap_exts = (struct kmap_ext *)xrealloc((char *)kmap_exts, kmap_extn * sizeof(*kmap_exts));
- kme = kmap_exts + i;
- bzero((char *)kme, 8 * sizeof(*kmap_exts));
- for (; i < kmap_extn; i++, kme++)
- {
- kme->str = 0;
- kme->dm.nr = kme->mm.nr = kme->um.nr = RC_ILLEGAL;
- kme->dm.args = kme->mm.args = kme->um.args = noargs;
- }
- i -= 8;
- kme -= 8;
- }
- if (df == 0 && kme->dm.nr != RC_ILLEGAL)
- used = 1;
- if (mf == 0 && kme->mm.nr != RC_ILLEGAL)
- used = 1;
- if ((df || mf) && kme->um.nr != RC_ILLEGAL)
- used = 1;
- i += KMAP_KEYS + KMAP_AKEYS;
- newact = df ? &kme->dm : mf ? &kme->mm : &kme->um;
- }
- else
- {
- for (i = T_CAPS; i < T_OCAPS; i++)
- if (strcmp(term[i].tcname, *args) == 0)
- break;
- if (i == T_OCAPS)
- {
- Msg(0, "%s: bindkey: unknown key '%s'", rc_name, *args);
- break;
- }
- if (af && i >= T_CURSOR && i < T_OCAPS)
- i -= T_CURSOR - KMAP_KEYS;
- else
- i -= T_CAPS;
- newact = df ? &dmtab[i] : mf ? &mmtab[i] : &umtab[i];
- }
- if (args[1])
- {
- if ((newnr = FindCommnr(args[1])) == RC_ILLEGAL)
- {
- Msg(0, "%s: bindkey: unknown command '%s'", rc_name, args[1]);
- break;
- }
- if (CheckArgNum(newnr, args + 2) < 0)
- break;
- ClearAction(newact);
- SaveAction(newact, newnr, args + 2, argl + 2);
- if (kf == 0 && args[1])
- {
- if (kme->str)
- free(kme->str);
- kme->str = SaveStrn(*args, *argl);
- kme->fl = fl | *argl;
- }
- }
- else
- ClearAction(newact);
- for (display = displays; display; display = display->d_next)
- remap(i, args[1] ? 1 : 0);
- if (kf == 0 && !args[1])
- {
- if (!used && kme->str)
- {
- free(kme->str);
- kme->str = 0;
- kme->fl = 0;
- }
- }
- display = odisp;
- }
- break;
- case RC_MAPTIMEOUT:
- if (*args)
- {
- if (ParseNum(act, &n))
- break;
- if (n < 0)
- {
- Msg(0, "%s: maptimeout: illegal time %d", rc_name, n);
- break;
- }
- maptimeout = n;
- }
- if (*args == 0 || msgok)
- Msg(0, "maptimeout is %dms", maptimeout);
- break;
- case RC_MAPNOTNEXT:
- D_dontmap = 1;
- break;
- case RC_MAPDEFAULT:
- D_mapdefault = 1;
- break;
-#endif
-#ifdef MULTIUSER
- case RC_ACLCHG:
- case RC_ACLADD:
- case RC_ADDACL:
- case RC_CHACL:
- UsersAcl(NULL, argc, args);
- break;
- case RC_ACLDEL:
- if (UserDel(args[0], NULL))
- break;
- if (msgok)
- Msg(0, "%s removed from acl database", args[0]);
- break;
- case RC_ACLGRP:
- /*
- * modify a user to gain or lose rights granted to a group.
- * This group is actually a normal user whose rights were defined
- * with chacl in the usual way.
- */
- if (args[1])
- {
- if (strcmp(args[1], "none")) /* link a user to another user */
- {
- if (AclLinkUser(args[0], args[1]))
- break;
- if (msgok)
- Msg(0, "User %s joined acl-group %s", args[0], args[1]);
- }
- else /* remove all groups from user */
- {
- struct acluser *u;
- struct aclusergroup *g;
-
- if (!(u = *FindUserPtr(args[0])))
- break;
- while ((g = u->u_group))
- {
- u->u_group = g->next;
- free((char *)g);
- }
- }
- }
- else /* show all groups of user */
- {
- char buf[256], *p = buf;
- int ngroups = 0;
- struct acluser *u;
- struct aclusergroup *g;
-
- if (!(u = *FindUserPtr(args[0])))
- {
- if (msgok)
- Msg(0, "User %s does not exist.", args[0]);
- break;
- }
- g = u->u_group;
- while (g)
- {
- ngroups++;
- sprintf(p, "%s ", g->u->u_name);
- p += strlen(p);
- if (p > buf+200)
- break;
- g = g->next;
- }
- if (ngroups)
- *(--p) = '\0';
- Msg(0, "%s's group%s: %s.", args[0], (ngroups == 1) ? "" : "s",
- (ngroups == 0) ? "none" : buf);
- }
- break;
- case RC_ACLUMASK:
- case RC_UMASK:
- while ((s = *args++))
- {
- char *err = 0;
-
- if (AclUmask(display ? D_user : users, s, &err))
- Msg(0, "umask: %s\n", err);
- }
- break;
- case RC_MULTIUSER:
- if (ParseOnOff(act, &n))
- break;
- multi = n ? "" : 0;
- chsock();
- if (msgok)
- Msg(0, "Multiuser mode %s", multi ? "enabled" : "disabled");
- break;
-#endif /* MULTIUSER */
-#ifdef PSEUDOS
- case RC_EXEC:
- winexec(args);
- break;
-#endif
-#ifdef MULTI
- case RC_NONBLOCK:
- i = D_nonblock >= 0;
- if (*args && ((args[0][0] >= '0' && args[0][0] <= '9') || args[0][0] == '.'))
- {
- if (ParseNum1000(act, &i))
- break;
- }
- else if (!ParseSwitch(act, &i))
- i = i == 0 ? -1 : 1000;
- else
- break;
- if (msgok && i == -1)
- Msg(0, "display set to blocking mode");
- else if (msgok && i == 0)
- Msg(0, "display set to nonblocking mode, no timeout");
- else if (msgok)
- Msg(0, "display set to nonblocking mode, %.10gs timeout", i/1000.);
- D_nonblock = i;
- if (D_nonblock <= 0)
- evdeq(&D_blockedev);
- break;
- case RC_DEFNONBLOCK:
- if (*args && ((args[0][0] >= '0' && args[0][0] <= '9') || args[0][0] == '.'))
- {
- if (ParseNum1000(act, &defnonblock))
- break;
- }
- else if (!ParseOnOff(act, &defnonblock))
- defnonblock = defnonblock == 0 ? -1 : 1000;
- else
- break;
- if (display && *rc_name)
- {
- D_nonblock = defnonblock;
- if (D_nonblock <= 0)
- evdeq(&D_blockedev);
- }
- break;
-#endif
- case RC_GR:
-#ifdef ENCODINGS
- if (fore->w_gr == 2)
- fore->w_gr = 0;
-#endif
- if (ParseSwitch(act, &fore->w_gr) == 0 && msgok)
- Msg(0, "Will %suse GR", fore->w_gr ? "" : "not ");
-#ifdef ENCODINGS
- if (fore->w_gr == 0 && fore->w_FontE)
- fore->w_gr = 2;
-#endif
- break;
- case RC_C1:
- if (ParseSwitch(act, &fore->w_c1) == 0 && msgok)
- Msg(0, "Will %suse C1", fore->w_c1 ? "" : "not ");
- break;
-#ifdef COLOR
- case RC_BCE:
- if (ParseSwitch(act, &fore->w_bce) == 0 && msgok)
- Msg(0, "Will %serase with background color", fore->w_bce ? "" : "not ");
- break;
-#endif
-#ifdef ENCODINGS
- case RC_KANJI:
- case RC_ENCODING:
-#ifdef UTF8
- if (*args && !strcmp(args[0], "-d"))
- {
- if (!args[1])
- Msg(0, "encodings directory is %s", screenencodings ? screenencodings : "<unset>");
- else
- {
- free(screenencodings);
- screenencodings = SaveStr(args[1]);
- }
- break;
- }
- if (*args && !strcmp(args[0], "-l"))
- {
- if (!args[1])
- Msg(0, "encoding: -l: argument required");
- else if (LoadFontTranslation(-1, args[1]))
- Msg(0, "encoding: could not load utf8 encoding file");
- else if (msgok)
- Msg(0, "encoding: utf8 encoding file loaded");
- break;
- }
-#else
- if (*args && (!strcmp(args[0], "-l") || !strcmp(args[0], "-d")))
- {
- if (msgok)
- Msg(0, "encoding: screen is not compiled for UTF-8.");
- break;
- }
-#endif
- for (i = 0; i < 2; i++)
- {
- if (args[i] == 0)
- break;
- if (!strcmp(args[i], "."))
- continue;
- n = FindEncoding(args[i]);
- if (n == -1)
- {
- Msg(0, "encoding: unknown encoding '%s'", args[i]);
- break;
- }
- if (i == 0 && fore)
- {
- WinSwitchEncoding(fore, n);
- ResetCharsets(fore);
- }
- else if (i && display)
- D_encoding = n;
- }
- break;
- case RC_DEFKANJI:
- case RC_DEFENCODING:
- n = FindEncoding(*args);
- if (n == -1)
- {
- Msg(0, "defencoding: unknown encoding '%s'", *args);
- break;
- }
- nwin_default.encoding = n;
- break;
-#endif
-
-#ifdef UTF8
- case RC_DEFUTF8:
- n = nwin_default.encoding == UTF8;
- if (ParseSwitch(act, &n) == 0)
- {
- nwin_default.encoding = n ? UTF8 : 0;
- if (msgok)
- Msg(0, "Will %suse UTF-8 encoding for new windows", n ? "" : "not ");
- }
- break;
- case RC_UTF8:
- for (i = 0; i < 2; i++)
- {
- if (i && args[i] == 0)
- break;
- if (args[i] == 0)
- n = fore->w_encoding != UTF8;
- else if (strcmp(args[i], "off") == 0)
- n = 0;
- else if (strcmp(args[i], "on") == 0)
- n = 1;
- else
- {
- Msg(0, "utf8: illegal argument (%s)", args[i]);
- break;
- }
- if (i == 0)
- {
- WinSwitchEncoding(fore, n ? UTF8 : 0);
- if (msgok)
- Msg(0, "Will %suse UTF-8 encoding", n ? "" : "not ");
- }
- else if (display)
- D_encoding = n ? UTF8 : 0;
- if (args[i] == 0)
- break;
- }
- break;
-#endif
-
- case RC_PRINTCMD:
- if (*args)
- {
- if (printcmd)
- free(printcmd);
- printcmd = 0;
- if (**args)
- printcmd = SaveStr(*args);
- }
- if (*args == 0 || msgok)
- {
- if (printcmd)
- Msg(0, "using '%s' as print command", printcmd);
- else
- Msg(0, "using termcap entries for printing");
- break;
- }
- break;
-
- case RC_DIGRAPH:
- Input("Enter digraph: ", 10, INP_EVERY, digraph_fn, NULL);
- if (*args && **args)
- {
- s = *args;
- n = strlen(s);
- LayProcess(&s, &n);
- }
- break;
-
- case RC_DEFHSTATUS:
- if (*args == 0)
- {
- char buf[256];
- *buf = 0;
- if (nwin_default.hstatus)
- AddXChars(buf, sizeof(buf), nwin_default.hstatus);
- Msg(0, "default hstatus is '%s'", buf);
- break;
- }
- (void)ParseSaveStr(act, &nwin_default.hstatus);
- if (*nwin_default.hstatus == 0)
- {
- free(nwin_default.hstatus);
- nwin_default.hstatus = 0;
- }
- break;
- case RC_HSTATUS:
- (void)ParseSaveStr(act, &fore->w_hstatus);
- if (*fore->w_hstatus == 0)
- {
- free(fore->w_hstatus);
- fore->w_hstatus = 0;
- }
- WindowChanged(fore, 'h');
- break;
-
-#ifdef FONT
- case RC_DEFCHARSET:
- case RC_CHARSET:
- if (*args == 0)
- {
- char buf[256];
- *buf = 0;
- if (nwin_default.charset)
- AddXChars(buf, sizeof(buf), nwin_default.charset);
- Msg(0, "default charset is '%s'", buf);
- break;
- }
- n = strlen(*args);
- if (n == 0 || n > 6)
- {
- Msg(0, "%s: %s: string has illegal size.", rc_name, comms[nr].name);
- break;
- }
- if (n > 4 && (
- ((args[0][4] < '0' || args[0][4] > '3') && args[0][4] != '.') ||
- ((args[0][5] < '0' || args[0][5] > '3') && args[0][5] && args[0][5] != '.')))
- {
- Msg(0, "%s: %s: illegal mapping number.", rc_name, comms[nr].name);
- break;
- }
- if (nr == RC_CHARSET)
- {
- SetCharsets(fore, *args);
- break;
- }
- if (nwin_default.charset)
- free(nwin_default.charset);
- nwin_default.charset = SaveStr(*args);
- break;
-#endif
-#ifdef COLOR
- case RC_ATTRCOLOR:
- s = args[0];
- if (*s >= '0' && *s <= '9')
- i = *s - '0';
- else
- for (i = 0; i < 8; i++)
- if (*s == "dubrsBiI"[i])
- break;
- s++;
- nr = 0;
- if (*s && s[1] && !s[2])
- {
- if (*s == 'd' && s[1] == 'd')
- nr = 3;
- else if (*s == '.' && s[1] == 'd')
- nr = 2;
- else if (*s == 'd' && s[1] == '.')
- nr = 1;
- else if (*s != '.' || s[1] != '.')
- s--;
- s += 2;
- }
- if (*s || i < 0 || i >= 8)
- {
- Msg(0, "%s: attrcolor: unknown attribute '%s'.", rc_name, args[0]);
- break;
- }
- n = 0;
- if (args[1])
- n = ParseAttrColor(args[1], args[2], 1);
- if (n == -1)
- break;
- attr2color[i][nr] = n;
- n = 0;
- for (i = 0; i < 8; i++)
- if (attr2color[i][0] || attr2color[i][1] || attr2color[i][2] || attr2color[i][3])
- n |= 1 << i;
- nattr2color = n;
- break;
-#endif
- case RC_SORENDITION:
- i = 0;
- if (*args)
- {
- i = ParseAttrColor(*args, args[1], 1);
- if (i == -1)
- break;
- ApplyAttrColor(i, &mchar_so);
- debug2("--> %x %x\n", mchar_so.attr, mchar_so.color);
- }
- if (msgok)
-#ifdef COLOR
- Msg(0, "Standout attributes 0x%02x color 0x%02x", (unsigned char)mchar_so.attr, 0x99 ^ (unsigned char)mchar_so.color);
-#else
- Msg(0, "Standout attributes 0x%02x ", (unsigned char)mchar_so.attr);
-#endif
- break;
-
- case RC_SOURCE:
- do_source(*args);
- break;
-
-#ifdef MULTIUSER
- case RC_SU:
- s = NULL;
- if (!*args)
- {
- Msg(0, "%s:%s screen login", HostName, SockPath);
- InputSu(D_fore, &D_user, NULL);
- }
- else if (!args[1])
- InputSu(D_fore, &D_user, args[0]);
- else if (!args[2])
- s = DoSu(&D_user, args[0], args[1], "\377");
- else
- s = DoSu(&D_user, args[0], args[1], args[2]);
- if (s)
- Msg(0, "%s", s);
- break;
-#endif /* MULTIUSER */
- case RC_SPLIT:
- AddCanvas();
- Activate(-1);
- break;
- case RC_REMOVE:
- RemCanvas();
- Activate(-1);
- break;
- case RC_ONLY:
- OneCanvas();
- Activate(-1);
- break;
- case RC_FIT:
- D_forecv->c_xoff = D_forecv->c_xs;
- D_forecv->c_yoff = D_forecv->c_ys;
- RethinkViewportOffsets(D_forecv);
- ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, 0);
- flayer = D_forecv->c_layer;
- LaySetCursor();
- break;
- case RC_FOCUS:
- if (!*args || !strcmp(*args, "down"))
- D_forecv = D_forecv->c_next ? D_forecv->c_next : D_cvlist;
- else if (!strcmp(*args, "up"))
- {
- struct canvas *cv;
- for (cv = D_cvlist; cv->c_next && cv->c_next != D_forecv; cv = cv->c_next)
- ;
- D_forecv = cv;
- }
- else if (!strcmp(*args, "top"))
- D_forecv = D_cvlist;
- else if (!strcmp(*args, "bottom"))
- {
- struct canvas *cv;
- for (cv = D_cvlist; cv->c_next; cv = cv->c_next)
- ;
- D_forecv = cv;
- }
- else
- {
- Msg(0, "%s: usage: focus [up|down|top|bottom]", rc_name);
- break;
- }
- fore = D_fore = Layer2Window(D_forecv->c_layer);
- flayer = D_forecv->c_layer;
-#ifdef RXVT_OSC
- if (D_xtermosc[2] || D_xtermosc[3])
- {
- Activate(-1);
- break;
- }
-#endif
- RefreshHStatus();
-#ifdef RXVT_OSC
- RefreshXtermOSC();
-#endif
- flayer = D_forecv->c_layer;
- CV_CALL(D_forecv, LayRestore();LaySetCursor());
- WindowChanged(0, 'F');
- break;
- case RC_RESIZE:
- if (*args)
- ResizeRegions(*args);
- else
- Input("resize # lines: ", 20, INP_COOKED, ResizeFin, (char*)0);
- break;
- case RC_SETSID:
- (void)ParseSwitch(act, &separate_sids);
- break;
- case RC_EVAL:
- for (; *args; args++)
- {
- char *ss = SaveStr(*args);
- if (*ss)
- Colonfin(ss, strlen(ss), (char *)0);
- free(ss);
- }
- break;
- case RC_ALTSCREEN:
- (void)ParseSwitch(act, &use_altscreen);
- if (msgok)
- Msg(0, "Will %sdo alternate screen switching", use_altscreen ? "" : "not ");
- break;
- case RC_MAXWIN:
- if (ParseNum(act, &n))
- break;
- if (n < 1)
- Msg(0, "illegal maxwin number specified");
- else if (n > maxwin)
- Msg(0, "may only decrease maxwin number");
- else
- maxwin = n;
- break;
- case RC_BACKTICK:
- if (ParseBase(act, *args, &n, 10, "decimal"))
- break;
- if (!args[1])
- setbacktick(n, 0, 0, (char **)0);
- else
- {
- int lifespan, tick;
- if (argc < 4)
- {
- Msg(0, "%s: usage: backtick num [lifespan tick cmd args...]", rc_name);
- break;
- }
- if (ParseBase(act, args[1], &lifespan, 10, "decimal"))
- break;
- if (ParseBase(act, args[2], &tick, 10, "decimal"))
- break;
- setbacktick(n, lifespan, tick, SaveArgs(args + 3));
- }
- WindowChanged(0, '`');
- break;
- case RC_BLANKER:
-#ifdef BLANKER_PRG
- if (blankerprg)
- {
- RunBlanker(blankerprg);
- break;
- }
-#endif
- ClearAll();
- CursorVisibility(-1);
- D_blocked = 4;
- break;
-#ifdef BLANKER_PRG
- case RC_BLANKERPRG:
- if (blankerprg)
- {
- char **pp;
- for (pp = blankerprg; *pp; pp++)
- free(*pp);
- free(blankerprg);
- blankerprg = 0;
- }
- if (args[0][0])
- blankerprg = SaveArgs(args);
- break;
-#endif
- case RC_IDLE:
- if (*args)
- {
- struct display *olddisplay = display;
- if (!strcmp(*args, "off"))
- idletimo = 0;
- else if (args[0][0])
- idletimo = atoi(*args) * 1000;
- if (argc > 1)
- {
- if ((i = FindCommnr(args[1])) == RC_ILLEGAL)
- {
- Msg(0, "%s: idle: unknown command '%s'", rc_name, args[1]);
- break;
- }
- if (CheckArgNum(i, args + 2) < 0)
- break;
- ClearAction(&idleaction);
- SaveAction(&idleaction, i, args + 2, argl + 2);
- }
- for (display = displays; display; display = display->d_next)
- ResetIdle();
- display = olddisplay;
- }
- if (msgok)
- {
- if (idletimo)
- Msg(0, "idle timeout %ds, %s", idletimo / 1000, comms[idleaction.nr].name);
- else
- Msg(0, "idle off");
- }
- break;
- default:
-#ifdef HAVE_BRAILLE
- /* key == -2: input from braille keybord, msgok always 0 */
- DoBrailleAction(act, key == -2 ? 0 : msgok);
-#endif
- break;
- }
- if (display != odisplay)
- {
- for (display = displays; display; display = display->d_next)
- if (display == odisplay)
- break;
- }
-}
-
-void
-DoCommand(argv, argl)
-char **argv;
-int *argl;
-{
- struct action act;
-
- if ((act.nr = FindCommnr(*argv)) == RC_ILLEGAL)
- {
- Msg(0, "%s: unknown command '%s'", rc_name, *argv);
- return;
- }
- act.args = argv + 1;
- act.argl = argl + 1;
- DoAction(&act, -1);
-}
-
-static void
-SaveAction(act, nr, args, argl)
-struct action *act;
-int nr;
-char **args;
-int *argl;
-{
- register int argc = 0;
- char **pp;
- int *lp;
-
- if (args)
- while (args[argc])
- argc++;
- if (argc == 0)
- {
- act->nr = nr;
- act->args = noargs;
- act->argl = 0;
- return;
- }
- if ((pp = (char **)malloc((unsigned)(argc + 1) * sizeof(char **))) == 0)
- Panic(0, strnomem);
- if ((lp = (int *)malloc((unsigned)(argc) * sizeof(int *))) == 0)
- Panic(0, strnomem);
- act->nr = nr;
- act->args = pp;
- act->argl = lp;
- while (argc--)
- {
- *lp = argl ? *argl++ : (int)strlen(*args);
- *pp++ = SaveStrn(*args++, *lp++);
- }
- *pp = 0;
-}
-
-static char **
-SaveArgs(args)
-char **args;
-{
- register char **ap, **pp;
- register int argc = 0;
-
- while (args[argc])
- argc++;
- if ((pp = ap = (char **)malloc((unsigned)(argc + 1) * sizeof(char **))) == 0)
- Panic(0, strnomem);
- while (argc--)
- *pp++ = SaveStr(*args++);
- *pp = 0;
- return ap;
-}
-
-
-/*
- * buf is split into argument vector args.
- * leading whitespace is removed.
- * @!| abbreviations are expanded.
- * the end of buffer is recognized by '\0' or an un-escaped '#'.
- * " and ' are interpreted.
- *
- * argc is returned.
- */
-int
-Parse(buf, bufl, args, argl)
-char *buf, **args;
-int bufl, *argl;
-{
- register char *p = buf, **ap = args, *pp;
- register int delim, argc;
- int *lp = argl;
-
- debug2("Parse %d %s\n", bufl, buf);
- argc = 0;
- pp = buf;
- delim = 0;
- for (;;)
- {
- while (*p && (*p == ' ' || *p == '\t'))
- ++p;
-#ifdef PSEUDOS
- if (argc == 0 && *p == '!')
- {
- *ap++ = "exec";
- *lp++ = 4;
- p++;
- argc++;
- continue;
- }
-#endif
- if (*p == '\0' || *p == '#' || *p == '\n')
- {
- *p = '\0';
- for (delim = 0; delim < argc; delim++)
- debug1("-- %s\n", args[delim]);
- args[argc] = 0;
- return argc;
- }
- if (++argc >= MAXARGS)
- {
- Msg(0, "%s: too many tokens.", rc_name);
- return 0;
- }
- *ap++ = pp;
-
- debug1("- new arg %s\n", p);
- while (*p)
- {
- if (*p == delim)
- delim = 0;
- else if (delim != '\'' && *p == '\\' && (p[1] == '\'' || p[1] == '"' || p[1] == '\\' || p[1] == '$' || p[1] == '#' || p[1] == '^' || (p[1] >= '0' && p[1] <= '7')))
- {
- p++;
- if (*p >= '0' && *p <= '7')
- {
- *pp = *p - '0';
- if (p[1] >= '0' && p[1] <= '7')
- {
- p++;
- *pp = (*pp << 3) | (*p - '0');
- if (p[1] >= '0' && p[1] <= '7')
- {
- p++;
- *pp = (*pp << 3) | (*p - '0');
- }
- }
- pp++;
- }
- else
- *pp++ = *p;
- }
- else if (delim != '\'' && *p == '$' && (p[1] == '{' || p[1] == ':' || (p[1] >= 'a' && p[1] <= 'z') || (p[1] >= 'A' && p[1] <= 'Z') || (p[1] >= '0' && p[1] <= '9') || p[1] == '_'))
-
- {
- char *ps, *pe, op, *v, xbuf[11];
- int vl;
-
- ps = ++p;
- debug1("- var %s\n", ps);
- p++;
- while (*p)
- {
- if (*ps == '{' && *p == '}')
- break;
- if (*ps == ':' && *p == ':')
- break;
- if (*ps != '{' && *ps != ':' && (*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9') && *p != '_')
- break;
- p++;
- }
- pe = p;
- if (*ps == '{' || *ps == ':')
- {
- if (!*p)
- {
- Msg(0, "%s: bad variable name.", rc_name);
- return 0;
- }
- p++;
- }
- op = *pe;
- *pe = 0;
- debug1("- var is '%s'\n", ps);
- if (*ps == ':')
- v = gettermcapstring(ps + 1);
- else
- {
- if (*ps == '{')
- ps++;
- v = xbuf;
- if (!strcmp(ps, "TERM"))
- v = display ? D_termname : "unknown";
- else if (!strcmp(ps, "COLUMNS"))
- sprintf(xbuf, "%d", display ? D_width : -1);
- else if (!strcmp(ps, "LINES"))
- sprintf(xbuf, "%d", display ? D_height : -1);
- else
- v = getenv(ps);
- }
- *pe = op;
- vl = v ? strlen(v) : 0;
- if (vl)
- {
- debug1("- sub is '%s'\n", v);
- if (p - pp < vl)
- {
- int right = buf + bufl - (p + strlen(p) + 1);
- if (right > 0)
- {
- bcopy(p, p + right, strlen(p) + 1);
- p += right;
- }
- }
- if (p - pp < vl)
- {
- Msg(0, "%s: no space left for variable expansion.", rc_name);
- return 0;
- }
- bcopy(v, pp, vl);
- pp += vl;
- }
- continue;
- }
- else if (delim != '\'' && *p == '^' && p[1])
- {
- p++;
- *pp++ = *p == '?' ? '\177' : *p & 0x1f;
- }
- else if (delim == 0 && (*p == '\'' || *p == '"'))
- delim = *p;
- else if (delim == 0 && (*p == ' ' || *p == '\t' || *p == '\n'))
- break;
- else
- *pp++ = *p;
- p++;
- }
- if (delim)
- {
- Msg(0, "%s: Missing %c quote.", rc_name, delim);
- return 0;
- }
- if (*p)
- p++;
- *pp = 0;
- debug2("- arg done, '%s' rest %s\n", ap[-1], p);
- *lp++ = pp - ap[-1];
- pp++;
- }
-}
-
-void
-SetEscape(u, e, me)
-struct acluser *u;
-int e, me;
-{
- if (u)
- {
- u->u_Esc = e;
- u->u_MetaEsc = me;
- }
- else
- {
- if (users)
- {
- if (DefaultEsc >= 0)
- ClearAction(&ktab[DefaultEsc]);
- if (DefaultMetaEsc >= 0)
- ClearAction(&ktab[DefaultMetaEsc]);
- }
- DefaultEsc = e;
- DefaultMetaEsc = me;
- if (users)
- {
- if (DefaultEsc >= 0)
- {
- ClearAction(&ktab[DefaultEsc]);
- ktab[DefaultEsc].nr = RC_OTHER;
- }
- if (DefaultMetaEsc >= 0)
- {
- ClearAction(&ktab[DefaultMetaEsc]);
- ktab[DefaultMetaEsc].nr = RC_META;
- }
- }
- }
-}
-
-int
-ParseSwitch(act, var)
-struct action *act;
-int *var;
-{
- if (*act->args == 0)
- {
- *var ^= 1;
- return 0;
- }
- return ParseOnOff(act, var);
-}
-
-static int
-ParseOnOff(act, var)
-struct action *act;
-int *var;
-{
- register int num = -1;
- char **args = act->args;
-
- if (args[1] == 0)
- {
- if (strcmp(args[0], "on") == 0)
- num = 1;
- else if (strcmp(args[0], "off") == 0)
- num = 0;
- }
- if (num < 0)
- {
- Msg(0, "%s: %s: invalid argument. Give 'on' or 'off'", rc_name, comms[act->nr].name);
- return -1;
- }
- *var = num;
- return 0;
-}
-
-int
-ParseSaveStr(act, var)
-struct action *act;
-char **var;
-{
- char **args = act->args;
- if (*args == 0 || args[1])
- {
- Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name);
- return -1;
- }
- if (*var)
- free(*var);
- *var = SaveStr(*args);
- return 0;
-}
-
-int
-ParseNum(act, var)
-struct action *act;
-int *var;
-{
- int i;
- char *p, **args = act->args;
-
- p = *args;
- if (p == 0 || *p == 0 || args[1])
- {
- Msg(0, "%s: %s: invalid argument. Give one argument.",
- rc_name, comms[act->nr].name);
- return -1;
- }
- i = 0;
- while (*p)
- {
- if (*p >= '0' && *p <= '9')
- i = 10 * i + (*p - '0');
- else
- {
- Msg(0, "%s: %s: invalid argument. Give numeric argument.",
- rc_name, comms[act->nr].name);
- return -1;
- }
- p++;
- }
- debug1("ParseNum got %d\n", i);
- *var = i;
- return 0;
-}
-
-static int
-ParseNum1000(act, var)
-struct action *act;
-int *var;
-{
- int i;
- char *p, **args = act->args;
- int dig = 0;
-
- p = *args;
- if (p == 0 || *p == 0 || args[1])
- {
- Msg(0, "%s: %s: invalid argument. Give one argument.",
- rc_name, comms[act->nr].name);
- return -1;
- }
- i = 0;
- while (*p)
- {
- if (*p >= '0' && *p <= '9')
- {
- if (dig < 4)
- i = 10 * i + (*p - '0');
- else if (dig == 4 && *p >= '5')
- i++;
- if (dig)
- dig++;
- }
- else if (*p == '.' && !dig)
- dig++;
- else
- {
- Msg(0, "%s: %s: invalid argument. Give floating point argument.",
- rc_name, comms[act->nr].name);
- return -1;
- }
- p++;
- }
- if (dig == 0)
- i *= 1000;
- else
- while (dig++ < 4)
- i *= 10;
- if (i < 0)
- i = (int)((unsigned int)~0 >> 1);
- debug1("ParseNum1000 got %d\n", i);
- *var = i;
- return 0;
-}
-
-static struct win *
-WindowByName(s)
-char *s;
-{
- struct win *p;
-
- for (p = windows; p; p = p->w_next)
- if (!strcmp(p->w_title, s))
- return p;
- for (p = windows; p; p = p->w_next)
- if (!strncmp(p->w_title, s, strlen(s)))
- return p;
- return 0;
-}
-
-static int
-WindowByNumber(str)
-char *str;
-{
- int i;
- char *s;
-
- for (i = 0, s = str; *s; s++)
- {
- if (*s < '0' || *s > '9')
- break;
- i = i * 10 + (*s - '0');
- }
- return *s ? -1 : i;
-}
-
-/*
- * Get window number from Name or Number string.
- * Numbers are tried first, then names, a prefix match suffices.
- * Be careful when assigning numeric strings as WindowTitles.
- */
-int
-WindowByNoN(str)
-char *str;
-{
- int i;
- struct win *p;
-
- if ((i = WindowByNumber(str)) < 0 || i >= MAXWIN)
- {
- if ((p = WindowByName(str)))
- return p->w_number;
- return -1;
- }
- return i;
-}
-
-static int
-ParseWinNum(act, var)
-struct action *act;
-int *var;
-{
- char **args = act->args;
- int i = 0;
-
- if (*args == 0 || args[1])
- {
- Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name);
- return -1;
- }
-
- i = WindowByNoN(*args);
- if (i < 0)
- {
- Msg(0, "%s: %s: invalid argument. Give window number or name.",
- rc_name, comms[act->nr].name);
- return -1;
- }
- debug1("ParseWinNum got %d\n", i);
- *var = i;
- return 0;
-}
-
-static int
-ParseBase(act, p, var, base, bname)
-struct action *act;
-char *p;
-int *var;
-int base;
-char *bname;
-{
- int i = 0;
- int c;
-
- if (*p == 0)
- {
- Msg(0, "%s: %s: empty argument.", rc_name, comms[act->nr].name);
- return -1;
- }
- while ((c = *p++))
- {
- if (c >= 'a' && c <= 'z')
- c -= 'a' - 'A';
- if (c >= 'A' && c <= 'Z')
- c -= 'A' - ('0' + 10);
- c -= '0';
- if (c < 0 || c >= base)
- {
- Msg(0, "%s: %s: argument is not %s.", rc_name, comms[act->nr].name, bname);
- return -1;
- }
- i = base * i + c;
- }
- debug1("ParseBase got %d\n", i);
- *var = i;
- return 0;
-}
-
-static int
-IsNum(s, base)
-register char *s;
-register int base;
-{
- for (base += '0'; *s; ++s)
- if (*s < '0' || *s > base)
- return 0;
- return 1;
-}
-
-int
-IsNumColon(s, base, p, psize)
-int base, psize;
-char *s, *p;
-{
- char *q;
- if ((q = rindex(s, ':')) != 0)
- {
- strncpy(p, q + 1, psize - 1);
- p[psize - 1] = '\0';
- *q = '\0';
- }
- else
- *p = '\0';
- return IsNum(s, base);
-}
-
-void
-SwitchWindow(n)
-int n;
-{
- struct win *p;
-
- debug1("SwitchWindow %d\n", n);
- if (n < 0 || n >= MAXWIN)
- {
- ShowWindows(-1);
- return;
- }
- if ((p = wtab[n]) == 0)
- {
- ShowWindows(n);
- return;
- }
- if (display == 0)
- {
- fore = p;
- return;
- }
- if (p == D_fore)
- {
- Msg(0, "This IS window %d (%s).", n, p->w_title);
- return;
- }
-#ifdef MULTIUSER
- if (AclCheckPermWin(D_user, ACL_READ, p))
- {
- Msg(0, "Access to window %d denied.", p->w_number);
- return;
- }
-#endif
- SetForeWindow(p);
- Activate(fore->w_norefresh);
-}
-
-
-void
-SetCanvasWindow(cv, wi)
-struct canvas *cv;
-struct win *wi;
-{
- struct win *p = 0, **pp;
- struct layer *l;
- struct canvas *cvp, **cvpp;
-
- l = cv->c_layer;
- display = cv->c_display;
-
- if (l)
- {
- /* remove old layer */
- for (cvpp = &l->l_cvlist; (cvp = *cvpp); cvpp = &cvp->c_lnext)
- if (cvp == cv)
- break;
- ASSERT(cvp);
- *cvpp = cvp->c_lnext;
-
- p = Layer2Window(l);
- l = cv->c_layer;
- cv->c_layer = 0;
-
- if (p && cv == D_forecv)
- {
-#ifdef MULTIUSER
- ReleaseAutoWritelock(display, p);
-#endif
- if (p->w_silence)
- {
- SetTimeout(&p->w_silenceev, p->w_silencewait * 1000);
- evenq(&p->w_silenceev);
- }
- D_other = fore;
- D_fore = 0;
- }
- if (l->l_cvlist == 0 && (p == 0 || l != p->w_savelayer))
- KillLayerChain(l);
- }
-
- /* find right layer to display on canvas */
- if (wi)
- {
- l = &wi->w_layer;
- if (wi->w_savelayer && (wi->w_blocked || wi->w_savelayer->l_cvlist == 0))
- l = wi->w_savelayer;
- }
- else
- l = &cv->c_blank;
-
- /* add our canvas to the layer's canvaslist */
- cv->c_lnext = l->l_cvlist;
- l->l_cvlist = cv;
- cv->c_layer = l;
- cv->c_xoff = cv->c_xs;
- cv->c_yoff = cv->c_ys;
- RethinkViewportOffsets(cv);
-
- if (flayer == 0)
- flayer = l;
-
- if (wi && D_other == wi)
- D_other = wi->w_next; /* Might be 0, but that's OK. */
- if (cv == D_forecv)
- {
- D_fore = wi;
- fore = D_fore; /* XXX ? */
- if (wi)
- {
-#ifdef MULTIUSER
- ObtainAutoWritelock(display, wi);
-#endif
- /*
- * Place the window at the head of the most-recently-used list
- */
- if (windows != wi)
- {
- for (pp = &windows; (p = *pp); pp = &p->w_next)
- if (p == wi)
- break;
- ASSERT(p);
- *pp = p->w_next;
- p->w_next = windows;
- windows = p;
- WListLinkChanged();
- }
- }
- }
-}
-
-
-/*
- * SetForeWindow changes the window in the input focus of the display.
- * Puts window wi in canvas display->d_forecv.
- */
-void
-SetForeWindow(wi)
-struct win *wi;
-{
- struct win *p;
- if (display == 0)
- {
- fore = wi;
- return;
- }
- p = Layer2Window(D_forecv->c_layer);
- SetCanvasWindow(D_forecv, wi);
- if (p)
- WindowChanged(p, 'u');
- if (wi)
- WindowChanged(wi, 'u');
- flayer = D_forecv->c_layer;
- /* Activate called afterwards, so no RefreshHStatus needed */
-}
-
-
-/*****************************************************************/
-
-/*
- * Activate - make fore window active
- * norefresh = -1 forces a refresh, disregard all_norefresh then.
- */
-void
-Activate(norefresh)
-int norefresh;
-{
- debug1("Activate(%d)\n", norefresh);
- if (display == 0)
- return;
- if (D_status)
- {
- Msg(0, "%s", ""); /* wait till mintime (keep gcc quiet) */
- RemoveStatus();
- }
-
- if (MayResizeLayer(D_forecv->c_layer))
- ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, display);
-
- fore = D_fore;
- if (fore)
- {
- /* XXX ? */
- if (fore->w_monitor != MON_OFF)
- fore->w_monitor = MON_ON;
- fore->w_bell = BELL_ON;
- WindowChanged(fore, 'f');
-
-#if 0
- if (ResizeDisplay(fore->w_width, fore->w_height))
- {
- debug2("Cannot resize from (%d,%d)", D_width, D_height);
- debug2(" to (%d,%d) -> resize window\n", fore->w_width, fore->w_height);
- DoResize(D_width, D_height);
- }
-#endif
- }
- Redisplay(norefresh + all_norefresh);
-}
-
-
-static int
-NextWindow()
-{
- register struct win **pp;
- int n = fore ? fore->w_number : -1;
-
- for (pp = wtab + n + 1; pp != wtab + n; pp++)
- {
- if (pp == wtab + MAXWIN)
- pp = wtab;
- if (*pp)
- break;
- }
- return pp - wtab;
-}
-
-static int
-PreviousWindow()
-{
- register struct win **pp;
- int n = fore ? fore->w_number : MAXWIN - 1;
-
- for (pp = wtab + n - 1; pp != wtab + n; pp--)
- {
- if (pp < wtab)
- pp = wtab + MAXWIN - 1;
- if (*pp)
- break;
- }
- return pp - wtab;
-}
-
-static int
-MoreWindows()
-{
- char *m = "No other window.";
- if (windows && (fore == 0 || windows->w_next))
- return 1;
- if (fore == 0)
- {
- Msg(0, "No window available");
- return 0;
- }
- Msg(0, m, fore->w_number); /* other arg for nethack */
- return 0;
-}
-
-void
-KillWindow(wi)
-struct win *wi;
-{
- struct win **pp, *p;
- struct canvas *cv;
- int gotone;
-
- /*
- * Remove window from linked list.
- */
- for (pp = &windows; (p = *pp); pp = &p->w_next)
- if (p == wi)
- break;
- ASSERT(p);
- *pp = p->w_next;
- wi->w_inlen = 0;
- wtab[wi->w_number] = 0;
-
- if (windows == 0)
- {
- FreeWindow(wi);
- Finit(0);
- }
-
- /*
- * switch to different window on all canvases
- */
- for (display = displays; display; display = display->d_next)
- {
- gotone = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- if (Layer2Window(cv->c_layer) != wi)
- continue;
- /* switch to other window */
- SetCanvasWindow(cv, FindNiceWindow(D_other, 0));
- gotone = 1;
- }
- if (gotone)
- {
-#ifdef ZMODEM
- if (wi->w_zdisplay == display)
- {
- D_blocked = 0;
- D_readev.condpos = D_readev.condneg = 0;
- }
-#endif
- Activate(-1);
- }
- }
- FreeWindow(wi);
- WindowChanged((struct win *)0, 'w');
- WindowChanged((struct win *)0, 'W');
- WindowChanged((struct win *)0, 0);
-}
-
-static void
-LogToggle(on)
-int on;
-{
- char buf[1024];
-
- if ((fore->w_log != 0) == on)
- {
- if (display && !*rc_name)
- Msg(0, "You are %s logging.", on ? "already" : "not");
- return;
- }
- if (fore->w_log != 0)
- {
- Msg(0, "Logfile \"%s\" closed.", fore->w_log->name);
- logfclose(fore->w_log);
- fore->w_log = 0;
- WindowChanged(fore, 'f');
- return;
- }
- if (DoStartLog(fore, buf, sizeof(buf)))
- {
- Msg(errno, "Error opening logfile \"%s\"", buf);
- return;
- }
- if (ftell(fore->w_log->fp) == 0)
- Msg(0, "Creating logfile \"%s\".", fore->w_log->name);
- else
- Msg(0, "Appending to logfile \"%s\".", fore->w_log->name);
- WindowChanged(fore, 'f');
-}
-
-char *
-AddWindows(buf, len, flags, where)
-char *buf;
-int len;
-int flags;
-int where;
-{
- register char *s, *ss;
- register struct win **pp, *p;
- register char *cmd;
- int l;
-
- s = ss = buf;
- for (pp = ((flags & 4) && where >= 0) ? wtab + where + 1: wtab; pp < wtab + MAXWIN; pp++)
- {
- if (pp - wtab == where && ss == buf)
- ss = s;
- if ((p = *pp) == 0)
- continue;
- if ((flags & 1) && display && p == D_fore)
- continue;
-
- cmd = p->w_title;
- l = strlen(cmd);
- if (l > 20)
- l = 20;
- if (s - buf + l > len - 24)
- break;
- if (s > buf || (flags & 4))
- {
- *s++ = ' ';
- *s++ = ' ';
- }
- sprintf(s, "%d", p->w_number);
- if (p->w_number == where)
- ss = s;
- s += strlen(s);
- if (display && p == D_fore)
- *s++ = '*';
- if (!(flags & 2))
- {
- if (display && p == D_other)
- *s++ = '-';
- s = AddWindowFlags(s, len, p);
- }
- *s++ = ' ';
- strncpy(s, cmd, l);
- s += l;
- }
- *s = 0;
- return ss;
-}
-
-char *
-AddWindowFlags(buf, len, p)
-char *buf;
-int len;
-struct win *p;
-{
- char *s = buf;
- if (p == 0 || len < 12)
- {
- *s = 0;
- return s;
- }
-#if 0
- if (display && p == D_fore)
- *s++ = '*';
- if (display && p == D_other)
- *s++ = '-';
-#endif
- if (p->w_layer.l_cvlist && p->w_layer.l_cvlist->c_lnext)
- *s++ = '&';
- if (p->w_monitor == MON_DONE)
- *s++ = '@';
- if (p->w_bell == BELL_DONE)
- *s++ = '!';
-#ifdef UTMPOK
- if (p->w_slot != (slot_t) 0 && p->w_slot != (slot_t) -1)
- *s++ = '$';
-#endif
- if (p->w_log != 0)
- {
- strcpy(s, "(L)");
- s += 3;
- }
- if (p->w_ptyfd < 0)
- *s++ = 'Z';
- *s = 0;
- return s;
-}
-
-char *
-AddOtherUsers(buf, len, p)
-char *buf;
-int len;
-struct win *p;
-{
- struct display *d, *olddisplay = display;
- struct canvas *cv;
- char *s;
- int l;
-
- s = buf;
- for (display = displays; display; display = display->d_next)
- {
- if (D_user == olddisplay->d_user)
- continue;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (Layer2Window(cv->c_layer) == p)
- break;
- if (!cv)
- continue;
- for (d = displays; d && d != display; d = d->d_next)
- if (D_user == d->d_user)
- break;
- if (d && d != display)
- continue;
- if (len > 1 && s != buf)
- {
- *s++ = ',';
- len--;
- }
- l = strlen(D_user->u_name);
- if (l + 1 > len)
- break;
- strcpy(s, D_user->u_name);
- s += l;
- len -= l;
- }
- *s = 0;
- display = olddisplay;
- return s;
-}
-
-void
-ShowWindows(where)
-int where;
-{
- char buf[1024];
- char *s, *ss;
-
- if (!display)
- return;
- if (where == -1 && D_fore)
- where = D_fore->w_number;
- ss = AddWindows(buf, sizeof(buf), 0, where);
- s = buf + strlen(buf);
- if (ss - buf > D_width / 2)
- {
- ss -= D_width / 2;
- if (s - ss < D_width)
- {
- ss = s - D_width;
- if (ss < buf)
- ss = buf;
- }
- }
- else
- ss = buf;
- Msg(0, "%s", ss);
-}
-
-static void
-ShowInfo()
-{
- char buf[512], *p;
- register struct win *wp = fore;
- register int i;
-
- if (wp == 0)
- {
- Msg(0, "(%d,%d)/(%d,%d) no window", D_x + 1, D_y + 1, D_width, D_height);
- return;
- }
- p = buf;
- if (buf < (p += GetAnsiStatus(wp, p)))
- *p++ = ' ';
- sprintf(p, "(%d,%d)/(%d,%d)",
- wp->w_x + 1, wp->w_y + 1, wp->w_width, wp->w_height);
-#ifdef COPY_PASTE
- sprintf(p += strlen(p), "+%d", wp->w_histheight);
-#endif
- sprintf(p += strlen(p), " %c%sflow",
- (wp->w_flow & FLOW_NOW) ? '+' : '-',
- (wp->w_flow & FLOW_AUTOFLAG) ? "" :
- ((wp->w_flow & FLOW_AUTO) ? "(+)" : "(-)"));
- if (!wp->w_wrap) sprintf(p += strlen(p), " -wrap");
- if (wp->w_insert) sprintf(p += strlen(p), " ins");
- if (wp->w_origin) sprintf(p += strlen(p), " org");
- if (wp->w_keypad) sprintf(p += strlen(p), " app");
- if (wp->w_log) sprintf(p += strlen(p), " log");
- if (wp->w_monitor != MON_OFF) sprintf(p += strlen(p), " mon");
- if (wp->w_mouse) sprintf(p += strlen(p), " mouse");
-#ifdef COLOR
- if (wp->w_bce) sprintf(p += strlen(p), " bce");
-#endif
- if (!wp->w_c1) sprintf(p += strlen(p), " -c1");
- if (wp->w_norefresh) sprintf(p += strlen(p), " nored");
-
- p += strlen(p);
-#ifdef FONT
-# ifdef ENCODINGS
- if (wp->w_encoding && (display == 0 || D_encoding != wp->w_encoding || EncodingDefFont(wp->w_encoding) <= 0))
- {
- *p++ = ' ';
- strcpy(p, EncodingName(wp->w_encoding));
- p += strlen(p);
- }
-# ifdef UTF8
- if (wp->w_encoding != UTF8)
-# endif
-# endif
- if (D_CC0 || (D_CS0 && *D_CS0))
- {
- if (wp->w_gr == 2)
- {
- sprintf(p, " G%c", wp->w_Charset + '0');
- if (wp->w_FontE >= ' ')
- p[3] = wp->w_FontE;
- else
- {
- p[3] = '^';
- p[4] = wp->w_FontE ^ 0x40;
- p++;
- }
- p[4] = '[';
- p++;
- }
- else if (wp->w_gr)
- sprintf(p++, " G%c%c[", wp->w_Charset + '0', wp->w_CharsetR + '0');
- else
- sprintf(p, " G%c[", wp->w_Charset + '0');
- p += 4;
- for (i = 0; i < 4; i++)
- {
- if (wp->w_charsets[i] == ASCII)
- *p++ = 'B';
- else if (wp->w_charsets[i] >= ' ')
- *p++ = wp->w_charsets[i];
- else
- {
- *p++ = '^';
- *p++ = wp->w_charsets[i] ^ 0x40;
- }
- }
- *p++ = ']';
- *p = 0;
- }
-#endif
-
- if (wp->w_type == W_TYPE_PLAIN)
- {
- /* add info about modem control lines */
- *p++ = ' ';
- TtyGetModemStatus(wp->w_ptyfd, p);
- }
-#ifdef BUILTIN_TELNET
- else if (wp->w_type == W_TYPE_TELNET)
- {
- *p++ = ' ';
- TelStatus(wp, p, sizeof(buf) - 1 - (p - buf));
- }
-#endif
- Msg(0, "%s %d(%s)", buf, wp->w_number, wp->w_title);
-}
-
-static void
-ShowDInfo()
-{
- char buf[512], *p;
- if (display == 0)
- return;
- p = buf;
- sprintf(p, "(%d,%d)", D_width, D_height),
- p += strlen(p);
-#ifdef ENCODINGS
- if (D_encoding)
- {
- *p++ = ' ';
- strcpy(p, EncodingName(D_encoding));
- p += strlen(p);
- }
-#endif
- if (D_CXT)
- {
- strcpy(p, " xterm");
- p += strlen(p);
- }
-#ifdef COLOR
- if (D_hascolor)
- {
- strcpy(p, " color");
- p += strlen(p);
- }
-#endif
-#ifdef FONT
- if (D_CG0)
- {
- strcpy(p, " iso2022");
- p += strlen(p);
- }
- else if (D_CS0 && *D_CS0)
- {
- strcpy(p, " altchar");
- p += strlen(p);
- }
-#endif
- Msg(0, "%s", buf);
-}
-
-static void
-AKAfin(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- ASSERT(display);
- if (len && fore)
- ChangeAKA(fore, buf, strlen(buf));
-}
-
-static void
-InputAKA()
-{
- char *s, *ss;
- int n;
- Input("Set window's title to: ", sizeof(fore->w_akabuf) - 1, INP_COOKED, AKAfin, NULL);
- s = fore->w_title;
- if (!s)
- return;
- for (; *s; s++)
- {
- if ((*(unsigned char *)s & 0x7f) < 0x20 || *s == 0x7f)
- continue;
- ss = s;
- n = 1;
- LayProcess(&ss, &n);
- }
-}
-
-static void
-Colonfin(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- char mbuf[256];
- if (len)
- {
- len = strlen(buf) + 1;
- if (len > (int)sizeof(mbuf))
- RcLine(buf, len);
- else
- {
- bcopy(buf, mbuf, len);
- RcLine(mbuf, sizeof mbuf);
- }
- }
-}
-
-static void
-SelectFin(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- int n;
-
- if (!len || !display)
- return;
- if (len == 1 && *buf == '-')
- {
- SetForeWindow((struct win *)0);
- Activate(0);
- return;
- }
- if ((n = WindowByNoN(buf)) < 0)
- return;
- SwitchWindow(n);
-}
-
-static void
-InputSelect()
-{
- Input("Switch to window: ", 20, INP_COOKED, SelectFin, NULL);
-}
-
-static char setenv_var[31];
-
-
-static void
-SetenvFin1(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- if (!len || !display)
- return;
- InputSetenv(buf);
-}
-
-static void
-SetenvFin2(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- if (!len || !display)
- return;
- debug2("SetenvFin2: setenv '%s' '%s'\n", setenv_var, buf);
- xsetenv(setenv_var, buf);
- MakeNewEnv();
-}
-
-static void
-InputSetenv(arg)
-char *arg;
-{
- static char setenv_buf[50 + sizeof(setenv_var)]; /* need to be static here, cannot be freed */
-
- if (arg)
- {
- strncpy(setenv_var, arg, sizeof(setenv_var) - 1);
- sprintf(setenv_buf, "Enter value for %s: ", setenv_var);
- Input(setenv_buf, 30, INP_COOKED, SetenvFin2, NULL);
- }
- else
- Input("Setenv: Enter variable name: ", 30, INP_COOKED, SetenvFin1, NULL);
-}
-
-/*
- * the following options are understood by this parser:
- * -f, -f0, -f1, -fy, -fa
- * -t title, -T terminal-type, -h height-of-scrollback,
- * -ln, -l0, -ly, -l1, -l
- * -a, -M, -L
- */
-void
-DoScreen(fn, av)
-char *fn, **av;
-{
- struct NewWindow nwin;
- register int num;
- char buf[20];
-
- nwin = nwin_undef;
- while (av && *av && av[0][0] == '-')
- {
- if (av[0][1] == '-')
- {
- av++;
- break;
- }
- switch (av[0][1])
- {
- case 'f':
- switch (av[0][2])
- {
- case 'n':
- case '0':
- nwin.flowflag = FLOW_NOW * 0;
- break;
- case 'y':
- case '1':
- case '\0':
- nwin.flowflag = FLOW_NOW * 1;
- break;
- case 'a':
- nwin.flowflag = FLOW_AUTOFLAG;
- break;
- default:
- break;
- }
- break;
- case 't': /* no more -k */
- if (av[0][2])
- nwin.aka = &av[0][2];
- else if (*++av)
- nwin.aka = *av;
- else
- --av;
- break;
- case 'T':
- if (av[0][2])
- nwin.term = &av[0][2];
- else if (*++av)
- nwin.term = *av;
- else
- --av;
- break;
- case 'h':
- if (av[0][2])
- nwin.histheight = atoi(av[0] + 2);
- else if (*++av)
- nwin.histheight = atoi(*av);
- else
- --av;
- break;
-#ifdef LOGOUTOK
- case 'l':
- switch (av[0][2])
- {
- case 'n':
- case '0':
- nwin.lflag = 0;
- break;
- case 'y':
- case '1':
- case '\0':
- nwin.lflag = 1;
- break;
- case 'a':
- nwin.lflag = 3;
- break;
- default:
- break;
- }
- break;
-#endif
- case 'a':
- nwin.aflag = 1;
- break;
- case 'M':
- nwin.monitor = MON_ON;
- break;
- case 'L':
- nwin.Lflag = 1;
- break;
- default:
- Msg(0, "%s: screen: invalid option -%c.", fn, av[0][1]);
- break;
- }
- ++av;
- }
- num = 0;
- if (av && *av && IsNumColon(*av, 10, buf, sizeof(buf)))
- {
- if (*buf != '\0')
- nwin.aka = buf;
- num = atoi(*av);
- if (num < 0 || num > MAXWIN - 1)
- {
- Msg(0, "%s: illegal screen number %d.", fn, num);
- num = 0;
- }
- nwin.StartAt = num;
- ++av;
- }
- if (av && *av)
- {
- nwin.args = av;
- if (!nwin.aka)
- nwin.aka = Filename(*av);
- }
- MakeWindow(&nwin);
-}
-
-#ifdef COPY_PASTE
-/*
- * CompileKeys must be called before Markroutine is first used.
- * to initialise the keys with defaults, call CompileKeys(NULL, mark_key_tab);
- *
- * s is an ascii string in a termcap-like syntax. It looks like
- * "j=u:k=d:l=r:h=l: =.:" and so on...
- * this example rebinds the cursormovement to the keys u (up), d (down),
- * l (left), r (right). placing a mark will now be done with ".".
- */
-int
-CompileKeys(s, sl, array)
-char *s;
-int sl;
-unsigned char *array;
-{
- int i;
- unsigned char key, value;
-
- if (sl == 0)
- {
- for (i = 0; i < 256; i++)
- array[i] = i;
- return 0;
- }
- debug1("CompileKeys: '%s'\n", s);
- while (sl)
- {
- key = *(unsigned char *)s++;
- if (*s != '=' || sl < 3)
- return -1;
- sl--;
- do
- {
- s++;
- sl -= 2;
- value = *(unsigned char *)s++;
- array[value] = key;
- }
- while (*s == '=' && sl >= 2);
- if (sl == 0)
- break;
- if (*s++ != ':')
- return -1;
- sl--;
- }
- return 0;
-}
-#endif /* COPY_PASTE */
-
-/*
- * Asynchronous input functions
- */
-
-#if defined(DETACH) && defined(POW_DETACH)
-static void
-pow_detach_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- debug("pow_detach_fn called\n");
- if (len)
- {
- *buf = 0;
- return;
- }
- if (ktab[(int)(unsigned char)*buf].nr != RC_POW_DETACH)
- {
- if (display)
- write(D_userfd, "\007", 1);
- Msg(0, "Detach aborted.");
- }
- else
- Detach(D_POWER);
-}
-#endif /* POW_DETACH */
-
-#ifdef COPY_PASTE
-static void
-copy_reg_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- struct plop *pp = plop_tab + (int)(unsigned char)*buf;
-
- if (len)
- {
- *buf = 0;
- return;
- }
- if (pp->buf)
- free(pp->buf);
- pp->buf = 0;
- pp->len = 0;
- if (D_user->u_plop.len)
- {
- if ((pp->buf = (char *)malloc(D_user->u_plop.len)) == NULL)
- {
- Msg(0, strnomem);
- return;
- }
- bcopy(D_user->u_plop.buf, pp->buf, D_user->u_plop.len);
- }
- pp->len = D_user->u_plop.len;
-#ifdef ENCODINGS
- pp->enc = D_user->u_plop.enc;
-#endif
- Msg(0, "Copied %d characters into register %c", D_user->u_plop.len, *buf);
-}
-
-static void
-ins_reg_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- struct plop *pp = plop_tab + (int)(unsigned char)*buf;
-
-
- if (!fore)
- return; /* Input() should not call us w/o fore, but you never know... */
- if (*buf == '.')
- Msg(0, "ins_reg_fn: Warning: pasting real register '.'!");
- if (len)
- {
- *buf = 0;
- return;
- }
- if (pp->buf)
- {
- MakePaster(&fore->w_paster, pp->buf, pp->len, 0);
- return;
- }
- Msg(0, "Empty register.");
-}
-#endif /* COPY_PASTE */
-
-static void
-process_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- struct plop *pp = plop_tab + (int)(unsigned char)*buf;
-
- if (len)
- {
- *buf = 0;
- return;
- }
- if (pp->buf)
- {
- ProcessInput(pp->buf, pp->len);
- return;
- }
- Msg(0, "Empty register.");
-}
-
-static void
-confirm_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- struct action act;
-
- if (len || (*buf != 'y' && *buf != 'Y'))
- {
- *buf = 0;
- return;
- }
- act.nr = (int)data;
- act.args = noargs;
- act.argl = 0;
- DoAction(&act, -1);
-}
-
-#ifdef MULTIUSER
-struct inputsu
-{
- struct acluser **up;
- char name[24];
- char pw1[130]; /* FreeBSD crypts to 128 bytes */
- char pw2[130];
-};
-
-static void
-su_fin(buf, len, data)
-char *buf;
-int len;
-char *data;
-{
- struct inputsu *i = (struct inputsu *)data;
- char *p;
- int l;
-
- if (!*i->name)
- { p = i->name; l = sizeof(i->name) - 1; }
- else if (!*i->pw1)
- { strcpy(p = i->pw1, "\377"); l = sizeof(i->pw1) - 1; }
- else
- { strcpy(p = i->pw2, "\377"); l = sizeof(i->pw2) - 1; }
- if (buf && len)
- strncpy(p, buf, 1 + (l < len) ? l : len);
- if (!*i->name)
- Input("Screen User: ", sizeof(i->name) - 1, INP_COOKED, su_fin, (char *)i);
- else if (!*i->pw1)
- Input("User's UNIX Password: ", sizeof(i->pw1)-1, INP_COOKED|INP_NOECHO, su_fin, (char *)i);
- else if (!*i->pw2)
- Input("User's Screen Password: ", sizeof(i->pw2)-1, INP_COOKED|INP_NOECHO, su_fin, (char *)i);
- else
- {
- if ((p = DoSu(i->up, i->name, i->pw2, i->pw1)))
- Msg(0, "%s", p);
- free((char *)i);
- }
-}
-
-static int
-InputSu(w, up, name)
-struct win *w;
-struct acluser **up;
-char *name;
-{
- struct inputsu *i;
-
- if (!(i = (struct inputsu *)calloc(1, sizeof(struct inputsu))))
- return -1;
-
- i->up = up;
- if (name && *name)
- su_fin(name, (int)strlen(name), (char *)i); /* can also initialise stuff */
- else
- su_fin((char *)0, 0, (char *)i);
- return 0;
-}
-#endif /* MULTIUSER */
-
-#ifdef PASSWORD
-
-static void
-pass1(buf, len, data)
-char *buf;
-int len;
-char *data;
-{
- struct acluser *u = (struct acluser *)data;
-
- if (!*buf)
- return;
- ASSERT(u);
- if (u->u_password != NullStr)
- free((char *)u->u_password);
- u->u_password = SaveStr(buf);
- bzero(buf, strlen(buf));
- Input("Retype new password:", 100, INP_NOECHO, pass2, data);
-}
-
-static void
-pass2(buf, len, data)
-char *buf;
-int len;
-char *data;
-{
- int st;
- char salt[3];
- struct acluser *u = (struct acluser *)data;
-
- ASSERT(u);
- if (!buf || strcmp(u->u_password, buf))
- {
- Msg(0, "[ Passwords don't match - checking turned off ]");
- if (u->u_password != NullStr)
- {
- bzero(u->u_password, strlen(u->u_password));
- free((char *)u->u_password);
- }
- u->u_password = NullStr;
- }
- else if (u->u_password[0] == '\0')
- {
- Msg(0, "[ No password - no secure ]");
- if (buf)
- bzero(buf, strlen(buf));
- }
-
- if (u->u_password != NullStr)
- {
- for (st = 0; st < 2; st++)
- salt[st] = 'A' + (int)((time(0) >> 6 * st) % 26);
- salt[2] = 0;
- buf = crypt(u->u_password, salt);
- bzero(u->u_password, strlen(u->u_password));
- free((char *)u->u_password);
- u->u_password = SaveStr(buf);
- bzero(buf, strlen(buf));
-#ifdef COPY_PASTE
- if (u->u_plop.buf)
- UserFreeCopyBuffer(u);
- u->u_plop.len = strlen(u->u_password);
-# ifdef ENCODINGS
- u->u_plop.enc = 0;
-#endif
- if (!(u->u_plop.buf = SaveStr(u->u_password)))
- {
- Msg(0, strnomem);
- D_user->u_plop.len = 0;
- }
- else
- Msg(0, "[ Password moved into copybuffer ]");
-#else /* COPY_PASTE */
- Msg(0, "[ Crypted password is \"%s\" ]", u->u_password);
-#endif /* COPY_PASTE */
- }
-}
-#endif /* PASSWORD */
-
-static void
-digraph_fn(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- int ch, i, x;
-
- ch = buf[len];
- if (ch)
- {
- if (ch < ' ' || ch == '\177')
- return;
- if (len >= 1 && ((*buf == 'U' && buf[1] == '+') || (*buf == '0' && (buf[1] == 'x' || buf[1] == 'X'))))
- {
- if (len == 1)
- return;
- if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f') && (ch < 'A' || ch > 'F'))
- {
- buf[len] = '\034'; /* ^] is ignored by Input() */
- return;
- }
- if (len == (*buf == 'U' ? 5 : 3))
- buf[len] = '\n';
- return;
- }
- if (len && *buf == '0')
- {
- if (ch < '0' || ch > '7')
- {
- buf[len] = '\034'; /* ^] is ignored by Input() */
- return;
- }
- if (len == 3)
- buf[len] = '\n';
- return;
- }
- if (len == 1)
- buf[len] = '\n';
- return;
- }
- buf[len] = buf[len + 1]; /* gross */
- len++;
- if (len < 2)
- return;
- if (len >= 1 && ((*buf == 'U' && buf[1] == '+') || (*buf == '0' && (buf[1] == 'x' || buf[1] == 'X'))))
- {
- x = 0;
- for (i = 2; i < len; i++)
- {
- if (buf[i] >= '0' && buf[i] <= '9')
- x = x * 16 | (buf[i] - '0');
- else if (buf[i] >= 'a' && buf[i] <= 'f')
- x = x * 16 | (buf[i] - ('a' - 10));
- else if (buf[i] >= 'A' && buf[i] <= 'F')
- x = x * 16 | (buf[i] - ('A' - 10));
- else
- break;
- }
- }
- else if (buf[0] == '0')
- {
- x = 0;
- for (i = 1; i < len; i++)
- {
- if (buf[i] < '0' || buf[i] > '7')
- break;
- x = x * 8 | (buf[i] - '0');
- }
- }
- else
- {
- for (i = 0; i < (int)(sizeof(digraphs)/sizeof(*digraphs)); i++)
- if ((digraphs[i][0] == (unsigned char)buf[0] && digraphs[i][1] == (unsigned char)buf[1]) ||
- (digraphs[i][0] == (unsigned char)buf[1] && digraphs[i][1] == (unsigned char)buf[0]))
- break;
- if (i == (int)(sizeof(digraphs)/sizeof(*digraphs)))
- {
- Msg(0, "Unknown digraph");
- return;
- }
- x = digraphs[i][2];
- }
- i = 1;
- *buf = x;
-#ifdef UTF8
- if (flayer->l_encoding == UTF8)
- i = ToUtf8(buf, x); /* buf is big enough for all UTF-8 codes */
-#endif
- while(i)
- LayProcess(&buf, &i);
-}
-
-#ifdef MAPKEYS
-int
-StuffKey(i)
-int i;
-{
- struct action *act;
-
- debug1("StuffKey #%d", i);
-#ifdef DEBUG
- if (i < KMAP_KEYS)
- debug1(" - %s", term[i + T_CAPS].tcname);
-#endif
- if (i >= T_CURSOR - T_CAPS && i < T_KEYPAD - T_CAPS && D_cursorkeys)
- i += T_OCAPS - T_CURSOR;
- else if (i >= T_KEYPAD - T_CAPS && i < T_OCAPS - T_CAPS && D_keypad)
- i += T_OCAPS - T_CURSOR;
- debug1(" - action %d\n", i);
- flayer = D_forecv->c_layer;
- fore = D_fore;
- act = 0;
-#ifdef COPY_PASTE
- if (InMark() || InInput() || InWList())
- act = i < KMAP_KEYS+KMAP_AKEYS ? &mmtab[i] : &kmap_exts[i - (KMAP_KEYS+KMAP_AKEYS)].mm;
-#endif
- if ((!act || act->nr == RC_ILLEGAL) && !D_mapdefault)
- act = i < KMAP_KEYS+KMAP_AKEYS ? &umtab[i] : &kmap_exts[i - (KMAP_KEYS+KMAP_AKEYS)].um;
- D_mapdefault = 0;
- if (!act || act->nr == RC_ILLEGAL)
- act = i < KMAP_KEYS+KMAP_AKEYS ? &dmtab[i] : &kmap_exts[i - (KMAP_KEYS+KMAP_AKEYS)].dm;
- if (act == 0 || act->nr == RC_ILLEGAL)
- return -1;
- DoAction(act, 0);
- return 0;
-}
-#endif
-
-
-static int
-IsOnDisplay(wi)
-struct win *wi;
-{
- struct canvas *cv;
- ASSERT(display);
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (Layer2Window(cv->c_layer) == wi)
- return 1;
- return 0;
-}
-
-struct win *
-FindNiceWindow(wi, presel)
-struct win *wi;
-char *presel;
-{
- int i;
-
- debug2("FindNiceWindow %d %s\n", wi ? wi->w_number : -1 , presel ? presel : "NULL");
- if (presel)
- {
- i = WindowByNoN(presel);
- if (i >= 0)
- wi = wtab[i];
- }
- if (!display)
- return wi;
-#ifdef MULTIUSER
- if (wi && AclCheckPermWin(D_user, ACL_READ, wi))
- wi = 0;
-#endif
- if (!wi || (IsOnDisplay(wi) && !presel))
- {
- /* try to get another window */
- wi = 0;
-#ifdef MULTIUSER
- for (wi = windows; wi; wi = wi->w_next)
- if (!wi->w_layer.l_cvlist && !AclCheckPermWin(D_user, ACL_WRITE, wi))
- break;
- if (!wi)
- for (wi = windows; wi; wi = wi->w_next)
- if (wi->w_layer.l_cvlist && !IsOnDisplay(wi) && !AclCheckPermWin(D_user, ACL_WRITE, wi))
- break;
- if (!wi)
- for (wi = windows; wi; wi = wi->w_next)
- if (!wi->w_layer.l_cvlist && !AclCheckPermWin(D_user, ACL_READ, wi))
- break;
- if (!wi)
- for (wi = windows; wi; wi = wi->w_next)
- if (wi->w_layer.l_cvlist && !IsOnDisplay(wi) && !AclCheckPermWin(D_user, ACL_READ, wi))
- break;
-#endif
- if (!wi)
- for (wi = windows; wi; wi = wi->w_next)
- if (!wi->w_layer.l_cvlist)
- break;
- if (!wi)
- for (wi = windows; wi; wi = wi->w_next)
- if (wi->w_layer.l_cvlist && !IsOnDisplay(wi))
- break;
- }
-#ifdef MULTIUSER
- if (wi && AclCheckPermWin(D_user, ACL_READ, wi))
- wi = 0;
-#endif
- return wi;
-}
-
-#if 0
-
-/* sorted list of all commands */
-static struct comm **commtab;
-static int ncommtab;
-
-void
-AddComms(cos, hand)
-struct comm *cos;
-void (*hand) __P((struct comm *, char **, int));
-{
- int n, i, j, r;
- for (n = 0; cos[n].name; n++)
- ;
- if (n == 0)
- return;
- if (commtab)
- commtab = (struct commt *)realloc(commtab, sizeof(*commtab) * (ncommtab + n));
- else
- commtab = (struct commt *)malloc(sizeof(*commtab) * (ncommtab + n));
- if (!commtab)
- Panic(0, strnomem);
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < ncommtab; j++)
- {
- r = strcmp(cos[i].name, commtab[j]->name);
- if (r == 0)
- Panic(0, "Duplicate command: %s\n", cos[i].name);
- if (r < 0)
- break;
- }
- for (r = ncommtab; r > j; r--)
- commtab[r] = commtab[r - 1];
- commtab[j] = cos + i;
- cos[i].handler = hand;
- bzero(cos[i].userbits, sizeof(cos[i].userbits));
- ncommtab++;
- }
-}
-
-struct comm *
-FindComm(str)
-char *str;
-{
- int x, m, l = 0, r = ncommtab - 1;
- while (l <= r)
- {
- m = (l + r) / 2;
- x = strcmp(str, commtab[m]->name);
- if (x > 0)
- l = m + 1;
- else if (x < 0)
- r = m - 1;
- else
- return commtab[m];
- }
- return 0;
-}
-
-#endif
-
-static void
-ResizeRegions(arg)
-char *arg;
-{
- struct canvas *cv;
- int nreg, dsize, diff, siz;
-
- ASSERT(display);
- for (nreg = 0, cv = D_cvlist; cv; cv = cv->c_next)
- nreg++;
- if (nreg < 2)
- {
- Msg(0, "resize: need more than one region");
- return;
- }
- dsize = D_height - (D_has_hstatus == HSTATUS_LASTLINE);
- if (*arg == '=')
- {
- /* make all regions the same height */
- int h = dsize;
- int hh, i = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- hh = h / nreg-- - 1;
- cv->c_ys = i;
- cv->c_ye = i + hh - 1;
- cv->c_yoff = i;
- i += hh + 1;
- h -= hh + 1;
- }
- RethinkDisplayViewports();
- ResizeLayersToCanvases();
- return;
- }
- siz = D_forecv->c_ye - D_forecv->c_ys + 1;
- if (*arg == '+')
- diff = atoi(arg + 1);
- else if (*arg == '-')
- diff = -atoi(arg + 1);
- else if (!strcmp(arg, "min"))
- diff = 1 - siz;
- else if (!strcmp(arg, "max"))
- diff = dsize - (nreg - 1) * 2 - 1 - siz;
- else
- diff = atoi(arg) - siz;
- if (diff == 0)
- return;
- if (siz + diff < 1)
- diff = 1 - siz;
- if (siz + diff > dsize - (nreg - 1) * 2 - 1)
- diff = dsize - (nreg - 1) * 2 - 1 - siz;
- if (diff == 0 || siz + diff < 1)
- return;
-
- if (diff < 0)
- {
- if (D_forecv->c_next)
- {
- D_forecv->c_ye += diff;
- D_forecv->c_next->c_ys += diff;
- D_forecv->c_next->c_yoff += diff;
- }
- else
- {
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (cv->c_next == D_forecv)
- break;
- ASSERT(cv);
- cv->c_ye -= diff;
- D_forecv->c_ys -= diff;
- D_forecv->c_yoff -= diff;
- }
- }
- else
- {
- int s, i = 0, found = 0, di = diff, d2;
- s = dsize - (nreg - 1) * 2 - 1 - siz;
- for (cv = D_cvlist; cv; i = cv->c_ye + 2, cv = cv->c_next)
- {
- if (cv == D_forecv)
- {
- cv->c_ye = i + (cv->c_ye - cv->c_ys) + diff;
- cv->c_yoff -= cv->c_ys - i;
- cv->c_ys = i;
- found = 1;
- continue;
- }
- s -= cv->c_ye - cv->c_ys;
- if (!found)
- {
- if (s >= di)
- continue;
- d2 = di - s;
- }
- else
- d2 = di > cv->c_ye - cv->c_ys ? cv->c_ye - cv->c_ys : di;
- di -= d2;
- cv->c_ye = i + (cv->c_ye - cv->c_ys) - d2;
- cv->c_yoff -= cv->c_ys - i;
- cv->c_ys = i;
- }
- }
- RethinkDisplayViewports();
- ResizeLayersToCanvases();
-}
-
-static void
-ResizeFin(buf, len, data)
-char *buf;
-int len;
-char *data;
-{
- ResizeRegions(buf);
-}
-
-#ifdef RXVT_OSC
-void
-RefreshXtermOSC()
-{
- int i;
- struct win *p;
-
- p = Layer2Window(D_forecv->c_layer);
- for (i = 3; i >=0; i--)
- SetXtermOSC(i, p ? p->w_xtermosc[i] : 0);
-}
-#endif
-
-int
-ParseAttrColor(s1, s2, msgok)
-char *s1, *s2;
-int msgok;
-{
- int i, n;
- char *s, *ss;
- int r = 0;
-
- s = s1;
- while (*s == ' ')
- s++;
- ss = s;
- while (*ss && *ss != ' ')
- ss++;
- while (*ss == ' ')
- ss++;
- if (*s && (s2 || *ss || !((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || *s == '.')))
- {
- int mode = 0, n = 0;
- if (*s == '+')
- {
- mode = 1;
- s++;
- }
- else if (*s == '-')
- {
- mode = -1;
- s++;
- }
- else if (*s == '!')
- {
- mode = 2;
- s++;
- }
- else if (*s == '=')
- s++;
- if (*s >= '0' && *s <= '9')
- {
- n = *s++ - '0';
- if (*s >= '0' && *s <= '9')
- n = n * 16 + (*s++ - '0');
- else if (*s >= 'a' && *s <= 'f')
- n = n * 16 + (*s++ - ('a' - 10));
- else if (*s >= 'A' && *s <= 'F')
- n = n * 16 + (*s++ - ('A' - 10));
- else if (*s && *s != ' ')
- {
- if (msgok)
- Msg(0, "Illegal attribute hexchar '%c'", *s);
- return -1;
- }
- }
- else
- {
- while (*s && *s != ' ')
- {
- if (*s == 'd')
- n |= A_DI;
- else if (*s == 'u')
- n |= A_US;
- else if (*s == 'b')
- n |= A_BD;
- else if (*s == 'r')
- n |= A_RV;
- else if (*s == 's')
- n |= A_SO;
- else if (*s == 'B')
- n |= A_BL;
- else
- {
- if (msgok)
- Msg(0, "Illegal attribute specifier '%c'", *s);
- return -1;
- }
- s++;
- }
- }
- if (*s && *s != ' ')
- {
- if (msgok)
- Msg(0, "junk after attribute description: '%c'", *s);
- return -1;
- }
- if (mode == -1)
- r = n << 8 | n;
- else if (mode == 1)
- r = n << 8;
- else if (mode == 2)
- r = n;
- else if (mode == 0)
- r = 0xffff ^ n;
- }
- while (*s && *s == ' ')
- s++;
-
- if (s2)
- {
- if (*s)
- {
- if (msgok)
- Msg(0, "junk after description: '%c'", *s);
- return -1;
- }
- s = s2;
- while (*s && *s == ' ')
- s++;
- }
-
-#ifdef COLOR
- if (*s)
- {
- static char costr[] = "krgybmcw d i.01234567 9 f FKRGYBMCW I ";
- int numco = 0, j;
-
- n = 0;
- if (*s == '.')
- {
- numco++;
- n = 0x0f;
- s++;
- }
- for (j = 0; j < 2 && *s && *s != ' '; j++)
- {
- for (i = 0; costr[i]; i++)
- if (*s == costr[i])
- break;
- if (!costr[i])
- {
- if (msgok)
- Msg(0, "illegal color descriptor: '%c'", *s);
- return -1;
- }
- numco++;
- n = n << 4 | (i & 15);
-#ifdef COLORS16
- if (i >= 48)
- n = (n & 0x20ff) | 0x200;
-#endif
- s++;
- }
- if ((n & 0xf00) == 0xf00)
- n ^= 0xf00; /* clear superflous bits */
-#ifdef COLORS16
- if (n & 0x2000)
- n ^= 0x2400; /* shift bit into right position */
-#endif
- if (numco == 1)
- n |= 0xf0; /* don't change bg color */
- if (numco != 2 && n != 0xff)
- n |= 0x100; /* special invert mode */
- if (*s && *s != ' ')
- {
- if (msgok)
- Msg(0, "junk after color description: '%c'", *s);
- return -1;
- }
- n ^= 0xff;
- r |= n << 16;
- }
-#endif
-
- while (*s && *s == ' ')
- s++;
- if (*s)
- {
- if (msgok)
- Msg(0, "junk after description: '%c'", *s);
- return -1;
- }
- debug1("ParseAttrColor %06x\n", r);
- return r;
-}
-
-/*
- * Color coding:
- * 0-7 normal colors
- * 9 default color
- * e just set intensity
- * f don't change anything
- * Intensity is encoded into bits 17(fg) and 18(bg).
- */
-void
-ApplyAttrColor(i, mc)
-int i;
-struct mchar *mc;
-{
- debug1("ApplyAttrColor %06x\n", i);
- mc->attr |= i >> 8 & 255;
- mc->attr ^= i & 255;
-#ifdef COLOR
- i = (i >> 16) ^ 0xff;
- if ((i & 0x100) != 0)
- {
- i &= 0xeff;
- if (mc->attr & (A_SO|A_RV))
-# ifdef COLORS16
- i = ((i & 0x0f) << 4) | ((i & 0xf0) >> 4) | ((i & 0x200) << 1) | ((i & 0x400) >> 1);
-# else
- i = ((i & 0x0f) << 4) | ((i & 0xf0) >> 4);
-# endif
- }
-# ifdef COLORS16
- if ((i & 0x0f) != 0x0f)
- mc->attr = (mc->attr & 0xbf) | ((i >> 3) & 0x40);
- if ((i & 0xf0) != 0xf0)
- mc->attr = (mc->attr & 0x7f) | ((i >> 3) & 0x80);
-# endif
- mc->color = 0x99 ^ mc->color;
- if ((i & 0x0e) == 0x0e)
- i = (i & 0xf0) | (mc->color & 0x0f);
- if ((i & 0xe0) == 0xe0)
- i = (i & 0x0f) | (mc->color & 0xf0);
- mc->color = 0x99 ^ i;
- debug2("ApplyAttrColor - %02x %02x\n", mc->attr, i);
-#endif
-}
diff --git a/src/pty.c b/src/pty.c
deleted file mode 100644
index f89d44c..0000000
--- a/src/pty.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#include "config.h"
-#include "screen.h"
-
-#ifndef sun
-# include <sys/ioctl.h>
-#endif
-
-/* for solaris 2.1, Unixware (SVR4.2) and possibly others */
-#ifdef HAVE_SVR4_PTYS
-# include <sys/stropts.h>
-#endif
-
-#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)
-# include <sys/ttold.h>
-#endif
-
-#ifdef ISC
-# include <sys/tty.h>
-# include <sys/sioctl.h>
-# include <sys/pty.h>
-#endif
-
-#ifdef sgi
-# include <sys/sysmacros.h>
-#endif /* sgi */
-
-#include "extern.h"
-
-/*
- * if no PTYRANGE[01] is in the config file, we pick a default
- */
-#ifndef PTYRANGE0
-# define PTYRANGE0 "qpr"
-#endif
-#ifndef PTYRANGE1
-# define PTYRANGE1 "0123456789abcdef"
-#endif
-
-/* SVR4 pseudo ttys don't seem to work with SCO-5 */
-#ifdef M_UNIX
-# undef HAVE_SVR4_PTYS
-#endif
-
-extern int eff_uid;
-
-/* used for opening a new pty-pair: */
-static char PtyName[32], TtyName[32];
-
-#if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS))
-# ifdef hpux
-static char PtyProto[] = "/dev/ptym/ptyXY";
-static char TtyProto[] = "/dev/pty/ttyXY";
-# else
-# ifdef M_UNIX
-static char PtyProto[] = "/dev/ptypXY";
-static char TtyProto[] = "/dev/ttypXY";
-# else
-static char PtyProto[] = "/dev/ptyXY";
-static char TtyProto[] = "/dev/ttyXY";
-# endif
-# endif /* hpux */
-#endif
-
-static void initmaster __P((int));
-
-#if defined(sun)
-/* sun's utmp_update program opens the salve side, thus corrupting
- */
-int pty_preopen = 1;
-#else
-int pty_preopen = 0;
-#endif
-
-/*
- * Open all ptys with O_NOCTTY, just to be on the safe side
- * (RISCos mips breaks otherwise)
- */
-#ifndef O_NOCTTY
-# define O_NOCTTY 0
-#endif
-
-/***************************************************************/
-
-static void
-initmaster(f)
-int f;
-{
-#ifdef POSIX
- tcflush(f, TCIOFLUSH);
-#else
-# ifdef TIOCFLUSH
- (void) ioctl(f, TIOCFLUSH, (char *) 0);
-# endif
-#endif
-#ifdef LOCKPTY
- (void) ioctl(f, TIOCEXCL, (char *) 0);
-#endif
-}
-
-void
-InitPTY(f)
-int f;
-{
- if (f < 0)
- return;
-#if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__osf__) && !defined(M_UNIX)
- if (ioctl(f, I_PUSH, "ptem"))
- Panic(errno, "InitPTY: cannot I_PUSH ptem");
- if (ioctl(f, I_PUSH, "ldterm"))
- Panic(errno, "InitPTY: cannot I_PUSH ldterm");
-# ifdef sun
- if (ioctl(f, I_PUSH, "ttcompat"))
- Panic(errno, "InitPTY: cannot I_PUSH ttcompat");
-# endif
-#endif
-}
-
-/***************************************************************/
-
-#if defined(OSX) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- register int f;
- if ((f = open_controlling_pty(TtyName)) < 0)
- return -1;
- initmaster(f);
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- char *m, *s;
- register int f;
-
- if ((f = getpseudotty(&s, &m)) < 0)
- return -1;
-#ifdef _SEQUENT_
- fvhangup(s);
-#endif
- strncpy(PtyName, m, sizeof(PtyName));
- strncpy(TtyName, s, sizeof(TtyName));
- initmaster(f);
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(__sgi) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- int f;
- char *name, *_getpty();
- sigret_t (*sigcld)__P(SIGPROTOARG);
-
- /*
- * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and
- * exec() /usr/adm/mkpts
- */
- sigcld = signal(SIGCHLD, SIG_DFL);
- name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0);
- signal(SIGCHLD, sigcld);
-
- if (name == 0)
- return -1;
- initmaster(f);
- *ttyn = name;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- register int f;
- struct stat buf;
-
- strcpy(PtyName, "/dev/ptc");
- if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
- return -1;
- if (fstat(f, &buf) < 0)
- {
- close(f);
- return -1;
- }
- sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev));
- initmaster(f);
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- register int f;
- char *m, *ptsname();
- int unlockpt __P((int)), grantpt __P((int));
-#if defined(HAVE_GETPT) && defined(linux)
- int getpt __P((void));
-#endif
- sigret_t (*sigcld)__P(SIGPROTOARG);
-
- strcpy(PtyName, "/dev/ptmx");
-#if defined(HAVE_GETPT) && defined(linux)
- if ((f = getpt()) == -1)
-#else
- if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
-#endif
- return -1;
-
- /*
- * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and
- * exec()s pt_chmod
- */
- sigcld = signal(SIGCHLD, SIG_DFL);
- if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f))
- {
- signal(SIGCHLD, sigcld);
- close(f);
- return -1;
- }
- signal(SIGCHLD, sigcld);
- strncpy(TtyName, m, sizeof(TtyName));
- initmaster(f);
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
-#define PTY_DONE
-
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- register int f;
-
- /* a dumb looking loop replaced by mycrofts code: */
- strcpy (PtyName, "/dev/ptc");
- if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0)
- return -1;
- strncpy(TtyName, ttyname(f), sizeof(TtyName));
- if (eff_uid && access(TtyName, R_OK | W_OK))
- {
- close(f);
- return -1;
- }
- initmaster(f);
-# ifdef _IBMR2
- pty_preopen = 1;
-# endif
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#if defined(HAVE_OPENPTY) && !defined(PTY_DONE)
-#define PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- int f, s;
- if (openpty(&f, &s, TtyName, NULL, NULL) != 0)
- return -1;
- close(s);
- initmaster(f);
- pty_preopen = 1;
- *ttyn = TtyName;
- return f;
-}
-#endif
-
-/***************************************************************/
-
-#ifndef PTY_DONE
-int
-OpenPTY(ttyn)
-char **ttyn;
-{
- register char *p, *q, *l, *d;
- register int f;
-
- debug("OpenPTY: Using BSD style ptys.\n");
- strcpy(PtyName, PtyProto);
- strcpy(TtyName, TtyProto);
- for (p = PtyName; *p != 'X'; p++)
- ;
- for (q = TtyName; *q != 'X'; q++)
- ;
- for (l = PTYRANGE0; (*p = *l) != '\0'; l++)
- {
- for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++)
- {
- debug1("OpenPTY tries '%s'\n", PtyName);
- if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
- continue;
- q[0] = *l;
- q[1] = *d;
- if (eff_uid && access(TtyName, R_OK | W_OK))
- {
- close(f);
- continue;
- }
-#if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3)
- /* Hack to ensure that the slave side of the pty is
- * unused. May not work in anything other than SunOS4.1
- */
- {
- int pgrp;
-
- /* tcgetpgrp does not work (uses TIOCGETPGRP)! */
- if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO)
- {
- close(f);
- continue;
- }
- }
-#endif
- initmaster(f);
- *ttyn = TtyName;
- return f;
- }
- }
- return -1;
-}
-#endif
-
diff --git a/src/putenv.c b/src/putenv.c
deleted file mode 100644
index 8c9fc03..0000000
--- a/src/putenv.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-/*
- * putenv -- put value into environment
- *
- * Usage: i = putenv (string)
- * int i;
- * char *string;
- *
- * where string is of the form <name>=<value>.
- * If "value" is 0, then "name" will be deleted from the environment.
- * Putenv returns 0 normally, -1 on error (not enough core for malloc).
- *
- * Putenv may need to add a new name into the environment, or to
- * associate a value longer than the current value with a particular
- * name. So, to make life simpler, putenv() copies your entire
- * environment into the heap (i.e. malloc()) from the stack
- * (i.e. where it resides when your process is initiated) the first
- * time you call it.
- *
- * HISTORY
- * 3-Sep-91 Michael Schroeder (mlschroe). Modified to behave as
- * as putenv.
- * 16-Aug-91 Tim MacKenzie (tym) at Monash University. Modified for
- * use in screen (iScreen) (ignores final int parameter)
- * 14-Oct-85 Michael Mauldin (mlm) at Carnegie-Mellon University
- * Ripped out of CMU lib for Rob-O-Matic portability
- * 20-Nov-79 Steven Shafer (sas) at Carnegie-Mellon University
- * Created for VAX. Too bad Bell Labs didn't provide this. It's
- * unfortunate that you have to copy the whole environment onto the
- * heap, but the bookkeeping-and-not-so-much-copying approach turns
- * out to be much hairier. So, I decided to do the simple thing,
- * copying the entire environment onto the heap the first time you
- * call putenv(), then doing realloc() uniformly later on.
- */
-
-#include "config.h"
-
-#ifdef NEEDPUTENV
-
-#if defined(__STDC__)
-# define __P(a) a
-#else
-# define __P(a) ()
-#endif
-
-char *malloc __P((int));
-char *realloc __P((char *, int));
-void free __P((char *));
-int sprintf __P((char *, char *, ...));
-
-#define EXTRASIZE 5 /* increment to add to env. size */
-
-static int envsize = -1; /* current size of environment */
-extern char **environ; /* the global which is your env. */
-
-static int findenv __P((char *)); /* look for a name in the env. */
-static int newenv __P((void)); /* copy env. from stack to heap */
-static int moreenv __P((void)); /* incr. size of env. */
-
-int
-unsetenv(name)
-char *name;
-{
- register int i;
-
- if (envsize < 0)
- { /* first time putenv called */
- if (newenv() < 0) /* copy env. to heap */
- return -1;
- }
- i = findenv(name);
- if (i < 0)
- return 0; /* Already here */
-
- free(environ[i]);
- if (envsize > 0)
- envsize--;
- for (; environ[i]; i++)
- environ[i] = environ[i+1];
- return 0; /* Already here */
-}
-
-int
-putenv(string)
-char *string;
-{
- register int i;
- register char *p;
-
- if (envsize < 0)
- { /* first time putenv called */
- if (newenv() < 0) /* copy env. to heap */
- return -1;
- }
-
- i = findenv(string); /* look for name in environment */
-
- if (i < 0)
- { /* name must be added */
- for (i = 0; environ[i]; i++);
- if (i >= (envsize - 1))
- { /* need new slot */
- if (moreenv() < 0)
- return -1;
- }
- p = malloc(strlen(string) + 1);
- if (p == 0) /* not enough core */
- return -1;
- environ[i + 1] = 0; /* new end of env. */
- }
- else
- { /* name already in env. */
- p = realloc(environ[i], strlen(string) + 1);
- if (p == 0)
- return -1;
- }
- sprintf(p, "%s", string); /* copy into env. */
- environ[i] = p;
-
- return 0;
-}
-
-static int
-findenv(name)
-char *name;
-{
- register char *namechar, *envchar;
- register int i, found;
-
- found = 0;
- for (i = 0; environ[i] && !found; i++)
- {
- envchar = environ[i];
- namechar = name;
- while (*namechar && *namechar != '=' && (*namechar == *envchar))
- {
- namechar++;
- envchar++;
- }
- found = ((*namechar == '\0' || *namechar == '=') && *envchar == '=');
- }
- return found ? i - 1 : -1;
-}
-
-static int
-newenv()
-{
- register char **env, *elem;
- register int i, esize;
-
- for (i = 0; environ[i]; i++)
- ;
- esize = i + EXTRASIZE + 1;
- env = (char **)malloc(esize * sizeof (elem));
- if (env == 0)
- return -1;
-
- for (i = 0; environ[i]; i++)
- {
- elem = malloc(strlen(environ[i]) + 1);
- if (elem == 0)
- return -1;
- env[i] = elem;
- strcpy(elem, environ[i]);
- }
-
- env[i] = 0;
- environ = env;
- envsize = esize;
- return 0;
-}
-
-static int
-moreenv()
-{
- register int esize;
- register char **env;
-
- esize = envsize + EXTRASIZE;
- env = (char **)realloc((char *)environ, esize * sizeof (*env));
- if (env == 0)
- return -1;
- environ = env;
- envsize = esize;
- return 0;
-}
-
-#endif /* NEEDPUTENV */
-
diff --git a/src/resize.c b/src/resize.c
deleted file mode 100644
index 6b5cef4..0000000
--- a/src/resize.c
+++ /dev/null
@@ -1,1104 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <signal.h>
-#ifndef sun
-#include <sys/ioctl.h>
-#endif
-
-#ifdef ISC
-# include <sys/tty.h>
-# include <sys/sioctl.h>
-# include <sys/pty.h>
-#endif
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-static void CheckMaxSize __P((int));
-static void FreeMline __P((struct mline *));
-static int AllocMline __P((struct mline *ml, int));
-static void MakeBlankLine __P((unsigned char *, int));
-static void kaablamm __P((void));
-static int BcopyMline __P((struct mline *, int, struct mline *, int, int, int));
-static void SwapAltScreen __P((struct win *));
-
-extern struct layer *flayer;
-extern struct display *display, *displays;
-extern unsigned char *blank, *null;
-extern struct mline mline_blank, mline_null, mline_old;
-extern struct win *windows;
-extern int Z0width, Z1width;
-extern int captionalways;
-
-#if defined(TIOCGWINSZ) || defined(TIOCSWINSZ)
-struct winsize glwz;
-#endif
-
-static struct mline mline_zero = {
- (unsigned char *)0,
- (unsigned char *)0
-#ifdef FONT
- ,(unsigned char *)0
-#endif
-#ifdef COLOR
- ,(unsigned char *)0
-# ifdef COLORS256
- ,(unsigned char *)0
-# endif
-#endif
-};
-
-/*
- * ChangeFlag: 0: try to modify no window
- * 1: modify fore (and try to modify no other) + redisplay
- * 2: modify all windows
- *
- * Note: Activate() is only called if change_flag == 1
- * i.e. on a WINCH event
- */
-
-void
-CheckScreenSize(change_flag)
-int change_flag;
-{
- int wi, he;
-
- if (display == 0)
- {
- debug("CheckScreenSize: No display -> no check.\n");
- return;
- }
-#ifdef TIOCGWINSZ
- if (ioctl(D_userfd, TIOCGWINSZ, (char *)&glwz) != 0)
- {
- debug2("CheckScreenSize: ioctl(%d, TIOCGWINSZ) errno %d\n", D_userfd, errno);
- wi = D_CO;
- he = D_LI;
- }
- else
- {
- wi = glwz.ws_col;
- he = glwz.ws_row;
- if (wi == 0)
- wi = D_CO;
- if (he == 0)
- he = D_LI;
- }
-#else
- wi = D_CO;
- he = D_LI;
-#endif
-
- debug2("CheckScreenSize: screen is (%d,%d)\n", wi, he);
-
-#if 0 /* XXX: Fixme */
- if (change_flag == 2)
- {
- debug("Trying to adapt all windows (-A)\n");
- for (p = windows; p; p = p->w_next)
- if (p->w_display == 0 || p->w_display == display)
- ChangeWindowSize(p, wi, he, p->w_histheight);
- }
-#endif
- if (D_width == wi && D_height == he)
- {
- debug("CheckScreenSize: No change -> return.\n");
- return;
- }
-#ifdef BLANKER_PRG
- KillBlanker();
-#endif
- ResetIdle();
- ChangeScreenSize(wi, he, change_flag);
-/* XXX Redisplay logic */
-#if 0
- if (change_flag == 1)
- Redisplay(D_fore ? D_fore->w_norefresh : 0);
-#endif
-}
-
-void
-ChangeScreenSize(wi, he, change_fore)
-int wi, he;
-int change_fore;
-{
- struct win *p;
- struct canvas *cv, **cvpp;
- int wwi;
- int y, h, hn;
-
- debug2("ChangeScreenSize from (%d,%d) ", D_width, D_height);
- debug3("to (%d,%d) (change_fore: %d)\n",wi, he, change_fore);
-
- /*
- * STRATEGY: keep the ratios.
- * if canvas doesn't fit anymore, throw it off.
- * (ATTENTION: cvlist must be sorted!)
- */
- y = 0;
- h = he;
- if (D_has_hstatus == HSTATUS_LASTLINE)
- {
- if (h > 1)
- h--;
- else
- D_has_hstatus = 0; /* sorry */
- }
- for (cvpp = &D_cvlist; (cv = *cvpp); )
- {
- if (h < 2 && cvpp != &D_cvlist)
- {
- /* kill canvas */
- SetCanvasWindow(cv, 0);
- *cvpp = cv->c_next;
- free(cv);
- if (D_forecv == cv)
- D_forecv = 0;
- continue;
- }
- hn = (cv->c_ye - cv->c_ys + 1) * he / D_height;
- if (hn == 0)
- hn = 1;
- if (hn + 2 >= h || cv->c_next == 0)
- hn = h - 1;
- if ((!captionalways && cv == D_cvlist && h - hn < 2) || hn == 0)
- hn = h;
- ASSERT(hn > 0);
- cv->c_xs = 0;
- cv->c_xe = wi - 1;
- cv->c_ys = y;
- cv->c_ye = y + hn - 1;
-
- cv->c_xoff = cv->c_xs;
- cv->c_yoff = cv->c_ys;
-
- y += hn + 1;
- h -= hn + 1;
- cvpp = &cv->c_next;
- }
- RethinkDisplayViewports();
- if (D_forecv == 0)
- D_forecv = D_cvlist;
- if (D_forecv)
- D_fore = Layer2Window(D_forecv->c_layer);
-
- D_width = wi;
- D_height = he;
-
- CheckMaxSize(wi);
- if (D_CWS)
- {
- D_defwidth = D_CO;
- D_defheight = D_LI;
- }
- else
- {
- if (D_CZ0 && (wi == Z0width || wi == Z1width) &&
- (D_CO == Z0width || D_CO == Z1width))
- D_defwidth = D_CO;
- else
- D_defwidth = wi;
- D_defheight = he;
- }
- debug2("Default size: (%d,%d)\n", D_defwidth, D_defheight);
- if (change_fore)
- ResizeLayersToCanvases();
- if (D_CWS == NULL && displays->d_next == 0)
- {
- /* adapt all windows - to be removed ? */
- for (p = windows; p; p = p->w_next)
- {
- debug1("Trying to change window %d.\n", p->w_number);
- wwi = wi;
-#if 0
- if (D_CZ0 && p->w_width != wi && (wi == Z0width || wi == Z1width))
- {
- if (p->w_width > (Z0width + Z1width) / 2)
- wwi = Z0width;
- else
- wwi = Z1width;
- }
-#endif
- if (p->w_savelayer && p->w_savelayer->l_cvlist == 0)
- ResizeLayer(p->w_savelayer, wwi, he, 0);
-#if 0
- ChangeWindowSize(p, wwi, he, p->w_histheight);
-#endif
- }
- }
-}
-
-void
-ResizeLayersToCanvases()
-{
- struct canvas *cv;
- struct layer *l;
- int lx, ly;
-
- debug("ResizeLayersToCanvases\n");
- D_kaablamm = 0;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- {
- l = cv->c_layer;
- if (l == 0)
- continue;
- debug("Doing canvas: ");
- if (l->l_width == cv->c_xe - cv->c_xs + 1 &&
- l->l_height == cv->c_ye - cv->c_ys + 1)
- {
- debug("already fitting.\n");
- continue;
- }
- if (!MayResizeLayer(l))
- {
- debug("may not resize.\n");
- }
- else
- {
- debug("doing resize.\n");
- ResizeLayer(l, cv->c_xe - cv->c_xs + 1, cv->c_ye - cv->c_ys + 1, display);
- }
-
- /* normalize window, see screen.c */
- lx = cv->c_layer->l_x;
- ly = cv->c_layer->l_y;
- if (ly + cv->c_yoff < cv->c_ys)
- {
- cv->c_yoff = cv->c_ys - ly;
- RethinkViewportOffsets(cv);
- }
- else if (ly + cv->c_yoff > cv->c_ye)
- {
- cv->c_yoff = cv->c_ye - ly;
- RethinkViewportOffsets(cv);
- }
- if (lx + cv->c_xoff < cv->c_xs)
- {
- int n = cv->c_xs - (lx + cv->c_xoff);
- if (n < (cv->c_xe - cv->c_xs + 1) / 2)
- n = (cv->c_xe - cv->c_xs + 1) / 2;
- if (cv->c_xoff + n > cv->c_xs)
- n = cv->c_xs - cv->c_xoff;
- cv->c_xoff += n;
- RethinkViewportOffsets(cv);
- }
- else if (lx + cv->c_xoff > cv->c_xe)
- {
- int n = lx + cv->c_xoff - cv->c_xe;
- if (n < (cv->c_xe - cv->c_xs + 1) / 2)
- n = (cv->c_xe - cv->c_xs + 1) / 2;
- if (cv->c_xoff - n + cv->c_layer->l_width - 1 < cv->c_xe)
- n = cv->c_xoff + cv->c_layer->l_width - 1 - cv->c_xe;
- cv->c_xoff -= n;
- RethinkViewportOffsets(cv);
- }
- }
- Redisplay(0);
- if (D_kaablamm)
- {
- kaablamm();
- D_kaablamm = 0;
- }
-}
-
-int
-MayResizeLayer(l)
-struct layer *l;
-{
- int cvs = 0;
- debug("MayResizeLayer:\n");
- for (; l; l = l->l_next)
- {
- if (l->l_cvlist)
- if (++cvs > 1 || l->l_cvlist->c_lnext)
- {
- debug1("may not - cvs %d\n", cvs);
- return 0;
- }
- }
- debug("may resize\n");
- return 1;
-}
-
-/*
- * Easy implementation: rely on the fact that the only layers
- * supporting resize are Win and Blank. So just kill all overlays.
- *
- * This is a lot harder if done the right way...
- */
-
-static void
-kaablamm()
-{
- Msg(0, "Aborted because of window size change.");
-}
-
-void
-ResizeLayer(l, wi, he, norefdisp)
-struct layer *l;
-int wi, he;
-struct display *norefdisp;
-{
- struct win *p;
- struct canvas *cv;
- struct layer *oldflayer = flayer;
- struct display *d, *olddisplay = display;
-
- if (l->l_width == wi && l->l_height == he)
- return;
- p = Layer2Window(l);
-
- if (oldflayer && (l == oldflayer || Layer2Window(oldflayer) == p))
- while (oldflayer->l_next)
- oldflayer = oldflayer->l_next;
-
- if (p)
- {
- for (d = displays; d; d = d->d_next)
- for (cv = d->d_cvlist; cv; cv = cv->c_next)
- {
- if (p == Layer2Window(cv->c_layer))
- {
- flayer = cv->c_layer;
- if (flayer->l_next)
- d->d_kaablamm = 1;
- while (flayer->l_next)
- ExitOverlayPage();
- }
- }
- l = p->w_savelayer;
- }
- flayer = l;
- if (p == 0 && flayer->l_next && flayer->l_next->l_next == 0 && LayResize(wi, he) == 0)
- {
- flayer = flayer->l_next;
- LayResize(wi, he);
- flayer = l;
- }
- else
- {
- if (flayer->l_next)
- for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext)
- cv->c_display->d_kaablamm = 1;
- while (flayer->l_next)
- ExitOverlayPage();
- }
- if (p)
- flayer = &p->w_layer;
- LayResize(wi, he);
- /* now everybody is on flayer, redisplay */
- l = flayer;
- for (display = displays; display; display = display->d_next)
- {
- if (display == norefdisp)
- continue;
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (cv->c_layer == l)
- {
- CV_CALL(cv, LayRedisplayLine(-1, -1, -1, 0));
- RefreshArea(cv->c_xs, cv->c_ys, cv->c_xe, cv->c_ye, 0);
- }
- if (D_kaablamm)
- {
- kaablamm();
- D_kaablamm = 0;
- }
- }
- flayer = oldflayer;
- display = olddisplay;
-}
-
-
-static void
-FreeMline(ml)
-struct mline *ml;
-{
- if (ml->image)
- free(ml->image);
- if (ml->attr && ml->attr != null)
- free(ml->attr);
-#ifdef FONT
- if (ml->font && ml->font != null)
- free(ml->font);
-#endif
-#ifdef COLOR
- if (ml->color && ml->color != null)
- free(ml->color);
-# ifdef COLORS256
- if (ml->colorx && ml->colorx != null)
- free(ml->colorx);
-# endif
-#endif
- *ml = mline_zero;
-}
-
-static int
-AllocMline(ml, w)
-struct mline *ml;
-int w;
-{
- ml->image = malloc(w);
- ml->attr = null;
-#ifdef FONT
- ml->font = null;
-#endif
-#ifdef COLOR
- ml->color = null;
-# ifdef COLORS256
- ml->colorx = null;
-# endif
-#endif
- if (ml->image == 0)
- return -1;
- return 0;
-}
-
-
-static int
-BcopyMline(mlf, xf, mlt, xt, l, w)
-struct mline *mlf, *mlt;
-int xf, xt, l, w;
-{
- int r = 0;
-
- bcopy((char *)mlf->image + xf, (char *)mlt->image + xt, l);
- if (mlf->attr != null && mlt->attr == null)
- {
- if ((mlt->attr = (unsigned char *)malloc(w)) == 0)
- mlt->attr = null, r = -1;
- bzero((char *)mlt->attr, w);
- }
- if (mlt->attr != null)
- bcopy((char *)mlf->attr + xf, (char *)mlt->attr + xt, l);
-#ifdef FONT
- if (mlf->font != null && mlt->font == null)
- {
- if ((mlt->font = (unsigned char *)malloc(w)) == 0)
- mlt->font = null, r = -1;
- bzero((char *)mlt->font, w);
- }
- if (mlt->font != null)
- bcopy((char *)mlf->font + xf, (char *)mlt->font + xt, l);
-#endif
-#ifdef COLOR
- if (mlf->color != null && mlt->color == null)
- {
- if ((mlt->color = (unsigned char *)malloc(w)) == 0)
- mlt->color = null, r = -1;
- bzero((char *)mlt->color, w);
- }
- if (mlt->color != null)
- bcopy((char *)mlf->color + xf, (char *)mlt->color + xt, l);
-# ifdef COLORS256
- if (mlf->colorx != null && mlt->colorx == null)
- {
- if ((mlt->colorx = (unsigned char *)malloc(w)) == 0)
- mlt->colorx = null, r = -1;
- bzero((char *)mlt->colorx, w);
- }
- if (mlt->colorx != null)
- bcopy((char *)mlf->colorx + xf, (char *)mlt->colorx + xt, l);
-# endif
-#endif
- return r;
-}
-
-
-static int maxwidth;
-
-static void
-CheckMaxSize(wi)
-int wi;
-{
- unsigned char *oldnull = null;
- struct win *p;
- int i;
- struct mline *ml;
-
- wi = ((wi + 1) + 255) & ~255;
- if (wi <= maxwidth)
- return;
- maxwidth = wi;
- debug1("New maxwidth: %d\n", maxwidth);
- blank = (unsigned char *)xrealloc((char *)blank, maxwidth);
- null = (unsigned char *)xrealloc((char *)null, maxwidth);
- mline_old.image = (unsigned char *)xrealloc((char *)mline_old.image, maxwidth);
- mline_old.attr = (unsigned char *)xrealloc((char *)mline_old.attr, maxwidth);
-#ifdef FONT
- mline_old.font = (unsigned char *)xrealloc((char *)mline_old.font, maxwidth);
-#endif
-#ifdef COLOR
- mline_old.color = (unsigned char *)xrealloc((char *)mline_old.color, maxwidth);
-# ifdef COLORS256
- mline_old.colorx = (unsigned char *)xrealloc((char *)mline_old.color, maxwidth);
-# endif
-#endif
- if (!(blank && null && mline_old.image && mline_old.attr IFFONT(&& mline_old.font) IFCOLOR(&& mline_old.color) IFCOLORX(&& mline_old.colorx)))
- Panic(0, strnomem);
-
- MakeBlankLine(blank, maxwidth);
- bzero((char *)null, maxwidth);
-
- mline_blank.image = blank;
- mline_blank.attr = null;
- mline_null.image = null;
- mline_null.attr = null;
-#ifdef FONT
- mline_blank.font = null;
- mline_null.font = null;
-#endif
-#ifdef COLOR
- mline_blank.color = null;
- mline_null.color = null;
-# ifdef COLORS256
- mline_blank.colorx = null;
- mline_null.colorx = null;
-# endif
-#endif
-
- /* We have to run through all windows to substitute
- * the null references.
- */
- for (p = windows; p; p = p->w_next)
- {
- ml = p->w_mlines;
- for (i = 0; i < p->w_height; i++, ml++)
- {
- if (ml->attr == oldnull)
- ml->attr = null;
-#ifdef FONT
- if (ml->font == oldnull)
- ml->font = null;
-#endif
-#ifdef COLOR
- if (ml->color == oldnull)
- ml->color= null;
-#ifdef COLORS256
- if (ml->colorx == oldnull)
- ml->colorx = null;
-#endif
-#endif
- }
-#ifdef COPY_PASTE
- ml = p->w_hlines;
- for (i = 0; i < p->w_histheight; i++, ml++)
- {
- if (ml->attr == oldnull)
- ml->attr = null;
-# ifdef FONT
- if (ml->font == oldnull)
- ml->font = null;
-# endif
-# ifdef COLOR
- if (ml->color == oldnull)
- ml->color= null;
-# ifdef COLORS256
- if (ml->colorx == oldnull)
- ml->colorx = null;
-# endif
-# endif
- }
-#endif
- }
-}
-
-
-char *
-xrealloc(mem, len)
-char *mem;
-int len;
-{
- register char *nmem;
-
- if (mem == 0)
- return malloc(len);
- if ((nmem = realloc(mem, len)))
- return nmem;
- free(mem);
- return (char *)0;
-}
-
-static void
-MakeBlankLine(p, n)
-register unsigned char *p;
-register int n;
-{
- while (n--)
- *p++ = ' ';
-}
-
-
-
-
-#ifdef COPY_PASTE
-
-#define OLDWIN(y) ((y < p->w_histheight) \
- ? &p->w_hlines[(p->w_histidx + y) % p->w_histheight] \
- : &p->w_mlines[y - p->w_histheight])
-
-#define NEWWIN(y) ((y < hi) ? &nhlines[y] : &nmlines[y - hi])
-
-#else
-
-#define OLDWIN(y) (&p->w_mlines[y])
-#define NEWWIN(y) (&nmlines[y])
-
-#endif
-
-
-int
-ChangeWindowSize(p, wi, he, hi)
-struct win *p;
-int wi, he, hi;
-{
- struct mline *mlf = 0, *mlt = 0, *ml, *nmlines, *nhlines;
- int fy, ty, l, lx, lf, lt, yy, oty, addone;
- int ncx, ncy, naka, t;
- int y, shift;
-
- if (wi == 0)
- he = hi = 0;
-
- if (p->w_width == wi && p->w_height == he && p->w_histheight == hi)
- {
- debug("ChangeWindowSize: No change.\n");
- return 0;
- }
-
- CheckMaxSize(wi);
-
- /* XXX */
-#if 0
- /* just in case ... */
- if (wi && (p->w_width != wi || p->w_height != he) && p->w_lay != &p->w_winlay)
- {
- debug("ChangeWindowSize: No resize because of overlay?\n");
- return -1;
- }
-#endif
-
- debug("ChangeWindowSize");
- debug3(" from (%d,%d)+%d", p->w_width, p->w_height, p->w_histheight);
- debug3(" to(%d,%d)+%d\n", wi, he, hi);
-
- fy = p->w_histheight + p->w_height - 1;
- ty = hi + he - 1;
-
- nmlines = nhlines = 0;
- ncx = 0;
- ncy = 0;
- naka = 0;
-
- if (wi)
- {
- if (wi != p->w_width || he != p->w_height)
- {
- if ((nmlines = (struct mline *)calloc(he, sizeof(struct mline))) == 0)
- {
- KillWindow(p);
- Msg(0, strnomem);
- return -1;
- }
- }
- else
- {
- debug1("image stays the same: %d lines\n", he);
- nmlines = p->w_mlines;
- fy -= he;
- ty -= he;
- ncx = p->w_x;
- ncy = p->w_y;
- naka = p->w_autoaka;
- }
- }
-#ifdef COPY_PASTE
- if (hi)
- {
- if ((nhlines = (struct mline *)calloc(hi, sizeof(struct mline))) == 0)
- {
- Msg(0, "No memory for history buffer - turned off");
- hi = 0;
- ty = he - 1;
- }
- }
-#endif
-
- /* special case: cursor is at magic margin position */
- addone = 0;
- if (p->w_width && p->w_x == p->w_width)
- {
- debug2("Special addone case: %d %d\n", p->w_x, p->w_y);
- addone = 1;
- p->w_x--;
- }
-
- /* handle the cursor and autoaka lines now if the widths are equal */
- if (p->w_width == wi)
- {
- ncx = p->w_x + addone;
- ncy = p->w_y + he - p->w_height;
- /* never lose sight of the line with the cursor on it */
- shift = -ncy;
- for (yy = p->w_y + p->w_histheight - 1; yy >= 0 && ncy + shift < he; yy--)
- {
- ml = OLDWIN(yy);
- if (ml->image[p->w_width] == ' ')
- break;
- shift++;
- }
- if (shift < 0)
- shift = 0;
- else
- debug1("resize: cursor out of bounds, shifting %d\n", shift);
- ncy += shift;
- if (p->w_autoaka > 0)
- {
- naka = p->w_autoaka + he - p->w_height + shift;
- if (naka < 1 || naka > he)
- naka = 0;
- }
- while (shift-- > 0)
- {
- ml = OLDWIN(fy);
- FreeMline(ml);
- fy--;
- }
- }
- debug2("fy %d ty %d\n", fy, ty);
- if (fy >= 0)
- mlf = OLDWIN(fy);
- if (ty >= 0)
- mlt = NEWWIN(ty);
-
- while (fy >= 0 && ty >= 0)
- {
- if (p->w_width == wi)
- {
- /* here is a simple shortcut: just copy over */
- *mlt = *mlf;
- *mlf = mline_zero;
- if (--fy >= 0)
- mlf = OLDWIN(fy);
- if (--ty >= 0)
- mlt = NEWWIN(ty);
- continue;
- }
-
- /* calculate lenght */
- for (l = p->w_width - 1; l > 0; l--)
- if (mlf->image[l] != ' ' || mlf->attr[l])
- break;
- if (fy == p->w_y + p->w_histheight && l < p->w_x)
- l = p->w_x; /* cursor is non blank */
- l++;
- lf = l;
-
- /* add wrapped lines to length */
- for (yy = fy - 1; yy >= 0; yy--)
- {
- ml = OLDWIN(yy);
- if (ml->image[p->w_width] == ' ')
- break;
- l += p->w_width;
- }
-
- /* rewrap lines */
- lt = (l - 1) % wi + 1; /* lf is set above */
- oty = ty;
- while (l > 0 && fy >= 0 && ty >= 0)
- {
- lx = lt > lf ? lf : lt;
- if (mlt->image == 0)
- {
- if (AllocMline(mlt, wi + 1))
- goto nomem;
- MakeBlankLine(mlt->image + lt, wi - lt);
- mlt->image[wi] = ((oty == ty) ? ' ' : 0);
- }
- if (BcopyMline(mlf, lf - lx, mlt, lt - lx, lx, wi + 1))
- goto nomem;
-
- /* did we copy the cursor ? */
- if (fy == p->w_y + p->w_histheight && lf - lx <= p->w_x && lf > p->w_x)
- {
- ncx = p->w_x + lt - lf + addone;
- ncy = ty - hi;
- shift = wi ? -ncy + (l - lx) / wi : 0;
- if (ty + shift > hi + he - 1)
- shift = hi + he - 1 - ty;
- if (shift > 0)
- {
- debug3("resize: cursor out of bounds, shifting %d [%d/%d]\n", shift, lt - lx, wi);
- for (y = hi + he - 1; y >= ty; y--)
- {
- mlt = NEWWIN(y);
- FreeMline(mlt);
- if (y - shift < ty)
- continue;
- ml = NEWWIN(y - shift);
- *mlt = *ml;
- *ml = mline_zero;
- }
- ncy += shift;
- ty += shift;
- mlt = NEWWIN(ty);
- if (naka > 0)
- naka = naka + shift > he ? 0 : naka + shift;
- }
- ASSERT(ncy >= 0);
- }
- /* did we copy autoaka line ? */
- if (p->w_autoaka > 0 && fy == p->w_autoaka - 1 + p->w_histheight && lf - lx <= 0)
- naka = ty - hi >= 0 ? 1 + ty - hi : 0;
-
- lf -= lx;
- lt -= lx;
- l -= lx;
- if (lf == 0)
- {
- FreeMline(mlf);
- lf = p->w_width;
- if (--fy >= 0)
- mlf = OLDWIN(fy);
- }
- if (lt == 0)
- {
- lt = wi;
- if (--ty >= 0)
- mlt = NEWWIN(ty);
- }
- }
- ASSERT(l != 0 || fy == yy);
- }
- while (fy >= 0)
- {
- FreeMline(mlf);
- if (--fy >= 0)
- mlf = OLDWIN(fy);
- }
- while (ty >= 0)
- {
- if (AllocMline(mlt, wi + 1))
- goto nomem;
- MakeBlankLine(mlt->image, wi + 1);
- if (--ty >= 0)
- mlt = NEWWIN(ty);
- }
-
-#ifdef DEBUG
- if (nmlines != p->w_mlines)
- for (fy = 0; fy < p->w_height + p->w_histheight; fy++)
- {
- ml = OLDWIN(fy);
- ASSERT(ml->image == 0);
- }
-#endif
-
- if (p->w_mlines && p->w_mlines != nmlines)
- free((char *)p->w_mlines);
- p->w_mlines = nmlines;
-#ifdef COPY_PASTE
- if (p->w_hlines && p->w_hlines != nhlines)
- free((char *)p->w_hlines);
- p->w_hlines = nhlines;
-#endif
- nmlines = nhlines = 0;
-
- /* change tabs */
- if (p->w_width != wi)
- {
- if (wi)
- {
- t = p->w_tabs ? p->w_width : 0;
- p->w_tabs = xrealloc(p->w_tabs, wi + 1);
- if (p->w_tabs == 0)
- {
- nomem:
- if (nmlines)
- {
- for (ty = he + hi - 1; ty >= 0; ty--)
- {
- mlt = NEWWIN(ty);
- FreeMline(mlt);
- }
- if (nmlines && p->w_mlines != nmlines)
- free((char *)nmlines);
-#ifdef COPY_PASTE
- if (nhlines && p->w_hlines != nhlines)
- free((char *)nhlines);
-#endif
- }
- KillWindow(p);
- Msg(0, strnomem);
- return -1;
- }
- for (; t < wi; t++)
- p->w_tabs[t] = t && !(t & 7) ? 1 : 0;
- p->w_tabs[wi] = 0;
- }
- else
- {
- if (p->w_tabs)
- free(p->w_tabs);
- p->w_tabs = 0;
- }
- }
-
- /* Change w_Saved_y - this is only an estimate... */
- p->w_Saved_y += ncy - p->w_y;
-
- p->w_x = ncx;
- p->w_y = ncy;
- if (p->w_autoaka > 0)
- p->w_autoaka = naka;
-
- /* do sanity checks */
- if (p->w_x > wi)
- p->w_x = wi;
- if (p->w_y >= he)
- p->w_y = he - 1;
- if (p->w_Saved_x > wi)
- p->w_Saved_x = wi;
- if (p->w_Saved_y < 0)
- p->w_Saved_y = 0;
- if (p->w_Saved_y >= he)
- p->w_Saved_y = he - 1;
-
- /* reset scrolling region */
- p->w_top = 0;
- p->w_bot = he - 1;
-
- /* signal new size to window */
-#ifdef TIOCSWINSZ
- if (wi && (p->w_width != wi || p->w_height != he) && p->w_ptyfd >= 0 && p->w_pid)
- {
- glwz.ws_col = wi;
- glwz.ws_row = he;
- debug("Setting pty winsize.\n");
- if (ioctl(p->w_ptyfd, TIOCSWINSZ, (char *)&glwz))
- debug2("SetPtySize: errno %d (fd:%d)\n", errno, p->w_ptyfd);
- }
-#endif /* TIOCSWINSZ */
-
- /* store new size */
- p->w_width = wi;
- p->w_height = he;
-#ifdef COPY_PASTE
- p->w_histidx = 0;
- p->w_histheight = hi;
-#endif
-
-#ifdef BUILTIN_TELNET
- if (p->w_type == W_TYPE_TELNET)
- TelWindowSize(p);
-#endif
-
-#ifdef DEBUG
- /* Test if everything was ok */
- for (fy = 0; fy < p->w_height + p->w_histheight; fy++)
- {
- ml = OLDWIN(fy);
- ASSERT(ml->image);
-# ifdef UTF8
- if (p->w_encoding == UTF8)
- {
- for (l = 0; l < p->w_width; l++)
- ASSERT(ml->image[l] >= ' ' || ml->font[l]);
- }
- else
-#endif
- for (l = 0; l < p->w_width; l++)
- ASSERT(ml->image[l] >= ' ');
- }
-#endif
- return 0;
-}
-
-void
-FreeAltScreen(p)
-struct win *p;
-{
- int i;
-
- if (p->w_alt_mlines)
- for (i = 0; i < p->w_alt_height; i++)
- FreeMline(p->w_alt_mlines + i);
- p->w_alt_mlines = 0;
- p->w_alt_width = 0;
- p->w_alt_height = 0;
- p->w_alt_x = 0;
- p->w_alt_y = 0;
-#ifdef COPY_PASTE
- if (p->w_alt_hlines)
- for (i = 0; i < p->w_alt_histheight; i++)
- FreeMline(p->w_alt_hlines + i);
- p->w_alt_hlines = 0;
- p->w_alt_histidx = 0;
-#endif
- p->w_alt_histheight = 0;
-}
-
-static void
-SwapAltScreen(p)
-struct win *p;
-{
- struct mline *ml;
- int t;
-
- ml = p->w_alt_mlines; p->w_alt_mlines = p->w_mlines; p->w_mlines = ml;
- t = p->w_alt_width; p->w_alt_width = p->w_width; p->w_width = t;
- t = p->w_alt_height; p->w_alt_height = p->w_height; p->w_height = t;
- t = p->w_alt_histheight; p->w_alt_histheight = p->w_histheight; p->w_histheight = t;
- t = p->w_alt_x; p->w_alt_x = p->w_x; p->w_x = t;
- t = p->w_alt_y; p->w_alt_y = p->w_y; p->w_y = t;
-#ifdef COPY_PASTE
- ml = p->w_alt_hlines; p->w_alt_hlines = p->w_hlines; p->w_hlines = ml;
- t = p->w_alt_histidx; p->w_alt_histidx = p->w_histidx; p->w_histidx = t;
-#endif
-}
-
-void
-EnterAltScreen(p)
-struct win *p;
-{
- int ox = p->w_x, oy = p->w_y;
- FreeAltScreen(p);
- SwapAltScreen(p);
- ChangeWindowSize(p, p->w_alt_width, p->w_alt_height, p->w_alt_histheight);
- p->w_x = ox;
- p->w_y = oy;
-}
-
-void
-LeaveAltScreen(p)
-struct win *p;
-{
- if (!p->w_alt_mlines)
- return;
- SwapAltScreen(p);
- ChangeWindowSize(p, p->w_alt_width, p->w_alt_height, p->w_alt_histheight);
- FreeAltScreen(p);
-}
diff --git a/src/sched.c b/src/sched.c
deleted file mode 100644
index 7a181d8..0000000
--- a/src/sched.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
-# include <time.h>
-#endif
-#include <sys/time.h>
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-static struct event *evs;
-static struct event *tevs;
-static struct event *nextev;
-static int calctimeout;
-
-static struct event *calctimo __P((void));
-#if (defined(sgi) && defined(SVR4)) || defined(__osf__) || defined(M_UNIX)
-static int sgihack __P((void));
-#endif
-
-void
-evenq(ev)
-struct event *ev;
-{
- struct event *evp, **evpp;
- debug3("New event fd %d type %d queued %d\n", ev->fd, ev->type, ev->queued);
- if (ev->queued)
- return;
- evpp = &evs;
- if (ev->type == EV_TIMEOUT)
- {
- calctimeout = 1;
- evpp = &tevs;
- }
- for (; (evp = *evpp); evpp = &evp->next)
- if (ev->pri > evp->pri)
- break;
- ev->next = evp;
- *evpp = ev;
- ev->queued = 1;
-}
-
-void
-evdeq(ev)
-struct event *ev;
-{
- struct event *evp, **evpp;
- debug3("Deq event fd %d type %d queued %d\n", ev->fd, ev->type, ev->queued);
- if (!ev->queued)
- return;
- evpp = &evs;
- if (ev->type == EV_TIMEOUT)
- {
- calctimeout = 1;
- evpp = &tevs;
- }
- for (; (evp = *evpp); evpp = &evp->next)
- if (evp == ev)
- break;
- ASSERT(evp);
- *evpp = ev->next;
- ev->queued = 0;
- if (ev == nextev)
- nextev = nextev->next;
-}
-
-static struct event *
-calctimo()
-{
- struct event *ev, *min;
- long mins;
-
- if ((min = tevs) == 0)
- return 0;
- mins = min->timeout.tv_sec;
- for (ev = tevs->next; ev; ev = ev->next)
- {
- ASSERT(ev->type == EV_TIMEOUT);
- if (mins < ev->timeout.tv_sec)
- continue;
- if (mins > ev->timeout.tv_sec || min->timeout.tv_usec > ev->timeout.tv_usec)
- {
- min = ev;
- mins = ev->timeout.tv_sec;
- }
- }
- return min;
-}
-
-void
-sched()
-{
- struct event *ev;
- fd_set r, w, *set;
- struct event *timeoutev = 0;
- struct timeval timeout;
- int nsel;
-
- for (;;)
- {
- if (calctimeout)
- timeoutev = calctimo();
- if (timeoutev)
- {
- gettimeofday(&timeout, NULL);
- /* tp - timeout */
- timeout.tv_sec = timeoutev->timeout.tv_sec - timeout.tv_sec;
- timeout.tv_usec = timeoutev->timeout.tv_usec - timeout.tv_usec;
- if (timeout.tv_usec < 0)
- {
- timeout.tv_usec += 1000000;
- timeout.tv_sec--;
- }
- if (timeout.tv_sec < 0)
- {
- timeout.tv_usec = 0;
- timeout.tv_sec = 0;
- }
- }
-#ifdef DEBUG
- debug("waiting for events");
- if (timeoutev)
- debug2(" timeout %d secs %d usecs", timeout.tv_sec, timeout.tv_usec);
- debug(":\n");
- for (ev = evs; ev; ev = ev->next)
- debug3(" - fd %d type %d pri %d\n", ev->fd, ev->type, ev->pri);
- if (tevs)
- debug("timed events:\n");
- for (ev = tevs; ev; ev = ev->next)
- debug3(" - pri %d sec %d usec %d\n", ev->pri, ev->timeout.tv_sec, ev->timeout.tv_usec);
-#endif
-
- FD_ZERO(&r);
- FD_ZERO(&w);
- for (ev = evs; ev; ev = ev->next)
- {
- if (ev->condpos && *ev->condpos <= (ev->condneg ? *ev->condneg : 0))
- {
- debug2(" - cond ev fd %d type %d failed\n", ev->fd, ev->type);
- continue;
- }
- if (ev->type == EV_READ)
- FD_SET(ev->fd, &r);
- else if (ev->type == EV_WRITE)
- FD_SET(ev->fd, &w);
- }
-
-#ifdef DEBUG
- debug("readfds:");
- for (nsel = 0; nsel < FD_SETSIZE; nsel++)
- if (FD_ISSET(nsel, &r))
- debug1(" %d", nsel);
- debug("\n");
- debug("writefds:");
- for (nsel = 0; nsel < FD_SETSIZE; nsel++)
- if (FD_ISSET(nsel, &w))
- debug1(" %d", nsel);
- debug("\n");
-#endif
-
- nsel = select(FD_SETSIZE, &r, &w, (fd_set *)0, timeoutev ? &timeout : (struct timeval *) 0);
- if (nsel < 0)
- {
- if (errno != EINTR)
- {
-#if defined(sgi) && defined(SVR4)
- if (errno == EIO && sgihack())
- continue;
-#endif
-#if defined(__osf__) || defined(M_UNIX)
- /* OSF/1 3.x, SCO bug: EBADF */
- /* OSF/1 4.x bug: EIO */
- if ((errno == EIO || errno == EBADF) && sgihack())
- continue;
-#endif
- Panic(errno, "select");
- }
- nsel = 0;
- }
- else if (nsel == 0) /* timeout */
- {
- debug("TIMEOUT!\n");
- ASSERT(timeoutev);
- evdeq(timeoutev);
- timeoutev->handler(timeoutev, timeoutev->data);
- }
-#ifdef SELECT_BROKEN
- /*
- * Sequents select emulation counts a descriptor which is
- * readable and writeable only as one hit. Waaaaa.
- */
- if (nsel)
- nsel = 2 * FD_SETSIZE;
-#endif
-
- for (ev = evs; ev; ev = nextev)
- {
- nextev = ev->next;
- if (ev->type != EV_ALWAYS)
- {
- set = ev->type == EV_READ ? &r : &w;
- if (nsel == 0 || !FD_ISSET(ev->fd, set))
- continue;
- nsel--;
- }
- if (ev->condpos && *ev->condpos <= (ev->condneg ? *ev->condneg : 0))
- continue;
- debug2(" + hit ev fd %d type %d!\n", ev->fd, ev->type);
- ev->handler(ev, ev->data);
- }
- }
-}
-
-void
-SetTimeout(ev, timo)
-struct event *ev;
-int timo;
-{
- ASSERT(ev->type == EV_TIMEOUT);
- debug2("event %x new timeout %d ms\n", ev, timo);
- gettimeofday(&ev->timeout, NULL);
- ev->timeout.tv_sec += timo / 1000;
- ev->timeout.tv_usec += (timo % 1000) * 1000;
- if (ev->timeout.tv_usec > 1000000)
- {
- ev->timeout.tv_usec -= 1000000;
- ev->timeout.tv_sec++;
- }
- if (ev->queued)
- calctimeout = 1;
-}
-
-
-#if (defined(sgi) && defined(SVR4)) || defined(__osf__) || defined(M_UNIX)
-
-extern struct display *display, *displays;
-static int sgihack()
-{
- fd_set r, w;
- struct timeval tv;
-
- debug("IRIX5.2 workaround: searching for bad display\n");
- for (display = displays; display; )
- {
- FD_ZERO(&r);
- FD_ZERO(&w);
- FD_SET(D_userfd, &r);
- FD_SET(D_userfd, &w);
- tv.tv_sec = tv.tv_usec = 0;
- if (select(FD_SETSIZE, &r, &w, (fd_set *)0, &tv) == -1)
- {
- if (errno == EINTR)
- continue;
- Hangup(); /* goodbye display */
- return 1;
- }
- display = display->d_next;
- }
- return 0;
-}
-
-#endif
diff --git a/src/sched.h b/src/sched.h
deleted file mode 100644
index b3fca92..0000000
--- a/src/sched.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-struct event
-{
- struct event *next;
- void (*handler) __P((struct event *, char *));
- char *data;
- int fd;
- int type;
- int pri;
- struct timeval timeout;
- int queued; /* in evs queue */
- int active; /* in fdset */
- int *condpos; /* only active if condpos - condneg > 0 */
- int *condneg;
-};
-
-#define EV_TIMEOUT 0
-#define EV_READ 1
-#define EV_WRITE 2
-#define EV_ALWAYS 3
diff --git a/src/search.c b/src/search.c
deleted file mode 100644
index f83c2c2..0000000
--- a/src/search.c
+++ /dev/null
@@ -1,373 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-#include "screen.h"
-#include "mark.h"
-#include "extern.h"
-
-#define INPUTLINE (flayer->l_height - 1)
-
-extern struct layer *flayer;
-extern struct win *fore;
-
-#ifdef COPY_PASTE
-
-int search_ic;
-
-/********************************************************************
- * VI style Search
- */
-
-static int matchword __P((char *, int, int, int));
-static void searchend __P((char *, int, char *));
-static void backsearchend __P((char *, int, char *));
-
-void
-Search(dir)
-int dir;
-{
- struct markdata *markdata;
- if (dir == 0)
- {
- markdata = (struct markdata *)flayer->l_data;
- if (markdata->isdir > 0)
- searchend(0, 0, NULL);
- else if (markdata->isdir < 0)
- backsearchend(0, 0, NULL);
- else
- LMsg(0, "No previous pattern");
- }
- else
- Input((dir > 0 ? "/" : "?"), sizeof(markdata->isstr)-1, INP_COOKED,
- (dir > 0 ? searchend : backsearchend), NULL);
-}
-
-static void
-searchend(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- int x = 0, sx, ex, y;
- struct markdata *markdata;
- struct win *p;
-
- markdata = (struct markdata *)flayer->l_data;
- p = markdata->md_window;
- markdata->isdir = 1;
- if (len)
- strcpy(markdata->isstr, buf);
- sx = markdata->cx + 1;
- ex = flayer->l_width - 1;
- for (y = markdata->cy; y < p->w_histheight + flayer->l_height; y++, sx = 0)
- {
- if ((x = matchword(markdata->isstr, y, sx, ex)) >= 0)
- break;
- }
- if (y >= p->w_histheight + flayer->l_height)
- {
- LGotoPos(flayer, markdata->cx, W2D(markdata->cy));
- LMsg(0, "Pattern not found");
- }
- else
- revto(x, y);
-}
-
-static void
-backsearchend(buf, len, data)
-char *buf;
-int len;
-char *data; /* dummy */
-{
- int sx, ex, x = -1, y;
- struct markdata *markdata;
-
- markdata = (struct markdata *)flayer->l_data;
- markdata->isdir = -1;
- if (len)
- strcpy(markdata->isstr, buf);
- ex = markdata->cx - 1;
- for (y = markdata->cy; y >= 0; y--, ex = flayer->l_width - 1)
- {
- sx = 0;
- while ((sx = matchword(markdata->isstr, y, sx, ex)) >= 0)
- x = sx++;
- if (x >= 0)
- break;
- }
- if (y < 0)
- {
- LGotoPos(flayer, markdata->cx, W2D(markdata->cy));
- LMsg(0, "Pattern not found");
- }
- else
- revto(x, y);
-}
-
-static int
-matchword(pattern, y, sx, ex)
-char *pattern;
-int y, sx, ex;
-{
- unsigned char *ip, *ipe, *cp, *pp;
- struct mline *ml;
-
- /* *sigh* to make WIN work */
- fore = ((struct markdata *)flayer->l_data)->md_window;
-
- ml = WIN(y);
- ip = ml->image + sx;
- ipe = ml->image + flayer->l_width;
- for (;sx <= ex; sx++)
- {
- cp = ip++;
- pp = (unsigned char *)pattern;
- for (;;)
- {
- if (*cp != *pp)
- if (!search_ic || ((*cp ^ *pp) & 0xdf) || (*cp | 0x20) < 'a' || (*cp | 0x20) > 'z')
- break;
- cp++;
- pp++;
- if (*pp == 0)
- return sx;
- if (cp == ipe)
- break;
- }
- }
- return -1;
-}
-
-
-/********************************************************************
- * Emacs style ISearch
- */
-
-static char *isprompts[] = {
- "I-search backward: ", "failing I-search backward: ",
- "I-search: ", "failing I-search: "
-};
-
-
-static int is_redo __P((struct markdata *));
-static void is_process __P((char *, int, char *));
-static int is_bm __P((char *, int, int, int, int));
-
-
-static int
-is_bm(str, l, p, end, dir)
-char *str;
-int l, p, end, dir;
-{
- int tab[256];
- int i, q;
- unsigned char *s, c;
- int w = flayer->l_width;
-
- /* *sigh* to make WIN work */
- fore = ((struct markdata *)flayer->l_next->l_data)->md_window;
- debug2("is_bm: searching for %s len %d\n", str, l);
- debug3("start at %d end %d dir %d\n", p, end, dir);
- if (p < 0 || p + l > end)
- return -1;
- if (l == 0)
- return p;
- if (dir < 0)
- str += l - 1;
- for (i = 0; i < 256; i++)
- tab[i] = l * dir;
- for (i = 0; i < l - 1; i++, str += dir)
- {
- q = *(unsigned char *)str;
- tab[q] = (l - 1 - i) * dir;
- if (search_ic && (q | 0x20) >= 'a' && ((q | 0x20) <= 'z'))
- tab[q ^ 0x20] = (l - 1 - i) * dir;
- }
- if (dir > 0)
- p += l - 1;
- debug1("first char to match: %c\n", *str);
- while (p >= 0 && p < end)
- {
- q = p;
- s = (unsigned char *)str;
- for (i = 0;;)
- {
- c = (WIN(q / w))->image[q % w];
- if (i == 0)
- p += tab[(int)(unsigned char) c];
- if (c != *s)
- if (!search_ic || ((c ^ *s) & 0xdf) || (c | 0x20) < 'a' || (c | 0x20) > 'z')
- break;
- q -= dir;
- s -= dir;
- if (++i == l)
- return q + (dir > 0 ? 1 : -l);
- }
- }
- return -1;
-}
-
-
-/*ARGSUSED*/
-static void
-is_process(p, n, data) /* i-search */
-char *p;
-int n;
-char *data; /* dummy */
-{
- int pos, x, y, dir;
- struct markdata *markdata;
-
- if (n == 0)
- return;
- ASSERT(p);
- markdata = (struct markdata *)flayer->l_next->l_data;
-
- pos = markdata->cx + markdata->cy * flayer->l_width;
- LGotoPos(flayer, markdata->cx, W2D(markdata->cy));
-
- switch (*p)
- {
- case '\007': /* CTRL-G */
- pos = markdata->isstartpos;
- /*FALLTHROUGH*/
- case '\033': /* ESC */
- *p = 0;
- break;
- case '\013': /* CTRL-K */
- case '\027': /* CTRL-W */
- markdata->isistrl = 1;
- /*FALLTHROUGH*/
- case '\b':
- case '\177':
- if (markdata->isistrl == 0)
- return;
- markdata->isistrl--;
- pos = is_redo(markdata);
- *p = '\b';
- break;
- case '\023': /* CTRL-S */
- case '\022': /* CTRL-R */
- if (markdata->isistrl >= (int)sizeof(markdata->isistr))
- return;
- dir = (*p == '\023') ? 1 : -1;
- pos += dir;
- if (markdata->isdir == dir && markdata->isistrl == 0)
- {
- strcpy(markdata->isistr, markdata->isstr);
- markdata->isistrl = markdata->isstrl = strlen(markdata->isstr);
- break;
- }
- markdata->isdir = dir;
- markdata->isistr[markdata->isistrl++] = *p;
- break;
- default:
- if (*p < ' ' || markdata->isistrl >= (int)sizeof(markdata->isistr)
- || markdata->isstrl >= (int)sizeof(markdata->isstr) - 1)
- return;
- markdata->isstr[markdata->isstrl++] = *p;
- markdata->isistr[markdata->isistrl++] = *p;
- markdata->isstr[markdata->isstrl] = 0;
- debug2("New char: %c - left %d\n", *p, (int)sizeof(markdata->isistr) - markdata->isistrl);
- }
- if (*p && *p != '\b')
- pos = is_bm(markdata->isstr, markdata->isstrl, pos, flayer->l_width * (markdata->md_window->w_histheight + flayer->l_height), markdata->isdir);
- if (pos >= 0)
- {
- x = pos % flayer->l_width;
- y = pos / flayer->l_width;
- LAY_CALL_UP
- (
- LayRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0);
- revto(x, y);
- if (W2D(markdata->cy) == INPUTLINE)
- revto_line(markdata->cx, markdata->cy, INPUTLINE > 0 ? INPUTLINE - 1 : 1);
- );
- }
- if (*p)
- inp_setprompt(isprompts[markdata->isdir + (pos < 0) + 1], markdata->isstrl ? markdata->isstr : "");
- flayer->l_x = markdata->cx;
- flayer->l_y = W2D(markdata->cy);
- LGotoPos(flayer, flayer->l_x, flayer->l_y);
- if (!*p)
- {
- /* we are about to finish, keep cursor position */
- flayer->l_next->l_x = markdata->cx;
- flayer->l_next->l_y = W2D(markdata->cy);
- }
-}
-
-static int
-is_redo(markdata)
-struct markdata *markdata;
-{
- int i, pos, npos, dir;
- char c;
-
- npos = pos = markdata->isstartpos;
- dir = markdata->isstartdir;
- markdata->isstrl = 0;
- for (i = 0; i < markdata->isistrl; i++)
- {
- c = markdata->isistr[i];
- if (c == '\022') /* ^R */
- pos += (dir = -1);
- else if (c == '\023') /* ^S */
- pos += (dir = 1);
- else
- markdata->isstr[markdata->isstrl++] = c;
- if (pos >= 0)
- {
- npos = is_bm(markdata->isstr, markdata->isstrl, pos, flayer->l_width * (markdata->md_window->w_histheight + flayer->l_height), dir);
- if (npos >= 0)
- pos = npos;
- }
- }
- markdata->isstr[markdata->isstrl] = 0;
- markdata->isdir = dir;
- return npos;
-}
-
-void
-ISearch(dir)
-int dir;
-{
- struct markdata *markdata;
-
- markdata = (struct markdata *)flayer->l_data;
- markdata->isdir = markdata->isstartdir = dir;
- markdata->isstartpos = markdata->cx + markdata->cy * flayer->l_width;
- markdata->isistrl = markdata->isstrl = 0;
- if (W2D(markdata->cy) == INPUTLINE)
- revto_line(markdata->cx, markdata->cy, INPUTLINE > 0 ? INPUTLINE - 1 : 1);
- Input(isprompts[dir + 1], sizeof(markdata->isstr) - 1, INP_RAW,
- is_process, NULL);
- LGotoPos(flayer, markdata->cx, W2D(markdata->cy));
- flayer->l_x = markdata->cx;
- flayer->l_y = W2D(markdata->cy);
-}
-
-#endif /* COPY_PASTE */
diff --git a/src/socket.c b/src/socket.c
deleted file mode 100644
index 62a73af..0000000
--- a/src/socket.c
+++ /dev/null
@@ -1,1426 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include "config.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#if !defined(NAMEDPIPE)
-#include <sys/socket.h>
-#include <sys/un.h>
-#endif
-
-#ifndef SIGINT
-# include <signal.h>
-#endif
-
-#include "screen.h"
-
-#ifdef HAVE_DIRENT_H
-# include <dirent.h>
-#else
-# include <sys/dir.h>
-# define dirent direct
-#endif
-
-#include "extern.h"
-
-static int CheckPid __P((int));
-static void ExecCreate __P((struct msg *));
-static void DoCommandMsg __P((struct msg *));
-#if defined(_SEQUENT_) && !defined(NAMEDPIPE)
-# define connect sconnect /* _SEQUENT_ has braindamaged connect */
-static int sconnect __P((int, struct sockaddr *, int));
-#endif
-static void FinishAttach __P((struct msg *));
-static void AskPassword __P((struct msg *));
-
-
-extern char *RcFileName, *extra_incap, *extra_outcap;
-extern int ServerSocket, real_uid, real_gid, eff_uid, eff_gid;
-extern int dflag, iflag, rflag, lsflag, quietflag, wipeflag, xflag;
-extern char *attach_tty, *LoginName, HostName[];
-extern struct display *display, *displays;
-extern struct win *fore, *wtab[], *console_window, *windows;
-extern struct layer *flayer;
-extern struct NewWindow nwin_undef;
-#ifdef MULTIUSER
-extern char *multi;
-#endif
-
-extern char *getenv();
-
-extern char SockPath[];
-extern struct event serv_read;
-extern char *rc_name;
-extern struct comm comms[];
-
-#ifdef MULTIUSER
-# define SOCKMODE (S_IWRITE | S_IREAD | (displays ? S_IEXEC : 0) | (multi ? 1 : 0))
-#else
-# define SOCKMODE (S_IWRITE | S_IREAD | (displays ? S_IEXEC : 0))
-#endif
-
-
-/*
- * Socket directory manager
- *
- * fdp: pointer to store the first good socket.
- * nfoundp: pointer to store the number of sockets found matching.
- * notherp: pointer to store the number of sockets not matching.
- * match: string to match socket name.
- *
- * The socket directory must be in SockPath!
- * The global variables LoginName, multi, rflag, xflag, dflag,
- * quietflag, SockPath are used.
- *
- * The first good socket is stored in fdp and its name is
- * appended to SockPath.
- * If none exists or fdp is NULL SockPath is not changed.
- *
- * Returns: number of good sockets.
- *
- */
-
-int
-FindSocket(fdp, nfoundp, notherp, match)
-int *fdp;
-int *nfoundp, *notherp;
-char *match;
-{
- DIR *dirp;
- struct dirent *dp;
- struct stat st;
- int mode;
- int sdirlen;
- int matchlen = 0;
- char *name, *n;
- int firsts = -1, sockfd;
- char *firstn = NULL;
- int nfound = 0, ngood = 0, ndead = 0, nwipe = 0, npriv = 0;
- struct sent
- {
- struct sent *next;
- int mode;
- char *name;
- } *slist, **slisttail, *sent, *nsent;
-
- if (match)
- {
- matchlen = strlen(match);
-#ifdef NAME_MAX
- if (matchlen > NAME_MAX)
- matchlen = NAME_MAX;
-#endif
- }
-
- /*
- * SockPath contains the socket directory.
- * At the end of FindSocket the socket name will be appended to it.
- * Thus FindSocket() can only be called once!
- */
- sdirlen = strlen(SockPath);
-
-#ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
-#endif
-
- if ((dirp = opendir(SockPath)) == 0)
- Panic(errno, "Cannot opendir %s", SockPath);
-
- slist = 0;
- slisttail = &slist;
- while ((dp = readdir(dirp)))
- {
- name = dp->d_name;
- debug1("- %s\n", name);
- if (*name == 0 || *name == '.' || strlen(name) > 2*MAXSTR)
- continue;
- if (matchlen)
- {
- n = name;
- /* if we don't want to match digits. Skip them */
- if ((*match <= '0' || *match > '9') && (*n > '0' && *n <= '9'))
- {
- while (*n >= '0' && *n <= '9')
- n++;
- if (*n == '.')
- n++;
- }
- /* the tty prefix is optional */
- if (strncmp(match, "tty", 3) && strncmp(n, "tty", 3) == 0)
- n += 3;
- if (strncmp(match, n, matchlen))
- continue;
- debug1(" -> matched %s\n", match);
- }
- sprintf(SockPath + sdirlen, "/%s", name);
-
- debug1("stat %s\n", SockPath);
- errno = 0;
- debug2("uid = %d, gid = %d\n", getuid(), getgid());
- debug2("euid = %d, egid = %d\n", geteuid(), getegid());
- if (stat(SockPath, &st))
- {
- debug1("errno = %d\n", errno);
- continue;
- }
-
-#ifndef SOCK_NOT_IN_FS
-# ifdef NAMEDPIPE
-# ifdef S_ISFIFO
- debug("S_ISFIFO?\n");
- if (!S_ISFIFO(st.st_mode))
- continue;
-# endif
-# else
-# ifdef S_ISSOCK
- debug("S_ISSOCK?\n");
- if (!S_ISSOCK(st.st_mode))
- continue;
-# endif
-# endif
-#endif
-
- debug2("st.st_uid = %d, real_uid = %d\n", st.st_uid, real_uid);
- if ((int)st.st_uid != real_uid)
- continue;
- mode = (int)st.st_mode & 0777;
- debug1(" has mode 0%03o\n", mode);
-#ifdef MULTIUSER
- if (multi && ((mode & 0677) != 0601))
- {
- debug(" is not a MULTI-USER session");
- if (strcmp(multi, LoginName))
- {
- debug(" and we are in a foreign directory.\n");
- mode = -4;
- }
- else
- {
- debug(", but it is our own session.\n");
- }
- }
-#endif
- debug(" store it.\n");
- if ((sent = (struct sent *)malloc(sizeof(struct sent))) == 0)
- continue;
- sent->next = 0;
- sent->name = SaveStr(name);
- sent->mode = mode;
- *slisttail = sent;
- slisttail = &sent->next;
- nfound++;
- sockfd = MakeClientSocket(0);
-#ifdef USE_SETEUID
- /* MakeClientSocket sets ids back to eff */
- xseteuid(real_uid);
- xsetegid(real_gid);
-#endif
- if (sockfd == -1)
- {
- debug2(" MakeClientSocket failed, unreachable? %d %d\n",
- matchlen, wipeflag);
- sent->mode = -3;
-#ifndef SOCKDIR_IS_LOCAL_TO_HOST
- /* Unreachable - it is dead if we detect that it's local
- * or we specified a match
- */
- n = name + strlen(name) - 1;
- while (n != name && *n != '.')
- n--;
- if (matchlen == 0 && !(*n == '.' && n[1] && strncmp(HostName, n + 1, strlen(n + 1)) == 0))
- {
- npriv++; /* a good socket that was not for us */
- continue;
- }
-#endif
- ndead++;
- sent->mode = -1;
- if (wipeflag)
- {
- if (unlink(SockPath) == 0)
- {
- sent->mode = -2;
- nwipe++;
- }
- }
- continue;
- }
-
- mode &= 0776;
- /* Shall we connect ? */
- debug2(" connecting: mode=%03o, rflag=%d, ", mode, rflag);
- debug2("xflag=%d, dflag=%d ?\n", xflag, dflag);
-
- /*
- * mode 600: socket is detached.
- * mode 700: socket is attached.
- * xflag implies rflag here.
- *
- * fail, when socket mode mode is not 600 or 700
- * fail, when we want to detach w/o reattach, but it already is detached.
- * fail, when we only want to attach, but mode 700 and not xflag.
- * fail, if none of dflag, rflag, xflag is set.
- */
- if ((mode != 0700 && mode != 0600) ||
- (dflag && !rflag && !xflag && mode == 0600) ||
- (!dflag && rflag && mode == 0700 && !xflag) ||
- (!dflag && !rflag && !xflag))
- {
- close(sockfd);
- debug(" no!\n");
- npriv++; /* a good socket that was not for us */
- continue;
- }
- ngood++;
- if (fdp && firsts == -1)
- {
- firsts = sockfd;
- firstn = sent->name;
- debug(" taken.\n");
- }
- else
- {
- debug(" discarded.\n");
- close(sockfd);
- }
- }
- (void)closedir(dirp);
- if (nfound && (lsflag || ngood != 1) && !quietflag)
- {
- switch(ngood)
- {
- case 0:
- Msg(0, nfound > 1 ? "There are screens on:" : "There is a screen on:");
- break;
- case 1:
- Msg(0, nfound > 1 ? "There are several screens on:" : "There is a suitable screen on:");
- break;
- default:
- Msg(0, "There are several suitable screens on:");
- break;
- }
- for (sent = slist; sent; sent = sent->next)
- {
- switch (sent->mode)
- {
- case 0700:
- printf("\t%s\t(Attached)\n", sent->name);
- break;
- case 0600:
- printf("\t%s\t(Detached)\n", sent->name);
- break;
-#ifdef MULTIUSER
- case 0701:
- printf("\t%s\t(Multi, attached)\n", sent->name);
- break;
- case 0601:
- printf("\t%s\t(Multi, detached)\n", sent->name);
- break;
-#endif
- case -1:
- /* No trigraphs here! */
- printf("\t%s\t(Dead ?%c?)\n", sent->name, '?');
- break;
- case -2:
- printf("\t%s\t(Removed)\n", sent->name);
- break;
- case -3:
- printf("\t%s\t(Remote or dead)\n", sent->name);
- break;
- case -4:
- printf("\t%s\t(Private)\n", sent->name);
- break;
- }
- }
- }
- if (ndead && !quietflag)
- {
- char *m = "Remove dead screens with 'screen -wipe'.";
- if (wipeflag)
- Msg(0, "%d socket%s wiped out.", nwipe, nwipe > 1 ? "s" : "");
- else
- Msg(0, m, ndead > 1 ? "s" : "", ndead > 1 ? "" : "es"); /* other args for nethack */
- }
- if (firsts != -1)
- {
- sprintf(SockPath + sdirlen, "/%s", firstn);
- *fdp = firsts;
- }
- else
- SockPath[sdirlen] = 0;
- for (sent = slist; sent; sent = nsent)
- {
- nsent = sent->next;
- free(sent->name);
- free((char *)sent);
- }
-#ifdef USE_SETEUID
- xseteuid(eff_uid);
- xsetegid(eff_gid);
-#endif
- if (notherp)
- *notherp = npriv;
- if (nfoundp)
- *nfoundp = nfound - nwipe;
- return ngood;
-}
-
-
-/*
-**
-** Socket/pipe create routines
-**
-*/
-
-#ifdef NAMEDPIPE
-
-int
-MakeServerSocket()
-{
- register int s;
- struct stat st;
-
-# ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
-# endif
- if ((s = open(SockPath, O_WRONLY | O_NONBLOCK)) >= 0)
- {
- debug("huii, my fifo already exists??\n");
- if (quietflag)
- {
- Kill(D_userpid, SIG_BYE);
- eexit(11);
- }
- Msg(0, "There is already a screen running on %s.", Filename(SockPath));
- if (stat(SockPath, &st) == -1)
- Panic(errno, "stat");
- if ((int)st.st_uid != real_uid)
- Panic(0, "Unfortunatelly you are not its owner.");
- if ((st.st_mode & 0700) == 0600)
- Panic(0, "To resume it, use \"screen -r\"");
- else
- Panic(0, "It is not detached.");
- /* NOTREACHED */
- }
-# ifdef USE_SETEUID
- (void) unlink(SockPath);
- if (mkfifo(SockPath, SOCKMODE))
- Panic(0, "mkfifo %s failed", SockPath);
-# ifdef BROKEN_PIPE
- if ((s = open(SockPath, O_RDWR | O_NONBLOCK, 0)) < 0)
-# else
- if ((s = open(SockPath, O_RDONLY | O_NONBLOCK, 0)) < 0)
-# endif
- Panic(errno, "open fifo %s", SockPath);
- xseteuid(eff_uid);
- xsetegid(eff_gid);
- return s;
-# else /* !USE_SETEUID */
- if (UserContext() > 0)
- {
- (void) unlink(SockPath);
- UserReturn(mkfifo(SockPath, SOCKMODE));
- }
- if (UserStatus())
- Panic(0, "mkfifo %s failed", SockPath);
-# ifdef BROKEN_PIPE
- if ((s = secopen(SockPath, O_RDWR | O_NONBLOCK, 0)) < 0)
-# else
- if ((s = secopen(SockPath, O_RDONLY | O_NONBLOCK, 0)) < 0)
-# endif
- Panic(errno, "open fifo %s", SockPath);
- return s;
-# endif /* !USE_SETEUID */
-}
-
-
-int
-MakeClientSocket(err)
-int err;
-{
- register int s = 0;
-
- if ((s = secopen(SockPath, O_WRONLY | O_NONBLOCK, 0)) >= 0)
- {
- (void) fcntl(s, F_SETFL, 0);
- return s;
- }
- if (err)
- Msg(errno, "%s", SockPath);
- debug2("MakeClientSocket() open %s failed (%d)\n", SockPath, errno);
- return -1;
-}
-
-
-#else /* NAMEDPIPE */
-
-
-int
-MakeServerSocket()
-{
- register int s;
- struct sockaddr_un a;
- struct stat st;
-
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- Panic(errno, "socket");
- a.sun_family = AF_UNIX;
- strncpy(a.sun_path, SockPath, sizeof(a.sun_path));
- a.sun_path[sizeof(a.sun_path) - 1] = 0;
-# ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
-# endif
- if (connect(s, (struct sockaddr *) &a, strlen(SockPath) + 2) != -1)
- {
- debug("oooooh! socket already is alive!\n");
- if (quietflag)
- {
- Kill(D_userpid, SIG_BYE);
- /*
- * oh, well. nobody receives that return code. papa
- * dies by signal.
- */
- eexit(11);
- }
- Msg(0, "There is already a screen running on %s.", Filename(SockPath));
- if (stat(SockPath, &st) == -1)
- Panic(errno, "stat");
- if (st.st_uid != real_uid)
- Panic(0, "Unfortunatelly you are not its owner.");
- if ((st.st_mode & 0700) == 0600)
- Panic(0, "To resume it, use \"screen -r\"");
- else
- Panic(0, "It is not detached.");
- /* NOTREACHED */
- }
-#if defined(m88k) || defined(sysV68)
- close(s); /* we get bind: Invalid argument if this is not done */
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- Panic(errno, "reopen socket");
-#endif
- (void) unlink(SockPath);
- if (bind(s, (struct sockaddr *) & a, strlen(SockPath) + 2) == -1)
- Panic(errno, "bind (%s)", SockPath);
-#ifdef SOCK_NOT_IN_FS
- {
- int f;
- if ((f = secopen(SockPath, O_RDWR | O_CREAT, SOCKMODE)) < 0)
- Panic(errno, "shadow socket open");
- close(f);
- }
-#else
- chmod(SockPath, SOCKMODE);
-# ifndef USE_SETEUID
- chown(SockPath, real_uid, real_gid);
-# endif
-#endif /* SOCK_NOT_IN_FS */
- if (listen(s, 5) == -1)
- Panic(errno, "listen");
-# ifdef F_SETOWN
- fcntl(s, F_SETOWN, getpid());
- debug1("Serversocket owned by %d\n", fcntl(s, F_GETOWN, 0));
-# endif /* F_SETOWN */
-# ifdef USE_SETEUID
- xseteuid(eff_uid);
- xsetegid(eff_gid);
-# endif
- return s;
-}
-
-int
-MakeClientSocket(err)
-int err;
-{
- register int s;
- struct sockaddr_un a;
-
- if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- Panic(errno, "socket");
- a.sun_family = AF_UNIX;
- strncpy(a.sun_path, SockPath, sizeof(a.sun_path));
- a.sun_path[sizeof(a.sun_path) - 1] = 0;
-# ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
-# else
- if (access(SockPath, W_OK))
- {
- if (err)
- Msg(errno, "%s", SockPath);
- debug2("MakeClientSocket: access(%s): %d.\n", SockPath, errno);
- close(s);
- return -1;
- }
-# endif
- if (connect(s, (struct sockaddr *) &a, strlen(SockPath) + 2) == -1)
- {
- if (err)
- Msg(errno, "%s: connect", SockPath);
- debug("MakeClientSocket: connect failed.\n");
- close(s);
- s = -1;
- }
-# ifdef USE_SETEUID
- xseteuid(eff_uid);
- xsetegid(eff_gid);
-# endif
- return s;
-}
-#endif /* NAMEDPIPE */
-
-
-/*
-**
-** Message send and receive routines
-**
-*/
-
-void
-SendCreateMsg(sty, nwin)
-char *sty;
-struct NewWindow *nwin;
-{
- int s;
- struct msg m;
- register char *p;
- register int len, n;
- char **av = nwin->args;
-
-#ifdef NAME_MAX
- if (strlen(sty) > NAME_MAX)
- sty[NAME_MAX] = 0;
-#endif
- if (strlen(sty) > 2 * MAXSTR - 1)
- sty[2 * MAXSTR - 1] = 0;
- sprintf(SockPath + strlen(SockPath), "/%s", sty);
- if ((s = MakeClientSocket(1)) == -1)
- exit(1);
- debug1("SendCreateMsg() to '%s'\n", SockPath);
- bzero((char *)&m, sizeof(m));
- m.type = MSG_CREATE;
- strncpy(m.m_tty, attach_tty, sizeof(m.m_tty) - 1);
- m.m_tty[sizeof(m.m_tty) - 1] = 0;
- p = m.m.create.line;
- n = 0;
- if (nwin->args != nwin_undef.args)
- for (av = nwin->args; *av && n < MAXARGS - 1; ++av, ++n)
- {
- len = strlen(*av) + 1;
- if (p + len >= m.m.create.line + sizeof(m.m.create.line) - 1)
- break;
- strcpy(p, *av);
- p += len;
- }
- if (nwin->aka != nwin_undef.aka && p + strlen(nwin->aka) + 1 < m.m.create.line + sizeof(m.m.create.line))
- strcpy(p, nwin->aka);
- else
- *p = '\0';
- m.m.create.nargs = n;
- m.m.create.aflag = nwin->aflag;
- m.m.create.flowflag = nwin->flowflag;
- m.m.create.lflag = nwin->lflag;
- m.m.create.hheight = nwin->histheight;
- if (getcwd(m.m.create.dir, sizeof(m.m.create.dir)) == 0)
- {
- Msg(errno, "getcwd");
- return;
- }
- if (nwin->term != nwin_undef.term)
- strncpy(m.m.create.screenterm, nwin->term, 19);
- m.m.create.screenterm[19] = '\0';
- m.protocol_revision = MSG_REVISION;
- debug1("SendCreateMsg writing '%s'\n", m.m.create.line);
- if (write(s, (char *) &m, sizeof m) != sizeof m)
- Msg(errno, "write");
- close(s);
-}
-
-int
-SendErrorMsg(tty, buf)
-char *tty, *buf;
-{
- int s;
- struct msg m;
-
- strncpy(m.m.message, buf, sizeof(m.m.message) - 1);
- m.m.message[sizeof(m.m.message) - 1] = 0;
- s = MakeClientSocket(0);
- if (s < 0)
- return -1;
- m.type = MSG_ERROR;
- strncpy(m.m_tty, tty, sizeof(m.m_tty) - 1);
- m.m_tty[sizeof(m.m_tty) - 1] = 0;
- m.protocol_revision = MSG_REVISION;
- debug1("SendErrorMsg(): writing to '%s'\n", SockPath);
- (void) write(s, (char *) &m, sizeof m);
- close(s);
- return 0;
-}
-
-static void
-ExecCreate(mp)
-struct msg *mp;
-{
- struct NewWindow nwin;
- char *args[MAXARGS];
- register int n;
- register char **pp = args, *p = mp->m.create.line;
-
- nwin = nwin_undef;
- n = mp->m.create.nargs;
- if (n > MAXARGS - 1)
- n = MAXARGS - 1;
- /* ugly hack alert... should be done by the frontend! */
- if (n)
- {
- int l, num;
- char buf[20];
-
- l = strlen(p);
- if (IsNumColon(p, 10, buf, sizeof(buf)))
- {
- if (*buf)
- nwin.aka = buf;
- num = atoi(p);
- if (num < 0 || num > MAXWIN - 1)
- num = 0;
- nwin.StartAt = num;
- p += l + 1;
- n--;
- }
- }
- for (; n > 0; n--)
- {
- *pp++ = p;
- p += strlen(p) + 1;
- }
- *pp = 0;
- if (*p)
- nwin.aka = p;
- if (*args)
- nwin.args = args;
- nwin.aflag = mp->m.create.aflag;
- nwin.flowflag = mp->m.create.flowflag;
- if (*mp->m.create.dir)
- nwin.dir = mp->m.create.dir;
- nwin.lflag = mp->m.create.lflag;
- nwin.histheight = mp->m.create.hheight;
- if (*mp->m.create.screenterm)
- nwin.term = mp->m.create.screenterm;
- MakeWindow(&nwin);
-}
-
-static int
-CheckPid(pid)
-int pid;
-{
- debug1("Checking pid %d\n", pid);
- if (pid < 2)
- return -1;
- if (eff_uid == real_uid)
- return kill(pid, 0);
- if (UserContext() > 0)
- UserReturn(kill(pid, 0));
- return UserStatus();
-}
-
-#ifdef hpux
-/*
- * From: "F. K. Bruner" <napalm@ugcs.caltech.edu>
- * From: "Dan Egnor" <egnor@oracorp.com> Tue Aug 10 06:56:45 1993
- * The problem is that under HPUX (and possibly other systems too) there are
- * two equivalent device files for each pty/tty device:
- * /dev/ttyxx == /dev/pty/ttyxx
- * /dev/ptyxx == /dev/ptym/ptyxx
- * I didn't look into the exact specifics, but I've run across this problem
- * before: Even if you open /dev/ttyxx as fds 0 1 & 2 for a process, if that
- * process calls the system to determine its tty, it'll get /dev/pty/ttyxx.
- *
- * Earlier versions seemed to work -- wonder what they did.
- */
-static int
-ttycmp(s1, s2)
-char *s1, *s2;
-{
- if (strlen(s1) > 5) s1 += strlen(s1) - 5;
- if (strlen(s2) > 5) s2 += strlen(s2) - 5;
- return strcmp(s1, s2);
-}
-# define TTYCMP(a, b) ttycmp(a, b)
-#else
-# define TTYCMP(a, b) strcmp(a, b)
-#endif
-
-void
-ReceiveMsg()
-{
- int left, len, i;
- static struct msg m;
- char *p;
- int ns = ServerSocket;
- struct mode Mode;
- struct win *wi;
-#ifdef REMOTE_DETACH
- struct display *next;
-#endif
- struct display *olddisplays = displays;
-
-#ifdef NAMEDPIPE
- debug("Ha, there was someone knocking on my fifo??\n");
- if (fcntl(ServerSocket, F_SETFL, 0) == -1)
- Panic(errno, "BLOCK fcntl");
-#else
- struct sockaddr_un a;
-
- len = sizeof(a);
- debug("Ha, there was someone knocking on my socket??\n");
- if ((ns = accept(ns, (struct sockaddr *) &a, &len)) < 0)
- {
- Msg(errno, "accept");
- return;
- }
-#endif /* NAMEDPIPE */
-
- p = (char *) &m;
- left = sizeof(m);
- while (left > 0)
- {
- len = read(ns, p, left);
- if (len < 0 && errno == EINTR)
- continue;
- if (len <= 0)
- break;
- p += len;
- left -= len;
- }
-
-#ifdef NAMEDPIPE
-# ifndef BROKEN_PIPE
- /* Reopen pipe to prevent EOFs at the select() call */
- close(ServerSocket);
- if ((ServerSocket = secopen(SockPath, O_RDONLY | O_NONBLOCK, 0)) < 0)
- Panic(errno, "reopen fifo %s", SockPath);
- evdeq(&serv_read);
- serv_read.fd = ServerSocket;
- evenq(&serv_read);
-# endif
-#else
- close(ns);
-#endif
-
- if (len < 0)
- {
- Msg(errno, "read");
- return;
- }
- if (left > 0)
- {
- if (left != sizeof(m))
- Msg(0, "Message %d of %d bytes too small", left, (int)sizeof(m));
- else
- debug("No data on socket.\n");
- return;
- }
- if (m.protocol_revision != MSG_REVISION)
- {
- Msg(0, "Invalid message (magic 0x%08x).", m.protocol_revision);
- return;
- }
-
- debug2("*** RecMsg: type %d tty %s\n", m.type, m.m_tty);
- for (display = displays; display; display = display->d_next)
- if (TTYCMP(D_usertty, m.m_tty) == 0)
- break;
- debug2("display: %s display %sfound\n", m.m_tty, display ? "" : "not ");
- wi = 0;
- if (!display)
- {
- for (wi = windows; wi; wi = wi->w_next)
- if (!TTYCMP(m.m_tty, wi->w_tty))
- {
- /* XXX: hmmm, rework this? */
- display = wi->w_layer.l_cvlist ? wi->w_layer.l_cvlist->c_display : 0;
- debug2("but window %s %sfound.\n", m.m_tty, display ? "" :
- "(backfacing)");
- break;
- }
- }
-
- /* Remove the status to prevent garbage on the screen */
- if (display && D_status)
- RemoveStatus();
-
- if (display && !D_tcinited && m.type != MSG_HANGUP)
- return; /* ignore messages for bad displays */
-
- switch (m.type)
- {
- case MSG_WINCH:
- if (display)
- CheckScreenSize(1); /* Change fore */
- break;
- case MSG_CREATE:
- /*
- * the window that issued the create message need not be an active
- * window. Then we create the window without having a display.
- * Resulting in another inactive window.
- *
- * Currently we enforce that at least one display exists. But why?
- * jw.
- */
- if (displays)
- ExecCreate(&m);
- break;
- case MSG_CONT:
- if (display && D_userpid != 0 && kill(D_userpid, 0) == 0)
- break; /* Intruder Alert */
- debug2("RecMsg: apid=%d,was %d\n", m.m.attach.apid, display ? D_userpid : 0);
- /* FALLTHROUGH */
-
- case MSG_ATTACH:
- if (CheckPid(m.m.attach.apid))
- {
- Msg(0, "Attach attempt with bad pid(%d)!", m.m.attach.apid);
- break;
- }
- if ((i = secopen(m.m_tty, O_RDWR | O_NONBLOCK, 0)) < 0)
- {
- Msg(errno, "Attach: Could not open %s!", m.m_tty);
- Kill(m.m.attach.apid, SIG_BYE);
- break;
- }
-# ifdef MULTIUSER
- Kill(m.m.attach.apid, SIGCONT);
-# endif
-
-#if defined(ultrix) || defined(pyr) || defined(NeXT)
- brktty(i); /* for some strange reason this must be done */
-#endif
-
- if (display || wi)
- {
- write(i, "Attaching from inside of screen?\n", 33);
- close(i);
- Kill(m.m.attach.apid, SIG_BYE);
- Msg(0, "Attach msg ignored: coming from inside.");
- break;
- }
-
-#ifdef MULTIUSER
- if (strcmp(m.m.attach.auser, LoginName))
- if (*FindUserPtr(m.m.attach.auser) == 0)
- {
- write(i, "Access to session denied.\n", 26);
- close(i);
- Kill(m.m.attach.apid, SIG_BYE);
- Msg(0, "Attach: access denied for user %s.", m.m.attach.auser);
- break;
- }
-#endif
-
- debug2("RecMsg: apid %d is o.k. and we just opened '%s'\n", m.m.attach.apid, m.m_tty);
-#ifndef MULTI
- if (displays)
- {
- write(i, "Screen session in use.\n", 23);
- close(i);
- Kill(m.m.attach.apid, SIG_BYE);
- break;
- }
-#endif
-
- /* create new display */
- GetTTY(i, &Mode);
- if (MakeDisplay(m.m.attach.auser, m.m_tty, m.m.attach.envterm, i, m.m.attach.apid, &Mode) == 0)
- {
- write(i, "Could not make display.\n", 24);
- close(i);
- Msg(0, "Attach: could not make display for user %s", m.m.attach.auser);
- Kill(m.m.attach.apid, SIG_BYE);
- break;
- }
-#ifdef ENCODINGS
-# ifdef UTF8
- D_encoding = m.m.attach.encoding == 1 ? UTF8 : m.m.attach.encoding ? m.m.attach.encoding - 1 : 0;
-# else
- D_encoding = m.m.attach.encoding ? m.m.attach.encoding - 1 : 0;
-# endif
- if (D_encoding < 0 || !EncodingName(D_encoding))
- D_encoding = 0;
-#endif
- /* turn off iflag on a multi-attach... */
- if (iflag && olddisplays)
- {
- iflag = 0;
-#if defined(TERMIO) || defined(POSIX)
- olddisplays->d_NewMode.tio.c_cc[VINTR] = VDISABLE;
- olddisplays->d_NewMode.tio.c_lflag &= ~ISIG;
-#else /* TERMIO || POSIX */
- olddisplays->d_NewMode.m_tchars.t_intrc = -1;
-#endif /* TERMIO || POSIX */
- SetTTY(olddisplays->d_userfd, &olddisplays->d_NewMode);
- }
- SetMode(&D_OldMode, &D_NewMode, D_flow, iflag);
- SetTTY(D_userfd, &D_NewMode);
- if (fcntl(D_userfd, F_SETFL, FNBLOCK))
- Msg(errno, "Warning: NBLOCK fcntl failed");
-
-#ifdef PASSWORD
- if (D_user->u_password && *D_user->u_password)
- AskPassword(&m);
- else
-#endif
- FinishAttach(&m);
- break;
- case MSG_ERROR:
- Msg(0, "%s", m.m.message);
- break;
- case MSG_HANGUP:
- if (!wi) /* ignore hangups from inside */
- Hangup();
- break;
-#ifdef REMOTE_DETACH
- case MSG_DETACH:
-# ifdef POW_DETACH
- case MSG_POW_DETACH:
-# endif /* POW_DETACH */
- for (display = displays; display; display = next)
- {
- next = display->d_next;
-# ifdef POW_DETACH
- if (m.type == MSG_POW_DETACH)
- Detach(D_REMOTE_POWER);
- else
-# endif /* POW_DETACH */
- if (m.type == MSG_DETACH)
- Detach(D_REMOTE);
- }
- break;
-#endif
- case MSG_COMMAND:
- DoCommandMsg(&m);
- break;
- default:
- Msg(0, "Invalid message (type %d).", m.type);
- }
-}
-
-#if defined(_SEQUENT_) && !defined(NAMEDPIPE)
-#undef connect
-/*
- * sequent_ptx socket emulation must have mode 000 on the socket!
- */
-static int
-sconnect(s, sapp, len)
-int s, len;
-struct sockaddr *sapp;
-{
- register struct sockaddr_un *sap;
- struct stat st;
- int x;
-
- sap = (struct sockaddr_un *)sapp;
- if (stat(sap->sun_path, &st))
- return -1;
- chmod(sap->sun_path, 0);
- x = connect(s, (struct sockaddr *) sap, len);
- chmod(sap->sun_path, st.st_mode);
- return x;
-}
-#endif
-
-
-/*
- * Set the mode bits of the socket to the current status
- */
-int
-chsock()
-{
- int r, euid = geteuid();
- if (euid != real_uid)
- {
- if (UserContext() <= 0)
- return UserStatus();
- }
- r = chmod(SockPath, SOCKMODE);
- /*
- * Sockets usually reside in the /tmp/ area, where sysadmin scripts
- * may be happy to remove old files. We manually prevent the socket
- * from becoming old. (chmod does not touch mtime).
- */
- (void)utimes(SockPath, NULL);
-
- if (euid != real_uid)
- UserReturn(r);
- return r;
-}
-
-/*
- * Try to recreate the socket/pipe
- */
-int
-RecoverSocket()
-{
- close(ServerSocket);
- if ((int)geteuid() != real_uid)
- {
- if (UserContext() > 0)
- UserReturn(unlink(SockPath));
- (void)UserStatus();
- }
- else
- (void) unlink(SockPath);
-
- if ((ServerSocket = MakeServerSocket()) < 0)
- return 0;
- evdeq(&serv_read);
- serv_read.fd = ServerSocket;
- evenq(&serv_read);
- return 1;
-}
-
-
-static void
-FinishAttach(m)
-struct msg *m;
-{
- char *p;
- int pid;
- int noshowwin;
- struct win *wi;
-
- ASSERT(display);
- pid = D_userpid;
-
-#if defined(pyr) || defined(xelos) || defined(sequent)
- /*
- * Kludge for systems with braindamaged termcap routines,
- * which evaluate $TERMCAP, regardless weather it describes
- * the correct terminal type or not.
- */
- debug("unsetenv(TERMCAP) in case of a different terminal");
- unsetenv("TERMCAP");
-#endif
-
- /*
- * We reboot our Terminal Emulator. Forget all we knew about
- * the old terminal, reread the termcap entries in .screenrc
- * (and nothing more from .screenrc is read. Mainly because
- * I did not check, weather a full reinit is safe. jw)
- * and /etc/screenrc, and initialise anew.
- */
- if (extra_outcap)
- free(extra_outcap);
- if (extra_incap)
- free(extra_incap);
- extra_incap = extra_outcap = 0;
- debug2("Message says size (%dx%d)\n", m->m.attach.columns, m->m.attach.lines);
-#ifdef ETCSCREENRC
-# ifdef ALLOW_SYSSCREENRC
- if ((p = getenv("SYSSCREENRC")))
- StartRc(p);
- else
-# endif
- StartRc(ETCSCREENRC);
-#endif
- StartRc(RcFileName);
- if (InitTermcap(m->m.attach.columns, m->m.attach.lines))
- {
- FreeDisplay();
- Kill(pid, SIG_BYE);
- return;
- }
- MakeDefaultCanvas();
- InitTerm(m->m.attach.adaptflag); /* write init string on fd */
- if (displays->d_next == 0)
- (void) chsock();
- signal(SIGHUP, SigHup);
- if (m->m.attach.esc != -1 && m->m.attach.meta_esc != -1)
- {
- D_user->u_Esc = m->m.attach.esc;
- D_user->u_MetaEsc = m->m.attach.meta_esc;
- }
-
-#ifdef UTMPOK
- /*
- * we set the Utmp slots again, if we were detached normally
- * and if we were detached by ^Z.
- * don't log zomies back in!
- */
- RemoveLoginSlot();
- if (displays->d_next == 0)
- for (wi = windows; wi; wi = wi->w_next)
- if (wi->w_ptyfd >= 0 && wi->w_slot != (slot_t) -1)
- SetUtmp(wi);
-#endif
-
- D_fore = NULL;
- /*
- * there may be a window that we remember from last detach:
- */
- debug1("D_user->u_detachwin = %d\n", D_user->u_detachwin);
- if (D_user->u_detachwin >= 0)
- fore = wtab[D_user->u_detachwin];
- else
- fore = 0;
-
- /* Wayne wants us to restore the other window too. */
- if (D_user->u_detachotherwin >= 0)
- D_other = wtab[D_user->u_detachotherwin];
-
- noshowwin = 0;
- if (*m->m.attach.preselect)
- {
- if (!strcmp(m->m.attach.preselect, "="))
- fore = 0;
- else if (!strcmp(m->m.attach.preselect, "-"))
- {
- fore = 0;
- noshowwin = 1;
- }
- else
- fore = FindNiceWindow(fore, m->m.attach.preselect);
- }
- else
- fore = FindNiceWindow(fore, 0);
- if (fore)
- SetForeWindow(fore);
- else if (!noshowwin)
- {
-#ifdef MULTIUSER
- if (!AclCheckPermCmd(D_user, ACL_EXEC, &comms[RC_WINDOWLIST]))
-#endif
- {
- flayer = D_forecv->c_layer;
- display_wlist(1, WLIST_NUM);
- noshowwin = 1;
- }
- }
- Activate(0);
- ResetIdle();
- if (!D_fore && !noshowwin)
- ShowWindows(-1);
- if (displays->d_next == 0 && console_window)
- {
- if (TtyGrabConsole(console_window->w_ptyfd, 1, "reattach") == 0)
- Msg(0, "console %s is on window %d", HostName, console_window->w_number);
- }
- debug("activated...\n");
-
-# if defined(DEBUG) && defined(SIG_NODEBUG)
- if (!dfp)
- {
- sleep(1);
- debug1("Attacher %d must not debug, as we have debug off.\n", pid);
- kill(pid, SIG_NODEBUG);
- }
-# endif /* SIG_NODEBUG */
-}
-
-
-#ifdef PASSWORD
-static void PasswordProcessInput __P((char *, int));
-
-struct pwdata {
- int l;
- char buf[20 + 1];
- struct msg m;
-};
-
-static void
-AskPassword(m)
-struct msg *m;
-{
- struct pwdata *pwdata;
- ASSERT(display);
- pwdata = (struct pwdata *)malloc(sizeof(struct pwdata));
- if (!pwdata)
- Panic(0, strnomem);
- pwdata->l = 0;
- pwdata->m = *m;
- D_processinputdata = (char *)pwdata;
- D_processinput = PasswordProcessInput;
- AddStr("Screen password: ");
-}
-
-static void
-PasswordProcessInput(ibuf, ilen)
-char *ibuf;
-int ilen;
-{
- struct pwdata *pwdata;
- int c, l;
- char *up;
- int pid = D_userpid;
-
- pwdata = (struct pwdata *)D_processinputdata;
- l = pwdata->l;
- while (ilen-- > 0)
- {
- c = *(unsigned char *)ibuf++;
- if (c == '\r' || c == '\n')
- {
- up = D_user->u_password;
- pwdata->buf[l] = 0;
- if (strncmp(crypt(pwdata->buf, up), up, strlen(up)))
- {
- /* uh oh, user failed */
- bzero(pwdata->buf, sizeof(pwdata->buf));
- AddStr("\r\nPassword incorrect.\r\n");
- D_processinputdata = 0; /* otherwise freed by FreeDis */
- FreeDisplay();
- Msg(0, "Illegal reattach attempt from terminal %s.", pwdata->m.m_tty);
- free(pwdata);
- Kill(pid, SIG_BYE);
- return;
- }
- /* great, pw matched, all is fine */
- bzero(pwdata->buf, sizeof(pwdata->buf));
- AddStr("\r\n");
- D_processinputdata = 0;
- D_processinput = ProcessInput;
- FinishAttach(&pwdata->m);
- free(pwdata);
- return;
- }
- if (c == Ctrl('c'))
- {
- AddStr("\r\n");
- FreeDisplay();
- Kill(pid, SIG_BYE);
- return;
- }
- if (c == '\b' || c == 0177)
- {
- if (l > 0)
- l--;
- continue;
- }
- if (c == Ctrl('u'))
- {
- l = 0;
- continue;
- }
- if (l < (int)sizeof(pwdata->buf) - 1)
- pwdata->buf[l++] = c;
- }
- pwdata->l = l;
-}
-#endif
-
-static void
-DoCommandMsg(mp)
-struct msg *mp;
-{
- char *args[MAXARGS];
- int argl[MAXARGS];
- int n, *lp;
- register char **pp = args, *p = mp->m.command.cmd;
- struct acluser *user;
-#ifdef MULTIUSER
- extern struct acluser *EffectiveAclUser; /* acls.c */
-#else
- extern struct acluser *users; /* acls.c */
-#endif
-
- lp = argl;
- n = mp->m.command.nargs;
- if (n > MAXARGS - 1)
- n = MAXARGS - 1;
- for (; n > 0; n--)
- {
- *pp++ = p;
- *lp = strlen(p);
- p += *lp++ + 1;
- }
- *pp = 0;
-#ifdef MULTIUSER
- user = *FindUserPtr(mp->m.attach.auser);
- if (user == 0)
- {
- Msg(0, "Unknown user %s tried to send a command!", mp->m.attach.auser);
- return;
- }
-#else
- user = users;
-#endif
-#ifdef PASSWORD
- if (user->u_password && *user->u_password)
- {
- Msg(0, "User %s has a password, cannot use -X option.", mp->m.attach.auser);
- return;
- }
-#endif
- if (!display)
- for (display = displays; display; display = display->d_next)
- if (D_user == user)
- break;
- for (fore = windows; fore; fore = fore->w_next)
- if (!TTYCMP(mp->m_tty, fore->w_tty))
- {
- if (!display)
- display = fore->w_layer.l_cvlist ? fore->w_layer.l_cvlist->c_display : 0;
- break;
- }
- if (!display)
- display = displays; /* sigh */
- if (*mp->m.command.preselect)
- {
- int i = -1;
- if (strcmp(mp->m.command.preselect, "-"))
- i = WindowByNoN(mp->m.command.preselect);
- fore = i >= 0 ? wtab[i] : 0;
- }
- else if (!fore)
- {
- if (display && D_user == user)
- fore = Layer2Window(display->d_forecv->c_layer);
- if (!fore)
- {
- fore = user->u_detachwin >= 0 ? wtab[user->u_detachwin] : 0;
- fore = FindNiceWindow(fore, 0);
- }
- }
-#ifdef MULTIUSER
- EffectiveAclUser = user;
-#endif
- if (*args)
- {
- char *oldrcname = rc_name;
- rc_name = "-X";
- debug3("Running command on display %x window %x (%d)\n", display, fore, fore ? fore->w_number : -1);
- flayer = fore ? &fore->w_layer : 0;
- if (fore && fore->w_savelayer && (fore->w_blocked || fore->w_savelayer->l_cvlist == 0))
- flayer = fore->w_savelayer;
- DoCommand(args, argl);
- rc_name = oldrcname;
- }
-#ifdef MULTIUSER
- EffectiveAclUser = 0;
-#endif
-}
diff --git a/src/teln.c b/src/teln.c
deleted file mode 100644
index 6fa910b..0000000
--- a/src/teln.c
+++ /dev/null
@@ -1,564 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <netdb.h>
-
-#include "config.h"
-
-#ifdef BUILTIN_TELNET
-
-#include "screen.h"
-#include "extern.h"
-
-extern struct win *fore;
-extern struct layer *flayer;
-extern int visual_bell;
-extern char screenterm[];
-
-static void TelReply __P((struct win *, char *, int));
-static void TelDocmd __P((struct win *, int, int));
-static void TelDosub __P((struct win *));
-
-#define TEL_DEFPORT 23
-#define TEL_CONNECTING (-2)
-
-#define TC_IAC 255
-#define TC_DONT 254
-#define TC_DO 253
-#define TC_WONT 252
-#define TC_WILL 251
-#define TC_SB 250
-#define TC_BREAK 243
-#define TC_SE 240
-
-#define TC_S "S b swWdDc"
-
-#define TO_BINARY 0
-#define TO_ECHO 1
-#define TO_SGA 3
-#define TO_TM 6
-#define TO_TTYPE 24
-#define TO_NAWS 31
-#define TO_TSPEED 32
-#define TO_LFLOW 33
-#define TO_XDISPLOC 35
-#define TO_NEWENV 39
-
-#define TO_S "be c t wsf xE E"
-
-
-static unsigned char tn_init[] = {
- TC_IAC, TC_DO, TO_SGA,
- TC_IAC, TC_WILL, TO_TTYPE,
- TC_IAC, TC_WILL, TO_NAWS,
- TC_IAC, TC_WILL, TO_LFLOW,
-};
-
-static void
-tel_connev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- if (connect(p->w_ptyfd, (struct sockaddr *)&p->w_telsa, sizeof(p->w_telsa)) && errno != EISCONN)
- {
- char buf[1024];
- buf[0] = ' ';
- strncpy(buf + 1, strerror(errno), sizeof(buf) - 2);
- buf[sizeof(buf) - 1] = 0;
- WriteString(p, buf, strlen(buf));
- WindowDied(p);
- return;
- }
- WriteString(p, "connected.\r\n", 12);
- evdeq(&p->w_telconnev);
- p->w_telstate = 0;
-}
-
-int
-TelOpen(args)
-char **args;
-{
- int fd;
- int on = 1;
-
- if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
- {
- Msg(errno, "TelOpen: socket");
- return -1;
- }
- if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
- Msg(errno, "TelOpen: setsockopt SO_OOBINLINE");
- return fd;
-}
-
-int
-TelConnect(p)
-struct win *p;
-{
- int port = TEL_DEFPORT;
- struct hostent *hp;
- char **args;
- char buf[256];
-
- args = p->w_cmdargs + 1;
-
- if (!*args)
- {
- Msg(0, "Usage: screen //telnet host [port]");
- return -1;
- }
- if (args[1])
- port = atoi(args[1]);
- p->w_telsa.sin_family = AF_INET;
- if((p->w_telsa.sin_addr.s_addr = inet_addr(*args)) == -1)
- {
- if ((hp = gethostbyname(*args)) == NULL)
- {
- Msg(0, "unknown host: %s", *args);
- return -1;
- }
- if (hp->h_length != sizeof(p->w_telsa.sin_addr.s_addr) || hp->h_addrtype != AF_INET)
- {
- Msg(0, "Bad address type for %s", hp->h_name);
- return -1;
- }
- bcopy((char *)hp->h_addr,(char *)&p->w_telsa.sin_addr.s_addr, hp->h_length);
- p->w_telsa.sin_family = hp->h_addrtype;
- }
- p->w_telsa.sin_port = htons(port);
- if (port != TEL_DEFPORT)
- sprintf(buf, "Trying %s %d...", inet_ntoa(p->w_telsa.sin_addr), port);
- else
- sprintf(buf, "Trying %s...", inet_ntoa(p->w_telsa.sin_addr));
- WriteString(p, buf, strlen(buf));
- if (connect(p->w_ptyfd, (struct sockaddr *)&p->w_telsa, sizeof(p->w_telsa)))
- {
- if (errno == EINPROGRESS)
- {
- p->w_telstate = TEL_CONNECTING;
- p->w_telconnev.fd = p->w_ptyfd;
- p->w_telconnev.handler = tel_connev_fn;
- p->w_telconnev.data = (char *)p;
- p->w_telconnev.type = EV_WRITE;
- p->w_telconnev.pri = 1;
- debug("telnet connect in progress...\n");
- evenq(&p->w_telconnev);
- }
- else
- {
- Msg(errno, "TelOpen: connect");
- return -1;
- }
- }
- else
- WriteString(p, "connected.\r\n", 12);
- if (port == TEL_DEFPORT)
- TelReply(p, (char *)tn_init, sizeof(tn_init));
- return 0;
-}
-
-int
-TelIsline(p)
-struct win *p;
-{
- return !fore->w_telropts[TO_SGA];
-}
-
-void
-TelProcessLine(bufpp, lenp)
-char **bufpp;
-int *lenp;
-{
- int echo = !fore->w_telropts[TO_ECHO];
- unsigned char c;
- char *tb;
- int tl;
-
- char *buf = *bufpp;
- int l = *lenp;
- while (l--)
- {
- c = *(unsigned char *)buf++;
- if (fore->w_telbufl + 2 >= IOSIZE)
- {
- WBell(fore, visual_bell);
- continue;
- }
- if (c == '\r')
- {
- if (echo)
- WriteString(fore, "\r\n", 2);
- fore->w_telbuf[fore->w_telbufl++] = '\r';
- fore->w_telbuf[fore->w_telbufl++] = '\n';
- tb = fore->w_telbuf;
- tl = fore->w_telbufl;
- LayProcess(&tb, &tl);
- fore->w_telbufl = 0;
- continue;
- }
- if (c == '\b' && fore->w_telbufl > 0)
- {
- if (echo)
- {
- WriteString(fore, (char *)&c, 1);
- WriteString(fore, " ", 1);
- WriteString(fore, (char *)&c, 1);
- }
- fore->w_telbufl--;
- }
- if ((c >= 0x20 && c <= 0x7e) || c >= 0xa0)
- {
- if (echo)
- WriteString(fore, (char *)&c, 1);
- fore->w_telbuf[fore->w_telbufl++] = c;
- }
- }
- *lenp = 0;
-}
-
-int
-DoTelnet(buf, lenp, f)
-char *buf;
-int *lenp;
-int f;
-{
- int echo = !fore->w_telropts[TO_ECHO];
- int cmode = fore->w_telropts[TO_SGA];
- int bin = fore->w_telropts[TO_BINARY];
- char *p = buf, *sbuf;
- int trunc = 0;
- int c;
- int l = *lenp;
-
- sbuf = p;
- while (l-- > 0)
- {
- c = *(unsigned char *)p++;
- if (c == TC_IAC || (c == '\r' && (l ==0 || *p != '\n') && cmode && !bin))
- {
- if (cmode && echo)
- {
- WriteString(fore, sbuf, p - sbuf);
- sbuf = p;
- }
- if (f-- <= 0)
- {
- trunc++;
- l--;
- }
- if (l < 0)
- {
- p--; /* drop char */
- break;
- }
- if (l)
- bcopy(p, p + 1, l);
- if (c == TC_IAC)
- *p++ = c;
- else if (c == '\r')
- *p++ = 0;
- else if (c == '\n')
- {
- p[-1] = '\r';
- *p++ = '\n';
- }
- }
- }
- *lenp = p - buf;
- return trunc;
-}
-
-/* modifies data in-place, returns new length */
-int
-TelIn(p, buf, len, free)
-struct win *p;
-char *buf;
-int len;
-int free;
-{
- char *rp, *wp;
- int c;
-
- rp = wp = buf;
- while (len-- > 0)
- {
- c = *(unsigned char *)rp++;
-
- if (p->w_telstate >= TC_WILL && p->w_telstate <= TC_DONT)
- {
- TelDocmd(p, p->w_telstate, c);
- p->w_telstate = 0;
- continue;
- }
- if (p->w_telstate == TC_SB || p->w_telstate == TC_SE)
- {
- if (p->w_telstate == TC_SE && c == TC_IAC)
- p->w_telsubidx--;
- if (p->w_telstate == TC_SE && c == TC_SE)
- {
- p->w_telsubidx--;
- TelDosub(p);
- p->w_telstate = 0;
- continue;
- }
- if (p->w_telstate == TC_SB && c == TC_IAC)
- p->w_telstate = TC_SE;
- else
- p->w_telstate = TC_SB;
- p->w_telsubbuf[p->w_telsubidx] = c;
- if (p->w_telsubidx < sizeof(p->w_telsubbuf) - 1)
- p->w_telsubidx++;
- continue;
- }
- if (p->w_telstate == TC_IAC)
- {
- if ((c >= TC_WILL && c <= TC_DONT) || c == TC_SB)
- {
- p->w_telsubidx = 0;
- p->w_telstate = c;
- continue;
- }
- p->w_telstate = 0;
- if (c != TC_IAC)
- continue;
- }
- else if (c == TC_IAC)
- {
- p->w_telstate = c;
- continue;
- }
- if (p->w_telstate == '\r')
- {
- p->w_telstate = 0;
- if (c == 0)
- continue; /* suppress trailing \0 */
- }
- else if (c == '\n' && !p->w_telropts[TO_SGA])
- {
- /* oops... simulate terminal line mode: insert \r */
- if (wp + 1 == rp)
- {
- if (free-- > 0)
- {
- if (len)
- bcopy(rp, rp + 1, len);
- rp++;
- *wp++ = '\r';
- }
- }
- else
- *wp++ = '\r';
- }
- if (c == '\r')
- p->w_telstate = c;
- *wp++ = c;
- }
- return wp - buf;
-}
-
-static void
-TelReply(p, str, len)
-struct win *p;
-char *str;
-int len;
-{
- if (len <= 0)
- return;
- if (p->w_inlen + len > IOSIZE)
- {
- Msg(0, "Warning: telnet protocol overrun!");
- return;
- }
- bcopy(str, p->w_inbuf + p->w_inlen, len);
- p->w_inlen += len;
-}
-
-static void
-TelDocmd(p, cmd, opt)
-struct win *p;
-int cmd, opt;
-{
- unsigned char b[3];
- int repl = 0;
-
- if (cmd == TC_WONT)
- debug2("[WONT %c %d]\n", TO_S[opt], opt);
- if (cmd == TC_WILL)
- debug2("[WILL %c %d]\n", TO_S[opt], opt);
- if (cmd == TC_DONT)
- debug2("[DONT %c %d]\n", TO_S[opt], opt);
- if (cmd == TC_DO)
- debug2("[DO %c %d]\n", TO_S[opt], opt);
-
- switch(cmd)
- {
- case TC_WILL:
- if (p->w_telropts[opt] || opt == TO_TM)
- return;
- repl = TC_DONT;
- if (opt == TO_ECHO || opt == TO_SGA || opt == TO_BINARY)
- {
- p->w_telropts[opt] = 1;
- /* setcon(); */
- repl = TC_DO;
- }
- break;
- case TC_WONT:
- if (!p->w_telropts[opt] || opt == TO_TM)
- return;
- repl = TC_DONT;
-#if 0
- if (opt == TO_ECHO || opt == TO_SGA)
- setcon();
-#endif
- p->w_telropts[opt] = 0;
- break;
- case TC_DO:
- if (p->w_telmopts[opt])
- return;
- repl = TC_WONT;
- if (opt == TO_TTYPE || opt == TO_SGA || opt == TO_BINARY || opt == TO_NAWS || opt == TO_TM || opt == TO_LFLOW)
- {
- repl = TC_WILL;
- p->w_telmopts[opt] = 1;
- }
- p->w_telmopts[TO_TM] = 0;
- break;
- case TC_DONT:
- if (!p->w_telmopts[opt])
- return;
- repl = TC_WONT;
- p->w_telmopts[opt] = 0;
- break;
- }
- b[0] = TC_IAC;
- b[1] = repl;
- b[2] = opt;
- TelReply(p, (char *)b, 3);
- if (cmd == TC_DO && opt == TO_NAWS)
- TelWindowSize(p);
-}
-
-
-static void
-TelDosub(p)
-struct win *p;
-{
- char trepl[20 + 6 + 1];
- int l;
-
- switch(p->w_telsubbuf[0])
- {
- case TO_TTYPE:
- if (p->w_telsubidx != 2 || p->w_telsubbuf[1] != 1)
- return;
- l = strlen(screenterm);
- if (l >= 20)
- break;
- sprintf(trepl, "%c%c%c%c%s%c%c", TC_IAC, TC_SB, TO_TTYPE, 0, screenterm, TC_IAC, TC_SE);
- TelReply(p, trepl, l + 6);
- break;
- case TO_LFLOW:
- if (p->w_telsubidx != 2)
- return;
- debug1("[FLOW %d]\r\n", p->w_telsubbuf[1]);
- break;
- default:
- break;
- }
-}
-
-void
-TelBreak(p)
-struct win *p;
-{
- static unsigned char tel_break[] = { TC_IAC, TC_BREAK };
- TelReply(p, (char *)tel_break, 2);
-}
-
-void
-TelWindowSize(p)
-struct win *p;
-{
- char s[20], trepl[20], *t;
- int i;
-
- debug2("TelWindowSize %d %d\n", p->w_width, p->w_height);
- if (p->w_width == 0 || p->w_height == 0 || !p->w_telmopts[TO_NAWS])
- return;
- sprintf(s, "%c%c%c%c%c%c%c%c%c", TC_SB, TC_SB, TO_NAWS, p->w_width / 256, p->w_width & 255, p->w_height / 256, p->w_height & 255, TC_SE, TC_SE);
- t = trepl;
- for (i = 0; i < 9; i++)
- if ((unsigned char)(*t++ = s[i]) == TC_IAC)
- *t++ = TC_IAC;
- trepl[0] = TC_IAC;
- t[-2] = TC_IAC;
- debug(" - sending");
- for (i = 0; trepl + i < t; i++)
- debug1(" %02x", (unsigned char)trepl[i]);
- debug("\n");
- TelReply(p, trepl, t - trepl);
-}
-
-static char tc_s[] = TC_S;
-static char to_s[] = TO_S;
-
-void
-TelStatus(p, buf, l)
-struct win *p;
-char *buf;
-int l;
-{
- int i;
-
- *buf++ = '[';
- for (i = 0; to_s[i]; i++)
- {
- if (to_s[i] == ' ' || p->w_telmopts[i] == 0)
- continue;
- *buf++ = to_s[i];
- }
- *buf++ = ':';
- for (i = 0; to_s[i]; i++)
- {
- if (to_s[i] == ' ' || p->w_telropts[i] == 0)
- continue;
- *buf++ = to_s[i];
- }
- if (p->w_telstate == TEL_CONNECTING)
- buf[-1] = 'C';
- else if (p->w_telstate && p->w_telstate != '\r')
- {
- *buf++ = ':';
- *buf++ = tc_s[p->w_telstate - TC_SE];
- }
- *buf++ = ']';
- *buf = 0;
- return;
-}
-
-#endif /* BUILTIN_TELNET */
diff --git a/src/term.c b/src/term.c
deleted file mode 100644
index d78d463..0000000
--- a/src/term.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include "term.h"
-
-#define KMAPDEF(s)
-#define KMAPADEF(s)
-#define KMAPMDEF(s)
-
-struct term term[T_N] =
-{
-/* display size */
- { "li", T_NUM },
- { "co", T_NUM },
-
-/* terminal types*/
- { "hc", T_FLG },
- { "os", T_FLG },
- { "ns", T_FLG },
-/* cursor movement */
- { "cm", T_STR },
- { "ho", T_STR },
- { "cr", T_STR },
- { "up", T_STR },
- { "UP", T_STR },
- { "do", T_STR },
- { "DO", T_STR },
- { "bs", T_FLG },
- { "bc", T_STR },
- { "le", T_STR },
- { "LE", T_STR },
- { "nd", T_STR },
- { "RI", T_STR },
-
-/* scroll */
- { "cs", T_STR },
- { "nl", T_STR },
- { "sf", T_STR },
- { "sr", T_STR },
- { "al", T_STR },
- { "AL", T_STR },
- { "dl", T_STR },
- { "DL", T_STR },
-
-/* insert/delete */
- { "in", T_FLG },
- { "im", T_STR },
- { "ei", T_STR },
- { "ic", T_STR },
- { "IC", T_STR },
- { "dc", T_STR },
- { "DC", T_STR },
-
-/* erase */
- { "ut", T_FLG },
- { "cl", T_STR },
- { "cd", T_STR },
- { "CD", T_STR },
- { "ce", T_STR },
- { "cb", T_STR },
-
-/* initialise */
- { "is", T_STR },
- { "ti", T_STR },
- { "te", T_STR },
-
-/* bell */
- { "bl", T_STR },
- { "vb", T_STR },
-
-/* resizing */
- { "WS", T_STR },
- { "Z0", T_STR },
- { "Z1", T_STR },
-
-/* attributes */
-/* define T_ATTR */
- { "mh", T_STR },
- { "us", T_STR },
- { "md", T_STR },
- { "mr", T_STR },
- { "so", T_STR },
- { "mb", T_STR },
- { "ue", T_STR },
- { "se", T_STR },
- { "me", T_STR },
- { "ms", T_FLG },
- { "sg", T_NUM },
- { "ug", T_NUM },
- { "sa", T_STR },
-
-/* color */
- { "AF", T_STR },
- { "AB", T_STR },
- { "Sf", T_STR },
- { "Sb", T_STR },
- { "op", T_STR },
- { "Co", T_NUM },
- { "be", T_FLG },
- { "AX", T_FLG },
- { "C8", T_FLG },
-
-/* keypad/cursorkeys */
- { "ks", T_STR },
- { "ke", T_STR },
- { "CS", T_STR },
- { "CE", T_STR },
-
-/* printer */
- { "po", T_STR },
- { "pf", T_STR },
-
-/* status line */
- { "hs", T_FLG },
- { "ws", T_NUM },
- { "ts", T_STR },
- { "fs", T_STR },
- { "ds", T_STR },
-
-/* cursor visibility */
- { "vi", T_STR },
- { "vs", T_STR },
- { "ve", T_STR },
-
-/* margin handling */
- { "am", T_FLG },
- { "xv", T_FLG },
- { "xn", T_FLG },
- { "OP", T_FLG },
- { "LP", T_FLG },
-
-/* special settings */
- { "NF", T_FLG },
- { "nx", T_FLG },
- { "AN", T_FLG },
- { "OL", T_NUM },
- { "KJ", T_STR },
- { "VR", T_STR },
- { "VN", T_STR },
- { "TF", T_FLG },
- { "XT", T_FLG },
-
-/* d_font setting */
- { "G0", T_FLG },
- { "S0", T_STR },
- { "E0", T_STR },
- { "C0", T_STR },
- { "as", T_STR },
- { "ae", T_STR },
- { "ac", T_STR },
- { "eA", T_STR },
- { "XC", T_STR },
-
-/* keycaps */
-/* define T_CAPS */
-/* nolist */
- { "k0", T_STR }, KMAPDEF("\033[10~")
- { "k1", T_STR }, KMAPDEF("\033OP")
- { "k2", T_STR }, KMAPDEF("\033OQ")
- { "k3", T_STR }, KMAPDEF("\033OR")
- { "k4", T_STR }, KMAPDEF("\033OS")
- { "k5", T_STR }, KMAPDEF("\033[15~")
- { "k6", T_STR }, KMAPDEF("\033[17~")
- { "k7", T_STR }, KMAPDEF("\033[18~")
- { "k8", T_STR }, KMAPDEF("\033[19~")
- { "k9", T_STR }, KMAPDEF("\033[20~")
- { "k;", T_STR }, KMAPDEF("\033[21~")
- { "F1", T_STR }, KMAPDEF("\033[23~")
- { "F2", T_STR }, KMAPDEF("\033[24~")
- /* extra keys for vt220 (David.Leonard@it.uq.edu.au) */
- { "F3", T_STR },
- { "F4", T_STR },
- { "F5", T_STR },
- { "F6", T_STR },
- { "F7", T_STR },
- { "F8", T_STR },
- { "F9", T_STR },
- { "FA", T_STR },
-
- { "kb", T_STR },
- { "K1", T_STR },
- { "K2", T_STR },
- { "K3", T_STR },
- { "K4", T_STR },
- { "K5", T_STR },
-/* more keys for Andrew A. Chernov (ache@astral.msk.su) */
- { "kA", T_STR },
- { "ka", T_STR },
-/* define T_BACKTAB */
- { "kB", T_STR },
- { "kC", T_STR },
- { "kE", T_STR },
- { "kF", T_STR }, KMAPMDEF("\004")
- { "kL", T_STR },
- { "kM", T_STR },
- { "kR", T_STR }, KMAPMDEF("\025")
- { "kS", T_STR },
- { "kT", T_STR },
- { "kt", T_STR },
- { "*4", T_STR }, /* kDC */
- { "*7", T_STR }, /* kEND */
- { "#2", T_STR }, /* kHOM */
- { "#3", T_STR }, /* kIC */
- { "#4", T_STR }, /* kLFT */
- { "%c", T_STR }, /* kNXT */
- { "%e", T_STR }, /* kPRV */
- { "%i", T_STR }, /* kRIT */
-
-/* keys above the cursor */
-/* define T_NAVIGATE */
- { "kh", T_STR }, KMAPDEF("\033[1~") KMAPMDEF("\201")
- { "@1", T_STR },
- { "kH", T_STR }, KMAPDEF("\033[4~") KMAPMDEF("\205")
- { "@7", T_STR },
- { "kN", T_STR }, KMAPDEF("\033[6~") KMAPMDEF("\006")
- { "kP", T_STR }, KMAPDEF("\033[5~") KMAPMDEF("\002")
- { "kI", T_STR }, KMAPDEF("\033[2~")
-/* define T_NAVIGATE_DELETE */
- { "kD", T_STR }, KMAPDEF("\033[3~")
-
-/* keys that can have two bindings */
-/* define T_CURSOR */
- { "ku", T_STR }, KMAPDEF("\033[A") KMAPADEF("\033OA") KMAPMDEF("\220")
- { "kd", T_STR }, KMAPDEF("\033[B") KMAPADEF("\033OB") KMAPMDEF("\216")
- { "kr", T_STR }, KMAPDEF("\033[C") KMAPADEF("\033OC") KMAPMDEF("\206")
- { "kl", T_STR }, KMAPDEF("\033[D") KMAPADEF("\033OD") KMAPMDEF("\202")
-/* define T_KEYPAD */
- { "f0", T_STR }, KMAPDEF("0") KMAPADEF("\033Op")
- { "f1", T_STR }, KMAPDEF("1") KMAPADEF("\033Oq")
- { "f2", T_STR }, KMAPDEF("2") KMAPADEF("\033Or")
- { "f3", T_STR }, KMAPDEF("3") KMAPADEF("\033Os")
- { "f4", T_STR }, KMAPDEF("4") KMAPADEF("\033Ot")
- { "f5", T_STR }, KMAPDEF("5") KMAPADEF("\033Ou")
- { "f6", T_STR }, KMAPDEF("6") KMAPADEF("\033Ov")
- { "f7", T_STR }, KMAPDEF("7") KMAPADEF("\033Ow")
- { "f8", T_STR }, KMAPDEF("8") KMAPADEF("\033Ox")
- { "f9", T_STR }, KMAPDEF("9") KMAPADEF("\033Oy")
- { "f+", T_STR }, KMAPDEF("+") KMAPADEF("\033Ok")
- { "f-", T_STR }, KMAPDEF("-") KMAPADEF("\033Om")
- { "f*", T_STR }, KMAPDEF("*") KMAPADEF("\033Oj")
- { "f/", T_STR }, KMAPDEF("/") KMAPADEF("\033Oo")
- { "fq", T_STR }, KMAPDEF("=") KMAPADEF("\033OX")
- { "f.", T_STR }, KMAPDEF(".") KMAPADEF("\033On")
- { "f,", T_STR }, KMAPDEF(",") KMAPADEF("\033Ol")
- { "fe", T_STR }, KMAPDEF("\015") KMAPADEF("\033OM")
-/* other things related to keycaps */
-/* define T_OCAPS */
- { "km", T_FLG },
- { "ko", T_STR },
- { "l0", T_STR },
- { "l1", T_STR },
- { "l2", T_STR },
- { "l3", T_STR },
- { "l4", T_STR },
- { "l5", T_STR },
- { "l6", T_STR },
- { "l7", T_STR },
- { "l8", T_STR },
- { "l9", T_STR },
- { "la", T_STR },
-/* list */
-/* define T_ECAPS */
-/* define T_N */
-};
diff --git a/src/term.h.dist b/src/term.h.dist
deleted file mode 100644
index bbe9894..0000000
--- a/src/term.h.dist
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * This file is automagically created from term.c -- DO NOT EDIT
- */
-
-#define T_FLG 0
-#define T_NUM 1
-#define T_STR 2
-
-struct term
-{
- char *tcname;
- int type;
-};
-
-union tcu
-{
- int flg;
- int num;
- char *str;
-};
-
-#define d_LI d_tcs[0].num
-#define D_LI (D_tcs[0].num)
-#define d_CO d_tcs[1].num
-#define D_CO (D_tcs[1].num)
-#define d_HC d_tcs[2].flg
-#define D_HC (D_tcs[2].flg)
-#define d_OS d_tcs[3].flg
-#define D_OS (D_tcs[3].flg)
-#define d_NS d_tcs[4].flg
-#define D_NS (D_tcs[4].flg)
-#define d_CM d_tcs[5].str
-#define D_CM (D_tcs[5].str)
-#define d_HO d_tcs[6].str
-#define D_HO (D_tcs[6].str)
-#define d_CR d_tcs[7].str
-#define D_CR (D_tcs[7].str)
-#define d_UP d_tcs[8].str
-#define D_UP (D_tcs[8].str)
-#define d_CUP d_tcs[9].str
-#define D_CUP (D_tcs[9].str)
-#define d_DO d_tcs[10].str
-#define D_DO (D_tcs[10].str)
-#define d_CDO d_tcs[11].str
-#define D_CDO (D_tcs[11].str)
-#define d_BS d_tcs[12].flg
-#define D_BS (D_tcs[12].flg)
-#define d_BC d_tcs[13].str
-#define D_BC (D_tcs[13].str)
-#define d_LE d_tcs[14].str
-#define D_LE (D_tcs[14].str)
-#define d_CLE d_tcs[15].str
-#define D_CLE (D_tcs[15].str)
-#define d_ND d_tcs[16].str
-#define D_ND (D_tcs[16].str)
-#define d_CRI d_tcs[17].str
-#define D_CRI (D_tcs[17].str)
-#define d_CS d_tcs[18].str
-#define D_CS (D_tcs[18].str)
-#define d_NL d_tcs[19].str
-#define D_NL (D_tcs[19].str)
-#define d_SF d_tcs[20].str
-#define D_SF (D_tcs[20].str)
-#define d_SR d_tcs[21].str
-#define D_SR (D_tcs[21].str)
-#define d_AL d_tcs[22].str
-#define D_AL (D_tcs[22].str)
-#define d_CAL d_tcs[23].str
-#define D_CAL (D_tcs[23].str)
-#define d_DL d_tcs[24].str
-#define D_DL (D_tcs[24].str)
-#define d_CDL d_tcs[25].str
-#define D_CDL (D_tcs[25].str)
-#define d_IN d_tcs[26].flg
-#define D_IN (D_tcs[26].flg)
-#define d_IM d_tcs[27].str
-#define D_IM (D_tcs[27].str)
-#define d_EI d_tcs[28].str
-#define D_EI (D_tcs[28].str)
-#define d_IC d_tcs[29].str
-#define D_IC (D_tcs[29].str)
-#define d_CIC d_tcs[30].str
-#define D_CIC (D_tcs[30].str)
-#define d_DC d_tcs[31].str
-#define D_DC (D_tcs[31].str)
-#define d_CDC d_tcs[32].str
-#define D_CDC (D_tcs[32].str)
-#define d_UT d_tcs[33].flg
-#define D_UT (D_tcs[33].flg)
-#define d_CL d_tcs[34].str
-#define D_CL (D_tcs[34].str)
-#define d_CD d_tcs[35].str
-#define D_CD (D_tcs[35].str)
-#define d_CCD d_tcs[36].str
-#define D_CCD (D_tcs[36].str)
-#define d_CE d_tcs[37].str
-#define D_CE (D_tcs[37].str)
-#define d_CB d_tcs[38].str
-#define D_CB (D_tcs[38].str)
-#define d_IS d_tcs[39].str
-#define D_IS (D_tcs[39].str)
-#define d_TI d_tcs[40].str
-#define D_TI (D_tcs[40].str)
-#define d_TE d_tcs[41].str
-#define D_TE (D_tcs[41].str)
-#define d_BL d_tcs[42].str
-#define D_BL (D_tcs[42].str)
-#define d_VB d_tcs[43].str
-#define D_VB (D_tcs[43].str)
-#define d_CWS d_tcs[44].str
-#define D_CWS (D_tcs[44].str)
-#define d_CZ0 d_tcs[45].str
-#define D_CZ0 (D_tcs[45].str)
-#define d_CZ1 d_tcs[46].str
-#define D_CZ1 (D_tcs[46].str)
-#define T_ATTR 47
-#define d_MH d_tcs[47].str
-#define D_MH (D_tcs[47].str)
-#define d_US d_tcs[48].str
-#define D_US (D_tcs[48].str)
-#define d_MD d_tcs[49].str
-#define D_MD (D_tcs[49].str)
-#define d_MR d_tcs[50].str
-#define D_MR (D_tcs[50].str)
-#define d_SO d_tcs[51].str
-#define D_SO (D_tcs[51].str)
-#define d_MB d_tcs[52].str
-#define D_MB (D_tcs[52].str)
-#define d_UE d_tcs[53].str
-#define D_UE (D_tcs[53].str)
-#define d_SE d_tcs[54].str
-#define D_SE (D_tcs[54].str)
-#define d_ME d_tcs[55].str
-#define D_ME (D_tcs[55].str)
-#define d_MS d_tcs[56].flg
-#define D_MS (D_tcs[56].flg)
-#define d_SG d_tcs[57].num
-#define D_SG (D_tcs[57].num)
-#define d_UG d_tcs[58].num
-#define D_UG (D_tcs[58].num)
-#define d_SA d_tcs[59].str
-#define D_SA (D_tcs[59].str)
-#define d_CAF d_tcs[60].str
-#define D_CAF (D_tcs[60].str)
-#define d_CAB d_tcs[61].str
-#define D_CAB (D_tcs[61].str)
-#define d_CSF d_tcs[62].str
-#define D_CSF (D_tcs[62].str)
-#define d_CSB d_tcs[63].str
-#define D_CSB (D_tcs[63].str)
-#define d_OP d_tcs[64].str
-#define D_OP (D_tcs[64].str)
-#define d_CCO d_tcs[65].num
-#define D_CCO (D_tcs[65].num)
-#define d_BE d_tcs[66].flg
-#define D_BE (D_tcs[66].flg)
-#define d_CAX d_tcs[67].flg
-#define D_CAX (D_tcs[67].flg)
-#define d_CC8 d_tcs[68].flg
-#define D_CC8 (D_tcs[68].flg)
-#define d_KS d_tcs[69].str
-#define D_KS (D_tcs[69].str)
-#define d_KE d_tcs[70].str
-#define D_KE (D_tcs[70].str)
-#define d_CCS d_tcs[71].str
-#define D_CCS (D_tcs[71].str)
-#define d_CCE d_tcs[72].str
-#define D_CCE (D_tcs[72].str)
-#define d_PO d_tcs[73].str
-#define D_PO (D_tcs[73].str)
-#define d_PF d_tcs[74].str
-#define D_PF (D_tcs[74].str)
-#define d_HS d_tcs[75].flg
-#define D_HS (D_tcs[75].flg)
-#define d_WS d_tcs[76].num
-#define D_WS (D_tcs[76].num)
-#define d_TS d_tcs[77].str
-#define D_TS (D_tcs[77].str)
-#define d_FS d_tcs[78].str
-#define D_FS (D_tcs[78].str)
-#define d_DS d_tcs[79].str
-#define D_DS (D_tcs[79].str)
-#define d_VI d_tcs[80].str
-#define D_VI (D_tcs[80].str)
-#define d_VS d_tcs[81].str
-#define D_VS (D_tcs[81].str)
-#define d_VE d_tcs[82].str
-#define D_VE (D_tcs[82].str)
-#define d_AM d_tcs[83].flg
-#define D_AM (D_tcs[83].flg)
-#define d_XV d_tcs[84].flg
-#define D_XV (D_tcs[84].flg)
-#define d_XN d_tcs[85].flg
-#define D_XN (D_tcs[85].flg)
-#define d_COP d_tcs[86].flg
-#define D_COP (D_tcs[86].flg)
-#define d_CLP d_tcs[87].flg
-#define D_CLP (D_tcs[87].flg)
-#define d_CNF d_tcs[88].flg
-#define D_CNF (D_tcs[88].flg)
-#define d_NX d_tcs[89].flg
-#define D_NX (D_tcs[89].flg)
-#define d_CAN d_tcs[90].flg
-#define D_CAN (D_tcs[90].flg)
-#define d_COL d_tcs[91].num
-#define D_COL (D_tcs[91].num)
-#define d_CKJ d_tcs[92].str
-#define D_CKJ (D_tcs[92].str)
-#define d_CVR d_tcs[93].str
-#define D_CVR (D_tcs[93].str)
-#define d_CVN d_tcs[94].str
-#define D_CVN (D_tcs[94].str)
-#define d_CTF d_tcs[95].flg
-#define D_CTF (D_tcs[95].flg)
-#define d_CXT d_tcs[96].flg
-#define D_CXT (D_tcs[96].flg)
-#define d_CG0 d_tcs[97].flg
-#define D_CG0 (D_tcs[97].flg)
-#define d_CS0 d_tcs[98].str
-#define D_CS0 (D_tcs[98].str)
-#define d_CE0 d_tcs[99].str
-#define D_CE0 (D_tcs[99].str)
-#define d_CC0 d_tcs[100].str
-#define D_CC0 (D_tcs[100].str)
-#define d_AS d_tcs[101].str
-#define D_AS (D_tcs[101].str)
-#define d_AE d_tcs[102].str
-#define D_AE (D_tcs[102].str)
-#define d_AC d_tcs[103].str
-#define D_AC (D_tcs[103].str)
-#define d_EA d_tcs[104].str
-#define D_EA (D_tcs[104].str)
-#define d_CXC d_tcs[105].str
-#define D_CXC (D_tcs[105].str)
-#define T_CAPS 106
-#define T_BACKTAB 135
-#define T_NAVIGATE 153
-#define T_NAVIGATE_DELETE 160
-#define T_CURSOR 161
-#define T_KEYPAD 165
-#define T_OCAPS 183
-#define T_ECAPS 196
-#define T_N 196
-
-#ifdef MAPKEYS
-# define KMAPDEFSTART 106
-# define NKMAPDEF 77
-# define KMAPADEFSTART 161
-# define NKMAPADEF 22
-# define KMAPMDEFSTART 138
-# define NKMAPMDEF 27
-#endif
diff --git a/src/term.sh b/src/term.sh
deleted file mode 100644
index f5dfc4a..0000000
--- a/src/term.sh
+++ /dev/null
@@ -1,169 +0,0 @@
-#! /bin/sh
-
-if test -z "$AWK"; then
- AWK=awk
-fi
-if test -z "$srcdir"; then
- srcdir=.
-fi
-
-LC_ALL=C
-export LC_ALL
-
-rm -f term.h
-cat << EOF > term.h
-/*
- * This file is automagically created from term.c -- DO NOT EDIT
- */
-
-#define T_FLG 0
-#define T_NUM 1
-#define T_STR 2
-
-struct term
-{
- char *tcname;
- int type;
-};
-
-union tcu
-{
- int flg;
- int num;
- char *str;
-};
-
-EOF
-
-#
-# SCO-Unix sufferers may need to use the following lines:
-# perl -p < ${srcdir}/term.c \
-# -e 's/"/"C/ if /"[A-Z]."/;' \
-# -e 'y/[a-z]/[A-Z]/ if /"/;' \
-#
-sed < ${srcdir}/term.c \
- -e '/"[A-Z]."/s/"/"C/' \
- -e '/"/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
-| $AWK '
-/^ [{] ".*KMAPDEF[(].*$/{
- if (min == 0) min = s
- max = s;
-}
-/^ [{] ".*KMAPADEF[(].*$/{
- if (amin == 0) amin = s
- amax = s;
-}
-/^ [{] ".*KMAPMDEF[(].*$/{
- if (mmin == 0) mmin = s
- mmax = s;
-}
-/^ [{] ".*$/{
-a=substr($2,2,length($2)-3);
-b=substr($3,3,3);
-if (nolist == 0) {
- printf "#define d_%s d_tcs[%d].%s\n",a,s,b
- printf "#define D_%s (D_tcs[%d].%s)\n",a,s,b
- }
-s++;
-}
-/\/* define/{
-printf "#define %s %d\n",$3,s
-}
-/\/* nolist/{
-nolist = 1;
-}
-/\/* list/{
-nolist = 0;
-}
-END {
- printf "\n#ifdef MAPKEYS\n"
- printf "# define KMAPDEFSTART %d\n", min
- printf "# define NKMAPDEF %d\n", max-min+1
- printf "# define KMAPADEFSTART %d\n", amin
- printf "# define NKMAPADEF %d\n", amax-amin+1
- printf "# define KMAPMDEFSTART %d\n", mmin
- printf "# define NKMAPMDEF %d\n", mmax-mmin+1
- printf "#endif\n"
-}
-' | sed -e s/NUM/num/ -e s/STR/str/ -e s/FLG/flg/ \
->> term.h
-
-rm -f kmapdef.c
-cat << EOF > kmapdef.c
-/*
- * This file is automagically created from term.c -- DO NOT EDIT
- */
-
-#include "config.h"
-
-#ifdef MAPKEYS
-
-EOF
-
-$AWK < ${srcdir}/term.c '
-/^ [{] ".*KMAP.*$/{
- for (i = 0; i < 3; i++) {
- q = $(5+i)
- if (substr(q, 1, 5) == "KMAPD") {
- if (min == 0) min = s
- max = s
- arr[s] = substr(q, 9, length(q)-9)
- }
- if (substr(q, 1, 5) == "KMAPA") {
- if (amin == 0) amin = s
- amax = s
- anarr[s] = substr(q, 10, length(q)-10)
- }
- if (substr(q, 1, 5) == "KMAPM") {
- if (mmin == 0) mmin = s
- mmax = s
- mnarr[s] = substr(q, 10, length(q)-10)
- }
- }
-}
-/^ [{] ".*$/{
- s++;
-}
-END {
- printf "char *kmapdef[] = {\n"
- for (s = min; s <= max; s++) {
- if (arr[s])
- printf "%s", arr[s]
- else
- printf "0"
- if (s < max)
- printf ",\n"
- else
- printf "\n"
- }
- printf "};\n\n"
- printf "char *kmapadef[] = {\n"
- for (s = amin; s <= amax; s++) {
- if (anarr[s])
- printf "%s", anarr[s]
- else
- printf "0"
- if (s < amax)
- printf ",\n"
- else
- printf "\n"
- }
- printf "};\n\n"
- printf "char *kmapmdef[] = {\n"
- for (s = mmin; s <= mmax; s++) {
- if (mnarr[s])
- printf "%s", mnarr[s]
- else
- printf "0"
- if (s < mmax)
- printf ",\n"
- else
- printf "\n"
- }
- printf "};\n\n#endif\n"
-}
-' >> kmapdef.c
-
-chmod a-w kmapdef.c
-chmod a-w term.h
-
diff --git a/src/termcap.c b/src/termcap.c
deleted file mode 100644
index 0e7186e..0000000
--- a/src/termcap.c
+++ /dev/null
@@ -1,1509 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#undef DEBUGG
-
-extern struct display *display, *displays;
-extern int real_uid, real_gid, eff_uid, eff_gid;
-extern struct term term[]; /* terminal capabilities */
-extern struct NewWindow nwin_undef, nwin_default, nwin_options;
-extern int force_vt;
-extern int Z0width, Z1width;
-extern int hardstatusemu;
-#ifdef MAPKEYS
-extern struct action umtab[];
-extern struct action mmtab[];
-extern struct action dmtab[];
-extern struct kmap_ext *kmap_exts;
-extern int kmap_extn;
-extern int DefaultEsc;
-#endif
-
-
-static void AddCap __P((char *));
-static void MakeString __P((char *, char *, int, char *));
-static char *findcap __P((char *, char **, int));
-static int copyarg __P((char **, char *));
-static int e_tgetent __P((char *, char *));
-static char *e_tgetstr __P((char *, char **));
-static int e_tgetflag __P((char *));
-static int e_tgetnum __P((char *));
-#ifdef MAPKEYS
-static int findseq_ge __P((char *, int, unsigned char **));
-static void setseqoff __P((unsigned char *, int, int));
-static int addmapseq __P((char *, int, int));
-static int remmapseq __P((char *, int));
-#ifdef DEBUGG
-static void dumpmap __P((void));
-#endif
-#endif
-
-
-char Termcap[TERMCAP_BUFSIZE + 8]; /* new termcap +8:"TERMCAP=" */
-static int Termcaplen;
-static int tcLineLen;
-char Term[MAXSTR+5]; /* +5: "TERM=" */
-char screenterm[20]; /* new $TERM, usually "screen" */
-
-char *extra_incap, *extra_outcap;
-
-static const char TermcapConst[] = "\\\n\
-\t:DO=\\E[%dB:LE=\\E[%dD:RI=\\E[%dC:UP=\\E[%dA:bs:bt=\\E[Z:\\\n\
-\t:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[J:cm=\\E[%i%d;%dH:ct=\\E[3g:\\\n\
-\t:do=^J:nd=\\E[C:pt:rc=\\E8:rs=\\Ec:sc=\\E7:st=\\EH:up=\\EM:\\\n\
-\t:le=^H:bl=^G:cr=^M:it#8:ho=\\E[H:nw=\\EE:ta=^I:is=\\E)0:";
-
-char *
-gettermcapstring(s)
-char *s;
-{
- int i;
-
- if (display == 0 || s == 0)
- return 0;
- for (i = 0; i < T_N; i++)
- {
- if (term[i].type != T_STR)
- continue;
- if (strcmp(term[i].tcname, s) == 0)
- return D_tcs[i].str;
- }
- return 0;
-}
-
-/*
- * Compile the terminal capabilities for a display.
- * Input: tgetent(, D_termname) extra_incap, extra_outcap.
- * Effect: display initialisation.
- */
-int
-InitTermcap(wi, he)
-int wi;
-int he;
-{
- register char *s;
- int i;
- char tbuf[TERMCAP_BUFSIZE], *tp;
- int t, xue, xse, xme;
-
- ASSERT(display);
- bzero(tbuf, sizeof(tbuf));
- debug1("InitTermcap: looking for tgetent('%s')\n", D_termname);
- if (*D_termname == 0 || e_tgetent(tbuf, D_termname) != 1)
- {
-#ifdef TERMINFO
- Msg(0, "Cannot find terminfo entry for '%s'.", D_termname);
-#else
- Msg(0, "Cannot find termcap entry for '%s'.", D_termname);
-#endif
- return -1;
- }
- debug1("got it:\n%s\n", tbuf);
-#ifdef DEBUG
- if (extra_incap)
- debug1("Extra incap: %s\n", extra_incap);
- if (extra_outcap)
- debug1("Extra outcap: %s\n", extra_outcap);
-#endif
-
- if ((D_tentry = (char *)malloc(TERMCAP_BUFSIZE + (extra_incap ? strlen(extra_incap) + 1 : 0))) == 0)
- {
- Msg(0, strnomem);
- return -1;
- }
-
- /*
- * loop through all needed capabilities, record their values in the display
- */
- tp = D_tentry;
- for (i = 0; i < T_N; i++)
- {
- switch(term[i].type)
- {
- case T_FLG:
- D_tcs[i].flg = e_tgetflag(term[i].tcname);
- break;
- case T_NUM:
- D_tcs[i].num = e_tgetnum(term[i].tcname);
- break;
- case T_STR:
- D_tcs[i].str = e_tgetstr(term[i].tcname, &tp);
- /* no empty strings, please */
- if (D_tcs[i].str && *D_tcs[i].str == 0)
- D_tcs[i].str = 0;
- break;
- default:
- Panic(0, "Illegal tc type in entry #%d", i);
- /*NOTREACHED*/
- }
- }
-
- /*
- * Now a good deal of sanity checks on the retrieved capabilities.
- */
- if (D_HC)
- {
- Msg(0, "You can't run screen on a hardcopy terminal.");
- return -1;
- }
- if (D_OS)
- {
- Msg(0, "You can't run screen on a terminal that overstrikes.");
- return -1;
- }
- if (!D_CL)
- {
- Msg(0, "Clear screen capability required.");
- return -1;
- }
- if (!D_CM)
- {
- Msg(0, "Addressable cursor capability required.");
- return -1;
- }
- if ((s = getenv("COLUMNS")) && (i = atoi(s)) > 0)
- D_CO = i;
- if ((s = getenv("LINES")) && (i = atoi(s)) > 0)
- D_LI = i;
- if (wi)
- D_CO = wi;
- if (he)
- D_LI = he;
- if (D_CO <= 0)
- D_CO = 80;
- if (D_LI <= 0)
- D_LI = 24;
-
- if (D_CTF)
- {
- /* standard fixes for xterms etc */
- /* assume color for everything that looks ansi-compatible */
- if (!D_CAF && D_ME && (InStr(D_ME, "\033[m") || InStr(D_ME, "\033[0m")))
- {
-#ifdef TERMINFO
- D_CAF = "\033[3%p1%dm";
- D_CAB = "\033[4%p1%dm";
-#else
- D_CAF = "\033[3%dm";
- D_CAB = "\033[4%dm";
-#endif
- }
- if (D_OP && InStr(D_OP, "\033[39;49m"))
- D_CAX = 1;
- if (D_OP && (InStr(D_OP, "\033[m") || InStr(D_OP, "\033[0m")))
- D_OP = 0;
- /* ISO2022 */
- if ((D_EA && InStr(D_EA, "\033(B")) || (D_AS && InStr(D_AS, "\033(0")))
- D_CG0 = 1;
- if (InStr(D_termname, "xterm") || InStr(D_termname, "rxvt"))
- D_CXT = 1;
- /* "be" seems to be standard for xterms... */
- if (D_CXT)
- D_BE = 1;
- }
- if (nwin_options.flowflag == nwin_undef.flowflag)
- nwin_default.flowflag = D_CNF ? FLOW_NOW * 0 :
- D_NX ? FLOW_NOW * 1 :
- FLOW_AUTOFLAG;
- D_CLP |= (!D_AM || D_XV || D_XN);
- if (!D_BL)
- D_BL = "\007";
- if (!D_BC)
- {
- if (D_BS)
- D_BC = "\b";
- else
- D_BC = D_LE;
- }
- if (!D_CR)
- D_CR = "\r";
- if (!D_NL)
- D_NL = "\n";
-
- /*
- * Set up attribute handling.
- * This is rather complicated because termcap has different
- * attribute groups.
- */
-
- if (D_UG > 0)
- D_US = D_UE = 0;
- if (D_SG > 0)
- D_SO = D_SE = 0;
- /* Unfortunatelly there is no 'mg' capability.
- * For now we think that mg > 0 if sg and ug > 0.
- */
- if (D_UG > 0 && D_SG > 0)
- D_MH = D_MD = D_MR = D_MB = D_ME = 0;
-
- xue = ATYP_U;
- xse = ATYP_S;
- xme = ATYP_M;
-
- if (D_SO && D_SE == 0)
- {
- Msg(0, "Warning: 'so' but no 'se' capability.");
- if (D_ME)
- xse = xme;
- else
- D_SO = 0;
- }
- if (D_US && D_UE == 0)
- {
- Msg(0, "Warning: 'us' but no 'ue' capability.");
- if (D_ME)
- xue = xme;
- else
- D_US = 0;
- }
- if ((D_MH || D_MD || D_MR || D_MB) && D_ME == 0)
- {
- Msg(0, "Warning: 'm?' but no 'me' capability.");
- D_MH = D_MD = D_MR = D_MB = 0;
- }
- /*
- * Does ME also reverse the effect of SO and/or US? This is not
- * clearly specified by the termcap manual. Anyway, we should at
- * least look whether ME and SE/UE are equal:
- */
- if (D_UE && D_SE && strcmp(D_SE, D_UE) == 0)
- xse = xue;
- if (D_SE && D_ME && strcmp(D_ME, D_SE) == 0)
- xse = xme;
- if (D_UE && D_ME && strcmp(D_ME, D_UE) == 0)
- xue = xme;
-
- for (i = 0; i < NATTR; i++)
- {
- D_attrtab[i] = D_tcs[T_ATTR + i].str;
- D_attrtyp[i] = i == ATTR_SO ? xse : (i == ATTR_US ? xue : xme);
- }
-
- /* Set up missing entries (attributes are priority ordered) */
- s = 0;
- t = 0;
- for (i = 0; i < NATTR; i++)
- if ((s = D_attrtab[i]))
- {
- t = D_attrtyp[i];
- break;
- }
- for (i = 0; i < NATTR; i++)
- {
- if (D_attrtab[i] == 0)
- {
- D_attrtab[i] = s;
- D_attrtyp[i] = t;
- }
- else
- {
- s = D_attrtab[i];
- t = D_attrtyp[i];
- }
- }
- if (D_CAF || D_CAB || D_CSF || D_CSB)
- D_hascolor = 1;
- if (D_UT)
- D_BE = 1; /* screen erased with background color */
-
- if (!D_DO)
- D_DO = D_NL;
- if (!D_SF)
- D_SF = D_NL;
- if (D_IN)
- D_IC = D_IM = 0;
- if (D_EI == 0)
- D_IM = 0;
- /* some strange termcap entries have IC == IM */
- if (D_IC && D_IM && strcmp(D_IC, D_IM) == 0)
- D_IC = 0;
- if (D_KE == 0)
- D_KS = 0;
- if (D_CVN == 0)
- D_CVR = 0;
- if (D_VE == 0)
- D_VI = D_VS = 0;
- if (D_CCE == 0)
- D_CCS = 0;
-
-#ifdef FONT
- if (D_CG0)
- {
- if (D_CS0 == 0)
-#ifdef TERMINFO
- D_CS0 = "\033(%p1%c";
-#else
- D_CS0 = "\033(%.";
-#endif
- if (D_CE0 == 0)
- D_CE0 = "\033(B";
- D_AC = 0;
- D_EA = 0;
- }
- else if (D_AC || (D_AS && D_AE)) /* some kind of graphics */
- {
- D_CS0 = (D_AS && D_AE) ? D_AS : "";
- D_CE0 = (D_AS && D_AE) ? D_AE : "";
- D_CC0 = D_AC;
- }
- else
- {
- D_CS0 = D_CE0 = "";
- D_CC0 = 0;
- D_AC = ""; /* enable default string */
- }
-
- for (i = 0; i < 256; i++)
- D_c0_tab[i] = i;
- if (D_AC)
- {
- /* init with default string first */
- s = "l+m+k+j+u+t+v+w+q-x|n+o~s_p\"r#`+a:f'g#~o.v-^+<,>h#I#0#y<z>";
- for (i = strlen(s) & ~1; i >= 0; i -= 2)
- D_c0_tab[(int)(unsigned char)s[i]] = s[i + 1];
- }
- if (D_CC0)
- for (i = strlen(D_CC0) & ~1; i >= 0; i -= 2)
- D_c0_tab[(int)(unsigned char)D_CC0[i]] = D_CC0[i + 1];
- debug1("ISO2022 = %d\n", D_CG0);
-#endif /* FONT */
- if (D_PF == 0)
- D_PO = 0;
- debug2("terminal size is %d, %d (says TERMCAP)\n", D_CO, D_LI);
-
-#ifdef FONT
- if (D_CXC)
- if (CreateTransTable(D_CXC))
- return -1;
-#endif
-
- /* Termcap fields Z0 & Z1 contain width-changing sequences. */
- if (D_CZ1 == 0)
- D_CZ0 = 0;
- Z0width = 132;
- Z1width = 80;
-
- CheckScreenSize(0);
-
- if (D_TS == 0 || D_FS == 0 || D_DS == 0)
- D_HS = 0;
- if (D_HS)
- {
- debug("oy! we have a hardware status line, says termcap\n");
- if (D_WS < 0)
- D_WS = 0;
- }
- D_has_hstatus = hardstatusemu & ~HSTATUS_ALWAYS;
- if (D_HS && !(hardstatusemu & HSTATUS_ALWAYS))
- D_has_hstatus = HSTATUS_HS;
-
-#ifdef ENCODINGS
- if (D_CKJ)
- {
- int enc = FindEncoding(D_CKJ);
- if (enc != -1)
- D_encoding = enc;
- }
-#endif
- if (!D_tcs[T_NAVIGATE].str && D_tcs[T_NAVIGATE + 1].str)
- D_tcs[T_NAVIGATE].str = D_tcs[T_NAVIGATE + 1].str; /* kh = @1 */
- if (!D_tcs[T_NAVIGATE + 2].str && D_tcs[T_NAVIGATE + 3].str)
- D_tcs[T_NAVIGATE + 2].str = D_tcs[T_NAVIGATE + 3].str; /* kH = @7 */
-
- D_UPcost = CalcCost(D_UP);
- D_DOcost = CalcCost(D_DO);
- D_NLcost = CalcCost(D_NL);
- D_LEcost = CalcCost(D_BC);
- D_NDcost = CalcCost(D_ND);
- D_CRcost = CalcCost(D_CR);
- D_IMcost = CalcCost(D_IM);
- D_EIcost = CalcCost(D_EI);
-
-#ifdef AUTO_NUKE
- if (D_CAN)
- {
- debug("termcap has AN, setting autonuke\n");
- D_auto_nuke = 1;
- }
-#endif
- if (D_COL > 0)
- {
- debug1("termcap has OL (%d), setting limit\n", D_COL);
- D_obufmax = D_COL;
- D_obuflenmax = D_obuflen - D_obufmax;
- }
-
- /* Some xterm entries set F0 and F10 to the same string. Nuke F0. */
- if (D_tcs[T_CAPS].str && D_tcs[T_CAPS + 10].str && !strcmp(D_tcs[T_CAPS].str, D_tcs[T_CAPS + 10].str))
- D_tcs[T_CAPS].str = 0;
- /* Some xterm entries set kD to ^?. Nuke it. */
- if (D_tcs[T_NAVIGATE_DELETE].str && !strcmp(D_tcs[T_NAVIGATE_DELETE].str, "\0177"))
- D_tcs[T_NAVIGATE_DELETE].str = 0;
- /* wyse52 entries have kcub1 == kb == ^H. Nuke... */
- if (D_tcs[T_CURSOR + 3].str && !strcmp(D_tcs[T_CURSOR + 3].str, "\008"))
- D_tcs[T_CURSOR + 3].str = 0;
-
-#ifdef MAPKEYS
- D_nseqs = 0;
- for (i = 0; i < T_OCAPS - T_CAPS; i++)
- remap(i, 1);
- for (i = 0; i < kmap_extn; i++)
- remap(i + (KMAP_KEYS+KMAP_AKEYS), 1);
- D_seqp = D_kmaps + 3;
- D_seql = 0;
- D_seqh = 0;
-#endif
-
- D_tcinited = 1;
- MakeTermcap(0);
-#ifdef MAPKEYS
- CheckEscape();
-#endif
- return 0;
-}
-
-#ifdef MAPKEYS
-
-int
-remap(n, map)
-int n;
-int map;
-{
- char *s = 0;
- int fl = 0, domap = 0;
- struct action *a1, *a2, *tab;
- int l = 0;
- struct kmap_ext *kme = 0;
-
- a1 = 0;
- if (n >= KMAP_KEYS+KMAP_AKEYS)
- {
- kme = kmap_exts + (n - (KMAP_KEYS+KMAP_AKEYS));
- s = kme->str;
- l = kme->fl & ~KMAP_NOTIMEOUT;
- fl = kme->fl & KMAP_NOTIMEOUT;
- a1 = &kme->um;
- }
- tab = umtab;
- for (;;)
- {
- a2 = 0;
- if (n < KMAP_KEYS+KMAP_AKEYS)
- {
- a1 = &tab[n];
- if (n >= KMAP_KEYS)
- n -= T_OCAPS-T_CURSOR;
- s = D_tcs[n + T_CAPS].str;
- l = s ? strlen(s) : 0;
- if (n >= T_CURSOR-T_CAPS)
- a2 = &tab[n + (T_OCAPS-T_CURSOR)];
- }
- if (s == 0 || l == 0)
- return 0;
- if (a1 && a1->nr == RC_ILLEGAL)
- a1 = 0;
- if (a2 && a2->nr == RC_ILLEGAL)
- a2 = 0;
- if (a1 && a1->nr == RC_STUFF && strcmp(a1->args[0], s) == 0)
- a1 = 0;
- if (a2 && a2->nr == RC_STUFF && strcmp(a2->args[0], s) == 0)
- a2 = 0;
- domap |= (a1 || a2);
- if (tab == umtab)
- {
- tab = dmtab;
- a1 = kme ? &kme->dm : 0;
- }
- else if (tab == dmtab)
- {
- tab = mmtab;
- a1 = kme ? &kme->mm : 0;
- }
- else
- break;
- }
-
- if (map == 0 && domap)
- return 0;
- if (map && !domap)
- return 0;
- debug3("%smapping %s %#x\n", map? "" :"un",s,n);
- if (map)
- return addmapseq(s, l, n | fl);
- else
- return remmapseq(s, l);
-}
-
-void
-CheckEscape()
-{
- struct display *odisplay;
- int i, nr;
-
- if (DefaultEsc >= 0)
- return;
-
- odisplay = display;
- for (display = displays; display; display = display->d_next)
- {
- for (i = 0; i < D_nseqs; i += D_kmaps[i + 2] * 2 + 4)
- {
- nr = (D_kmaps[i] << 8 | D_kmaps[i + 1]) & ~KMAP_NOTIMEOUT;
- if (nr < KMAP_KEYS+KMAP_AKEYS)
- {
- if (umtab[nr].nr == RC_COMMAND)
- break;
- if (umtab[nr].nr == RC_ILLEGAL && dmtab[nr].nr == RC_COMMAND)
- break;
- }
- else
- {
- struct kmap_ext *kme = kmap_exts + nr - (KMAP_KEYS+KMAP_AKEYS);
- if (kme->um.nr == RC_COMMAND)
- break;
- if (kme->um.nr == RC_ILLEGAL && kme->dm.nr == RC_COMMAND)
- break;
- }
- }
- }
- if (display == 0)
- {
- display = odisplay;
- return;
- }
- SetEscape((struct acluser *)0, Ctrl('a'), 'a');
- if (odisplay->d_user->u_Esc == -1)
- odisplay->d_user->u_Esc = DefaultEsc;
- if (odisplay->d_user->u_MetaEsc == -1)
- odisplay->d_user->u_MetaEsc = DefaultMetaEsc;
- display = 0;
- Msg(0, "Warning: escape char set back to ^A");
- display = odisplay;
-}
-
-static int
-findseq_ge(seq, k, sp)
-char *seq;
-int k;
-unsigned char **sp;
-{
- unsigned char *p;
- int j, l;
-
- p = D_kmaps;
- while (p - D_kmaps < D_nseqs)
- {
- l = p[2];
- p += 3;
- for (j = 0; ; j++)
- {
- if (j == k || j == l)
- j = l - k;
- else if (p[j] != ((unsigned char *)seq)[j])
- j = p[j] - ((unsigned char *)seq)[j];
- else
- continue;
- break;
- }
- if (j >= 0)
- {
- *sp = p - 3;
- return j;
- }
- p += 2 * l + 1;
- }
- *sp = p;
- return -1;
-}
-
-static void
-setseqoff(p, i, o)
-unsigned char *p;
-int i;
-int o;
-{
- unsigned char *q;
- int l, k;
-
- k = p[2];
- if (o < 256)
- {
- p[k + 4 + i] = o;
- return;
- }
- /* go for the biggest offset */
- for (q = p + k * 2 + 4; ; q += l * 2 + 4)
- {
- l = q[2];
- if ((q + l * 2 - p) / 2 >= 256)
- {
- p[k + 4 + i] = (q - p - 4) / 2;
- return;
- }
- }
-}
-
-static int
-addmapseq(seq, k, nr)
-char *seq;
-int k;
-int nr;
-{
- int i, j, l, mo, m;
- unsigned char *p, *q;
-
- if (k >= 254)
- return -1;
- j = findseq_ge(seq, k, &p);
- if (j == 0)
- {
- p[0] = nr >> 8;
- p[1] = nr;
- return 0;
- }
- i = p - D_kmaps;
- if (D_nseqs + 2 * k + 4 >= D_aseqs)
- {
- D_kmaps = (unsigned char *)xrealloc((char *)D_kmaps, D_aseqs + 256);
- D_aseqs += 256;
- p = D_kmaps + i;
- }
- D_seqp = D_kmaps + 3;
- D_seql = 0;
- D_seqh = 0;
- evdeq(&D_mapev);
- if (j > 0)
- bcopy((char *)p, (char *)p + 2 * k + 4, D_nseqs - i);
- p[0] = nr >> 8;
- p[1] = nr;
- p[2] = k;
- bcopy(seq, (char *)p + 3, k);
- bzero(p + k + 3, k + 1);
- D_nseqs += 2 * k + 4;
- if (j > 0)
- {
- q = p + 2 * k + 4;
- l = q[2];
- for (i = 0; i < k; i++)
- {
- if (p[3 + i] != q[3 + i])
- {
- p[k + 4 + i] = k;
- break;
- }
- setseqoff(p, i, q[l + 4 + i] ? q[l + 4 + i] + k + 2: 0);
- }
- }
- for (q = D_kmaps; q < p; q += 2 * l + 4)
- {
- l = q[2];
- for (m = j = 0; j < l; j++)
- {
- mo = m;
- if (!m && q[3 + j] != seq[j])
- m = 1;
- if (q[l + 4 + j] == 0)
- {
- if (!mo && m)
- setseqoff(q, j, (p - q - 4) / 2);
- }
- else if (q + q[l + 4 + j] * 2 + 4 > p || (q + q[l + 4 + j] * 2 + 4 == p && !m))
- setseqoff(q, j, q[l + 4 + j] + k + 2);
- }
- }
-#ifdef DEBUGG
- dumpmap();
-#endif
- return 0;
-}
-
-static int
-remmapseq(seq, k)
-char *seq;
-int k;
-{
- int j, l;
- unsigned char *p, *q;
-
- if (k >= 254 || (j = findseq_ge(seq, k, &p)) != 0)
- return -1;
- for (q = D_kmaps; q < p; q += 2 * l + 4)
- {
- l = q[2];
- for (j = 0; j < l; j++)
- {
- if (q + q[l + 4 + j] * 2 + 4 == p)
- setseqoff(q, j, p[k + 4 + j] ? q[l + 4 + j] + p[k + 4 + j] - k : 0);
- else if (q + q[l + 4 + j] * 2 + 4 > p)
- q[l + 4 + j] -= k + 2;
- }
- }
- if (D_kmaps + D_nseqs > p + 2 * k + 4)
- bcopy((char *)p + 2 * k + 4, (char *)p, (D_kmaps + D_nseqs) - (p + 2 * k + 4));
- D_nseqs -= 2 * k + 4;
- D_seqp = D_kmaps + 3;
- D_seql = 0;
- D_seqh = 0;
- evdeq(&D_mapev);
-#ifdef DEBUGG
- dumpmap();
-#endif
- return 0;
-}
-
-#ifdef DEBUGG
-static void
-dumpmap()
-{
- unsigned char *p;
- int j, n, l, o, oo;
- debug("Mappings:\n");
- p = D_kmaps;
- if (!p)
- return;
- while (p < D_kmaps + D_nseqs)
- {
- l = p[2];
- debug1("%d: ", p - D_kmaps + 3);
- for (j = 0; j < l; j++)
- {
- o = oo = p[l + 4 + j];
- if (o)
- o = 2 * o + 4 + (p + 3 + j - D_kmaps);
- if (p[j + 3] > ' ' && p[j + 3] < 0177)
- {
- debug3("%c[%d:%d] ", p[j + 3], oo, o);
- }
- else
- debug3("\\%03o[%d:%d] ", p[j + 3], oo, o);
- }
- n = p[0] << 8 | p[1];
- debug2(" ==> %d%s\n", n & ~KMAP_NOTIMEOUT, (n & KMAP_NOTIMEOUT) ? " (no timeout)" : "");
- p += 2 * l + 4;
- }
-}
-#endif /* DEBUGG */
-
-#endif /* MAPKEYS */
-
-/*
- * Appends to the static variable Termcap
- */
-static void
-AddCap(s)
-char *s;
-{
- register int n;
-
- if (tcLineLen + (n = strlen(s)) > 55 && Termcaplen < TERMCAP_BUFSIZE - 4 - 1)
- {
- strcpy(Termcap + Termcaplen, "\\\n\t:");
- Termcaplen += 4;
- tcLineLen = 0;
- }
- if (Termcaplen + n < TERMCAP_BUFSIZE - 1)
- {
- strcpy(Termcap + Termcaplen, s);
- Termcaplen += n;
- tcLineLen += n;
- }
- else
- Panic(0, "TERMCAP overflow - sorry.");
-}
-
-/*
- * Reads a displays capabilities and reconstructs a termcap entry in the
- * global buffer "Termcap". A pointer to this buffer is returned.
- */
-char *
-MakeTermcap(aflag)
-int aflag;
-{
- char buf[TERMCAP_BUFSIZE];
- register char *p, *cp, *s, ch, *tname;
- int i, wi, he;
-#if 0
- int found;
-#endif
-
- if (display)
- {
- wi = D_width;
- he = D_height;
- tname = D_termname;
- }
- else
- {
- wi = 80;
- he = 24;
- tname = "vt100";
- }
- debug1("MakeTermcap(%d)\n", aflag);
- if ((s = getenv("SCREENCAP")) && strlen(s) < TERMCAP_BUFSIZE)
- {
- sprintf(Termcap, "TERMCAP=%s", s);
- strcpy(Term, "TERM=screen");
- debug("getenvSCREENCAP o.k.\n");
- return Termcap;
- }
- Termcaplen = 0;
- debug1("MakeTermcap screenterm='%s'\n", screenterm);
- debug1("MakeTermcap termname='%s'\n", tname);
- if (*screenterm == '\0' || strlen(screenterm) > MAXSTR - 3)
- {
- debug("MakeTermcap sets screenterm=screen\n");
- strcpy(screenterm, "screen");
- }
-#if 0
- found = 1;
-#endif
- do
- {
- strcpy(Term, "TERM=");
- p = Term + 5;
- if (!aflag && strlen(screenterm) + strlen(tname) < MAXSTR-1)
- {
- sprintf(p, "%s.%s", screenterm, tname);
- if (e_tgetent(buf, p) == 1)
- break;
- }
-#ifdef COLOR
- if (nwin_default.bce)
- {
- sprintf(p, "%s-bce", screenterm);
- if (e_tgetent(buf, p) == 1)
- break;
- }
-#endif
-#ifdef CHECK_SCREEN_W
- if (wi >= 132)
- {
- sprintf(p, "%s-w", screenterm);
- if (e_tgetent(buf, p) == 1)
- break;
- }
-#endif
- strcpy(p, screenterm);
- if (e_tgetent(buf, p) == 1)
- break;
- strcpy(p, "vt100");
-#if 0
- found = 0;
-#endif
- }
- while (0); /* Goto free programming... */
-
-#if 0
-#ifndef TERMINFO
- /* check for compatibility problems, displays == 0 after fork */
- if (found)
- {
- char xbuf[TERMCAP_BUFSIZE], *xbp = xbuf;
- if (tgetstr("im", &xbp) && tgetstr("ic", &xbp) && displays)
- {
- Msg(0, "Warning: im and ic set in %s termcap entry", p);
- }
- }
-#endif
-#endif
-
- tcLineLen = 100; /* Force NL */
- if (strlen(Term) > TERMCAP_BUFSIZE - 40)
- strcpy(Term, "too_long");
- sprintf(Termcap, "TERMCAP=SC|%s|VT 100/ANSI X3.64 virtual terminal:", Term + 5);
- Termcaplen = strlen(Termcap);
- debug1("MakeTermcap decided '%s'\n", p);
- if (extra_outcap && *extra_outcap)
- {
- for (cp = extra_outcap; (p = index(cp, ':')); cp = p)
- {
- ch = *++p;
- *p = '\0';
- AddCap(cp);
- *p = ch;
- }
- tcLineLen = 100; /* Force NL */
- }
- debug1("MakeTermcap after outcap '%s'\n", (char *)TermcapConst);
- if (Termcaplen + strlen(TermcapConst) < TERMCAP_BUFSIZE)
- {
- strcpy(Termcap + Termcaplen, (char *)TermcapConst);
- Termcaplen += strlen(TermcapConst);
- }
- sprintf(buf, "li#%d:co#%d:", he, wi);
- AddCap(buf);
- AddCap("am:");
- if (aflag || (force_vt && !D_COP) || D_CLP || !D_AM)
- {
- AddCap("xn:");
- AddCap("xv:");
- AddCap("LP:");
- }
- if (aflag || (D_CS && D_SR) || D_AL || D_CAL)
- {
- AddCap("sr=\\EM:");
- AddCap("al=\\E[L:");
- AddCap("AL=\\E[%dL:");
- }
- else if (D_SR)
- AddCap("sr=\\EM:");
- if (aflag || D_CS)
- AddCap("cs=\\E[%i%d;%dr:");
- if (aflag || D_CS || D_DL || D_CDL)
- {
- AddCap("dl=\\E[M:");
- AddCap("DL=\\E[%dM:");
- }
- if (aflag || D_DC || D_CDC)
- {
- AddCap("dc=\\E[P:");
- AddCap("DC=\\E[%dP:");
- }
- if (aflag || D_CIC || D_IC || D_IM)
- {
- AddCap("im=\\E[4h:");
- AddCap("ei=\\E[4l:");
- AddCap("mi:");
- AddCap("IC=\\E[%d@:");
- }
-#ifdef MAPKEYS
- AddCap("ks=\\E[?1h\\E=:");
- AddCap("ke=\\E[?1l\\E>:");
-#endif
- AddCap("vi=\\E[?25l:");
- AddCap("ve=\\E[34h\\E[?25h:");
- AddCap("vs=\\E[34l:");
- AddCap("ti=\\E[?1049h:");
- AddCap("te=\\E[?1049l:");
- if (display)
- {
- if (D_US)
- {
- AddCap("us=\\E[4m:");
- AddCap("ue=\\E[24m:");
- }
- if (D_SO)
- {
- AddCap("so=\\E[3m:");
- AddCap("se=\\E[23m:");
- }
- if (D_MB)
- AddCap("mb=\\E[5m:");
- if (D_MD)
- AddCap("md=\\E[1m:");
- if (D_MH)
- AddCap("mh=\\E[2m:");
- if (D_MR)
- AddCap("mr=\\E[7m:");
- if (D_MB || D_MD || D_MH || D_MR)
- AddCap("me=\\E[m:ms:");
- if (D_hascolor)
- AddCap("Co#8:pa#64:AF=\\E[3%dm:AB=\\E[4%dm:op=\\E[39;49m:AX:");
- if (D_VB)
- AddCap("vb=\\Eg:");
-#ifndef MAPKEYS
- if (D_KS)
- {
- AddCap("ks=\\E=:");
- AddCap("ke=\\E>:");
- }
- if (D_CCS)
- {
- AddCap("CS=\\E[?1h:");
- AddCap("CE=\\E[?1l:");
- }
-#endif
- if (D_CG0)
- AddCap("G0:");
- if (D_CC0 || (D_CS0 && *D_CS0))
- {
- AddCap("as=\\E(0:");
- AddCap("ae=\\E(B:");
- /* avoid `` because some shells dump core... */
- AddCap("ac=\\140\\140aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00:");
- }
- if (D_PO)
- {
- AddCap("po=\\E[5i:");
- AddCap("pf=\\E[4i:");
- }
- if (D_CZ0)
- {
- AddCap("Z0=\\E[?3h:");
- AddCap("Z1=\\E[?3l:");
- }
- if (D_CWS)
- AddCap("WS=\\E[8;%d;%dt:");
- }
- for (i = T_CAPS; i < T_ECAPS; i++)
- {
-#ifdef MAPKEYS
- struct action *act;
- if (i < T_OCAPS)
- {
- if (i >= T_KEYPAD) /* don't put keypad codes in TERMCAP */
- continue; /* - makes it too big */
- if (i >= T_CURSOR && i < T_OCAPS)
- {
- act = &umtab[i - (T_CURSOR - T_OCAPS + T_CAPS)];
- if (act->nr == RC_ILLEGAL)
- act = &dmtab[i - (T_CURSOR - T_OCAPS + T_CAPS)];
- }
- else
- {
- act = &umtab[i - T_CAPS];
- if (act->nr == RC_ILLEGAL)
- act = &dmtab[i - T_CAPS];
- }
- if (act->nr == RC_ILLEGAL && (i == T_NAVIGATE + 1 || i == T_NAVIGATE + 3))
- {
- /* kh -> @1, kH -> @7 */
- act = &umtab[i - T_CAPS - 1];
- if (act->nr == RC_ILLEGAL)
- act = &dmtab[i - T_CAPS - 1];
- }
- if (act->nr != RC_ILLEGAL)
- {
- if (act->nr == RC_STUFF)
- {
- MakeString(term[i].tcname, buf, sizeof(buf), act->args[0]);
- AddCap(buf);
- }
- continue;
- }
- }
-#endif
- if (display == 0)
- continue;
- switch(term[i].type)
- {
- case T_STR:
- if (D_tcs[i].str == 0)
- break;
- MakeString(term[i].tcname, buf, sizeof(buf), D_tcs[i].str);
- AddCap(buf);
- break;
- case T_FLG:
- if (D_tcs[i].flg == 0)
- break;
- sprintf(buf, "%s:", term[i].tcname);
- AddCap(buf);
- break;
- default:
- break;
- }
- }
- debug("MakeTermcap: end\n");
- return Termcap;
-}
-
-static void
-MakeString(cap, buf, buflen, s)
-char *cap, *buf;
-int buflen;
-char *s;
-{
- register char *p, *pmax;
- register unsigned int c;
-
- p = buf;
- pmax = p + buflen - (3+4+2);
- *p++ = *cap++;
- *p++ = *cap;
- *p++ = '=';
- while ((c = *s++) && (p < pmax))
- {
- switch (c)
- {
- case '\033':
- *p++ = '\\';
- *p++ = 'E';
- break;
- case ':':
- strcpy(p, "\\072");
- p += 4;
- break;
- case '^':
- case '\\':
- *p++ = '\\';
- *p++ = c;
- break;
- default:
- if (c >= 200)
- {
- sprintf(p, "\\%03o", c & 0377);
- p += 4;
- }
- else if (c < ' ')
- {
- *p++ = '^';
- *p++ = c + '@';
- }
- else
- *p++ = c;
- }
- }
- *p++ = ':';
- *p = '\0';
-}
-
-
-#undef QUOTES
-#define QUOTES(p) \
- (*p == '\\' && (p[1] == '\\' || p[1] == ',' || p[1] == '%'))
-
-#ifdef FONT
-int
-CreateTransTable(s)
-char *s;
-{
- int curchar;
- char *templ, *arg;
- int templlen;
- int templnsub;
- char *p, *sx;
- char **ctable;
- int l, c;
-
- if ((D_xtable = (char ***)malloc(256 * sizeof(char **))) == 0)
- {
- Msg(0, strnomem);
- return -1;
- }
- bzero((char *)D_xtable, 256 * sizeof(char **));
-
- while (*s)
- {
- if (QUOTES(s))
- s++;
- curchar = (unsigned char)*s++;
- if (curchar == 'B')
- curchar = 0; /* ASCII */
- templ = s;
- templlen = 0;
- templnsub = 0;
- if (D_xtable[curchar] == 0)
- {
- if ((D_xtable[curchar] = (char **)malloc(257 * sizeof(char *))) == 0)
- {
- Msg(0, strnomem);
- FreeTransTable();
- return -1;
- }
- bzero((char *)D_xtable[curchar], 257 * sizeof(char *));
- }
- ctable = D_xtable[curchar];
- for(; *s && *s != ','; s++)
- {
- if (QUOTES(s))
- s++;
- else if (*s == '%')
- {
- templnsub++;
- continue;
- }
- templlen++;
- }
- if (*s++ == 0)
- break;
- while (*s && *s != ',')
- {
- c = (unsigned char)*s++;
- if (QUOTES((s - 1)))
- c = (unsigned char)*s++;
- else if (c == '%')
- c = 256;
- if (ctable[c])
- free(ctable[c]);
- arg = s;
- l = copyarg(&s, (char *)0);
- if (c != 256)
- l = l * templnsub + templlen;
- if ((ctable[c] = (char *)malloc(l + 1)) == 0)
- {
- Msg(0, strnomem);
- FreeTransTable();
- return -1;
- }
- sx = ctable[c];
- for (p = ((c == 256) ? "%" : templ); *p && *p != ','; p++)
- {
- if (QUOTES(p))
- p++;
- else if (*p == '%')
- {
- s = arg;
- sx += copyarg(&s, sx);
- continue;
- }
- *sx++ = *p;
- }
- *sx = 0;
- ASSERT(ctable[c] + l * templnsub + templlen == sx);
- debug3("XC: %c %c->%s\n", curchar, c, ctable[c]);
- }
- if (*s == ',')
- s++;
- }
- return 0;
-}
-
-void
-FreeTransTable()
-{
- char ***p, **q;
- int i, j;
-
- if ((p = D_xtable) == 0)
- return;
- for (i = 0; i < 256; i++, p++)
- {
- if (*p == 0)
- continue;
- q = *p;
- for (j = 0; j < 257; j++, q++)
- if (*q)
- free(*q);
- free(*p);
- }
- free(D_xtable);
-}
-#endif /* FONT */
-
-static int
-copyarg(pp, s)
-char **pp, *s;
-{
- int l;
- char *p;
-
- for (l = 0, p = *pp; *p && *p != ','; p++)
- {
- if (QUOTES(p))
- p++;
- if (s)
- *s++ = *p;
- l++;
- }
- if (*p == ',')
- p++;
- *pp = p;
- return l;
-}
-
-
-/*
-**
-** Termcap routines that use our extra_incap
-**
-*/
-
-static int
-e_tgetent(bp, name)
-char *bp, *name;
-{
- int r;
-
-#ifdef USE_SETEUID
- xseteuid(real_uid);
- xsetegid(real_gid);
-#endif
- r = tgetent(bp, name);
-#ifdef USE_SETEUID
- xseteuid(eff_uid);
- xsetegid(eff_gid);
-#endif
- return r;
-}
-
-
-/* findcap:
- * cap = capability we are looking for
- * tepp = pointer to bufferpointer
- * n = size of buffer (0 = infinity)
- */
-
-static char *
-findcap(cap, tepp, n)
-char *cap;
-char **tepp;
-int n;
-{
- char *tep;
- char c, *p, *cp;
- int mode; /* mode: 0=LIT 1=^ 2=\x 3,4,5=\nnn */
- int num = 0, capl;
-
- if (!extra_incap)
- return 0;
- tep = *tepp;
- capl = strlen(cap);
- cp = 0;
- mode = 0;
- for (p = extra_incap; *p; )
- {
- if (strncmp(p, cap, capl) == 0)
- {
- p += capl;
- c = *p;
- if (c && c != ':' && c != '@')
- p++;
- if (c == 0 || c == '@' || c == '=' || c == ':' || c == '#')
- cp = tep;
- }
- while ((c = *p))
- {
- p++;
- if (mode == 0)
- {
- if (c == ':')
- break;
- if (c == '^')
- mode = 1;
- if (c == '\\')
- mode = 2;
- }
- else if (mode == 1)
- {
- mode = 0;
- c = c & 0x1f;
- }
- else if (mode == 2)
- {
- mode = 0;
- switch(c)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- mode = 3;
- num = 0;
- break;
- case 'E':
- c = 27;
- break;
- case 'n':
- c = '\n';
- break;
- case 'r':
- c = '\r';
- break;
- case 't':
- c = '\t';
- break;
- case 'b':
- c = '\b';
- break;
- case 'f':
- c = '\f';
- break;
- }
- }
- if (mode > 2)
- {
- num = num * 8 + (c - '0');
- if (mode++ == 5 || (*p < '0' || *p > '9'))
- {
- c = num;
- mode = 0;
- }
- }
- if (mode)
- continue;
-
- if (cp && n != 1)
- {
- *cp++ = c;
- n--;
- }
- }
- if (cp)
- {
- *cp++ = 0;
- *tepp = cp;
- debug2("'%s' found in extra_incap -> %s\n", cap, tep);
- return tep;
- }
- }
- return 0;
-}
-
-static char *
-e_tgetstr(cap, tepp)
-char *cap;
-char **tepp;
-{
- char *tep;
- if ((tep = findcap(cap, tepp, 0)))
- return (*tep == '@') ? 0 : tep;
- return tgetstr(cap, tepp);
-}
-
-static int
-e_tgetflag(cap)
-char *cap;
-{
- char buf[2], *bufp;
- char *tep;
- bufp = buf;
- if ((tep = findcap(cap, &bufp, 2)))
- return (*tep == '@') ? 0 : 1;
- return tgetflag(cap) > 0;
-}
-
-static int
-e_tgetnum(cap)
-char *cap;
-{
- char buf[20], *bufp;
- char *tep, c;
- int res, base = 10;
-
- bufp = buf;
- if ((tep = findcap(cap, &bufp, 20)))
- {
- c = *tep;
- if (c == '@')
- return -1;
- if (c == '0')
- base = 8;
- res = 0;
- while ((c = *tep++) >= '0' && c <= '9')
- res = res * base + (c - '0');
- return res;
- }
- return tgetnum(cap);
-}
-
diff --git a/src/tty.c.dist b/src/tty.c.dist
deleted file mode 100644
index 688cf62..0000000
--- a/src/tty.c.dist
+++ /dev/null
@@ -1,1887 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-/*
- * NOTICE: tty.c is automatically generated from tty.sh
- * Do not change anything here. If you then change tty.sh.
- */
-
-#include <sys/types.h>
-#include <signal.h>
-#include <fcntl.h>
-#ifndef sgi
-# include <sys/file.h>
-#endif
-#if !defined(sun) || defined(SUNOS3)
-# include <sys/ioctl.h> /* collosions with termios.h */
-#else
-# ifndef TIOCEXCL
-# include <sys/ttold.h> /* needed for TIOCEXCL */
-# endif
-#endif
-#ifdef __hpux
-# include <sys/modem.h>
-#endif
-
-#ifdef ISC
-# include <sys/tty.h>
-# include <sys/sioctl.h>
-# include <sys/pty.h>
-#endif
-
-#include "config.h"
-#ifdef SVR4
-#include <sys/stropts.h> /* for I_POP */
-#endif
-
-#include "screen.h"
-#include "extern.h"
-
-#if !defined(TIOCCONS) && defined(sun) && defined(SVR4)
-# include <sys/strredir.h>
-#endif
-
-extern struct display *display, *displays;
-extern int iflag;
-#if (!defined(TIOCCONS) && defined(SRIOCSREDIR)) || defined(linux)
-extern struct win *console_window;
-static void consredir_readev_fn __P((struct event *, char *));
-#endif
-
-int separate_sids = 1;
-
-static void DoSendBreak __P((int, int, int));
-static sigret_t SigAlrmDummy __P(SIGPROTOARG);
-
-
-/* Frank Schulz (fschulz@pyramid.com):
- * I have no idea why VSTART is not defined and my fix is probably not
- * the cleanest, but it works.
- */
-#if !defined(VSTART) && defined(_VSTART)
-#define VSTART _VSTART
-#endif
-#if !defined(VSTOP) && defined(_VSTOP)
-#define VSTOP _VSTOP
-#endif
-
-#ifndef O_NOCTTY
-# define O_NOCTTY 0
-#endif
-
-#ifndef TTYVMIN
-# define TTYVMIN 1
-#endif
-#ifndef TTYVTIME
-#define TTYVTIME 0
-#endif
-
-
-static sigret_t
-SigAlrmDummy SIGDEFARG
-{
- debug("SigAlrmDummy()\n");
- SIGRETURN;
-}
-
-/*
- * Carefully open a charcter device. Not used to open display ttys.
- * The second parameter is parsed for a few stty style options.
- */
-
-int
-OpenTTY(line, opt)
-char *line, *opt;
-{
- int f;
- struct mode Mode;
- sigret_t (*sigalrm)__P(SIGPROTOARG);
-
- sigalrm = signal(SIGALRM, SigAlrmDummy);
- alarm(2);
-
- /* this open only succeeds, if real uid is allowed */
- if ((f = secopen(line, O_RDWR | O_NONBLOCK | O_NOCTTY, 0)) == -1)
- {
- if (errno == EINTR)
- Msg(0, "Cannot open line '%s' for R/W: open() blocked, aborted.", line);
- else
- Msg(errno, "Cannot open line '%s' for R/W", line);
- alarm(0);
- signal(SIGALRM, sigalrm);
- return -1;
- }
- if (!isatty(f))
- {
- Msg(0, "'%s' is not a tty", line);
- alarm(0);
- signal(SIGALRM, sigalrm);
- close(f);
- return -1;
- }
-#if defined(I_POP) && defined(POP_TTYMODULES)
- debug("OpenTTY I_POP\n");
- while (ioctl(f, I_POP, (char *)0) >= 0)
- ;
-#endif
- /*
- * We come here exclusively. This is to stop all kermit and cu type things
- * accessing the same tty line.
- * Perhaps we should better create a lock in some /usr/spool/locks directory?
- */
-#ifdef TIOCEXCL
- errno = 0;
- if (ioctl(f, TIOCEXCL, (char *) 0) < 0)
- Msg(errno, "%s: ioctl TIOCEXCL failed", line);
- debug3("%d %d %d\n", getuid(), geteuid(), getpid());
- debug2("%s TIOCEXCL errno %d\n", line, errno);
-#endif /* TIOCEXCL */
- /*
- * We create a sane tty mode. We do not copy things from the display tty
- */
-#if WE_REALLY_WANT_TO_COPY_THE_TTY_MODE
- if (display)
- {
- debug1("OpenTTY: using mode of display for %s\n", line);
- Mode = D_NewMode;
- }
- else
-#endif
- InitTTY(&Mode, W_TYPE_PLAIN);
-
- SttyMode(&Mode, opt);
-#ifdef DEBUG
- DebugTTY(&Mode);
-#endif
- SetTTY(f, &Mode);
-
-#if defined(linux) && defined(TIOCMSET)
- {
- int mcs = 0;
- ioctl(f, TIOCMGET, &mcs);
- mcs |= TIOCM_RTS;
- ioctl(f, TIOCMSET, &mcs);
- }
-#endif
-
- brktty(f);
- alarm(0);
- signal(SIGALRM, sigalrm);
- debug2("'%s' CONNECT fd=%d.\n", line, f);
- return f;
-}
-
-
-/*
- * Tty mode handling
- */
-
-void
-InitTTY(m, ttyflag)
-struct mode *m;
-int ttyflag;
-{
- bzero((char *)m, sizeof(*m));
-#ifdef POSIX
- /* struct termios tio
- * defaults, as seen on SunOS 4.1.3
- */
- debug1("InitTTY: POSIX: termios defaults based on SunOS 4.1.3, but better (%d)\n", ttyflag);
-#if defined(BRKINT)
- m->tio.c_iflag |= BRKINT;
-#endif /* BRKINT */
-#if defined(IGNPAR)
- m->tio.c_iflag |= IGNPAR;
-#endif /* IGNPAR */
-/* IF{ISTRIP} m->tio.c_iflag |= ISTRIP; may be needed, let's try. jw. */
-#if defined(IXON)
- m->tio.c_iflag |= IXON;
-#endif /* IXON */
-/* IF{IMAXBEL} m->tio.c_iflag |= IMAXBEL; sorry, this one is ridiculus. jw */
-
- if (!ttyflag) /* may not even be good for ptys.. */
- {
-#if defined(ICRNL)
- m->tio.c_iflag |= ICRNL;
-#endif /* ICRNL */
-#if defined(ONLCR)
- m->tio.c_oflag |= ONLCR;
-#endif /* ONLCR */
-#if defined(TAB3)
- m->tio.c_oflag |= TAB3;
-#endif /* TAB3 */
-#if defined(OXTABS)
- m->tio.c_oflag |= OXTABS;
-#endif /* OXTABS */
-/* IF{PARENB} m->tio.c_cflag |= PARENB; nah! jw. */
-#if defined(OPOST)
- m->tio.c_oflag |= OPOST;
-#endif /* OPOST */
- }
-
-
-/*
- * Or-ing the speed into c_cflags is dangerous.
- * It breaks on bsdi, where c_ispeed and c_ospeed are extra longs.
- *
- * IF{B9600} m->tio.c_cflag |= B9600;
- * IF{IBSHIFT) && defined(B9600} m->tio.c_cflag |= B9600 << IBSHIFT;
- *
- * We hope that we have the posix calls to do it right:
- * If these are not available you might try the above.
- */
-#if defined(B9600)
- cfsetospeed(&m->tio, B9600);
-#endif /* B9600 */
-#if defined(B9600)
- cfsetispeed(&m->tio, B9600);
-#endif /* B9600 */
-
-#if defined(CS8)
- m->tio.c_cflag |= CS8;
-#endif /* CS8 */
-#if defined(CREAD)
- m->tio.c_cflag |= CREAD;
-#endif /* CREAD */
-#if defined(CLOCAL)
- m->tio.c_cflag |= CLOCAL;
-#endif /* CLOCAL */
-
-#if defined(ECHOCTL)
- m->tio.c_lflag |= ECHOCTL;
-#endif /* ECHOCTL */
-#if defined(ECHOKE)
- m->tio.c_lflag |= ECHOKE;
-#endif /* ECHOKE */
-
- if (!ttyflag)
- {
-#if defined(ISIG)
- m->tio.c_lflag |= ISIG;
-#endif /* ISIG */
-#if defined(ICANON)
- m->tio.c_lflag |= ICANON;
-#endif /* ICANON */
-#if defined(ECHO)
- m->tio.c_lflag |= ECHO;
-#endif /* ECHO */
- }
-#if defined(ECHOE)
- m->tio.c_lflag |= ECHOE;
-#endif /* ECHOE */
-#if defined(ECHOK)
- m->tio.c_lflag |= ECHOK;
-#endif /* ECHOK */
-#if defined(IEXTEN)
- m->tio.c_lflag |= IEXTEN;
-#endif /* IEXTEN */
-
-#if defined(VINTR)
-#if (VINTR < MAXCC)
- m->tio.c_cc[VINTR] = Ctrl('C');
-#endif
-#endif /* VINTR */
-#if defined(VQUIT)
-#if (VQUIT < MAXCC)
- m->tio.c_cc[VQUIT] = Ctrl('\\');
-#endif
-#endif /* VQUIT */
-#if defined(VERASE)
-#if (VERASE < MAXCC)
- m->tio.c_cc[VERASE] = 0x7f; /* DEL */
-#endif
-#endif /* VERASE */
-#if defined(VKILL)
-#if (VKILL < MAXCC)
- m->tio.c_cc[VKILL] = Ctrl('H');
-#endif
-#endif /* VKILL */
-#if defined(VEOF)
-#if (VEOF < MAXCC)
- m->tio.c_cc[VEOF] = Ctrl('D');
-#endif
-#endif /* VEOF */
-#if defined(VEOL)
-#if (VEOL < MAXCC)
- m->tio.c_cc[VEOL] = 0000;
-#endif
-#endif /* VEOL */
-#if defined(VEOL2)
-#if (VEOL2 < MAXCC)
- m->tio.c_cc[VEOL2] = 0000;
-#endif
-#endif /* VEOL2 */
-#if defined(VSWTCH)
-#if (VSWTCH < MAXCC)
- m->tio.c_cc[VSWTCH] = 0000;
-#endif
-#endif /* VSWTCH */
-#if defined(VSTART)
-#if (VSTART < MAXCC)
- m->tio.c_cc[VSTART] = Ctrl('Q');
-#endif
-#endif /* VSTART */
-#if defined(VSTOP)
-#if (VSTOP < MAXCC)
- m->tio.c_cc[VSTOP] = Ctrl('S');
-#endif
-#endif /* VSTOP */
-#if defined(VSUSP)
-#if (VSUSP < MAXCC)
- m->tio.c_cc[VSUSP] = Ctrl('Z');
-#endif
-#endif /* VSUSP */
-#if defined(VDSUSP)
-#if (VDSUSP < MAXCC)
- m->tio.c_cc[VDSUSP] = Ctrl('Y');
-#endif
-#endif /* VDSUSP */
-#if defined(VREPRINT)
-#if (VREPRINT < MAXCC)
- m->tio.c_cc[VREPRINT] = Ctrl('R');
-#endif
-#endif /* VREPRINT */
-#if defined(VDISCARD)
-#if (VDISCARD < MAXCC)
- m->tio.c_cc[VDISCARD] = Ctrl('O');
-#endif
-#endif /* VDISCARD */
-#if defined(VWERASE)
-#if (VWERASE < MAXCC)
- m->tio.c_cc[VWERASE] = Ctrl('W');
-#endif
-#endif /* VWERASE */
-#if defined(VLNEXT)
-#if (VLNEXT < MAXCC)
- m->tio.c_cc[VLNEXT] = Ctrl('V');
-#endif
-#endif /* VLNEXT */
-#if defined(VSTATUS)
-#if (VSTATUS < MAXCC)
- m->tio.c_cc[VSTATUS] = Ctrl('T');
-#endif
-#endif /* VSTATUS */
-
- if (ttyflag)
- {
- m->tio.c_cc[VMIN] = TTYVMIN;
- m->tio.c_cc[VTIME] = TTYVTIME;
- }
-
-# ifdef HPUX_LTCHARS_HACK
- m->m_ltchars.t_suspc = Ctrl('Z');
- m->m_ltchars.t_dsuspc = Ctrl('Y');
- m->m_ltchars.t_rprntc = Ctrl('R');
- m->m_ltchars.t_flushc = Ctrl('O');
- m->m_ltchars.t_werasc = Ctrl('W');
- m->m_ltchars.t_lnextc = Ctrl('V');
-# endif /* HPUX_LTCHARS_HACK */
-
-#else /* POSIX */
-
-# ifdef TERMIO
- debug1("InitTTY: nonPOSIX, struct termio a la Motorola SYSV68 (%d)\n", ttyflag);
- /* struct termio tio
- * defaults, as seen on Mototola SYSV68:
- * input: 7bit, CR->NL, ^S/^Q flow control
- * output: POSTprocessing: NL->NL-CR, Tabs to spaces
- * control: 9600baud, 8bit CSIZE, enable input
- * local: enable signals, erase/kill processing, echo on.
- */
-#if defined(ISTRIP)
- m->tio.c_iflag |= ISTRIP;
-#endif /* ISTRIP */
-#if defined(IXON)
- m->tio.c_iflag |= IXON;
-#endif /* IXON */
-
- if (!ttyflag) /* may not even be good for ptys.. */
- {
-#if defined(OPOST)
- m->tio.c_oflag |= OPOST;
-#endif /* OPOST */
-#if defined(ICRNL)
- m->tio.c_iflag |= ICRNL;
-#endif /* ICRNL */
-#if defined(ONLCR)
- m->tio.c_oflag |= ONLCR;
-#endif /* ONLCR */
-#if defined(TAB3)
- m->tio.c_oflag |= TAB3;
-#endif /* TAB3 */
- }
-
-#ifdef __bsdi__
- )-: cannot handle BSDI without POSIX
-#else
-#if defined(B9600)
- m->tio.c_cflag = B9600;
-#endif /* B9600 */
-#endif
-#if defined(CS8)
- m->tio.c_cflag |= CS8;
-#endif /* CS8 */
-#if defined(CREAD)
- m->tio.c_cflag |= CREAD;
-#endif /* CREAD */
-
- if (!ttyflag)
- {
-#if defined(ISIG)
- m->tio.c_lflag |= ISIG;
-#endif /* ISIG */
-#if defined(ICANON)
- m->tio.c_lflag |= ICANON;
-#endif /* ICANON */
-#if defined(ECHO)
- m->tio.c_lflag |= ECHO;
-#endif /* ECHO */
- }
-#if defined(ECHOE)
- m->tio.c_lflag |= ECHOE;
-#endif /* ECHOE */
-#if defined(ECHOK)
- m->tio.c_lflag |= ECHOK;
-#endif /* ECHOK */
-
-#if defined(VINTR)
-#if (VINTR < MAXCC)
- m->tio.c_cc[VINTR] = Ctrl('C');
-#endif
-#endif /* VINTR */
-#if defined(VQUIT)
-#if (VQUIT < MAXCC)
- m->tio.c_cc[VQUIT] = Ctrl('\\');
-#endif
-#endif /* VQUIT */
-#if defined(VERASE)
-#if (VERASE < MAXCC)
- m->tio.c_cc[VERASE] = 0177; /* DEL */
-#endif
-#endif /* VERASE */
-#if defined(VKILL)
-#if (VKILL < MAXCC)
- m->tio.c_cc[VKILL] = Ctrl('H');
-#endif
-#endif /* VKILL */
-#if defined(VEOF)
-#if (VEOF < MAXCC)
- m->tio.c_cc[VEOF] = Ctrl('D');
-#endif
-#endif /* VEOF */
-#if defined(VEOL)
-#if (VEOL < MAXCC)
- m->tio.c_cc[VEOL] = 0377;
-#endif
-#endif /* VEOL */
-#if defined(VEOL2)
-#if (VEOL2 < MAXCC)
- m->tio.c_cc[VEOL2] = 0377;
-#endif
-#endif /* VEOL2 */
-#if defined(VSWTCH)
-#if (VSWTCH < MAXCC)
- m->tio.c_cc[VSWTCH] = 0000;
-#endif
-#endif /* VSWTCH */
-
- if (ttyflag)
- {
- m->tio.c_cc[VMIN] = TTYVMIN;
- m->tio.c_cc[VTIME] = TTYVTIME;
- }
-
-# else /* TERMIO */
- debug1("InitTTY: BSD: defaults a la SunOS 4.1.3 (%d)\n", ttyflag);
- m->m_ttyb.sg_ispeed = B9600;
- m->m_ttyb.sg_ospeed = B9600;
- m->m_ttyb.sg_erase = 0177; /*DEL */
- m->m_ttyb.sg_kill = Ctrl('H');
- if (!ttyflag)
- m->m_ttyb.sg_flags = CRMOD | ECHO
-#if defined(ANYP)
- | ANYP
-#endif /* ANYP */
- ;
- else
- m->m_ttyb.sg_flags = CBREAK
-#if defined(ANYP)
- | ANYP
-#endif /* ANYP */
- ;
-
- m->m_tchars.t_intrc = Ctrl('C');
- m->m_tchars.t_quitc = Ctrl('\\');
- m->m_tchars.t_startc = Ctrl('Q');
- m->m_tchars.t_stopc = Ctrl('S');
- m->m_tchars.t_eofc = Ctrl('D');
- m->m_tchars.t_brkc = -1;
-
- m->m_ltchars.t_suspc = Ctrl('Z');
- m->m_ltchars.t_dsuspc = Ctrl('Y');
- m->m_ltchars.t_rprntc = Ctrl('R');
- m->m_ltchars.t_flushc = Ctrl('O');
- m->m_ltchars.t_werasc = Ctrl('W');
- m->m_ltchars.t_lnextc = Ctrl('V');
-
-#if defined(NTTYDISC)
- m->m_ldisc = NTTYDISC;
-#endif /* NTTYDISC */
-
- m->m_lmode = 0
-#if defined(LDECCTQ)
- | LDECCTQ
-#endif /* LDECCTQ */
-#if defined(LCTLECH)
- | LCTLECH
-#endif /* LCTLECH */
-#if defined(LPASS8)
- | LPASS8
-#endif /* LPASS8 */
-#if defined(LCRTKIL)
- | LCRTKIL
-#endif /* LCRTKIL */
-#if defined(LCRTERA)
- | LCRTERA
-#endif /* LCRTERA */
-#if defined(LCRTBS)
- | LCRTBS
-#endif /* LCRTBS */
- ;
-# endif /* TERMIO */
-#endif /* POSIX */
-
-#if defined(ENCODINGS) && defined(TIOCKSET)
- m->m_jtchars.t_ascii = 'J';
- m->m_jtchars.t_kanji = 'B';
- m->m_knjmode = KM_ASCII | KM_SYSSJIS;
-#endif
-}
-
-void
-SetTTY(fd, mp)
-int fd;
-struct mode *mp;
-{
- errno = 0;
-#ifdef POSIX
- tcsetattr(fd, TCSADRAIN, &mp->tio);
-# ifdef HPUX_LTCHARS_HACK
- ioctl(fd, TIOCSLTC, (char *)&mp->m_ltchars);
-# endif
-#else
-# ifdef TERMIO
- ioctl(fd, TCSETAW, (char *)&mp->tio);
-# ifdef CYTERMIO
- if (mp->tio.c_line == 3)
- {
- ioctl(fd, LDSETMAPKEY, (char *)&mp->m_mapkey);
- ioctl(fd, LDSETMAPSCREEN, (char *)&mp->m_mapscreen);
- ioctl(fd, LDSETBACKSPACE, (char *)&mp->m_backspace);
- }
-# endif
-# else
- /* ioctl(fd, TIOCSETP, (char *)&mp->m_ttyb); */
- ioctl(fd, TIOCSETC, (char *)&mp->m_tchars);
- ioctl(fd, TIOCLSET, (char *)&mp->m_lmode);
- ioctl(fd, TIOCSETD, (char *)&mp->m_ldisc);
- ioctl(fd, TIOCSETP, (char *)&mp->m_ttyb);
- ioctl(fd, TIOCSLTC, (char *)&mp->m_ltchars); /* moved here for apollo. jw */
-# endif
-#endif
-#if defined(ENCODINGS) && defined(TIOCKSET)
- ioctl(fd, TIOCKSETC, &mp->m_jtchars);
- ioctl(fd, TIOCKSET, &mp->m_knjmode);
-#endif
- if (errno)
- Msg(errno, "SetTTY (fd %d): ioctl failed", fd);
-}
-
-void
-GetTTY(fd, mp)
-int fd;
-struct mode *mp;
-{
- errno = 0;
-#ifdef POSIX
- tcgetattr(fd, &mp->tio);
-# ifdef HPUX_LTCHARS_HACK
- ioctl(fd, TIOCGLTC, (char *)&mp->m_ltchars);
-# endif
-#else
-# ifdef TERMIO
- ioctl(fd, TCGETA, (char *)&mp->tio);
-# ifdef CYTERMIO
- if (mp->tio.c_line == 3)
- {
- ioctl(fd, LDGETMAPKEY, (char *)&mp->m_mapkey);
- ioctl(fd, LDGETMAPSCREEN, (char *)&mp->m_mapscreen);
- ioctl(fd, LDGETBACKSPACE, (char *)&mp->m_backspace);
- }
- else
- {
- mp->m_mapkey = NOMAPKEY;
- mp->m_mapscreen = NOMAPSCREEN;
- mp->m_backspace = '\b';
- }
-# endif
-# else
- ioctl(fd, TIOCGETP, (char *)&mp->m_ttyb);
- ioctl(fd, TIOCGETC, (char *)&mp->m_tchars);
- ioctl(fd, TIOCGLTC, (char *)&mp->m_ltchars);
- ioctl(fd, TIOCLGET, (char *)&mp->m_lmode);
- ioctl(fd, TIOCGETD, (char *)&mp->m_ldisc);
-# endif
-#endif
-#if defined(ENCODINGS) && defined(TIOCKSET)
- ioctl(fd, TIOCKGETC, &mp->m_jtchars);
- ioctl(fd, TIOCKGET, &mp->m_knjmode);
-#endif
- if (errno)
- Msg(errno, "GetTTY (fd %d): ioctl failed", fd);
-}
-
-/*
- * needs interrupt = iflag and flow = d->d_flow
- */
-void
-SetMode(op, np, flow, interrupt)
-struct mode *op, *np;
-int flow, interrupt;
-{
- *np = *op;
-
- ASSERT(display);
-#if defined(TERMIO) || defined(POSIX)
-# ifdef CYTERMIO
- np->m_mapkey = NOMAPKEY;
- np->m_mapscreen = NOMAPSCREEN;
- np->tio.c_line = 0;
-# endif
-#if defined(ICRNL)
- np->tio.c_iflag &= ~ICRNL;
-#endif /* ICRNL */
-#if defined(ISTRIP)
- np->tio.c_iflag &= ~ISTRIP;
-#endif /* ISTRIP */
-#if defined(ONLCR)
- np->tio.c_oflag &= ~ONLCR;
-#endif /* ONLCR */
- np->tio.c_lflag &= ~(ICANON | ECHO);
- /*
- * From Andrew Myers (andru@tonic.lcs.mit.edu)
- * to avoid ^V^V-Problem on OSF1
- */
-#if defined(IEXTEN)
- np->tio.c_lflag &= ~IEXTEN;
-#endif /* IEXTEN */
-
- /*
- * Unfortunately, the master process never will get SIGINT if the real
- * terminal is different from the one on which it was originaly started
- * (process group membership has not been restored or the new tty could not
- * be made controlling again). In my solution, it is the attacher who
- * receives SIGINT (because it is always correctly associated with the real
- * tty) and forwards it to the master [kill(MasterPid, SIGINT)].
- * Marc Boucher (marc@CAM.ORG)
- */
- if (interrupt)
- np->tio.c_lflag |= ISIG;
- else
- np->tio.c_lflag &= ~ISIG;
- /*
- * careful, careful catche monkey..
- * never set VMIN and VTIME to zero, if you want blocking io.
- *
- * We may want to do a VMIN > 0, VTIME > 0 read on the ptys too, to
- * reduce interrupt frequency. But then we would not know how to
- * handle read returning 0. jw.
- */
- np->tio.c_cc[VMIN] = 1;
- np->tio.c_cc[VTIME] = 0;
- if (!interrupt || !flow)
- np->tio.c_cc[VINTR] = VDISABLE;
- np->tio.c_cc[VQUIT] = VDISABLE;
- if (flow == 0)
- {
-#if defined(VSTART)
-#if (VSTART < MAXCC)
- np->tio.c_cc[VSTART] = VDISABLE;
-#endif
-#endif /* VSTART */
-#if defined(VSTOP)
-#if (VSTOP < MAXCC)
- np->tio.c_cc[VSTOP] = VDISABLE;
-#endif
-#endif /* VSTOP */
- np->tio.c_iflag &= ~IXON;
- }
-#if defined(VDISCARD)
-#if (VDISCARD < MAXCC)
- np->tio.c_cc[VDISCARD] = VDISABLE;
-#endif
-#endif /* VDISCARD */
-#if defined(VLNEXT)
-#if (VLNEXT < MAXCC)
- np->tio.c_cc[VLNEXT] = VDISABLE;
-#endif
-#endif /* VLNEXT */
-#if defined(VSTATUS)
-#if (VSTATUS < MAXCC)
- np->tio.c_cc[VSTATUS] = VDISABLE;
-#endif
-#endif /* VSTATUS */
-#if defined(VSUSP)
-#if (VSUSP < MAXCC)
- np->tio.c_cc[VSUSP] = VDISABLE;
-#endif
-#endif /* VSUSP */
-#if defined(VERASE)
-#if (VERASE < MAXCC)
- np->tio.c_cc[VERASE] = VDISABLE;
-#endif
-#endif /* VERASE */
-#if defined(VKILL)
-#if (VKILL < MAXCC)
- np->tio.c_cc[VKILL] = VDISABLE;
-#endif
-#endif /* VKILL */
-# ifdef HPUX_LTCHARS_HACK
- np->m_ltchars.t_suspc = VDISABLE;
- np->m_ltchars.t_dsuspc = VDISABLE;
- np->m_ltchars.t_rprntc = VDISABLE;
- np->m_ltchars.t_flushc = VDISABLE;
- np->m_ltchars.t_werasc = VDISABLE;
- np->m_ltchars.t_lnextc = VDISABLE;
-# else /* HPUX_LTCHARS_HACK */
-#if defined(VDSUSP)
-#if (VDSUSP < MAXCC)
- np->tio.c_cc[VDSUSP] = VDISABLE;
-#endif
-#endif /* VDSUSP */
-#if defined(VREPRINT)
-#if (VREPRINT < MAXCC)
- np->tio.c_cc[VREPRINT] = VDISABLE;
-#endif
-#endif /* VREPRINT */
-#if defined(VWERASE)
-#if (VWERASE < MAXCC)
- np->tio.c_cc[VWERASE] = VDISABLE;
-#endif
-#endif /* VWERASE */
-# endif /* HPUX_LTCHARS_HACK */
-#else /* TERMIO || POSIX */
- if (!interrupt || !flow)
- np->m_tchars.t_intrc = -1;
- np->m_ttyb.sg_flags &= ~(CRMOD | ECHO);
- np->m_ttyb.sg_flags |= CBREAK;
-# if defined(CYRILL) && defined(CSTYLE) && defined(CS_8BITS)
- np->m_ttyb.sg_flags &= ~CSTYLE;
- np->m_ttyb.sg_flags |= CS_8BITS;
-# endif
- np->m_tchars.t_quitc = -1;
- if (flow == 0)
- {
- np->m_tchars.t_startc = -1;
- np->m_tchars.t_stopc = -1;
- }
- np->m_ltchars.t_suspc = -1;
- np->m_ltchars.t_dsuspc = -1;
- np->m_ltchars.t_flushc = -1;
- np->m_ltchars.t_lnextc = -1;
-#endif /* defined(TERMIO) || defined(POSIX) */
-}
-
-/* operates on display */
-void
-SetFlow(on)
-int on;
-{
- ASSERT(display);
- if (D_flow == on)
- return;
-#if defined(TERMIO) || defined(POSIX)
- if (on)
- {
- D_NewMode.tio.c_cc[VINTR] = iflag ? D_OldMode.tio.c_cc[VINTR] : VDISABLE;
-#if defined(VSTART)
-#if (VSTART < MAXCC)
- D_NewMode.tio.c_cc[VSTART] = D_OldMode.tio.c_cc[VSTART];
-#endif
-#endif /* VSTART */
-#if defined(VSTOP)
-#if (VSTOP < MAXCC)
- D_NewMode.tio.c_cc[VSTOP] = D_OldMode.tio.c_cc[VSTOP];
-#endif
-#endif /* VSTOP */
- D_NewMode.tio.c_iflag |= D_OldMode.tio.c_iflag & IXON;
- }
- else
- {
- D_NewMode.tio.c_cc[VINTR] = VDISABLE;
-#if defined(VSTART)
-#if (VSTART < MAXCC)
- D_NewMode.tio.c_cc[VSTART] = VDISABLE;
-#endif
-#endif /* VSTART */
-#if defined(VSTOP)
-#if (VSTOP < MAXCC)
- D_NewMode.tio.c_cc[VSTOP] = VDISABLE;
-#endif
-#endif /* VSTOP */
- D_NewMode.tio.c_iflag &= ~IXON;
- }
-# ifdef POSIX
- if (tcsetattr(D_userfd, TCSANOW, &D_NewMode.tio))
-# else
- if (ioctl(D_userfd, TCSETAW, (char *)&D_NewMode.tio) != 0)
-# endif
- debug1("SetFlow: ioctl errno %d\n", errno);
-#else /* POSIX || TERMIO */
- if (on)
- {
- D_NewMode.m_tchars.t_intrc = iflag ? D_OldMode.m_tchars.t_intrc : -1;
- D_NewMode.m_tchars.t_startc = D_OldMode.m_tchars.t_startc;
- D_NewMode.m_tchars.t_stopc = D_OldMode.m_tchars.t_stopc;
- }
- else
- {
- D_NewMode.m_tchars.t_intrc = -1;
- D_NewMode.m_tchars.t_startc = -1;
- D_NewMode.m_tchars.t_stopc = -1;
- }
- if (ioctl(D_userfd, TIOCSETC, (char *)&D_NewMode.m_tchars) != 0)
- debug1("SetFlow: ioctl errno %d\n", errno);
-#endif /* POSIX || TERMIO */
- D_flow = on;
-}
-
-/* parse commands from opt and modify m */
-int
-SttyMode(m, opt)
-struct mode *m;
-char *opt;
-{
- static const char sep[] = " \t:;,";
-
- if (!opt)
- return 0;
-
- while (*opt)
- {
- while (index(sep, *opt)) opt++;
- if (*opt >= '0' && *opt <= '9')
- {
- if (SetBaud(m, atoi(opt), atoi(opt)))
- return -1;
- }
- else if (!strncmp("cs7", opt, 3))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_cflag &= ~CSIZE;
- m->tio.c_cflag |= CS7;
-#else
- m->m_lmode &= ~LPASS8;
-#endif
- }
- else if (!strncmp("cs8", opt, 3))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_cflag &= ~CSIZE;
- m->tio.c_cflag |= CS8;
-#else
- m->m_lmode |= LPASS8;
-#endif
- }
- else if (!strncmp("istrip", opt, 6))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= ISTRIP;
-#else
- m->m_lmode &= ~LPASS8;
-#endif
- }
- else if (!strncmp("-istrip", opt, 7))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~ISTRIP;
-#else
- m->m_lmode |= LPASS8;
-#endif
- }
- else if (!strncmp("ixon", opt, 4))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= IXON;
-#else
- debug("SttyMode: no ixon in old bsd land.\n");
-#endif
- }
- else if (!strncmp("-ixon", opt, 5))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~IXON;
-#else
- debug("SttyMode: no -ixon in old bsd land.\n");
-#endif
- }
- else if (!strncmp("ixoff", opt, 5))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= IXOFF;
-#else
- m->m_ttyb.sg_flags |= TANDEM;
-#endif
- }
- else if (!strncmp("-ixoff", opt, 6))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~IXOFF;
-#else
- m->m_ttyb.sg_flags &= ~TANDEM;
-#endif
- }
- else if (!strncmp("crtscts", opt, 7))
- {
-#if (defined(POSIX) || defined(TERMIO)) && defined(CRTSCTS)
- m->tio.c_cflag |= CRTSCTS;
-#endif
- }
- else if (!strncmp("-crtscts", opt, 8))
- {
-#if (defined(POSIX) || defined(TERMIO)) && defined(CRTSCTS)
- m->tio.c_cflag &= ~CRTSCTS;
-#endif
- }
- else
- return -1;
- while (*opt && !index(sep, *opt)) opt++;
- }
- return 0;
-}
-
-/*
- * Job control handling
- *
- * Somehow the ultrix session handling is broken, so use
- * the bsdish variant.
- */
-
-/*ARGSUSED*/
-void
-brktty(fd)
-int fd;
-{
-#if defined(POSIX) && !defined(ultrix)
- if (separate_sids)
- setsid(); /* will break terminal affiliation */
- /* GNU added for Hurd systems 2001-10-10 */
-# if defined(BSD) && defined(TIOCSCTTY) && !defined(__GNU__)
- ioctl(fd, TIOCSCTTY, (char *)0);
-# endif /* BSD && TIOCSCTTY */
-#else /* POSIX */
-# ifdef SYSV
- if (separate_sids)
- setpgrp(); /* will break terminal affiliation */
-# else /* SYSV */
-# ifdef BSDJOBS
- int devtty;
-
- if ((devtty = open("/dev/tty", O_RDWR | O_NONBLOCK)) >= 0)
- {
- if (ioctl(devtty, TIOCNOTTY, (char *)0))
- debug2("brktty: ioctl(devtty=%d, TIOCNOTTY, 0) = %d\n", devtty, errno);
- close(devtty);
- }
-# endif /* BSDJOBS */
-# endif /* SYSV */
-#endif /* POSIX */
-}
-
-int
-fgtty(fd)
-int fd;
-{
-#ifdef BSDJOBS
- int mypid;
-
- mypid = getpid();
-
- /* The next lines should be obsolete. Can anybody check if they
- * are really needed on the BSD platforms?
- *
- * this is to avoid the message:
- * fgtty: Not a typewriter (25)
- */
-# if defined(__osf__) || (BSD >= 199103) || defined(ISC)
- if (separate_sids)
- setsid(); /* should be already done */
-# ifdef TIOCSCTTY
- ioctl(fd, TIOCSCTTY, (char *)0);
-# endif
-# endif
-
-# ifdef POSIX
- if (separate_sids)
- if (tcsetpgrp(fd, mypid))
- {
- debug1("fgtty: tcsetpgrp: %d\n", errno);
- return -1;
- }
-# else /* POSIX */
- if (ioctl(fd, TIOCSPGRP, (char *)&mypid) != 0)
- debug1("fgtty: TIOSETPGRP: %d\n", errno);
-# ifndef SYSV /* Already done in brktty():setpgrp() */
- if (separate_sids)
- if (setpgrp(fd, mypid))
- debug1("fgtty: setpgrp: %d\n", errno);
-# endif
-# endif /* POSIX */
-#endif /* BSDJOBS */
- return 0;
-}
-
-/*
- * The alm boards on our sparc center 1000 have a lousy driver.
- * We cannot generate long breaks unless we use the most ugly form
- * of ioctls. jw.
- */
-#ifdef POSIX
-int breaktype = 2;
-#else /* POSIX */
-# ifdef TCSBRK
-int breaktype = 1;
-# else
-int breaktype = 0;
-# endif
-#endif /* POSIX */
-
-#if defined(sun) && !defined(SVR4)
-# define HAVE_SUPER_TCSENDBREAK
-#endif
-
-/*
- * type:
- * 0: TIOCSBRK / TIOCCBRK
- * 1: TCSBRK
- * 2: tcsendbreak()
- * n: approximate duration in 1/4 seconds.
- */
-static void
-DoSendBreak(fd, n, type)
-int fd, n, type;
-{
- switch (type)
- {
- case 2: /* tcsendbreak() =============================== */
-#ifdef POSIX
-# ifdef HAVE_SUPER_TCSENDBREAK
- /* There is one rare case that I have tested, where tcsendbreak works
- * really great: this was an alm driver that came with SunOS 4.1.3
- * If you have this one, define the above symbol.
- * here we can use the second parameter to specify the duration.
- */
- debug2("tcsendbreak(fd=%d, %d)\n", fd, n);
- if (tcsendbreak(fd, n) < 0)
- Msg(errno, "cannot send BREAK (tcsendbreak)");
-# else
- /*
- * here we hope, that multiple calls to tcsendbreak() can
- * be concatenated to form a long break, as we do not know
- * what exact interpretation the second parameter has:
- *
- * - sunos 4: duration in quarter seconds
- * - sunos 5: 0 a short break, nonzero a tcdrain()
- * - hpux, irix: ignored
- * - mot88: duration in milliseconds
- * - aix: duration in milliseconds, but 0 is 25 milliseconds.
- */
- debug2("%d * tcsendbreak(fd=%d, 0)\n", n, fd);
- {
- int i;
-
- if (!n)
- n++;
- for (i = 0; i < n; i++)
- if (tcsendbreak(fd, 0) < 0)
- {
- Msg(errno, "cannot send BREAK (tcsendbreak SVR4)");
- return;
- }
- }
-# endif
-#else /* POSIX */
- Msg(0, "tcsendbreak() not available, change breaktype");
-#endif /* POSIX */
- break;
-
- case 1: /* TCSBRK ======================================= */
-#ifdef TCSBRK
- if (!n)
- n++;
- /*
- * Here too, we assume that short breaks can be concatenated to
- * perform long breaks. But for SOLARIS, this is not true, of course.
- */
- debug2("%d * TCSBRK fd=%d\n", n, fd);
- {
- int i;
-
- for (i = 0; i < n; i++)
- if (ioctl(fd, TCSBRK, (char *)0) < 0)
- {
- Msg(errno, "Cannot send BREAK (TCSBRK)");
- return;
- }
- }
-#else /* TCSBRK */
- Msg(0, "TCSBRK not available, change breaktype");
-#endif /* TCSBRK */
- break;
-
- case 0: /* TIOCSBRK / TIOCCBRK ========================== */
-#if defined(TIOCSBRK) && defined(TIOCCBRK)
- /*
- * This is very rude. Screen actively celebrates the break.
- * But it may be the only save way to issue long breaks.
- */
- debug("TIOCSBRK TIOCCBRK\n");
- if (ioctl(fd, TIOCSBRK, (char *)0) < 0)
- {
- Msg(errno, "Can't send BREAK (TIOCSBRK)");
- return;
- }
- sleep1000(n ? n * 250 : 250);
- if (ioctl(fd, TIOCCBRK, (char *)0) < 0)
- {
- Msg(errno, "BREAK stuck!!! -- HELP! (TIOCCBRK)");
- return;
- }
-#else /* TIOCSBRK && TIOCCBRK */
- Msg(0, "TIOCSBRK/CBRK not available, change breaktype");
-#endif /* TIOCSBRK && TIOCCBRK */
- break;
-
- default: /* unknown ========================== */
- Msg(0, "Internal SendBreak error: method %d unknown", type);
- }
-}
-
-/*
- * Send a break for n * 0.25 seconds. Tty must be PLAIN.
- * The longest possible break allowed here is 15 seconds.
- */
-
-void
-SendBreak(wp, n, closeopen)
-struct win *wp;
-int n, closeopen;
-{
- sigret_t (*sigalrm)__P(SIGPROTOARG);
-
-#ifdef BUILTIN_TELNET
- if (wp->w_type == W_TYPE_TELNET)
- {
- TelBreak(wp);
- return;
- }
-#endif
- if (wp->w_type != W_TYPE_PLAIN)
- return;
-
- debug3("break(%d, %d) fd %d\n", n, closeopen, wp->w_ptyfd);
-
-#ifdef POSIX
- (void) tcflush(wp->w_ptyfd, TCIOFLUSH);
-#else
-# ifdef TIOCFLUSH
- (void) ioctl(wp->w_ptyfd, TIOCFLUSH, (char *)0);
-# endif /* TIOCFLUSH */
-#endif /* POSIX */
-
- if (closeopen)
- {
- close(wp->w_ptyfd);
- sleep1000(n ? n * 250 : 250);
- if ((wp->w_ptyfd = OpenTTY(wp->w_tty, wp->w_cmdargs[1])) < 1)
- {
- Msg(0, "Ouch, cannot reopen line %s, please try harder", wp->w_tty);
- return;
- }
- (void) fcntl(wp->w_ptyfd, F_SETFL, FNBLOCK);
- }
- else
- {
- sigalrm = signal(SIGALRM, SigAlrmDummy);
- alarm(15);
-
- DoSendBreak(wp->w_ptyfd, n, breaktype);
-
- alarm(0);
- signal(SIGALRM, sigalrm);
- }
- debug(" broken.\n");
-}
-
-/*
- * Console grabbing
- */
-
-#if (!defined(TIOCCONS) && defined(SRIOCSREDIR)) || defined(linux)
-
-static struct event consredir_ev;
-static int consredirfd[2] = {-1, -1};
-
-static void
-consredir_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- char *p, *n, buf[256];
- int l;
-
- if (!console_window || (l = read(consredirfd[0], buf, sizeof(buf))) <= 0)
- {
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- evdeq(ev);
- return;
- }
- for (p = n = buf; l > 0; n++, l--)
- if (*n == '\n')
- {
- if (n > p)
- WriteString(console_window, p, n - p);
- WriteString(console_window, "\r\n", 2);
- p = n + 1;
- }
- if (n > p)
- WriteString(console_window, p, n - p);
-}
-
-#endif
-
-/*ARGSUSED*/
-int
-TtyGrabConsole(fd, on, rc_name)
-int fd, on;
-char *rc_name;
-{
-#if defined(TIOCCONS) && !defined(linux)
- struct display *d;
- int ret = 0;
- int sfd = -1;
-
- if (on < 0)
- return 0; /* pty close will ungrab */
- if (on)
- {
- if (displays == 0)
- {
- Msg(0, "I need a display");
- return -1;
- }
- for (d = displays; d; d = d->d_next)
- if (strcmp(d->d_usertty, "/dev/console") == 0)
- break;
- if (d)
- {
- Msg(0, "too dangerous - screen is running on /dev/console");
- return -1;
- }
- }
-
- if (!on)
- {
- char *slave;
- if ((fd = OpenPTY(&slave)) < 0)
- {
- Msg(errno, "%s: could not open detach pty master", rc_name);
- return -1;
- }
- if ((sfd = open(slave, O_RDWR | O_NOCTTY)) < 0)
- {
- Msg(errno, "%s: could not open detach pty slave", rc_name);
- close(fd);
- return -1;
- }
- }
- if (UserContext() == 1)
- UserReturn(ioctl(fd, TIOCCONS, (char *)&on));
- ret = UserStatus();
- if (ret)
- Msg(errno, "%s: ioctl TIOCCONS failed", rc_name);
- if (!on)
- {
- close(sfd);
- close(fd);
- }
- return ret;
-
-#else
-# if defined(SRIOCSREDIR) || defined(linux)
- struct display *d;
-# ifdef SRIOCSREDIR
- int cfd;
-# else
- struct mode new1, new2;
- char *slave;
-# endif
-
- if (on > 0)
- {
- if (displays == 0)
- {
- Msg(0, "I need a display");
- return -1;
- }
- for (d = displays; d; d = d->d_next)
- if (strcmp(d->d_usertty, "/dev/console") == 0)
- break;
- if (d)
- {
- Msg(0, "too dangerous - screen is running on /dev/console");
- return -1;
- }
- }
- if (consredirfd[0] >= 0)
- {
- evdeq(&consredir_ev);
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- }
- if (on <= 0)
- return 0;
-# ifdef SRIOCSREDIR
- if ((cfd = secopen("/dev/console", O_RDWR|O_NOCTTY, 0)) == -1)
- {
- Msg(errno, "/dev/console");
- return -1;
- }
- if (pipe(consredirfd))
- {
- Msg(errno, "pipe");
- close(cfd);
- consredirfd[0] = consredirfd[1] = -1;
- return -1;
- }
- if (ioctl(cfd, SRIOCSREDIR, consredirfd[1]))
- {
- Msg(errno, "SRIOCSREDIR ioctl");
- close(cfd);
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- return -1;
- }
- close(cfd);
-# else
- /* special linux workaround for a too restrictive kernel */
- if ((consredirfd[0] = OpenPTY(&slave)) < 0)
- {
- Msg(errno, "%s: could not open detach pty master", rc_name);
- return -1;
- }
- if ((consredirfd[1] = open(slave, O_RDWR | O_NOCTTY)) < 0)
- {
- Msg(errno, "%s: could not open detach pty slave", rc_name);
- close(consredirfd[0]);
- return -1;
- }
- InitTTY(&new1, 0);
- SetMode(&new1, &new2, 0, 0);
- SetTTY(consredirfd[1], &new2);
- if (UserContext() == 1)
- UserReturn(ioctl(consredirfd[1], TIOCCONS, (char *)&on));
- if (UserStatus())
- {
- Msg(errno, "%s: ioctl TIOCCONS failed", rc_name);
- close(consredirfd[0]);
- close(consredirfd[1]);
- return -1;
- }
-# endif
- consredir_ev.fd = consredirfd[0];
- consredir_ev.type = EV_READ;
- consredir_ev.handler = consredir_readev_fn;
- evenq(&consredir_ev);
- return 0;
-# else
- if (on > 0)
- Msg(0, "%s: don't know how to grab the console", rc_name);
- return -1;
-# endif
-#endif
-}
-
-/*
- * Read modem control lines of a physical tty and write them to buf
- * in a readable format.
- * Will not write more than 256 characters to buf.
- * Returns buf;
- */
-char *
-TtyGetModemStatus(fd, buf)
-int fd;
-char *buf;
-{
- char *p = buf;
-#ifdef TIOCGSOFTCAR
- unsigned int softcar;
-#endif
-#if defined(TIOCMGET) || defined(TIOCMODG)
- unsigned int mflags;
-#else
-# ifdef MCGETA
- /* this is yet another interface, found on hpux. grrr */
- mflag mflags;
-#if defined(MDTR)
-# define TIOCM_DTR MDTR
-#endif /* MDTR */
-#if defined(MRTS)
-# define TIOCM_RTS MRTS
-#endif /* MRTS */
-#if defined(MDSR)
-# define TIOCM_DSR MDSR
-#endif /* MDSR */
-#if defined(MDCD)
-# define TIOCM_CAR MDCD
-#endif /* MDCD */
-#if defined(MRI)
-# define TIOCM_RNG MRI
-#endif /* MRI */
-#if defined(MCTS)
-# define TIOCM_CTS MCTS
-#endif /* MCTS */
-# endif
-#endif
-#if defined(CLOCAL) || defined(CRTSCTS)
- struct mode mtio; /* screen.h */
-#endif
-#if defined(CRTSCTS) || defined(TIOCM_CTS)
- int rtscts;
-#endif
- int clocal;
-
-#if defined(CLOCAL) || defined(CRTSCTS)
- GetTTY(fd, &mtio);
-#endif
- clocal = 0;
-#ifdef CLOCAL
- if (mtio.tio.c_cflag & CLOCAL)
- {
- clocal = 1;
- *p++ = '{';
- }
-#endif
-
-#ifdef TIOCM_CTS
-# ifdef CRTSCTS
- if (!(mtio.tio.c_cflag & CRTSCTS))
- rtscts = 0;
- else
-# endif /* CRTSCTS */
- rtscts = 1;
-#endif /* TIOCM_CTS */
-
-#ifdef TIOCGSOFTCAR
- if (ioctl(fd, TIOCGSOFTCAR, (char *)&softcar) < 0)
- softcar = 0;
-#endif
-
-#if defined(TIOCMGET) || defined(TIOCMODG) || defined(MCGETA)
-# ifdef TIOCMGET
- if (ioctl(fd, TIOCMGET, (char *)&mflags) < 0)
-# else
-# ifdef TIOCMODG
- if (ioctl(fd, TIOCMODG, (char *)&mflags) < 0)
-# else
- if (ioctl(fd, MCGETA, &mflags) < 0)
-# endif
-# endif
- {
-#ifdef TIOCGSOFTCAR
- sprintf(p, "NO-TTY? %s", softcar ? "(CD)" : "CD");
-#else
- sprintf(p, "NO-TTY?");
-#endif
- p += strlen(p);
- }
- else
- {
- char *s;
-# ifdef FANCY_MODEM
-# ifdef TIOCM_LE
- if (!(mflags & TIOCM_LE))
- for (s = "!LE "; *s; *p++ = *s++);
-# endif
-# endif /* FANCY_MODEM */
-
-# ifdef TIOCM_RTS
- s = "!RTS "; if (mflags & TIOCM_RTS) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_CTS
- s = "!CTS ";
- if (!rtscts)
- {
- *p++ = '(';
- s = "!CTS) ";
- }
- if (mflags & TIOCM_CTS) s++;
- while (*s) *p++ = *s++;
-# endif
-
-# ifdef TIOCM_DTR
- s = "!DTR "; if (mflags & TIOCM_DTR) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_DSR
- s = "!DSR "; if (mflags & TIOCM_DSR) s++;
- while (*s) *p++ = *s++;
-# endif
-# if defined(TIOCM_CD) || defined(TIOCM_CAR)
- s = "!CD ";
-# ifdef TIOCGSOFTCAR
- if (softcar)
- {
- *p++ = '(';
- s = "!CD) ";
- }
-# endif
-# ifdef TIOCM_CD
- if (mflags & TIOCM_CD) s++;
-# else
- if (mflags & TIOCM_CAR) s++;
-# endif
- while (*s) *p++ = *s++;
-# endif
-# if defined(TIOCM_RI) || defined(TIOCM_RNG)
-# ifdef TIOCM_RI
- if (mflags & TIOCM_RI)
-# else
- if (mflags & TIOCM_RNG)
-# endif
- for (s = "RI "; *s; *p++ = *s++);
-# endif
-# ifdef FANCY_MODEM
-# ifdef TIOCM_ST
- s = "!ST "; if (mflags & TIOCM_ST) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_SR
- s = "!SR "; if (mflags & TIOCM_SR) s++;
- while (*s) *p++ = *s++;
-# endif
-# endif /* FANCY_MODEM */
- if (p > buf && p[-1] == ' ')
- p--;
- *p = '\0';
- }
-#else
-# ifdef TIOCGSOFTCAR
- sprintf(p, " %s", softcar ? "(CD)", "CD");
- p += strlen(p);
-# endif
-#endif
- if (clocal)
- *p++ = '}';
- *p = '\0';
- return buf;
-}
-
-/*
- * Old bsd-ish machines may not have any of the baudrate B... symbols.
- * We hope to detect them here, so that the btable[] below always has
- * many entries.
- */
-#ifndef POSIX
-# ifndef TERMIO
-# if !defined(B9600) && !defined(B2400) && !defined(B1200) && !defined(B300)
-#if !defined(B0)
-#define B0 0
-#endif /* B0 */
-#if !defined(B50)
-#define B50 1
-#endif /* B50 */
-#if !defined(B75)
-#define B75 2
-#endif /* B75 */
-#if !defined(B110)
-#define B110 3
-#endif /* B110 */
-#if !defined(B134)
-#define B134 4
-#endif /* B134 */
-#if !defined(B150)
-#define B150 5
-#endif /* B150 */
-#if !defined(B200)
-#define B200 6
-#endif /* B200 */
-#if !defined(B300)
-#define B300 7
-#endif /* B300 */
-#if !defined(B600)
-#define B600 8
-#endif /* B600 */
-#if !defined(B1200)
-#define B1200 9
-#endif /* B1200 */
-#if !defined(B1800)
-#define B1800 10
-#endif /* B1800 */
-#if !defined(B2400)
-#define B2400 11
-#endif /* B2400 */
-#if !defined(B4800)
-#define B4800 12
-#endif /* B4800 */
-#if !defined(B9600)
-#define B9600 13
-#endif /* B9600 */
-#if !defined(EXTA)
-#define EXTA 14
-#endif /* EXTA */
-#if !defined(EXTB)
-#define EXTB 15
-#endif /* EXTB */
-# endif
-# endif
-#endif
-
-/*
- * On hpux, idx and sym will be different.
- * Rumor has it that, we need idx in D_dospeed to make tputs
- * padding correct.
- * Frequently used entries come first.
- */
-static struct baud_values btable[] =
-{
-#if defined(B9600)
- { 13, 9600, B9600 },
-#endif /* B9600 */
-#if defined(B19200)
- { 14, 19200, B19200 },
-#endif /* B19200 */
-#if defined(EXTA)
- { 14, 19200, EXTA },
-#endif /* EXTA */
-#if defined(B38400)
- { 15, 38400, B38400 },
-#endif /* B38400 */
-#if defined(EXTB)
- { 15, 38400, EXTB },
-#endif /* EXTB */
-#if defined(B57600)
- { 16, 57600, B57600 },
-#endif /* B57600 */
-#if defined(B115200)
- { 17, 115200, B115200 },
-#endif /* B115200 */
-#if defined(B230400)
- { 18, 230400, B230400 },
-#endif /* B230400 */
-#if defined(B460800)
- { 19, 460800, B460800 },
-#endif /* B460800 */
-#if defined(B7200)
- { 13, 7200, B7200 },
-#endif /* B7200 */
-#if defined(B4800)
- { 12, 4800, B4800 },
-#endif /* B4800 */
-#if defined(B3600)
- { 12, 3600, B3600 },
-#endif /* B3600 */
-#if defined(B2400)
- { 11, 2400, B2400 },
-#endif /* B2400 */
-#if defined(B1800)
- { 10, 1800, B1800 },
-#endif /* B1800 */
-#if defined(B1200)
- { 9, 1200, B1200 },
-#endif /* B1200 */
-#if defined(B900)
- { 9, 900, B900 },
-#endif /* B900 */
-#if defined(B600)
- { 8, 600, B600 },
-#endif /* B600 */
-#if defined(B300)
- { 7, 300, B300 },
-#endif /* B300 */
-#if defined(B200)
- { 6, 200, B200 },
-#endif /* B200 */
-#if defined(B150)
- { 5, 150, B150 },
-#endif /* B150 */
-#if defined(B134)
- { 4, 134, B134 },
-#endif /* B134 */
-#if defined(B110)
- { 3, 110, B110 },
-#endif /* B110 */
-#if defined(B75)
- { 2, 75, B75 },
-#endif /* B75 */
-#if defined(B50)
- { 1, 50, B50 },
-#endif /* B50 */
-#if defined(B0)
- { 0, 0, B0 },
-#endif /* B0 */
- { -1, -1, -1 }
-};
-
-/*
- * baud may either be a bits-per-second value or a symbolic
- * value as returned by cfget?speed()
- */
-struct baud_values *
-lookup_baud(baud)
-int baud;
-{
- struct baud_values *p;
-
- for (p = btable; p->idx >= 0; p++)
- if (baud == p->bps || baud == p->sym)
- return p;
- return NULL;
-}
-
-/*
- * change the baud rate in a mode structure.
- * ibaud and obaud are given in bit/second, or at your option as
- * termio B... symbols as defined in e.g. suns sys/ttydev.h
- * -1 means don't change.
- */
-int
-SetBaud(m, ibaud, obaud)
-struct mode *m;
-int ibaud, obaud;
-{
- struct baud_values *ip, *op;
-
- if ((!(ip = lookup_baud(ibaud)) && ibaud != -1) ||
- (!(op = lookup_baud(obaud)) && obaud != -1))
- return -1;
-
-#ifdef POSIX
- if (ip) cfsetispeed(&m->tio, ip->sym);
- if (op) cfsetospeed(&m->tio, op->sym);
-#else /* POSIX */
-# ifdef TERMIO
- if (ip)
- {
-# ifdef IBSHIFT
- m->tio.c_cflag &= ~(CBAUD << IBSHIFT);
- m->tio.c_cflag |= (ip->sym & CBAUD) << IBSHIFT;
-# else /* IBSHIFT */
- if (ibaud != obaud)
- return -1;
-# endif /* IBSHIFT */
- }
- if (op)
- {
- m->tio.c_cflag &= ~CBAUD;
- m->tio.c_cflag |= op->sym & CBAUD;
- }
-# else /* TERMIO */
- if (ip) m->m_ttyb.sg_ispeed = ip->idx;
- if (op) m->m_ttyb.sg_ospeed = op->idx;
-# endif /* TERMIO */
-#endif /* POSIX */
- return 0;
-}
-
-/*
- * Write out the mode struct in a readable form
- */
-
-#ifdef DEBUG
-void
-DebugTTY(m)
-struct mode *m;
-{
- int i;
-
-#ifdef POSIX
- debug("struct termios tio:\n");
- debug1("c_iflag = %#x\n", (unsigned int)m->tio.c_iflag);
- debug1("c_oflag = %#x\n", (unsigned int)m->tio.c_oflag);
- debug1("c_cflag = %#x\n", (unsigned int)m->tio.c_cflag);
- debug1("c_lflag = %#x\n", (unsigned int)m->tio.c_lflag);
- debug1("cfgetospeed() = %d\n", (int)cfgetospeed(&m->tio));
- debug1("cfgetispeed() = %d\n", (int)cfgetispeed(&m->tio));
- for (i = 0; i < sizeof(m->tio.c_cc)/sizeof(*m->tio.c_cc); i++)
- {
- debug2("c_cc[%d] = %#x\n", i, m->tio.c_cc[i]);
- }
-# ifdef HPUX_LTCHARS_HACK
- debug1("suspc = %#02x\n", m->m_ltchars.t_suspc);
- debug1("dsuspc = %#02x\n", m->m_ltchars.t_dsuspc);
- debug1("rprntc = %#02x\n", m->m_ltchars.t_rprntc);
- debug1("flushc = %#02x\n", m->m_ltchars.t_flushc);
- debug1("werasc = %#02x\n", m->m_ltchars.t_werasc);
- debug1("lnextc = %#02x\n", m->m_ltchars.t_lnextc);
-# endif /* HPUX_LTCHARS_HACK */
-#else /* POSIX */
-# ifdef TERMIO
- debug("struct termio tio:\n");
- debug1("c_iflag = %04o\n", m->tio.c_iflag);
- debug1("c_oflag = %04o\n", m->tio.c_oflag);
- debug1("c_cflag = %04o\n", m->tio.c_cflag);
- debug1("c_lflag = %04o\n", m->tio.c_lflag);
- for (i = 0; i < sizeof(m->tio.c_cc)/sizeof(*m->tio.c_cc); i++)
- {
- debug2("c_cc[%d] = %04o\n", i, m->tio.c_cc[i]);
- }
-# else /* TERMIO */
- debug1("sg_ispeed = %d\n", m->m_ttyb.sg_ispeed);
- debug1("sg_ospeed = %d\n", m->m_ttyb.sg_ospeed);
- debug1("sg_erase = %#02x\n", m->m_ttyb.sg_erase);
- debug1("sg_kill = %#02x\n", m->m_ttyb.sg_kill);
- debug1("sg_flags = %#04x\n", (unsigned short)m->m_ttyb.sg_flags);
- debug1("intrc = %#02x\n", m->m_tchars.t_intrc);
- debug1("quitc = %#02x\n", m->m_tchars.t_quitc);
- debug1("startc = %#02x\n", m->m_tchars.t_startc);
- debug1("stopc = %#02x\n", m->m_tchars.t_stopc);
- debug1("eofc = %#02x\n", m->m_tchars.t_eofc);
- debug1("brkc = %#02x\n", m->m_tchars.t_brkc);
- debug1("suspc = %#02x\n", m->m_ltchars.t_suspc);
- debug1("dsuspc = %#02x\n", m->m_ltchars.t_dsuspc);
- debug1("rprntc = %#02x\n", m->m_ltchars.t_rprntc);
- debug1("flushc = %#02x\n", m->m_ltchars.t_flushc);
- debug1("werasc = %#02x\n", m->m_ltchars.t_werasc);
- debug1("lnextc = %#02x\n", m->m_ltchars.t_lnextc);
- debug1("ldisc = %d\n", m->m_ldisc);
- debug1("lmode = %#x\n", m->m_lmode);
-# endif /* TERMIO */
-#endif /* POSIX */
-}
-#endif /* DEBUG */
diff --git a/src/tty.sh b/src/tty.sh
deleted file mode 100644
index b612f6c..0000000
--- a/src/tty.sh
+++ /dev/null
@@ -1,1563 +0,0 @@
-#! /bin/sh
-# sh tty.sh tty.c
-# This inserts all the needed #ifdefs for IF{} statements
-# and generates tty.c
-
-#
-# Stupid cpp on A/UX barfs on ``#if defined(FOO) && FOO < 17'' when
-# FOO is undefined. Reported by Robert C. Tindall (rtindall@uidaho.edu)
-#
-rm -f $1
-sed -e '1,26d' \
--e 's%^IF{\([^}]*\)}\(.*\)%#if defined(\1)\
-\2\
-#endif /* \1 */%' \
--e 's%^IFN{\([^}]*\)}\(.*\)%#if !defined(\1)\
-\2\
-#endif /* \1 */%' \
--e 's%^XIF{\([^}]*\)}\(.*\)%#if defined(\1)\
-#if (\1 < MAXCC)\
-\2\
-#endif \
-#endif /* \1 */%' \
- < $0 > $1
-chmod -w $1
-exit 0
-
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-/*
- * NOTICE: tty.c is automatically generated from tty.sh
- * Do not change anything here. If you then change tty.sh.
- */
-
-#include <sys/types.h>
-#include <signal.h>
-#include <fcntl.h>
-#ifndef sgi
-# include <sys/file.h>
-#endif
-#if !defined(sun) || defined(SUNOS3)
-# include <sys/ioctl.h> /* collosions with termios.h */
-#else
-# ifndef TIOCEXCL
-# include <sys/ttold.h> /* needed for TIOCEXCL */
-# endif
-#endif
-#ifdef __hpux
-# include <sys/modem.h>
-#endif
-
-#ifdef ISC
-# include <sys/tty.h>
-# include <sys/sioctl.h>
-# include <sys/pty.h>
-#endif
-
-#include "config.h"
-#ifdef SVR4
-#include <sys/stropts.h> /* for I_POP */
-#endif
-
-#include "screen.h"
-#include "extern.h"
-
-#if !defined(TIOCCONS) && defined(sun) && defined(SVR4)
-# include <sys/strredir.h>
-#endif
-
-extern struct display *display, *displays;
-extern int iflag;
-#if (!defined(TIOCCONS) && defined(SRIOCSREDIR)) || defined(linux)
-extern struct win *console_window;
-static void consredir_readev_fn __P((struct event *, char *));
-#endif
-
-int separate_sids = 1;
-
-static void DoSendBreak __P((int, int, int));
-static sigret_t SigAlrmDummy __P(SIGPROTOARG);
-
-
-/* Frank Schulz (fschulz@pyramid.com):
- * I have no idea why VSTART is not defined and my fix is probably not
- * the cleanest, but it works.
- */
-#if !defined(VSTART) && defined(_VSTART)
-#define VSTART _VSTART
-#endif
-#if !defined(VSTOP) && defined(_VSTOP)
-#define VSTOP _VSTOP
-#endif
-
-#ifndef O_NOCTTY
-# define O_NOCTTY 0
-#endif
-
-#ifndef TTYVMIN
-# define TTYVMIN 1
-#endif
-#ifndef TTYVTIME
-#define TTYVTIME 0
-#endif
-
-
-static sigret_t
-SigAlrmDummy SIGDEFARG
-{
- debug("SigAlrmDummy()\n");
- SIGRETURN;
-}
-
-/*
- * Carefully open a charcter device. Not used to open display ttys.
- * The second parameter is parsed for a few stty style options.
- */
-
-int
-OpenTTY(line, opt)
-char *line, *opt;
-{
- int f;
- struct mode Mode;
- sigret_t (*sigalrm)__P(SIGPROTOARG);
-
- sigalrm = signal(SIGALRM, SigAlrmDummy);
- alarm(2);
-
- /* this open only succeeds, if real uid is allowed */
- if ((f = secopen(line, O_RDWR | O_NONBLOCK | O_NOCTTY, 0)) == -1)
- {
- if (errno == EINTR)
- Msg(0, "Cannot open line '%s' for R/W: open() blocked, aborted.", line);
- else
- Msg(errno, "Cannot open line '%s' for R/W", line);
- alarm(0);
- signal(SIGALRM, sigalrm);
- return -1;
- }
- if (!isatty(f))
- {
- Msg(0, "'%s' is not a tty", line);
- alarm(0);
- signal(SIGALRM, sigalrm);
- close(f);
- return -1;
- }
-#if defined(I_POP) && defined(POP_TTYMODULES)
- debug("OpenTTY I_POP\n");
- while (ioctl(f, I_POP, (char *)0) >= 0)
- ;
-#endif
- /*
- * We come here exclusively. This is to stop all kermit and cu type things
- * accessing the same tty line.
- * Perhaps we should better create a lock in some /usr/spool/locks directory?
- */
-#ifdef TIOCEXCL
- errno = 0;
- if (ioctl(f, TIOCEXCL, (char *) 0) < 0)
- Msg(errno, "%s: ioctl TIOCEXCL failed", line);
- debug3("%d %d %d\n", getuid(), geteuid(), getpid());
- debug2("%s TIOCEXCL errno %d\n", line, errno);
-#endif /* TIOCEXCL */
- /*
- * We create a sane tty mode. We do not copy things from the display tty
- */
-#if WE_REALLY_WANT_TO_COPY_THE_TTY_MODE
- if (display)
- {
- debug1("OpenTTY: using mode of display for %s\n", line);
- Mode = D_NewMode;
- }
- else
-#endif
- InitTTY(&Mode, W_TYPE_PLAIN);
-
- SttyMode(&Mode, opt);
-#ifdef DEBUG
- DebugTTY(&Mode);
-#endif
- SetTTY(f, &Mode);
-
-#if defined(linux) && defined(TIOCMSET)
- {
- int mcs = 0;
- ioctl(f, TIOCMGET, &mcs);
- mcs |= TIOCM_RTS;
- ioctl(f, TIOCMSET, &mcs);
- }
-#endif
-
- brktty(f);
- alarm(0);
- signal(SIGALRM, sigalrm);
- debug2("'%s' CONNECT fd=%d.\n", line, f);
- return f;
-}
-
-
-/*
- * Tty mode handling
- */
-
-void
-InitTTY(m, ttyflag)
-struct mode *m;
-int ttyflag;
-{
- bzero((char *)m, sizeof(*m));
-#ifdef POSIX
- /* struct termios tio
- * defaults, as seen on SunOS 4.1.3
- */
- debug1("InitTTY: POSIX: termios defaults based on SunOS 4.1.3, but better (%d)\n", ttyflag);
-IF{BRKINT} m->tio.c_iflag |= BRKINT;
-IF{IGNPAR} m->tio.c_iflag |= IGNPAR;
-/* IF{ISTRIP} m->tio.c_iflag |= ISTRIP; may be needed, let's try. jw. */
-IF{IXON} m->tio.c_iflag |= IXON;
-/* IF{IMAXBEL} m->tio.c_iflag |= IMAXBEL; sorry, this one is ridiculus. jw */
-
- if (!ttyflag) /* may not even be good for ptys.. */
- {
-IF{ICRNL} m->tio.c_iflag |= ICRNL;
-IF{ONLCR} m->tio.c_oflag |= ONLCR;
-IF{TAB3} m->tio.c_oflag |= TAB3;
-IF{OXTABS} m->tio.c_oflag |= OXTABS;
-/* IF{PARENB} m->tio.c_cflag |= PARENB; nah! jw. */
-IF{OPOST} m->tio.c_oflag |= OPOST;
- }
-
-
-/*
- * Or-ing the speed into c_cflags is dangerous.
- * It breaks on bsdi, where c_ispeed and c_ospeed are extra longs.
- *
- * IF{B9600} m->tio.c_cflag |= B9600;
- * IF{IBSHIFT) && defined(B9600} m->tio.c_cflag |= B9600 << IBSHIFT;
- *
- * We hope that we have the posix calls to do it right:
- * If these are not available you might try the above.
- */
-IF{B9600} cfsetospeed(&m->tio, B9600);
-IF{B9600} cfsetispeed(&m->tio, B9600);
-
-IF{CS8} m->tio.c_cflag |= CS8;
-IF{CREAD} m->tio.c_cflag |= CREAD;
-IF{CLOCAL} m->tio.c_cflag |= CLOCAL;
-
-IF{ECHOCTL} m->tio.c_lflag |= ECHOCTL;
-IF{ECHOKE} m->tio.c_lflag |= ECHOKE;
-
- if (!ttyflag)
- {
-IF{ISIG} m->tio.c_lflag |= ISIG;
-IF{ICANON} m->tio.c_lflag |= ICANON;
-IF{ECHO} m->tio.c_lflag |= ECHO;
- }
-IF{ECHOE} m->tio.c_lflag |= ECHOE;
-IF{ECHOK} m->tio.c_lflag |= ECHOK;
-IF{IEXTEN} m->tio.c_lflag |= IEXTEN;
-
-XIF{VINTR} m->tio.c_cc[VINTR] = Ctrl('C');
-XIF{VQUIT} m->tio.c_cc[VQUIT] = Ctrl('\\');
-XIF{VERASE} m->tio.c_cc[VERASE] = 0x7f; /* DEL */
-XIF{VKILL} m->tio.c_cc[VKILL] = Ctrl('H');
-XIF{VEOF} m->tio.c_cc[VEOF] = Ctrl('D');
-XIF{VEOL} m->tio.c_cc[VEOL] = 0000;
-XIF{VEOL2} m->tio.c_cc[VEOL2] = 0000;
-XIF{VSWTCH} m->tio.c_cc[VSWTCH] = 0000;
-XIF{VSTART} m->tio.c_cc[VSTART] = Ctrl('Q');
-XIF{VSTOP} m->tio.c_cc[VSTOP] = Ctrl('S');
-XIF{VSUSP} m->tio.c_cc[VSUSP] = Ctrl('Z');
-XIF{VDSUSP} m->tio.c_cc[VDSUSP] = Ctrl('Y');
-XIF{VREPRINT} m->tio.c_cc[VREPRINT] = Ctrl('R');
-XIF{VDISCARD} m->tio.c_cc[VDISCARD] = Ctrl('O');
-XIF{VWERASE} m->tio.c_cc[VWERASE] = Ctrl('W');
-XIF{VLNEXT} m->tio.c_cc[VLNEXT] = Ctrl('V');
-XIF{VSTATUS} m->tio.c_cc[VSTATUS] = Ctrl('T');
-
- if (ttyflag)
- {
- m->tio.c_cc[VMIN] = TTYVMIN;
- m->tio.c_cc[VTIME] = TTYVTIME;
- }
-
-# ifdef HPUX_LTCHARS_HACK
- m->m_ltchars.t_suspc = Ctrl('Z');
- m->m_ltchars.t_dsuspc = Ctrl('Y');
- m->m_ltchars.t_rprntc = Ctrl('R');
- m->m_ltchars.t_flushc = Ctrl('O');
- m->m_ltchars.t_werasc = Ctrl('W');
- m->m_ltchars.t_lnextc = Ctrl('V');
-# endif /* HPUX_LTCHARS_HACK */
-
-#else /* POSIX */
-
-# ifdef TERMIO
- debug1("InitTTY: nonPOSIX, struct termio a la Motorola SYSV68 (%d)\n", ttyflag);
- /* struct termio tio
- * defaults, as seen on Mototola SYSV68:
- * input: 7bit, CR->NL, ^S/^Q flow control
- * output: POSTprocessing: NL->NL-CR, Tabs to spaces
- * control: 9600baud, 8bit CSIZE, enable input
- * local: enable signals, erase/kill processing, echo on.
- */
-IF{ISTRIP} m->tio.c_iflag |= ISTRIP;
-IF{IXON} m->tio.c_iflag |= IXON;
-
- if (!ttyflag) /* may not even be good for ptys.. */
- {
-IF{OPOST} m->tio.c_oflag |= OPOST;
-IF{ICRNL} m->tio.c_iflag |= ICRNL;
-IF{ONLCR} m->tio.c_oflag |= ONLCR;
-IF{TAB3} m->tio.c_oflag |= TAB3;
- }
-
-#ifdef __bsdi__
- )-: cannot handle BSDI without POSIX
-#else
-IF{B9600} m->tio.c_cflag = B9600;
-#endif
-IF{CS8} m->tio.c_cflag |= CS8;
-IF{CREAD} m->tio.c_cflag |= CREAD;
-
- if (!ttyflag)
- {
-IF{ISIG} m->tio.c_lflag |= ISIG;
-IF{ICANON} m->tio.c_lflag |= ICANON;
-IF{ECHO} m->tio.c_lflag |= ECHO;
- }
-IF{ECHOE} m->tio.c_lflag |= ECHOE;
-IF{ECHOK} m->tio.c_lflag |= ECHOK;
-
-XIF{VINTR} m->tio.c_cc[VINTR] = Ctrl('C');
-XIF{VQUIT} m->tio.c_cc[VQUIT] = Ctrl('\\');
-XIF{VERASE} m->tio.c_cc[VERASE] = 0177; /* DEL */
-XIF{VKILL} m->tio.c_cc[VKILL] = Ctrl('H');
-XIF{VEOF} m->tio.c_cc[VEOF] = Ctrl('D');
-XIF{VEOL} m->tio.c_cc[VEOL] = 0377;
-XIF{VEOL2} m->tio.c_cc[VEOL2] = 0377;
-XIF{VSWTCH} m->tio.c_cc[VSWTCH] = 0000;
-
- if (ttyflag)
- {
- m->tio.c_cc[VMIN] = TTYVMIN;
- m->tio.c_cc[VTIME] = TTYVTIME;
- }
-
-# else /* TERMIO */
- debug1("InitTTY: BSD: defaults a la SunOS 4.1.3 (%d)\n", ttyflag);
- m->m_ttyb.sg_ispeed = B9600;
- m->m_ttyb.sg_ospeed = B9600;
- m->m_ttyb.sg_erase = 0177; /*DEL */
- m->m_ttyb.sg_kill = Ctrl('H');
- if (!ttyflag)
- m->m_ttyb.sg_flags = CRMOD | ECHO
-IF{ANYP} | ANYP
- ;
- else
- m->m_ttyb.sg_flags = CBREAK
-IF{ANYP} | ANYP
- ;
-
- m->m_tchars.t_intrc = Ctrl('C');
- m->m_tchars.t_quitc = Ctrl('\\');
- m->m_tchars.t_startc = Ctrl('Q');
- m->m_tchars.t_stopc = Ctrl('S');
- m->m_tchars.t_eofc = Ctrl('D');
- m->m_tchars.t_brkc = -1;
-
- m->m_ltchars.t_suspc = Ctrl('Z');
- m->m_ltchars.t_dsuspc = Ctrl('Y');
- m->m_ltchars.t_rprntc = Ctrl('R');
- m->m_ltchars.t_flushc = Ctrl('O');
- m->m_ltchars.t_werasc = Ctrl('W');
- m->m_ltchars.t_lnextc = Ctrl('V');
-
-IF{NTTYDISC} m->m_ldisc = NTTYDISC;
-
- m->m_lmode = 0
-IF{LDECCTQ} | LDECCTQ
-IF{LCTLECH} | LCTLECH
-IF{LPASS8} | LPASS8
-IF{LCRTKIL} | LCRTKIL
-IF{LCRTERA} | LCRTERA
-IF{LCRTBS} | LCRTBS
- ;
-# endif /* TERMIO */
-#endif /* POSIX */
-
-#if defined(ENCODINGS) && defined(TIOCKSET)
- m->m_jtchars.t_ascii = 'J';
- m->m_jtchars.t_kanji = 'B';
- m->m_knjmode = KM_ASCII | KM_SYSSJIS;
-#endif
-}
-
-void
-SetTTY(fd, mp)
-int fd;
-struct mode *mp;
-{
- errno = 0;
-#ifdef POSIX
- tcsetattr(fd, TCSADRAIN, &mp->tio);
-# ifdef HPUX_LTCHARS_HACK
- ioctl(fd, TIOCSLTC, (char *)&mp->m_ltchars);
-# endif
-#else
-# ifdef TERMIO
- ioctl(fd, TCSETAW, (char *)&mp->tio);
-# ifdef CYTERMIO
- if (mp->tio.c_line == 3)
- {
- ioctl(fd, LDSETMAPKEY, (char *)&mp->m_mapkey);
- ioctl(fd, LDSETMAPSCREEN, (char *)&mp->m_mapscreen);
- ioctl(fd, LDSETBACKSPACE, (char *)&mp->m_backspace);
- }
-# endif
-# else
- /* ioctl(fd, TIOCSETP, (char *)&mp->m_ttyb); */
- ioctl(fd, TIOCSETC, (char *)&mp->m_tchars);
- ioctl(fd, TIOCLSET, (char *)&mp->m_lmode);
- ioctl(fd, TIOCSETD, (char *)&mp->m_ldisc);
- ioctl(fd, TIOCSETP, (char *)&mp->m_ttyb);
- ioctl(fd, TIOCSLTC, (char *)&mp->m_ltchars); /* moved here for apollo. jw */
-# endif
-#endif
-#if defined(ENCODINGS) && defined(TIOCKSET)
- ioctl(fd, TIOCKSETC, &mp->m_jtchars);
- ioctl(fd, TIOCKSET, &mp->m_knjmode);
-#endif
- if (errno)
- Msg(errno, "SetTTY (fd %d): ioctl failed", fd);
-}
-
-void
-GetTTY(fd, mp)
-int fd;
-struct mode *mp;
-{
- errno = 0;
-#ifdef POSIX
- tcgetattr(fd, &mp->tio);
-# ifdef HPUX_LTCHARS_HACK
- ioctl(fd, TIOCGLTC, (char *)&mp->m_ltchars);
-# endif
-#else
-# ifdef TERMIO
- ioctl(fd, TCGETA, (char *)&mp->tio);
-# ifdef CYTERMIO
- if (mp->tio.c_line == 3)
- {
- ioctl(fd, LDGETMAPKEY, (char *)&mp->m_mapkey);
- ioctl(fd, LDGETMAPSCREEN, (char *)&mp->m_mapscreen);
- ioctl(fd, LDGETBACKSPACE, (char *)&mp->m_backspace);
- }
- else
- {
- mp->m_mapkey = NOMAPKEY;
- mp->m_mapscreen = NOMAPSCREEN;
- mp->m_backspace = '\b';
- }
-# endif
-# else
- ioctl(fd, TIOCGETP, (char *)&mp->m_ttyb);
- ioctl(fd, TIOCGETC, (char *)&mp->m_tchars);
- ioctl(fd, TIOCGLTC, (char *)&mp->m_ltchars);
- ioctl(fd, TIOCLGET, (char *)&mp->m_lmode);
- ioctl(fd, TIOCGETD, (char *)&mp->m_ldisc);
-# endif
-#endif
-#if defined(ENCODINGS) && defined(TIOCKSET)
- ioctl(fd, TIOCKGETC, &mp->m_jtchars);
- ioctl(fd, TIOCKGET, &mp->m_knjmode);
-#endif
- if (errno)
- Msg(errno, "GetTTY (fd %d): ioctl failed", fd);
-}
-
-/*
- * needs interrupt = iflag and flow = d->d_flow
- */
-void
-SetMode(op, np, flow, interrupt)
-struct mode *op, *np;
-int flow, interrupt;
-{
- *np = *op;
-
- ASSERT(display);
-#if defined(TERMIO) || defined(POSIX)
-# ifdef CYTERMIO
- np->m_mapkey = NOMAPKEY;
- np->m_mapscreen = NOMAPSCREEN;
- np->tio.c_line = 0;
-# endif
-IF{ICRNL} np->tio.c_iflag &= ~ICRNL;
-IF{ISTRIP} np->tio.c_iflag &= ~ISTRIP;
-IF{ONLCR} np->tio.c_oflag &= ~ONLCR;
- np->tio.c_lflag &= ~(ICANON | ECHO);
- /*
- * From Andrew Myers (andru@tonic.lcs.mit.edu)
- * to avoid ^V^V-Problem on OSF1
- */
-IF{IEXTEN} np->tio.c_lflag &= ~IEXTEN;
-
- /*
- * Unfortunately, the master process never will get SIGINT if the real
- * terminal is different from the one on which it was originaly started
- * (process group membership has not been restored or the new tty could not
- * be made controlling again). In my solution, it is the attacher who
- * receives SIGINT (because it is always correctly associated with the real
- * tty) and forwards it to the master [kill(MasterPid, SIGINT)].
- * Marc Boucher (marc@CAM.ORG)
- */
- if (interrupt)
- np->tio.c_lflag |= ISIG;
- else
- np->tio.c_lflag &= ~ISIG;
- /*
- * careful, careful catche monkey..
- * never set VMIN and VTIME to zero, if you want blocking io.
- *
- * We may want to do a VMIN > 0, VTIME > 0 read on the ptys too, to
- * reduce interrupt frequency. But then we would not know how to
- * handle read returning 0. jw.
- */
- np->tio.c_cc[VMIN] = 1;
- np->tio.c_cc[VTIME] = 0;
- if (!interrupt || !flow)
- np->tio.c_cc[VINTR] = VDISABLE;
- np->tio.c_cc[VQUIT] = VDISABLE;
- if (flow == 0)
- {
-XIF{VSTART} np->tio.c_cc[VSTART] = VDISABLE;
-XIF{VSTOP} np->tio.c_cc[VSTOP] = VDISABLE;
- np->tio.c_iflag &= ~IXON;
- }
-XIF{VDISCARD} np->tio.c_cc[VDISCARD] = VDISABLE;
-XIF{VLNEXT} np->tio.c_cc[VLNEXT] = VDISABLE;
-XIF{VSTATUS} np->tio.c_cc[VSTATUS] = VDISABLE;
-XIF{VSUSP} np->tio.c_cc[VSUSP] = VDISABLE;
-XIF{VERASE} np->tio.c_cc[VERASE] = VDISABLE;
-XIF{VKILL} np->tio.c_cc[VKILL] = VDISABLE;
-# ifdef HPUX_LTCHARS_HACK
- np->m_ltchars.t_suspc = VDISABLE;
- np->m_ltchars.t_dsuspc = VDISABLE;
- np->m_ltchars.t_rprntc = VDISABLE;
- np->m_ltchars.t_flushc = VDISABLE;
- np->m_ltchars.t_werasc = VDISABLE;
- np->m_ltchars.t_lnextc = VDISABLE;
-# else /* HPUX_LTCHARS_HACK */
-XIF{VDSUSP} np->tio.c_cc[VDSUSP] = VDISABLE;
-XIF{VREPRINT} np->tio.c_cc[VREPRINT] = VDISABLE;
-XIF{VWERASE} np->tio.c_cc[VWERASE] = VDISABLE;
-# endif /* HPUX_LTCHARS_HACK */
-#else /* TERMIO || POSIX */
- if (!interrupt || !flow)
- np->m_tchars.t_intrc = -1;
- np->m_ttyb.sg_flags &= ~(CRMOD | ECHO);
- np->m_ttyb.sg_flags |= CBREAK;
-# if defined(CYRILL) && defined(CSTYLE) && defined(CS_8BITS)
- np->m_ttyb.sg_flags &= ~CSTYLE;
- np->m_ttyb.sg_flags |= CS_8BITS;
-# endif
- np->m_tchars.t_quitc = -1;
- if (flow == 0)
- {
- np->m_tchars.t_startc = -1;
- np->m_tchars.t_stopc = -1;
- }
- np->m_ltchars.t_suspc = -1;
- np->m_ltchars.t_dsuspc = -1;
- np->m_ltchars.t_flushc = -1;
- np->m_ltchars.t_lnextc = -1;
-#endif /* defined(TERMIO) || defined(POSIX) */
-}
-
-/* operates on display */
-void
-SetFlow(on)
-int on;
-{
- ASSERT(display);
- if (D_flow == on)
- return;
-#if defined(TERMIO) || defined(POSIX)
- if (on)
- {
- D_NewMode.tio.c_cc[VINTR] = iflag ? D_OldMode.tio.c_cc[VINTR] : VDISABLE;
-XIF{VSTART} D_NewMode.tio.c_cc[VSTART] = D_OldMode.tio.c_cc[VSTART];
-XIF{VSTOP} D_NewMode.tio.c_cc[VSTOP] = D_OldMode.tio.c_cc[VSTOP];
- D_NewMode.tio.c_iflag |= D_OldMode.tio.c_iflag & IXON;
- }
- else
- {
- D_NewMode.tio.c_cc[VINTR] = VDISABLE;
-XIF{VSTART} D_NewMode.tio.c_cc[VSTART] = VDISABLE;
-XIF{VSTOP} D_NewMode.tio.c_cc[VSTOP] = VDISABLE;
- D_NewMode.tio.c_iflag &= ~IXON;
- }
-# ifdef POSIX
- if (tcsetattr(D_userfd, TCSANOW, &D_NewMode.tio))
-# else
- if (ioctl(D_userfd, TCSETAW, (char *)&D_NewMode.tio) != 0)
-# endif
- debug1("SetFlow: ioctl errno %d\n", errno);
-#else /* POSIX || TERMIO */
- if (on)
- {
- D_NewMode.m_tchars.t_intrc = iflag ? D_OldMode.m_tchars.t_intrc : -1;
- D_NewMode.m_tchars.t_startc = D_OldMode.m_tchars.t_startc;
- D_NewMode.m_tchars.t_stopc = D_OldMode.m_tchars.t_stopc;
- }
- else
- {
- D_NewMode.m_tchars.t_intrc = -1;
- D_NewMode.m_tchars.t_startc = -1;
- D_NewMode.m_tchars.t_stopc = -1;
- }
- if (ioctl(D_userfd, TIOCSETC, (char *)&D_NewMode.m_tchars) != 0)
- debug1("SetFlow: ioctl errno %d\n", errno);
-#endif /* POSIX || TERMIO */
- D_flow = on;
-}
-
-/* parse commands from opt and modify m */
-int
-SttyMode(m, opt)
-struct mode *m;
-char *opt;
-{
- static const char sep[] = " \t:;,";
-
- if (!opt)
- return 0;
-
- while (*opt)
- {
- while (index(sep, *opt)) opt++;
- if (*opt >= '0' && *opt <= '9')
- {
- if (SetBaud(m, atoi(opt), atoi(opt)))
- return -1;
- }
- else if (!strncmp("cs7", opt, 3))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_cflag &= ~CSIZE;
- m->tio.c_cflag |= CS7;
-#else
- m->m_lmode &= ~LPASS8;
-#endif
- }
- else if (!strncmp("cs8", opt, 3))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_cflag &= ~CSIZE;
- m->tio.c_cflag |= CS8;
-#else
- m->m_lmode |= LPASS8;
-#endif
- }
- else if (!strncmp("istrip", opt, 6))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= ISTRIP;
-#else
- m->m_lmode &= ~LPASS8;
-#endif
- }
- else if (!strncmp("-istrip", opt, 7))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~ISTRIP;
-#else
- m->m_lmode |= LPASS8;
-#endif
- }
- else if (!strncmp("ixon", opt, 4))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= IXON;
-#else
- debug("SttyMode: no ixon in old bsd land.\n");
-#endif
- }
- else if (!strncmp("-ixon", opt, 5))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~IXON;
-#else
- debug("SttyMode: no -ixon in old bsd land.\n");
-#endif
- }
- else if (!strncmp("ixoff", opt, 5))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag |= IXOFF;
-#else
- m->m_ttyb.sg_flags |= TANDEM;
-#endif
- }
- else if (!strncmp("-ixoff", opt, 6))
- {
-#if defined(POSIX) || defined(TERMIO)
- m->tio.c_iflag &= ~IXOFF;
-#else
- m->m_ttyb.sg_flags &= ~TANDEM;
-#endif
- }
- else if (!strncmp("crtscts", opt, 7))
- {
-#if (defined(POSIX) || defined(TERMIO)) && defined(CRTSCTS)
- m->tio.c_cflag |= CRTSCTS;
-#endif
- }
- else if (!strncmp("-crtscts", opt, 8))
- {
-#if (defined(POSIX) || defined(TERMIO)) && defined(CRTSCTS)
- m->tio.c_cflag &= ~CRTSCTS;
-#endif
- }
- else
- return -1;
- while (*opt && !index(sep, *opt)) opt++;
- }
- return 0;
-}
-
-/*
- * Job control handling
- *
- * Somehow the ultrix session handling is broken, so use
- * the bsdish variant.
- */
-
-/*ARGSUSED*/
-void
-brktty(fd)
-int fd;
-{
-#if defined(POSIX) && !defined(ultrix)
- if (separate_sids)
- setsid(); /* will break terminal affiliation */
- /* GNU added for Hurd systems 2001-10-10 */
-# if defined(BSD) && defined(TIOCSCTTY) && !defined(__GNU__)
- ioctl(fd, TIOCSCTTY, (char *)0);
-# endif /* BSD && TIOCSCTTY */
-#else /* POSIX */
-# ifdef SYSV
- if (separate_sids)
- setpgrp(); /* will break terminal affiliation */
-# else /* SYSV */
-# ifdef BSDJOBS
- int devtty;
-
- if ((devtty = open("/dev/tty", O_RDWR | O_NONBLOCK)) >= 0)
- {
- if (ioctl(devtty, TIOCNOTTY, (char *)0))
- debug2("brktty: ioctl(devtty=%d, TIOCNOTTY, 0) = %d\n", devtty, errno);
- close(devtty);
- }
-# endif /* BSDJOBS */
-# endif /* SYSV */
-#endif /* POSIX */
-}
-
-int
-fgtty(fd)
-int fd;
-{
-#ifdef BSDJOBS
- int mypid;
-
- mypid = getpid();
-
- /* The next lines should be obsolete. Can anybody check if they
- * are really needed on the BSD platforms?
- *
- * this is to avoid the message:
- * fgtty: Not a typewriter (25)
- */
-# if defined(__osf__) || (BSD >= 199103) || defined(ISC)
- if (separate_sids)
- setsid(); /* should be already done */
-# ifdef TIOCSCTTY
- ioctl(fd, TIOCSCTTY, (char *)0);
-# endif
-# endif
-
-# ifdef POSIX
- if (separate_sids)
- if (tcsetpgrp(fd, mypid))
- {
- debug1("fgtty: tcsetpgrp: %d\n", errno);
- return -1;
- }
-# else /* POSIX */
- if (ioctl(fd, TIOCSPGRP, (char *)&mypid) != 0)
- debug1("fgtty: TIOSETPGRP: %d\n", errno);
-# ifndef SYSV /* Already done in brktty():setpgrp() */
- if (separate_sids)
- if (setpgrp(fd, mypid))
- debug1("fgtty: setpgrp: %d\n", errno);
-# endif
-# endif /* POSIX */
-#endif /* BSDJOBS */
- return 0;
-}
-
-/*
- * The alm boards on our sparc center 1000 have a lousy driver.
- * We cannot generate long breaks unless we use the most ugly form
- * of ioctls. jw.
- */
-#ifdef POSIX
-int breaktype = 2;
-#else /* POSIX */
-# ifdef TCSBRK
-int breaktype = 1;
-# else
-int breaktype = 0;
-# endif
-#endif /* POSIX */
-
-#if defined(sun) && !defined(SVR4)
-# define HAVE_SUPER_TCSENDBREAK
-#endif
-
-/*
- * type:
- * 0: TIOCSBRK / TIOCCBRK
- * 1: TCSBRK
- * 2: tcsendbreak()
- * n: approximate duration in 1/4 seconds.
- */
-static void
-DoSendBreak(fd, n, type)
-int fd, n, type;
-{
- switch (type)
- {
- case 2: /* tcsendbreak() =============================== */
-#ifdef POSIX
-# ifdef HAVE_SUPER_TCSENDBREAK
- /* There is one rare case that I have tested, where tcsendbreak works
- * really great: this was an alm driver that came with SunOS 4.1.3
- * If you have this one, define the above symbol.
- * here we can use the second parameter to specify the duration.
- */
- debug2("tcsendbreak(fd=%d, %d)\n", fd, n);
- if (tcsendbreak(fd, n) < 0)
- Msg(errno, "cannot send BREAK (tcsendbreak)");
-# else
- /*
- * here we hope, that multiple calls to tcsendbreak() can
- * be concatenated to form a long break, as we do not know
- * what exact interpretation the second parameter has:
- *
- * - sunos 4: duration in quarter seconds
- * - sunos 5: 0 a short break, nonzero a tcdrain()
- * - hpux, irix: ignored
- * - mot88: duration in milliseconds
- * - aix: duration in milliseconds, but 0 is 25 milliseconds.
- */
- debug2("%d * tcsendbreak(fd=%d, 0)\n", n, fd);
- {
- int i;
-
- if (!n)
- n++;
- for (i = 0; i < n; i++)
- if (tcsendbreak(fd, 0) < 0)
- {
- Msg(errno, "cannot send BREAK (tcsendbreak SVR4)");
- return;
- }
- }
-# endif
-#else /* POSIX */
- Msg(0, "tcsendbreak() not available, change breaktype");
-#endif /* POSIX */
- break;
-
- case 1: /* TCSBRK ======================================= */
-#ifdef TCSBRK
- if (!n)
- n++;
- /*
- * Here too, we assume that short breaks can be concatenated to
- * perform long breaks. But for SOLARIS, this is not true, of course.
- */
- debug2("%d * TCSBRK fd=%d\n", n, fd);
- {
- int i;
-
- for (i = 0; i < n; i++)
- if (ioctl(fd, TCSBRK, (char *)0) < 0)
- {
- Msg(errno, "Cannot send BREAK (TCSBRK)");
- return;
- }
- }
-#else /* TCSBRK */
- Msg(0, "TCSBRK not available, change breaktype");
-#endif /* TCSBRK */
- break;
-
- case 0: /* TIOCSBRK / TIOCCBRK ========================== */
-#if defined(TIOCSBRK) && defined(TIOCCBRK)
- /*
- * This is very rude. Screen actively celebrates the break.
- * But it may be the only save way to issue long breaks.
- */
- debug("TIOCSBRK TIOCCBRK\n");
- if (ioctl(fd, TIOCSBRK, (char *)0) < 0)
- {
- Msg(errno, "Can't send BREAK (TIOCSBRK)");
- return;
- }
- sleep1000(n ? n * 250 : 250);
- if (ioctl(fd, TIOCCBRK, (char *)0) < 0)
- {
- Msg(errno, "BREAK stuck!!! -- HELP! (TIOCCBRK)");
- return;
- }
-#else /* TIOCSBRK && TIOCCBRK */
- Msg(0, "TIOCSBRK/CBRK not available, change breaktype");
-#endif /* TIOCSBRK && TIOCCBRK */
- break;
-
- default: /* unknown ========================== */
- Msg(0, "Internal SendBreak error: method %d unknown", type);
- }
-}
-
-/*
- * Send a break for n * 0.25 seconds. Tty must be PLAIN.
- * The longest possible break allowed here is 15 seconds.
- */
-
-void
-SendBreak(wp, n, closeopen)
-struct win *wp;
-int n, closeopen;
-{
- sigret_t (*sigalrm)__P(SIGPROTOARG);
-
-#ifdef BUILTIN_TELNET
- if (wp->w_type == W_TYPE_TELNET)
- {
- TelBreak(wp);
- return;
- }
-#endif
- if (wp->w_type != W_TYPE_PLAIN)
- return;
-
- debug3("break(%d, %d) fd %d\n", n, closeopen, wp->w_ptyfd);
-
-#ifdef POSIX
- (void) tcflush(wp->w_ptyfd, TCIOFLUSH);
-#else
-# ifdef TIOCFLUSH
- (void) ioctl(wp->w_ptyfd, TIOCFLUSH, (char *)0);
-# endif /* TIOCFLUSH */
-#endif /* POSIX */
-
- if (closeopen)
- {
- close(wp->w_ptyfd);
- sleep1000(n ? n * 250 : 250);
- if ((wp->w_ptyfd = OpenTTY(wp->w_tty, wp->w_cmdargs[1])) < 1)
- {
- Msg(0, "Ouch, cannot reopen line %s, please try harder", wp->w_tty);
- return;
- }
- (void) fcntl(wp->w_ptyfd, F_SETFL, FNBLOCK);
- }
- else
- {
- sigalrm = signal(SIGALRM, SigAlrmDummy);
- alarm(15);
-
- DoSendBreak(wp->w_ptyfd, n, breaktype);
-
- alarm(0);
- signal(SIGALRM, sigalrm);
- }
- debug(" broken.\n");
-}
-
-/*
- * Console grabbing
- */
-
-#if (!defined(TIOCCONS) && defined(SRIOCSREDIR)) || defined(linux)
-
-static struct event consredir_ev;
-static int consredirfd[2] = {-1, -1};
-
-static void
-consredir_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- char *p, *n, buf[256];
- int l;
-
- if (!console_window || (l = read(consredirfd[0], buf, sizeof(buf))) <= 0)
- {
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- evdeq(ev);
- return;
- }
- for (p = n = buf; l > 0; n++, l--)
- if (*n == '\n')
- {
- if (n > p)
- WriteString(console_window, p, n - p);
- WriteString(console_window, "\r\n", 2);
- p = n + 1;
- }
- if (n > p)
- WriteString(console_window, p, n - p);
-}
-
-#endif
-
-/*ARGSUSED*/
-int
-TtyGrabConsole(fd, on, rc_name)
-int fd, on;
-char *rc_name;
-{
-#if defined(TIOCCONS) && !defined(linux)
- struct display *d;
- int ret = 0;
- int sfd = -1;
-
- if (on < 0)
- return 0; /* pty close will ungrab */
- if (on)
- {
- if (displays == 0)
- {
- Msg(0, "I need a display");
- return -1;
- }
- for (d = displays; d; d = d->d_next)
- if (strcmp(d->d_usertty, "/dev/console") == 0)
- break;
- if (d)
- {
- Msg(0, "too dangerous - screen is running on /dev/console");
- return -1;
- }
- }
-
- if (!on)
- {
- char *slave;
- if ((fd = OpenPTY(&slave)) < 0)
- {
- Msg(errno, "%s: could not open detach pty master", rc_name);
- return -1;
- }
- if ((sfd = open(slave, O_RDWR | O_NOCTTY)) < 0)
- {
- Msg(errno, "%s: could not open detach pty slave", rc_name);
- close(fd);
- return -1;
- }
- }
- if (UserContext() == 1)
- UserReturn(ioctl(fd, TIOCCONS, (char *)&on));
- ret = UserStatus();
- if (ret)
- Msg(errno, "%s: ioctl TIOCCONS failed", rc_name);
- if (!on)
- {
- close(sfd);
- close(fd);
- }
- return ret;
-
-#else
-# if defined(SRIOCSREDIR) || defined(linux)
- struct display *d;
-# ifdef SRIOCSREDIR
- int cfd;
-# else
- struct mode new1, new2;
- char *slave;
-# endif
-
- if (on > 0)
- {
- if (displays == 0)
- {
- Msg(0, "I need a display");
- return -1;
- }
- for (d = displays; d; d = d->d_next)
- if (strcmp(d->d_usertty, "/dev/console") == 0)
- break;
- if (d)
- {
- Msg(0, "too dangerous - screen is running on /dev/console");
- return -1;
- }
- }
- if (consredirfd[0] >= 0)
- {
- evdeq(&consredir_ev);
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- }
- if (on <= 0)
- return 0;
-# ifdef SRIOCSREDIR
- if ((cfd = secopen("/dev/console", O_RDWR|O_NOCTTY, 0)) == -1)
- {
- Msg(errno, "/dev/console");
- return -1;
- }
- if (pipe(consredirfd))
- {
- Msg(errno, "pipe");
- close(cfd);
- consredirfd[0] = consredirfd[1] = -1;
- return -1;
- }
- if (ioctl(cfd, SRIOCSREDIR, consredirfd[1]))
- {
- Msg(errno, "SRIOCSREDIR ioctl");
- close(cfd);
- close(consredirfd[0]);
- close(consredirfd[1]);
- consredirfd[0] = consredirfd[1] = -1;
- return -1;
- }
- close(cfd);
-# else
- /* special linux workaround for a too restrictive kernel */
- if ((consredirfd[0] = OpenPTY(&slave)) < 0)
- {
- Msg(errno, "%s: could not open detach pty master", rc_name);
- return -1;
- }
- if ((consredirfd[1] = open(slave, O_RDWR | O_NOCTTY)) < 0)
- {
- Msg(errno, "%s: could not open detach pty slave", rc_name);
- close(consredirfd[0]);
- return -1;
- }
- InitTTY(&new1, 0);
- SetMode(&new1, &new2, 0, 0);
- SetTTY(consredirfd[1], &new2);
- if (UserContext() == 1)
- UserReturn(ioctl(consredirfd[1], TIOCCONS, (char *)&on));
- if (UserStatus())
- {
- Msg(errno, "%s: ioctl TIOCCONS failed", rc_name);
- close(consredirfd[0]);
- close(consredirfd[1]);
- return -1;
- }
-# endif
- consredir_ev.fd = consredirfd[0];
- consredir_ev.type = EV_READ;
- consredir_ev.handler = consredir_readev_fn;
- evenq(&consredir_ev);
- return 0;
-# else
- if (on > 0)
- Msg(0, "%s: don't know how to grab the console", rc_name);
- return -1;
-# endif
-#endif
-}
-
-/*
- * Read modem control lines of a physical tty and write them to buf
- * in a readable format.
- * Will not write more than 256 characters to buf.
- * Returns buf;
- */
-char *
-TtyGetModemStatus(fd, buf)
-int fd;
-char *buf;
-{
- char *p = buf;
-#ifdef TIOCGSOFTCAR
- unsigned int softcar;
-#endif
-#if defined(TIOCMGET) || defined(TIOCMODG)
- unsigned int mflags;
-#else
-# ifdef MCGETA
- /* this is yet another interface, found on hpux. grrr */
- mflag mflags;
-IF{MDTR}# define TIOCM_DTR MDTR
-IF{MRTS}# define TIOCM_RTS MRTS
-IF{MDSR}# define TIOCM_DSR MDSR
-IF{MDCD}# define TIOCM_CAR MDCD
-IF{MRI}# define TIOCM_RNG MRI
-IF{MCTS}# define TIOCM_CTS MCTS
-# endif
-#endif
-#if defined(CLOCAL) || defined(CRTSCTS)
- struct mode mtio; /* screen.h */
-#endif
-#if defined(CRTSCTS) || defined(TIOCM_CTS)
- int rtscts;
-#endif
- int clocal;
-
-#if defined(CLOCAL) || defined(CRTSCTS)
- GetTTY(fd, &mtio);
-#endif
- clocal = 0;
-#ifdef CLOCAL
- if (mtio.tio.c_cflag & CLOCAL)
- {
- clocal = 1;
- *p++ = '{';
- }
-#endif
-
-#ifdef TIOCM_CTS
-# ifdef CRTSCTS
- if (!(mtio.tio.c_cflag & CRTSCTS))
- rtscts = 0;
- else
-# endif /* CRTSCTS */
- rtscts = 1;
-#endif /* TIOCM_CTS */
-
-#ifdef TIOCGSOFTCAR
- if (ioctl(fd, TIOCGSOFTCAR, (char *)&softcar) < 0)
- softcar = 0;
-#endif
-
-#if defined(TIOCMGET) || defined(TIOCMODG) || defined(MCGETA)
-# ifdef TIOCMGET
- if (ioctl(fd, TIOCMGET, (char *)&mflags) < 0)
-# else
-# ifdef TIOCMODG
- if (ioctl(fd, TIOCMODG, (char *)&mflags) < 0)
-# else
- if (ioctl(fd, MCGETA, &mflags) < 0)
-# endif
-# endif
- {
-#ifdef TIOCGSOFTCAR
- sprintf(p, "NO-TTY? %s", softcar ? "(CD)" : "CD");
-#else
- sprintf(p, "NO-TTY?");
-#endif
- p += strlen(p);
- }
- else
- {
- char *s;
-# ifdef FANCY_MODEM
-# ifdef TIOCM_LE
- if (!(mflags & TIOCM_LE))
- for (s = "!LE "; *s; *p++ = *s++);
-# endif
-# endif /* FANCY_MODEM */
-
-# ifdef TIOCM_RTS
- s = "!RTS "; if (mflags & TIOCM_RTS) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_CTS
- s = "!CTS ";
- if (!rtscts)
- {
- *p++ = '(';
- s = "!CTS) ";
- }
- if (mflags & TIOCM_CTS) s++;
- while (*s) *p++ = *s++;
-# endif
-
-# ifdef TIOCM_DTR
- s = "!DTR "; if (mflags & TIOCM_DTR) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_DSR
- s = "!DSR "; if (mflags & TIOCM_DSR) s++;
- while (*s) *p++ = *s++;
-# endif
-# if defined(TIOCM_CD) || defined(TIOCM_CAR)
- s = "!CD ";
-# ifdef TIOCGSOFTCAR
- if (softcar)
- {
- *p++ = '(';
- s = "!CD) ";
- }
-# endif
-# ifdef TIOCM_CD
- if (mflags & TIOCM_CD) s++;
-# else
- if (mflags & TIOCM_CAR) s++;
-# endif
- while (*s) *p++ = *s++;
-# endif
-# if defined(TIOCM_RI) || defined(TIOCM_RNG)
-# ifdef TIOCM_RI
- if (mflags & TIOCM_RI)
-# else
- if (mflags & TIOCM_RNG)
-# endif
- for (s = "RI "; *s; *p++ = *s++);
-# endif
-# ifdef FANCY_MODEM
-# ifdef TIOCM_ST
- s = "!ST "; if (mflags & TIOCM_ST) s++;
- while (*s) *p++ = *s++;
-# endif
-# ifdef TIOCM_SR
- s = "!SR "; if (mflags & TIOCM_SR) s++;
- while (*s) *p++ = *s++;
-# endif
-# endif /* FANCY_MODEM */
- if (p > buf && p[-1] == ' ')
- p--;
- *p = '\0';
- }
-#else
-# ifdef TIOCGSOFTCAR
- sprintf(p, " %s", softcar ? "(CD)", "CD");
- p += strlen(p);
-# endif
-#endif
- if (clocal)
- *p++ = '}';
- *p = '\0';
- return buf;
-}
-
-/*
- * Old bsd-ish machines may not have any of the baudrate B... symbols.
- * We hope to detect them here, so that the btable[] below always has
- * many entries.
- */
-#ifndef POSIX
-# ifndef TERMIO
-# if !defined(B9600) && !defined(B2400) && !defined(B1200) && !defined(B300)
-IFN{B0}#define B0 0
-IFN{B50}#define B50 1
-IFN{B75}#define B75 2
-IFN{B110}#define B110 3
-IFN{B134}#define B134 4
-IFN{B150}#define B150 5
-IFN{B200}#define B200 6
-IFN{B300}#define B300 7
-IFN{B600}#define B600 8
-IFN{B1200}#define B1200 9
-IFN{B1800}#define B1800 10
-IFN{B2400}#define B2400 11
-IFN{B4800}#define B4800 12
-IFN{B9600}#define B9600 13
-IFN{EXTA}#define EXTA 14
-IFN{EXTB}#define EXTB 15
-# endif
-# endif
-#endif
-
-/*
- * On hpux, idx and sym will be different.
- * Rumor has it that, we need idx in D_dospeed to make tputs
- * padding correct.
- * Frequently used entries come first.
- */
-static struct baud_values btable[] =
-{
-IF{B9600} { 13, 9600, B9600 },
-IF{B19200} { 14, 19200, B19200 },
-IF{EXTA} { 14, 19200, EXTA },
-IF{B38400} { 15, 38400, B38400 },
-IF{EXTB} { 15, 38400, EXTB },
-IF{B57600} { 16, 57600, B57600 },
-IF{B115200} { 17, 115200, B115200 },
-IF{B230400} { 18, 230400, B230400 },
-IF{B460800} { 19, 460800, B460800 },
-IF{B7200} { 13, 7200, B7200 },
-IF{B4800} { 12, 4800, B4800 },
-IF{B3600} { 12, 3600, B3600 },
-IF{B2400} { 11, 2400, B2400 },
-IF{B1800} { 10, 1800, B1800 },
-IF{B1200} { 9, 1200, B1200 },
-IF{B900} { 9, 900, B900 },
-IF{B600} { 8, 600, B600 },
-IF{B300} { 7, 300, B300 },
-IF{B200} { 6, 200, B200 },
-IF{B150} { 5, 150, B150 },
-IF{B134} { 4, 134, B134 },
-IF{B110} { 3, 110, B110 },
-IF{B75} { 2, 75, B75 },
-IF{B50} { 1, 50, B50 },
-IF{B0} { 0, 0, B0 },
- { -1, -1, -1 }
-};
-
-/*
- * baud may either be a bits-per-second value or a symbolic
- * value as returned by cfget?speed()
- */
-struct baud_values *
-lookup_baud(baud)
-int baud;
-{
- struct baud_values *p;
-
- for (p = btable; p->idx >= 0; p++)
- if (baud == p->bps || baud == p->sym)
- return p;
- return NULL;
-}
-
-/*
- * change the baud rate in a mode structure.
- * ibaud and obaud are given in bit/second, or at your option as
- * termio B... symbols as defined in e.g. suns sys/ttydev.h
- * -1 means don't change.
- */
-int
-SetBaud(m, ibaud, obaud)
-struct mode *m;
-int ibaud, obaud;
-{
- struct baud_values *ip, *op;
-
- if ((!(ip = lookup_baud(ibaud)) && ibaud != -1) ||
- (!(op = lookup_baud(obaud)) && obaud != -1))
- return -1;
-
-#ifdef POSIX
- if (ip) cfsetispeed(&m->tio, ip->sym);
- if (op) cfsetospeed(&m->tio, op->sym);
-#else /* POSIX */
-# ifdef TERMIO
- if (ip)
- {
-# ifdef IBSHIFT
- m->tio.c_cflag &= ~(CBAUD << IBSHIFT);
- m->tio.c_cflag |= (ip->sym & CBAUD) << IBSHIFT;
-# else /* IBSHIFT */
- if (ibaud != obaud)
- return -1;
-# endif /* IBSHIFT */
- }
- if (op)
- {
- m->tio.c_cflag &= ~CBAUD;
- m->tio.c_cflag |= op->sym & CBAUD;
- }
-# else /* TERMIO */
- if (ip) m->m_ttyb.sg_ispeed = ip->idx;
- if (op) m->m_ttyb.sg_ospeed = op->idx;
-# endif /* TERMIO */
-#endif /* POSIX */
- return 0;
-}
-
-/*
- * Write out the mode struct in a readable form
- */
-
-#ifdef DEBUG
-void
-DebugTTY(m)
-struct mode *m;
-{
- int i;
-
-#ifdef POSIX
- debug("struct termios tio:\n");
- debug1("c_iflag = %#x\n", (unsigned int)m->tio.c_iflag);
- debug1("c_oflag = %#x\n", (unsigned int)m->tio.c_oflag);
- debug1("c_cflag = %#x\n", (unsigned int)m->tio.c_cflag);
- debug1("c_lflag = %#x\n", (unsigned int)m->tio.c_lflag);
- debug1("cfgetospeed() = %d\n", (int)cfgetospeed(&m->tio));
- debug1("cfgetispeed() = %d\n", (int)cfgetispeed(&m->tio));
- for (i = 0; i < sizeof(m->tio.c_cc)/sizeof(*m->tio.c_cc); i++)
- {
- debug2("c_cc[%d] = %#x\n", i, m->tio.c_cc[i]);
- }
-# ifdef HPUX_LTCHARS_HACK
- debug1("suspc = %#02x\n", m->m_ltchars.t_suspc);
- debug1("dsuspc = %#02x\n", m->m_ltchars.t_dsuspc);
- debug1("rprntc = %#02x\n", m->m_ltchars.t_rprntc);
- debug1("flushc = %#02x\n", m->m_ltchars.t_flushc);
- debug1("werasc = %#02x\n", m->m_ltchars.t_werasc);
- debug1("lnextc = %#02x\n", m->m_ltchars.t_lnextc);
-# endif /* HPUX_LTCHARS_HACK */
-#else /* POSIX */
-# ifdef TERMIO
- debug("struct termio tio:\n");
- debug1("c_iflag = %04o\n", m->tio.c_iflag);
- debug1("c_oflag = %04o\n", m->tio.c_oflag);
- debug1("c_cflag = %04o\n", m->tio.c_cflag);
- debug1("c_lflag = %04o\n", m->tio.c_lflag);
- for (i = 0; i < sizeof(m->tio.c_cc)/sizeof(*m->tio.c_cc); i++)
- {
- debug2("c_cc[%d] = %04o\n", i, m->tio.c_cc[i]);
- }
-# else /* TERMIO */
- debug1("sg_ispeed = %d\n", m->m_ttyb.sg_ispeed);
- debug1("sg_ospeed = %d\n", m->m_ttyb.sg_ospeed);
- debug1("sg_erase = %#02x\n", m->m_ttyb.sg_erase);
- debug1("sg_kill = %#02x\n", m->m_ttyb.sg_kill);
- debug1("sg_flags = %#04x\n", (unsigned short)m->m_ttyb.sg_flags);
- debug1("intrc = %#02x\n", m->m_tchars.t_intrc);
- debug1("quitc = %#02x\n", m->m_tchars.t_quitc);
- debug1("startc = %#02x\n", m->m_tchars.t_startc);
- debug1("stopc = %#02x\n", m->m_tchars.t_stopc);
- debug1("eofc = %#02x\n", m->m_tchars.t_eofc);
- debug1("brkc = %#02x\n", m->m_tchars.t_brkc);
- debug1("suspc = %#02x\n", m->m_ltchars.t_suspc);
- debug1("dsuspc = %#02x\n", m->m_ltchars.t_dsuspc);
- debug1("rprntc = %#02x\n", m->m_ltchars.t_rprntc);
- debug1("flushc = %#02x\n", m->m_ltchars.t_flushc);
- debug1("werasc = %#02x\n", m->m_ltchars.t_werasc);
- debug1("lnextc = %#02x\n", m->m_ltchars.t_lnextc);
- debug1("ldisc = %d\n", m->m_ldisc);
- debug1("lmode = %#x\n", m->m_lmode);
-# endif /* TERMIO */
-#endif /* POSIX */
-}
-#endif /* DEBUG */
diff --git a/src/utmp.c b/src/utmp.c
deleted file mode 100644
index d47112c..0000000
--- a/src/utmp.c
+++ /dev/null
@@ -1,878 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "screen.h"
-#include "extern.h"
-
-#ifdef HAVE_UTEMPTER
-#include <utempter.h>
-#endif
-
-
-extern struct display *display;
-#ifdef CAREFULUTMP
-extern struct win *windows;
-#endif
-extern struct win *fore;
-extern char *LoginName;
-extern int real_uid, eff_uid;
-
-
-/*
- * UTNOKEEP: A (ugly) hack for apollo that does two things:
- * 1) Always close and reopen the utmp file descriptor. (I don't know
- * for what reason this is done...)
- * 2) Implement an unsorted utmp file much like GETUTENT.
- * (split into UT_CLOSE and UT_UNSORTED)
- */
-
-
-#ifdef UTNOKEEP
-# define UT_CLOSE
-# define UT_UNSORTED
-#endif
-
-#ifdef UT_CLOSE
-# undef UT_CLOSE
-# define UT_CLOSE endutent()
-#else
-# define UT_CLOSE
-#endif
-
-
-/*
- * we have a suid-root helper app that changes the utmp for us
- * (won't work for login-slots)
- */
-#if (defined(sun) && defined(SVR4) && defined(GETUTENT)) || defined(HAVE_UTEMPTER)
-# define UTMP_HELPER
-#endif
-
-
-
-#ifdef UTMPOK
-
-
-static slot_t TtyNameSlot __P((char *));
-static void makeuser __P((struct utmp *, char *, char *, int));
-static void makedead __P((struct utmp *));
-static int pututslot __P((slot_t, struct utmp *, char *, struct win *));
-static struct utmp *getutslot __P((slot_t));
-#ifndef GETUTENT
-static struct utmp *getutent __P((void));
-static void endutent __P((void));
-static int initutmp __P((void));
-static void setutent __P((void));
-#endif
-#if defined(linux) && defined(GETUTENT)
-static struct utmp *xpututline __P((struct utmp *utmp));
-# define pututline xpututline
-#endif
-
-
-static int utmpok;
-static char UtmpName[] = UTMPFILE;
-#ifndef UTMP_HELPER
-static int utmpfd = -1;
-#endif
-
-
-# if defined(GETUTENT) && (!defined(SVR4) || defined(__hpux))
-# if defined(hpux) /* cruel hpux release 8.0 */
-# define pututline _pututline
-# endif /* hpux */
-extern struct utmp *getutline(), *pututline();
-# if defined(_SEQUENT_)
-extern struct utmp *ut_add_user(), *ut_delete_user();
-extern char *ut_find_host();
-# ifndef UTHOST
-# define UTHOST /* _SEQUENT_ has ut_find_host() */
-# endif
-# endif /* _SEQUENT_ */
-# endif /* GETUTENT && !SVR4 */
-
-# if !defined(GETUTENT) && !defined(UT_UNSORTED)
-# ifdef GETTTYENT
-# include <ttyent.h>
-# else
-struct ttyent { char *ty_name; };
-static void setttyent __P((void));
-static struct ttyent *getttyent __P((void));
-# endif
-# endif /* !GETUTENT && !UT_UNSORTED */
-
-#ifndef _SEQUENT_
-# undef D_loginhost
-# define D_loginhost D_utmp_logintty.ut_host
-#endif
-#ifndef UTHOST
-# undef D_loginhost
-# define D_loginhost ((char *)0)
-#endif
-
-
-#endif /* UTMPOK */
-
-
-/*
- * SlotToggle - modify the utmp slot of the fore window.
- *
- * how > 0 do try to set a utmp slot.
- * how = 0 try to withdraw a utmp slot.
- *
- * w_slot = -1 window not logged in.
- * w_slot = 0 window not logged in, but should be logged in.
- * (unable to write utmp, or detached).
- */
-
-#ifndef UTMPOK
-void
-SlotToggle(how)
-int how;
-{
- debug1("SlotToggle (!UTMPOK) %d\n", how);
-# ifdef UTMPFILE
- Msg(0, "Unable to modify %s.\n", UTMPFILE);
-# else
- Msg(0, "Unable to modify utmp-database.\n");
-# endif
-}
-#endif
-
-
-
-#ifdef UTMPOK
-
-void
-SlotToggle(how)
-int how;
-{
- debug1("SlotToggle %d\n", how);
- if (fore->w_type != W_TYPE_PTY)
- {
- Msg(0, "Can only work with normal windows.\n");
- return;
- }
- if (how)
- {
- debug(" try to log in\n");
- if ((fore->w_slot == (slot_t) -1) || (fore->w_slot == (slot_t) 0))
- {
-#ifdef USRLIMIT
- if (CountUsers() >= USRLIMIT)
- {
- Msg(0, "User limit reached.");
- return;
- }
-#endif
- if (SetUtmp(fore) == 0)
- Msg(0, "This window is now logged in.");
- else
- Msg(0, "This window should now be logged in.");
- WindowChanged(fore, 'f');
- }
- else
- Msg(0, "This window is already logged in.");
- }
- else
- {
- debug(" try to log out\n");
- if (fore->w_slot == (slot_t) -1)
- Msg(0, "This window is already logged out\n");
- else if (fore->w_slot == (slot_t) 0)
- {
- debug("What a relief! In fact, it was not logged in\n");
- Msg(0, "This window is not logged in.");
- fore->w_slot = (slot_t) -1;
- }
- else
- {
- RemoveUtmp(fore);
- if (fore->w_slot != (slot_t) -1)
- Msg(0, "What? Cannot remove Utmp slot?");
- else
- Msg(0, "This window is no longer logged in.");
-#ifdef CAREFULUTMP
- CarefulUtmp();
-#endif
- WindowChanged(fore, 'f');
- }
- }
-}
-
-
-#ifdef CAREFULUTMP
-
-/* CAREFULUTMP: goodie for paranoid sysadmins: always leave one
- * window logged in
- */
-void
-CarefulUtmp()
-{
- struct win *p;
-
- if (!windows) /* hopeless */
- return;
- debug("CarefulUtmp counting slots\n");
- for (p = windows; p; p = p->w_next)
- if (p->w_ptyfd >= 0 && p->w_slot != (slot_t)-1)
- return; /* found one, nothing to do */
-
- debug("CarefulUtmp: no slots, log one in again.\n");
- for (p = windows; p; p = p->w_next)
- if (p->w_ptyfd >= 0) /* no zombies please */
- break;
- if (!p)
- return; /* really hopeless */
- SetUtmp(p);
- Msg(0, "Window %d is now logged in.\n", p->w_number);
-}
-#endif /* CAREFULUTMP */
-
-
-void
-InitUtmp()
-{
- debug1("InitUtmp testing '%s'...\n", UtmpName);
-#ifndef UTMP_HELPER
- if ((utmpfd = open(UtmpName, O_RDWR)) == -1)
- {
- if (errno != EACCES)
- Msg(errno, UtmpName);
- debug("InitUtmp failed.\n");
- utmpok = 0;
- return;
- }
-# ifdef GETUTENT
- close(utmpfd); /* it was just a test */
- utmpfd = -1;
-# endif /* GETUTENT */
-#endif /* UTMP_HELPER */
- utmpok = 1;
-}
-
-
-#ifdef USRLIMIT
-int
-CountUsers()
-{
- struct utmp *ut;
- int UserCount;
-
- debug1("CountUsers() - utmpok=%d\n", utmpok);
- if (!utmpok)
- return 0;
- UserCount = 0;
- setutent();
- while (ut = getutent())
- if (SLOT_USED(ut))
- UserCount++;
- UT_CLOSE;
- return UserCount;
-}
-#endif /* USRLIMIT */
-
-
-
-/*
- * the utmp entry for tty is located and removed.
- * it is stored in D_utmp_logintty.
- */
-void
-RemoveLoginSlot()
-{
- struct utmp u, *uu;
-
- ASSERT(display);
- debug("RemoveLoginSlot: removing your logintty\n");
- D_loginslot = TtyNameSlot(D_usertty);
- if (D_loginslot == (slot_t)0 || D_loginslot == (slot_t)-1)
- return;
-#ifdef UTMP_HELPER
- if (eff_uid) /* helpers can't do login slots. sigh. */
-#else
- if (!utmpok)
-#endif
- {
- D_loginslot = 0;
- debug("RemoveLoginSlot: utmpok == 0\n");
- }
- else
- {
-#ifdef _SEQUENT_
- {
- char *p;
- if ((p = ut_find_host(D_loginslot)) != 0)
- strncpy(D_loginhost, p, sizeof(D_loginhost) - 1);
- D_loginhost[sizeof(D_loginhost) - 1] = 0;
- }
-#endif /* _SEQUENT_ */
-
- if ((uu = getutslot(D_loginslot)) == 0)
- {
- debug("Utmp slot not found -> not removed");
- D_loginslot = 0;
- }
- else
- {
- D_utmp_logintty = *uu;
- u = *uu;
- makedead(&u);
- if (pututslot(D_loginslot, &u, (char *)0, (struct win *)0) == 0)
- D_loginslot = 0;
- }
- UT_CLOSE;
- }
- debug1(" slot %d zapped\n", (int)D_loginslot);
- if (D_loginslot == (slot_t)0)
- {
- /* couldn't remove slot, do a 'mesg n' at least. */
- struct stat stb;
- char *tty;
- debug("couln't zap slot -> do mesg n\n");
- D_loginttymode = 0;
- if ((tty = ttyname(D_userfd)) && stat(tty, &stb) == 0 && (int)stb.st_uid == real_uid && ((int)stb.st_mode & 0777) != 0666)
- {
- D_loginttymode = (int)stb.st_mode & 0777;
- chmod(D_usertty, stb.st_mode & 0600);
- }
- }
-}
-
-/*
- * D_utmp_logintty is reinserted into utmp
- */
-void
-RestoreLoginSlot()
-{
- char *tty;
-
- debug("RestoreLoginSlot()\n");
- ASSERT(display);
- if (utmpok && D_loginslot != (slot_t)0 && D_loginslot != (slot_t)-1)
- {
- debug1(" logging you in again (slot %#x)\n", (int)D_loginslot);
- if (pututslot(D_loginslot, &D_utmp_logintty, D_loginhost, (struct win *)0) == 0)
- Msg(errno,"Could not write %s", UtmpName);
- }
- UT_CLOSE;
- D_loginslot = (slot_t)0;
- if (D_loginttymode && (tty = ttyname(D_userfd)))
- chmod(tty, D_loginttymode);
-}
-
-
-
-/*
- * Construct a utmp entry for window wi.
- * the hostname field reflects what we know about the user (display)
- * location. If d_loginhost is not set, then he is local and we write
- * down the name of his terminal line; else he is remote and we keep
- * the hostname here. The letter S and the window id will be appended.
- * A saved utmp entry in wi->w_savut serves as a template, usually.
- */
-
-int
-SetUtmp(wi)
-struct win *wi;
-{
- register slot_t slot;
- struct utmp u;
- int saved_ut;
-#ifdef UTHOST
- char *p;
- char host[sizeof(D_loginhost) + 15];
-#else
- char *host = 0;
-#endif /* UTHOST */
-
- wi->w_slot = (slot_t)0;
- if (!utmpok || wi->w_type != W_TYPE_PTY)
- return -1;
- if ((slot = TtyNameSlot(wi->w_tty)) == (slot_t)0)
- {
- debug1("SetUtmp failed (tty %s).\n",wi->w_tty);
- return -1;
- }
- debug2("SetUtmp %d will get slot %d...\n", wi->w_number, (int)slot);
-
- bzero((char *)&u, sizeof(u));
- if ((saved_ut = bcmp((char *) &wi->w_savut, (char *)&u, sizeof(u))))
- /* restore original, of which we will adopt all fields but ut_host */
- bcopy((char *)&wi->w_savut, (char *) &u, sizeof(u));
-
- if (!saved_ut)
- makeuser(&u, stripdev(wi->w_tty), LoginName, wi->w_pid);
-
-#ifdef UTHOST
- host[sizeof(host) - 15] = '\0';
- if (display)
- {
- strncpy(host, D_loginhost, sizeof(host) - 15);
- if (D_loginslot != (slot_t)0 && D_loginslot != (slot_t)-1 && host[0] != '\0')
- {
- /*
- * we want to set our ut_host field to something like
- * ":ttyhf:s.0" or
- * "faui45:s.0" or
- * "132.199.81.4:s.0" (even this may hurt..), but not
- * "faui45.informati"......:s.0
- * HPUX uses host:0.0, so chop at "." and ":" (Eric Backus)
- */
- for (p = host; *p; p++)
- if ((*p < '0' || *p > '9') && (*p != '.'))
- break;
- if (*p)
- {
- for (p = host; *p; p++)
- if (*p == '.' || (*p == ':' && p != host))
- {
- *p = '\0';
- break;
- }
- }
- }
- else
- {
- strncpy(host + 1, stripdev(D_usertty), sizeof(host) - 15 - 1);
- host[0] = ':';
- }
- }
- else
- strncpy(host, "local", sizeof(host) - 15);
-
- sprintf(host + strlen(host), ":S.%d", wi->w_number);
- debug1("rlogin hostname: '%s'\n", host);
-
-# if !defined(_SEQUENT_) && !defined(sequent)
- strncpy(u.ut_host, host, sizeof(u.ut_host));
-# endif
-#endif /* UTHOST */
-
- if (pututslot(slot, &u, host, wi) == 0)
- {
- Msg(errno,"Could not write %s", UtmpName);
- UT_CLOSE;
- return -1;
- }
- debug("SetUtmp successful\n");
- wi->w_slot = slot;
- bcopy((char *)&u, (char *)&wi->w_savut, sizeof(u));
- UT_CLOSE;
- return 0;
-}
-
-/*
- * if slot could be removed or was 0, wi->w_slot = -1;
- * else not changed.
- */
-
-int
-RemoveUtmp(wi)
-struct win *wi;
-{
- struct utmp u, *uu;
- slot_t slot;
-
- slot = wi->w_slot;
- debug1("RemoveUtmp slot=%#x\n", slot);
- if (!utmpok)
- return -1;
- if (slot == (slot_t)0 || slot == (slot_t)-1)
- {
- wi->w_slot = (slot_t)-1;
- return 0;
- }
- bzero((char *) &u, sizeof(u));
-#ifdef sgi
- bcopy((char *)&wi->w_savut, (char *)&u, sizeof(u));
- uu = &u;
-#else
- if ((uu = getutslot(slot)) == 0)
- {
- Msg(0, "Utmp slot not found -> not removed");
- return -1;
- }
- bcopy((char *)uu, (char *)&wi->w_savut, sizeof(wi->w_savut));
-#endif
- u = *uu;
- makedead(&u);
- if (pututslot(slot, &u, (char *)0, wi) == 0)
- {
- Msg(errno,"Could not write %s", UtmpName);
- UT_CLOSE;
- return -1;
- }
- debug("RemoveUtmp successfull\n");
- wi->w_slot = (slot_t)-1;
- UT_CLOSE;
- return 0;
-}
-
-
-
-/*********************************************************************
- *
- * routines using the getut* api
- */
-
-#ifdef GETUTENT
-
-#define SLOT_USED(u) (u->ut_type == USER_PROCESS)
-
-static struct utmp *
-getutslot(slot)
-slot_t slot;
-{
- struct utmp u;
- bzero((char *)&u, sizeof(u));
- strncpy(u.ut_line, slot, sizeof(u.ut_line));
- setutent();
- return getutline(&u);
-}
-
-static int
-pututslot(slot, u, host, wi)
-slot_t slot;
-struct utmp *u;
-char *host;
-struct win *wi;
-{
-#ifdef _SEQUENT_
- if (SLOT_USED(u) && host && *host)
- return ut_add_user(u.ut_name, slot, u.ut_pid, host) != 0;
- if (!SLOT_USED(u))
- return ut_delete_user(slot, u.ut_pid, 0, 0) != 0;
-#endif
-#ifdef HAVE_UTEMPTER
- if (eff_uid && wi->w_ptyfd != -1)
- {
- /* sigh, linux hackers made the helper functions void */
- if (SLOT_USED(u))
- addToUtmp(wi->w_tty, host, wi->w_ptyfd);
- else
- removeLineFromUtmp(wi->w_tty, wi->w_ptyfd);
- return 1; /* pray for success */
- }
-#endif
- setutent();
- return pututline(u) != 0;
-}
-
-static void
-makedead(u)
-struct utmp *u;
-{
- u->ut_type = DEAD_PROCESS;
-#if !defined(linux) || defined(EMPTY)
- u->ut_exit.e_termination = 0;
- u->ut_exit.e_exit = 0;
-#endif
-#if !defined(sun) || !defined(SVR4)
- u->ut_user[0] = 0; /* for Digital UNIX, kilbi@rad.rwth-aachen.de */
-#endif
-}
-
-static void
-makeuser(u, line, user, pid)
-struct utmp *u;
-char *line, *user;
-int pid;
-{
- u->ut_type = USER_PROCESS;
- strncpy(u->ut_user, user, sizeof(u->ut_user));
- /* Now the tricky part... guess ut_id */
-#if defined(sgi) || defined(linux)
- strncpy(u->ut_id, line + 3, sizeof(u->ut_id));
-#else /* sgi */
-# ifdef _IBMR2
- strncpy(u->ut_id, line, sizeof(u->ut_id));
-# else
- strncpy(u->ut_id, line + strlen(line) - 2, sizeof(u->ut_id));
-# endif
-#endif /* sgi */
- strncpy(u->ut_line, line, sizeof(u->ut_line));
- u->ut_pid = pid;
- (void)time((time_t *)&u->ut_time);
-}
-
-static slot_t
-TtyNameSlot(nam)
-char *nam;
-{
- return stripdev(nam);
-}
-
-
-#else /* GETUTENT */
-
-/*********************************************************************
- *
- * getut emulation for systems lacking the api
- */
-
-static struct utmp uent;
-
-#define SLOT_USED(u) (u.ut_name[0] != 0)
-
-static int
-initutmp()
-{
- if (utmpfd >= 0)
- return 1;
- return (utmpfd = open(UtmpName, O_RDWR)) >= 0;
-}
-
-static void
-setutent()
-{
- if (utmpfd >= 0)
- (void)lseek(utmpfd, (off_t)0, 0);
-}
-
-static void
-endutent()
-{
- if (utmpfd >= 0)
- close(utmpfd);
- utmpfd = -1;
-}
-
-static struct utmp *
-getutent()
-{
- if (utmpfd < 0 && !initutmp())
- return 0;
- if (read(utmpfd, &uent, sizeof(uent)) != sizeof(uent))
- return 0;
- return &uent;
-}
-
-static struct utmp *
-getutslot(slot)
-slot_t slot;
-{
- if (utmpfd < 0 && !initutmp())
- return 0;
- lseek(utmpfd, (off_t)(slot * sizeof(struct utmp)), 0);
- if (read(utmpfd, &uent, sizeof(uent)) != sizeof(uent))
- return 0;
- return &uent;
-}
-
-static int
-pututslot(slot, u, host, wi)
-slot_t slot;
-struct utmp *u;
-char *host;
-struct win *wi;
-{
-#ifdef sequent
- if (SLOT_USED(u))
- return add_utmp(slot, u) != -1;
-#endif
- if (utmpfd < 0 && !initutmp())
- return 0;
- lseek(utmpfd, (off_t)(slot * sizeof(*u)), 0);
- if (write(utmpfd, u, sizeof(*u)) != sizeof(*u))
- return 0;
- return 1;
-}
-
-
-static void
-makedead(u)
-struct utmp *u;
-{
-#ifdef UT_UNSORTED
- bzero(u->ut_name, sizeof(u->ut_name));
-# ifdef UTHOST
- bzero(u->ut_host, sizeof(u->ut_host));
-# endif
-#else
- bzero((char *)u, sizeof(*u));
-#endif
-}
-
-
-static void
-makeuser(u, line, user, pid)
-struct utmp *u;
-char *line, *user;
-int pid;
-{
- strncpy(u->ut_line, line, sizeof(u->ut_line));
- strncpy(u->ut_name, user, sizeof(u->ut_name));
- (void)time((time_t *)&u->ut_time);
-}
-
-static slot_t
-TtyNameSlot(nam)
-char *nam;
-{
- slot_t slot;
- char *line;
-#ifndef UT_UNSORTED
- struct ttyent *tp;
-#endif
-
- line = stripdev(nam);
-#ifdef UT_UNSORTED
- setutent();
- if (utmpfd < 0)
- return -1;
- for (slot = 0; getutent(); slot++)
- if (strcmp(uent.ut_line, line) == 0)
- break;
- UT_CLOSE;
-#else
- slot = 1;
- setttyent();
- while ((tp = getttyent()) != 0 && strcmp(line, tp->ty_name) != 0)
- slot++;
-#endif
- return slot;
-}
-
-#endif /* GETUTENT */
-
-
-
-/*********************************************************************
- *
- * Cheap plastic imitation of ttyent routines.
- */
-
-#if !defined(GETTTYENT) && !defined(GETUTENT) && !defined(UT_UNSORTED)
-
-
-static char *tt, *ttnext;
-static char ttys[] = "/etc/ttys";
-
-static void
-setttyent()
-{
- if (ttnext == 0)
- {
- struct stat s;
- register int f;
- register char *p, *ep;
-
- if ((f = open(ttys, O_RDONLY)) == -1 || fstat(f, &s) == -1)
- Panic(errno, ttys);
- if ((tt = malloc((unsigned) s.st_size + 1)) == 0)
- Panic(0, strnomem);
- if (read(f, tt, s.st_size) != s.st_size)
- Panic(errno, ttys);
- close(f);
- for (p = tt, ep = p + s.st_size; p < ep; p++)
- if (*p == '\n')
- *p = '\0';
- *p = '\0';
- }
- ttnext = tt;
-}
-
-static struct ttyent *
-getttyent()
-{
- static struct ttyent t;
-
- if (*ttnext == '\0')
- return NULL;
- t.ty_name = ttnext + 2;
- ttnext += strlen(ttnext) + 1;
- return &t;
-}
-
-#endif /* !GETTTYENT && !GETUTENT && !UT_UNSORTED*/
-
-
-
-#endif /* UTMPOK */
-
-
-
-
-/*********************************************************************
- *
- * getlogin() replacement (for SVR4 machines)
- */
-
-# if defined(BUGGYGETLOGIN) && defined(UTMP_FILE)
-char *
-getlogin()
-{
- char *tty = NULL;
-#ifdef utmp
-# undef utmp
-#endif
- struct utmp u;
- static char retbuf[sizeof(u.ut_user)+1];
- int fd;
-
- for (fd = 0; fd <= 2 && (tty = ttyname(fd)) == NULL; fd++)
- ;
- if ((tty == NULL) || ((fd = open(UTMP_FILE, O_RDONLY)) < 0))
- return NULL;
- tty = stripdev(tty);
- retbuf[0] = '\0';
- while (read(fd, (char *)&u, sizeof(struct utmp)) == sizeof(struct utmp))
- {
- if (!strncmp(tty, u.ut_line, sizeof(u.ut_line)))
- {
- strncpy(retbuf, u.ut_user, sizeof(u.ut_user));
- retbuf[sizeof(u.ut_user)] = '\0';
- if (u.ut_type == USER_PROCESS)
- break;
- }
- }
- close(fd);
-
- return *retbuf ? retbuf : NULL;
-}
-# endif /* BUGGYGETLOGIN */
-
-#if defined(linux) && defined(GETUTENT)
-# undef pututline
-
-/* aargh, linux' pututline returns void! */
-struct utmp *
-xpututline(u)
-struct utmp *u;
-{
- struct utmp *u2;
- pututline(u);
- setutent();
- u2 = getutline(u);
- if (u2 == 0)
- return u->ut_type == DEAD_PROCESS ? u : 0;
- return u->ut_type == u2->ut_type ? u : 0;
-}
-#endif
-
diff --git a/src/window.c b/src/window.c
deleted file mode 100644
index 3b60ae0..0000000
--- a/src/window.c
+++ /dev/null
@@ -1,2179 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <fcntl.h>
-#ifndef sun
-# include <sys/ioctl.h>
-#endif
-
-#include "config.h"
-
-#include "screen.h"
-#include "extern.h"
-#include "logfile.h" /* logfopen() */
-
-extern struct display *displays, *display;
-extern struct win *windows, *fore, *wtab[], *console_window;
-extern char *ShellArgs[];
-extern char *ShellProg;
-extern char screenterm[];
-extern char *screenlogfile;
-extern char HostName[];
-extern int TtyMode;
-extern int SilenceWait;
-extern int real_uid, real_gid, eff_uid, eff_gid;
-extern char Termcap[];
-extern char **NewEnv;
-extern int visual_bell, maxwin;
-extern struct event logflushev;
-extern int log_flush, logtstamp_after;
-extern int ZombieKey_destroy, ZombieKey_resurrect;
-extern struct layer *flayer;
-extern int maxusercount;
-extern int pty_preopen;
-#ifdef ZMODEM
-extern int zmodem_mode;
-extern struct mchar mchar_blank;
-extern char *zmodem_sendcmd;
-extern char *zmodem_recvcmd;
-#endif
-
-#if defined(TIOCSWINSZ) || defined(TIOCGWINSZ)
-extern struct winsize glwz;
-#endif
-
-#ifdef O_NOCTTY
-extern int separate_sids;
-#endif
-
-static void WinProcess __P((char **, int *));
-static void WinRedisplayLine __P((int, int, int, int));
-static void WinClearLine __P((int, int, int, int));
-static int WinRewrite __P((int, int, int, struct mchar *, int));
-static int WinResize __P((int, int));
-static void WinRestore __P((void));
-static int DoAutolf __P((char *, int *, int));
-static void ZombieProcess __P((char **, int *));
-static void win_readev_fn __P((struct event *, char *));
-static void win_writeev_fn __P((struct event *, char *));
-static int muchpending __P((struct win *, struct event *));
-#ifdef COPY_PASTE
-static void paste_slowev_fn __P((struct event *, char *));
-#endif
-#ifdef PSEUDOS
-static void pseu_readev_fn __P((struct event *, char *));
-static void pseu_writeev_fn __P((struct event *, char *));
-#endif
-static void win_silenceev_fn __P((struct event *, char *));
-
-static int OpenDevice __P((char **, int, int *, char **));
-static int ForkWindow __P((struct win *, char **, char *));
-#ifdef ZMODEM
-static void zmodem_found __P((struct win *, int, char *, int));
-static void zmodem_fin __P((char *, int, char *));
-static int zmodem_parse __P((struct win *, char *, int));
-#endif
-
-
-
-int VerboseCreate = 0; /* XXX move this to user.h */
-
-char DefaultShell[] = "/bin/sh";
-static char DefaultPath[] = ":/usr/ucb:/bin:/usr/bin";
-
-/* keep this in sync with the structure definition in window.h */
-struct NewWindow nwin_undef =
-{
- -1, /* StartAt */
- (char *)0, /* aka */
- (char **)0, /* args */
- (char *)0, /* dir */
- (char *)0, /* term */
- -1, /* aflag */
- -1, /* flowflag */
- -1, /* lflag */
- -1, /* histheight */
- -1, /* monitor */
- -1, /* wlock */
- -1, /* silence */
- -1, /* wrap */
- -1, /* logging */
- -1, /* slowpaste */
- -1, /* gr */
- -1, /* c1 */
- -1, /* bce */
- -1, /* encoding */
- (char *)0, /* hstatus */
- (char *)0 /* charset */
-};
-
-struct NewWindow nwin_default =
-{
- 0, /* StartAt */
- 0, /* aka */
- ShellArgs, /* args */
- 0, /* dir */
- screenterm, /* term */
- 0, /* aflag */
- 1*FLOW_NOW, /* flowflag */
- LOGINDEFAULT, /* lflag */
- DEFAULTHISTHEIGHT, /* histheight */
- MON_OFF, /* monitor */
- WLOCK_OFF, /* wlock */
- 0, /* silence */
- 1, /* wrap */
- 0, /* logging */
- 0, /* slowpaste */
- 0, /* gr */
- 1, /* c1 */
- 0, /* bce */
- 0, /* encoding */
- (char *)0, /* hstatus */
- (char *)0 /* charset */
-};
-
-struct NewWindow nwin_options;
-
-static int const_IOSIZE = IOSIZE;
-static int const_one = 1;
-
-void
-nwin_compose(def, new, res)
-struct NewWindow *def, *new, *res;
-{
-#define COMPOSE(x) res->x = new->x != nwin_undef.x ? new->x : def->x
- COMPOSE(StartAt);
- COMPOSE(aka);
- COMPOSE(args);
- COMPOSE(dir);
- COMPOSE(term);
- COMPOSE(aflag);
- COMPOSE(flowflag);
- COMPOSE(lflag);
- COMPOSE(histheight);
- COMPOSE(monitor);
- COMPOSE(wlock);
- COMPOSE(silence);
- COMPOSE(wrap);
- COMPOSE(Lflag);
- COMPOSE(slow);
- COMPOSE(gr);
- COMPOSE(c1);
- COMPOSE(bce);
- COMPOSE(encoding);
- COMPOSE(hstatus);
- COMPOSE(charset);
-#undef COMPOSE
-}
-
-/*****************************************************************
- *
- * The window layer functions
- */
-
-struct LayFuncs WinLf =
-{
- WinProcess,
- 0,
- WinRedisplayLine,
- WinClearLine,
- WinRewrite,
- WinResize,
- WinRestore
-};
-
-static int
-DoAutolf(buf, lenp, fr)
-char *buf;
-int *lenp;
-int fr;
-{
- char *p;
- int len = *lenp;
- int trunc = 0;
-
- for (p = buf; len > 0; p++, len--)
- {
- if (*p != '\r')
- continue;
- if (fr-- <= 0)
- {
- trunc++;
- len--;
- }
- if (len == 0)
- break;
- bcopy(p, p + 1, len++);
- p[1] = '\n';
- }
- *lenp = p - buf;
- return trunc;
-}
-
-static void
-WinProcess(bufpp, lenp)
-char **bufpp;
-int *lenp;
-{
- int l2 = 0, f, *ilen, l = *lenp, trunc;
- char *ibuf;
-
- debug1("WinProcess: %d bytes\n", *lenp);
- fore = (struct win *)flayer->l_data;
-
- if (fore->w_ptyfd < 0) /* zombie? */
- {
- ZombieProcess(bufpp, lenp);
- return;
- }
-#ifdef MULTIUSER
- /* a pending writelock is this:
- * fore->w_wlock == WLOCK_AUTO, fore->w_wlockuse = NULL
- * The user who wants to use this window next, will get the lock, if he can.
- */
- if (display && fore->w_wlock == WLOCK_AUTO &&
- !fore->w_wlockuser && !AclCheckPermWin(D_user, ACL_WRITE, fore))
- {
- fore->w_wlockuser = D_user;
- debug2("window %d: pending writelock grabbed by user %s\n",
- fore->w_number, fore->w_wlockuser->u_name);
- }
- /* if w_wlock is set, only one user may write, else we check acls */
- if (display && ((fore->w_wlock == WLOCK_OFF) ?
- AclCheckPermWin(D_user, ACL_WRITE, fore) :
- (D_user != fore->w_wlockuser)))
- {
- debug2("window %d, user %s: ", fore->w_number, D_user->u_name);
- debug2("writelock %d (wlockuser %s)\n", fore->w_wlock,
- fore->w_wlockuser ? fore->w_wlockuser->u_name : "NULL");
- /* XXX FIXME only display !*/
- WBell(fore, visual_bell);
- *bufpp += *lenp;
- *lenp = 0;
- return;
- }
-#endif /* MULTIUSER */
-
-#ifdef BUILTIN_TELNET
- if (fore->w_type == W_TYPE_TELNET && TelIsline(fore) && *bufpp != fore->w_telbuf)
- {
- TelProcessLine(bufpp, lenp);
- return;
- }
-#endif
-
-#ifdef PSEUDOS
- if (W_UWP(fore))
- {
- /* we send the user input to our pseudowin */
- ibuf = fore->w_pwin->p_inbuf; ilen = &fore->w_pwin->p_inlen;
- f = sizeof(fore->w_pwin->p_inbuf) - *ilen;
- }
- else
-#endif /* PSEUDOS */
- {
- /* we send the user input to the window */
- ibuf = fore->w_inbuf; ilen = &fore->w_inlen;
- f = sizeof(fore->w_inbuf) - *ilen;
- }
-
- if (l > f)
- l = f;
-#ifdef BUILTIN_TELNET
- while (l > 0)
-#else
- if (l > 0)
-#endif
- {
- l2 = l;
- bcopy(*bufpp, ibuf + *ilen, l2);
- if (fore->w_autolf && (trunc = DoAutolf(ibuf + *ilen, &l2, f - l2)))
- l -= trunc;
-#ifdef BUILTIN_TELNET
- if (fore->w_type == W_TYPE_TELNET && (trunc = DoTelnet(ibuf + *ilen, &l2, f - l2)))
- {
- l -= trunc;
- if (fore->w_autolf)
- continue; /* need exact value */
- }
-#endif
- *ilen += l2;
- *bufpp += l;
- *lenp -= l;
- return;
- }
-}
-
-static void
-ZombieProcess(bufpp, lenp)
-char **bufpp;
-int *lenp;
-{
- int l = *lenp;
- char *buf = *bufpp, b1[10], b2[10];
-
- debug1("ZombieProcess: %d bytes\n", *lenp);
- fore = (struct win *)flayer->l_data;
-
- ASSERT(fore->w_ptyfd < 0);
- *bufpp += *lenp;
- *lenp = 0;
- for (; l-- > 0; buf++)
- {
- if (*(unsigned char *)buf == ZombieKey_destroy)
- {
- debug1("Turning undead: %d\n", fore->w_number);
- KillWindow(fore);
- return;
- }
- if (*(unsigned char *)buf == ZombieKey_resurrect)
- {
- debug1("Resurrecting Zombie: %d\n", fore->w_number);
- WriteString(fore, "\r\n", 2);
- RemakeWindow(fore);
- return;
- }
- }
- b1[AddXChar(b1, ZombieKey_destroy)] = '\0';
- b2[AddXChar(b2, ZombieKey_resurrect)] = '\0';
- Msg(0, "Press %s to destroy or %s to resurrect window", b1, b2);
-}
-
-static void
-WinRedisplayLine(y, from, to, isblank)
-int y, from, to, isblank;
-{
- debug3("WinRedisplayLine %d %d %d\n", y, from, to);
- if (y < 0)
- return;
- fore = (struct win *)flayer->l_data;
- if (from == 0 && y > 0 && fore->w_mlines[y - 1].image[fore->w_width] == 0)
- LCDisplayLineWrap(&fore->w_layer, &fore->w_mlines[y], y, from, to, isblank);
- else
- LCDisplayLine(&fore->w_layer, &fore->w_mlines[y], y, from, to, isblank);
-}
-
-static int
-WinRewrite(y, x1, x2, rend, doit)
-int y, x1, x2, doit;
-struct mchar *rend;
-{
- register int cost, dx;
- register unsigned char *p, *i;
-#ifdef FONT
- register unsigned char *f;
-#endif
-#ifdef COLOR
- register unsigned char *c;
-# ifdef COLORS256
- register unsigned char *cx;
-# endif
-#endif
-
- debug3("WinRewrite %d, %d-%d\n", y, x1, x2);
- fore = (struct win *)flayer->l_data;
- dx = x2 - x1 + 1;
- if (doit)
- {
- i = fore->w_mlines[y].image + x1;
- while (dx-- > 0)
- PUTCHAR(*i++);
- return 0;
- }
- p = fore->w_mlines[y].attr + x1;
-#ifdef FONT
- f = fore->w_mlines[y].font + x1;
-# ifdef DW_CHARS
- if (is_dw_font(rend->font))
- return EXPENSIVE;
-# endif
-# ifdef UTF8
- if (fore->w_encoding && fore->w_encoding != UTF8 && D_encoding == UTF8 && ContainsSpecialDeffont(fore->w_mlines + y, x1, x2, fore->w_encoding))
- return EXPENSIVE;
-# endif
-#endif
-#ifdef COLOR
- c = fore->w_mlines[y].color + x1;
-# ifdef COLORS256
- cx = fore->w_mlines[y].colorx + x1;
-# endif
-#endif
-
- cost = dx = x2 - x1 + 1;
- while(dx-- > 0)
- {
- if (*p++ != rend->attr)
- return EXPENSIVE;
-#ifdef FONT
- if (*f++ != rend->font)
- return EXPENSIVE;
-#endif
-#ifdef COLOR
- if (*c++ != rend->color)
- return EXPENSIVE;
-# ifdef COLORS256
- if (*cx++ != rend->colorx)
- return EXPENSIVE;
-# endif
-#endif
- }
- return cost;
-}
-
-static void
-WinClearLine(y, xs, xe, bce)
-int y, xs, xe, bce;
-{
- fore = (struct win *)flayer->l_data;
- debug3("WinClearLine %d %d-%d\n", y, xs, xe);
- LClearLine(flayer, y, xs, xe, bce, &fore->w_mlines[y]);
-}
-
-static int
-WinResize(wi, he)
-int wi, he;
-{
- fore = (struct win *)flayer->l_data;
- ChangeWindowSize(fore, wi, he, fore->w_histheight);
- return 0;
-}
-
-static void
-WinRestore()
-{
- struct canvas *cv;
- fore = (struct win *)flayer->l_data;
- debug1("WinRestore: win %x\n", fore);
- for (cv = flayer->l_cvlist; cv; cv = cv->c_next)
- {
- display = cv->c_display;
- if (cv != D_forecv)
- continue;
- /* ChangeScrollRegion(fore->w_top, fore->w_bot); */
- KeypadMode(fore->w_keypad);
- CursorkeysMode(fore->w_cursorkeys);
- SetFlow(fore->w_flow & FLOW_NOW);
- InsertMode(fore->w_insert);
- ReverseVideo(fore->w_revvid);
- CursorVisibility(fore->w_curinv ? -1 : fore->w_curvvis);
- MouseMode(fore->w_mouse);
- }
-}
-
-/*****************************************************************/
-
-
-/*
- * DoStartLog constructs a path for the "want to be logfile" in buf and
- * attempts logfopen.
- *
- * returns 0 on success.
- */
-int
-DoStartLog(w, buf, bufsize)
-struct win *w;
-char *buf;
-int bufsize;
-{
- int n;
- if (!w || !buf)
- return -1;
-
- strncpy(buf, MakeWinMsg(screenlogfile, w, '%'), bufsize - 1);
- buf[bufsize - 1] = 0;
-
- debug2("DoStartLog: win %d, file %s\n", w->w_number, buf);
-
- if (w->w_log != NULL)
- logfclose(w->w_log);
-
- if ((w->w_log = logfopen(buf, islogfile(buf) ? NULL : secfopen(buf, "a"))) == NULL)
- return -2;
- if (!logflushev.queued)
- {
- n = log_flush ? log_flush : (logtstamp_after + 4) / 5;
- if (n)
- {
- SetTimeout(&logflushev, n * 1000);
- evenq(&logflushev);
- }
- }
- return 0;
-}
-
-/*
- * Umask & wlock are set for the user of the display,
- * The display d (if specified) switches to that window.
- */
-int
-MakeWindow(newwin)
-struct NewWindow *newwin;
-{
- register struct win **pp, *p;
- register int n, i;
- int f = -1;
- struct NewWindow nwin;
- int type, startat;
- char *TtyName;
-#ifdef MULTIUSER
- extern struct acluser *users;
-#endif
-
- debug1("NewWindow: StartAt %d\n", newwin->StartAt);
- debug1("NewWindow: aka %s\n", newwin->aka?newwin->aka:"NULL");
- debug1("NewWindow: dir %s\n", newwin->dir?newwin->dir:"NULL");
- debug1("NewWindow: term %s\n", newwin->term?newwin->term:"NULL");
-
- nwin_compose(&nwin_default, newwin, &nwin);
- debug1("NWin: aka %s\n", nwin.aka ? nwin.aka : "NULL");
- debug1("NWin: wlock %d\n", nwin.wlock);
- debug1("NWin: Lflag %d\n", nwin.Lflag);
-
- startat = nwin.StartAt < maxwin ? nwin.StartAt : 0;
- pp = wtab + startat;
-
- do
- {
- if (*pp == 0)
- break;
- if (++pp == wtab + maxwin)
- pp = wtab;
- }
- while (pp != wtab + startat);
- if (*pp)
- {
- Msg(0, "No more windows.");
- return -1;
- }
-
-#if defined(USRLIMIT) && defined(UTMPOK)
- /*
- * Count current number of users, if logging windows in.
- */
- if (nwin.lflag && CountUsers() >= USRLIMIT)
- {
- Msg(0, "User limit reached. Window will not be logged in.");
- nwin.lflag = 0;
- }
-#endif
- n = pp - wtab;
- debug1("Makewin creating %d\n", n);
-
- if ((f = OpenDevice(nwin.args, nwin.lflag, &type, &TtyName)) < 0)
- return -1;
-
- if ((p = (struct win *)malloc(sizeof(struct win))) == 0)
- {
- close(f);
- Msg(0, strnomem);
- return -1;
- }
- bzero((char *)p, (int)sizeof(struct win));
-
-#ifdef UTMPOK
- if (type != W_TYPE_PTY)
- nwin.lflag = 0;
-#endif
-
- p->w_type = type;
-
- /* save the command line so that zombies can be resurrected */
- for (i = 0; nwin.args[i] && i < MAXARGS - 1; i++)
- p->w_cmdargs[i] = SaveStr(nwin.args[i]);
- p->w_cmdargs[i] = 0;
- if (nwin.dir)
- p->w_dir = SaveStr(nwin.dir);
- if (nwin.term)
- p->w_term = SaveStr(nwin.term);
-
- p->w_number = n;
-#ifdef MULTIUSER
- /*
- * This is dangerous: without a display we use creators umask
- * This is intended to be usefull for detached startup.
- * But is still better than default bits with a NULL user.
- */
- if (NewWindowAcl(p, display ? D_user : users))
- {
- free((char *)p);
- close(f);
- Msg(0, strnomem);
- return -1;
- }
-#endif
- p->w_layer.l_next = 0;
- p->w_layer.l_bottom = &p->w_layer;
- p->w_layer.l_layfn = &WinLf;
- p->w_layer.l_data = (char *)p;
- p->w_savelayer = &p->w_layer;
- p->w_pdisplay = 0;
- p->w_lastdisp = 0;
-
-#ifdef MULTIUSER
- if (display && !AclCheckPermWin(D_user, ACL_WRITE, p))
- p->w_wlockuser = D_user;
- p->w_wlock = nwin.wlock;
-#endif
- p->w_ptyfd = f;
- p->w_aflag = nwin.aflag;
- p->w_flow = nwin.flowflag | ((nwin.flowflag & FLOW_AUTOFLAG) ? (FLOW_AUTO|FLOW_NOW) : FLOW_AUTO);
- if (!nwin.aka)
- nwin.aka = Filename(nwin.args[0]);
- strncpy(p->w_akabuf, nwin.aka, sizeof(p->w_akabuf) - 1);
- if ((nwin.aka = rindex(p->w_akabuf, '|')) != NULL)
- {
- p->w_autoaka = 0;
- *nwin.aka++ = 0;
- p->w_title = nwin.aka;
- p->w_akachange = nwin.aka + strlen(nwin.aka);
- }
- else
- p->w_title = p->w_akachange = p->w_akabuf;
- if (nwin.hstatus)
- p->w_hstatus = SaveStr(nwin.hstatus);
- p->w_monitor = nwin.monitor;
-#ifdef MULTIUSER
- if (p->w_monitor == MON_ON)
- {
- /* always tell all users */
- for (i = 0; i < maxusercount; i++)
- ACLBYTE(p->w_mon_notify, i) |= ACLBIT(i);
- }
-#endif
- /*
- * defsilence by Lloyd Zusman (zusman_lloyd@jpmorgan.com)
- */
- p->w_silence = nwin.silence;
- p->w_silencewait = SilenceWait;
-#ifdef MULTIUSER
- if (p->w_silence == SILENCE_ON)
- {
- /* always tell all users */
- for (i = 0; i < maxusercount; i++)
- ACLBYTE(p->w_lio_notify, i) |= ACLBIT(i);
- }
-#endif
-#ifdef COPY_PASTE
- p->w_slowpaste = nwin.slow;
-#else
- nwin.histheight = 0;
-#endif
-
- p->w_norefresh = 0;
- strncpy(p->w_tty, TtyName, MAXSTR - 1);
-
-#if 0
- /* XXX Fixme display resize */
- if (ChangeWindowSize(p, display ? D_defwidth : 80,
- display ? D_defheight : 24,
- nwin.histheight))
- {
- FreeWindow(p);
- return -1;
- }
-#else
- if (ChangeWindowSize(p, display ? D_forecv->c_xe - D_forecv->c_xs + 1: 80,
- display ? D_forecv->c_ye - D_forecv->c_ys + 1 : 24,
- nwin.histheight))
- {
- FreeWindow(p);
- return -1;
- }
-#endif
-
- p->w_encoding = nwin.encoding;
- ResetWindow(p); /* sets w_wrap, w_c1, w_gr, w_bce */
-
-#ifdef FONT
- if (nwin.charset)
- SetCharsets(p, nwin.charset);
-#endif
-
- if (VerboseCreate)
- {
- struct display *d = display; /* WriteString zaps display */
-
- WriteString(p, ":screen (", 9);
- WriteString(p, p->w_title, strlen(p->w_title));
- WriteString(p, "):", 2);
- for (f = 0; p->w_cmdargs[f]; f++)
- {
- WriteString(p, " ", 1);
- WriteString(p, p->w_cmdargs[f], strlen(p->w_cmdargs[f]));
- }
- WriteString(p, "\r\n", 2);
- display = d;
- }
-
- p->w_pid = 0;
-#ifdef PSEUDOS
- p->w_pwin = 0;
-#endif
-
-#ifdef BUILTIN_TELNET
- if (type == W_TYPE_TELNET)
- {
- if (TelConnect(p))
- {
- FreeWindow(p);
- return -1;
- }
- }
- else
-#endif
- if (type == W_TYPE_PTY)
- {
- p->w_pid = ForkWindow(p, nwin.args, TtyName);
- if (p->w_pid < 0)
- {
- FreeWindow(p);
- return -1;
- }
- }
-
- /*
- * Place the new window at the head of the most-recently-used list.
- */
- if (display && D_fore)
- D_other = D_fore;
- *pp = p;
- p->w_next = windows;
- windows = p;
- p->w_lflag = nwin.lflag;
-#ifdef UTMPOK
- p->w_slot = (slot_t)-1;
-# ifdef LOGOUTOK
- debug1("MakeWindow will %slog in.\n", nwin.lflag?"":"not ");
- if (nwin.lflag & 1)
-# else /* LOGOUTOK */
- debug1("MakeWindow will log in, LOGOUTOK undefined in config.h%s.\n",
- nwin.lflag?"":" (although lflag=0)");
-# endif /* LOGOUTOK */
- {
- p->w_slot = (slot_t)0;
- if (display || (p->w_lflag & 2))
- SetUtmp(p);
- }
-# ifdef CAREFULUTMP
- CarefulUtmp(); /* If all 've been zombies, we've had no slot */
-# endif
-#endif /* UTMPOK */
-
- if (nwin.Lflag)
- {
- char buf[1024];
- DoStartLog(p, buf, sizeof(buf));
- }
-
- p->w_readev.fd = p->w_writeev.fd = p->w_ptyfd;
- p->w_readev.type = EV_READ;
- p->w_writeev.type = EV_WRITE;
- p->w_readev.data = p->w_writeev.data = (char *)p;
- p->w_readev.handler = win_readev_fn;
- p->w_writeev.handler = win_writeev_fn;
- p->w_writeev.condpos = &p->w_inlen;
- evenq(&p->w_readev);
- evenq(&p->w_writeev);
-#ifdef COPY_PASTE
- p->w_paster.pa_slowev.type = EV_TIMEOUT;
- p->w_paster.pa_slowev.data = (char *)&p->w_paster;
- p->w_paster.pa_slowev.handler = paste_slowev_fn;
-#endif
- p->w_silenceev.type = EV_TIMEOUT;
- p->w_silenceev.data = (char *)p;
- p->w_silenceev.handler = win_silenceev_fn;
- if (p->w_silence > 0)
- {
- debug("New window has silence enabled.\n");
- SetTimeout(&p->w_silenceev, p->w_silencewait * 1000);
- evenq(&p->w_silenceev);
- }
-
- SetForeWindow(p);
- Activate(p->w_norefresh);
- WindowChanged((struct win*)0, 'w');
- WindowChanged((struct win*)0, 'W');
- WindowChanged((struct win*)0, 0);
- return n;
-}
-
-/*
- * Resurrect a window from Zombie state.
- * The command vector is therefore stored in the window structure.
- * Note: The terminaltype defaults to screenterm again, the current
- * working directory is lost.
- */
-int
-RemakeWindow(p)
-struct win *p;
-{
- char *TtyName;
- int lflag, f;
-
- lflag = nwin_default.lflag;
- if ((f = OpenDevice(p->w_cmdargs, lflag, &p->w_type, &TtyName)) < 0)
- return -1;
-
- strncpy(p->w_tty, *TtyName ? TtyName : p->w_title, MAXSTR - 1);
- p->w_ptyfd = f;
- p->w_readev.fd = f;
- p->w_writeev.fd = f;
- evenq(&p->w_readev);
- evenq(&p->w_writeev);
-
- if (VerboseCreate)
- {
- struct display *d = display; /* WriteString zaps display */
-
- WriteString(p, ":screen (", 9);
- WriteString(p, p->w_title, strlen(p->w_title));
- WriteString(p, "):", 2);
- for (f = 0; p->w_cmdargs[f]; f++)
- {
- WriteString(p, " ", 1);
- WriteString(p, p->w_cmdargs[f], strlen(p->w_cmdargs[f]));
- }
- WriteString(p, "\r\n", 2);
- display = d;
- }
-
- p->w_pid = 0;
-#ifdef BUILTIN_TELNET
- if (p->w_type == W_TYPE_TELNET)
- {
- if (TelConnect(p))
- return -1;
- }
- else
-#endif
- if (p->w_type == W_TYPE_PTY)
- {
- p->w_pid = ForkWindow(p, p->w_cmdargs, TtyName);
- if (p->w_pid < 0)
- return -1;
- }
-
-#ifdef UTMPOK
- if (p->w_slot == (slot_t)0 && (display || (p->w_lflag & 2)))
- SetUtmp(p);
-# ifdef CAREFULUTMP
- CarefulUtmp(); /* If all 've been zombies, we've had no slot */
-# endif
-#endif
- WindowChanged(p, 'f');
- return p->w_number;
-}
-
-void
-CloseDevice(wp)
-struct win *wp;
-{
- if (wp->w_ptyfd < 0)
- return;
- if (wp->w_type == W_TYPE_PTY)
- {
- /* pty 4 SALE */
- (void)chmod(wp->w_tty, 0666);
- (void)chown(wp->w_tty, 0, 0);
- }
- close(wp->w_ptyfd);
- wp->w_ptyfd = -1;
- wp->w_tty[0] = 0;
- evdeq(&wp->w_readev);
- evdeq(&wp->w_writeev);
-#ifdef BUILTIN_TELNET
- evdeq(&wp->w_telconnev);
-#endif
- wp->w_readev.fd = wp->w_writeev.fd = -1;
-}
-
-void
-FreeWindow(wp)
-struct win *wp;
-{
- struct display *d;
- int i;
- struct canvas *cv, *ncv;
- struct layer *l;
-
- debug1("FreeWindow %d\n", wp ? wp->w_number: -1);
-#ifdef PSEUDOS
- if (wp->w_pwin)
- FreePseudowin(wp);
-#endif
-#ifdef UTMPOK
- RemoveUtmp(wp);
-#endif
- CloseDevice(wp);
-
- if (wp == console_window)
- {
- TtyGrabConsole(-1, -1, "free");
- console_window = 0;
- }
- if (wp->w_log != NULL)
- logfclose(wp->w_log);
- ChangeWindowSize(wp, 0, 0, 0);
-
- if (wp->w_hstatus)
- free(wp->w_hstatus);
- for (i = 0; wp->w_cmdargs[i]; i++)
- free(wp->w_cmdargs[i]);
- if (wp->w_dir)
- free(wp->w_dir);
- if (wp->w_term)
- free(wp->w_term);
- for (d = displays; d; d = d->d_next)
- {
- if (d->d_other == wp)
- d->d_other = d->d_fore && d->d_fore->w_next != wp ? d->d_fore->w_next : wp->w_next;
- if (d->d_fore == wp)
- d->d_fore = NULL;
- for (cv = d->d_cvlist; cv; cv = cv->c_next)
- {
- for (l = cv->c_layer; l; l = l->l_next)
- if (l->l_layfn == &WinLf)
- break;
- if (!l)
- continue;
- if ((struct win *)l->l_data != wp)
- continue;
- if (cv->c_layer == wp->w_savelayer)
- wp->w_savelayer = 0;
- KillLayerChain(cv->c_layer);
- }
- }
- if (wp->w_savelayer)
- KillLayerChain(wp->w_savelayer);
- for (cv = wp->w_layer.l_cvlist; cv; cv = ncv)
- {
- ncv = cv->c_lnext;
- cv->c_layer = &cv->c_blank;
- cv->c_blank.l_cvlist = cv;
- cv->c_lnext = 0;
- cv->c_xoff = cv->c_xs;
- cv->c_yoff = cv->c_ys;
- RethinkViewportOffsets(cv);
- }
- wp->w_layer.l_cvlist = 0;
- if (flayer == &wp->w_layer)
- flayer = 0;
-
-#ifdef MULTIUSER
- FreeWindowAcl(wp);
-#endif /* MULTIUSER */
- evdeq(&wp->w_readev); /* just in case */
- evdeq(&wp->w_writeev); /* just in case */
- evdeq(&wp->w_silenceev);
-#ifdef COPY_PASTE
- FreePaster(&wp->w_paster);
-#endif
- free((char *)wp);
-}
-
-static int
-OpenDevice(args, lflag, typep, namep)
-char **args;
-int lflag;
-int *typep;
-char **namep;
-{
- char *arg = args[0];
- struct stat st;
- int f;
-
- if (!arg)
- return -1;
-#ifdef BUILTIN_TELNET
- if (strcmp(arg, "//telnet") == 0)
- {
- f = TelOpen(args + 1);
- lflag = 0;
- *typep = W_TYPE_TELNET;
- *namep = "telnet";
- }
- else
-#endif
- if ((stat(arg, &st)) == 0 && S_ISCHR(st.st_mode))
- {
- if (access(arg, R_OK | W_OK) == -1)
- {
- Msg(errno, "Cannot access line '%s' for R/W", arg);
- return -1;
- }
- debug("OpenDevice: OpenTTY\n");
- if ((f = OpenTTY(arg, args[1])) < 0)
- return -1;
- lflag = 0;
- *typep = W_TYPE_PLAIN;
- *namep = arg;
- }
- else
- {
- *typep = W_TYPE_PTY;
- f = OpenPTY(namep);
- if (f == -1)
- {
- Msg(0, "No more PTYs.");
- return -1;
- }
-#ifdef TIOCPKT
- {
- int flag = 1;
- if (ioctl(f, TIOCPKT, (char *)&flag))
- {
- Msg(errno, "TIOCPKT ioctl");
- close(f);
- return -1;
- }
- }
-#endif /* TIOCPKT */
- }
- debug1("fcntl(%d, F_SETFL, FNBLOCK)\n", f);
- (void) fcntl(f, F_SETFL, FNBLOCK);
-#ifdef linux
- /*
- * Tenebreux (zeus@ns.acadiacom.net) has Linux 1.3.70 where select
- * gets confused in the following condition:
- * Open a pty-master side, request a flush on it, then set packet
- * mode and call select(). Select will return a possible read, where
- * the one byte response to the flush can be found. Select will
- * thereafter return a possible read, which yields I/O error.
- *
- * If we request another flush *after* switching into packet mode,
- * this I/O error does not occur. We receive a single response byte
- * although we send two flush requests now.
- *
- * Maybe we should not flush at all.
- *
- * 10.5.96 jw.
- */
- if (*typep == W_TYPE_PTY || *typep == W_TYPE_PLAIN)
- tcflush(f, TCIOFLUSH);
-#endif
-
- if (*typep != W_TYPE_PTY)
- return f;
-
-#ifndef PTYROFS
-#ifdef PTYGROUP
- if (chown(*namep, real_uid, PTYGROUP) && !eff_uid)
-#else
- if (chown(*namep, real_uid, real_gid) && !eff_uid)
-#endif
- {
- Msg(errno, "chown tty");
- close(f);
- return -1;
- }
-#ifdef UTMPOK
- if (chmod(*namep, lflag ? TtyMode : (TtyMode & ~022)) && !eff_uid)
-#else
- if (chmod(*namep, TtyMode) && !eff_uid)
-#endif
- {
- Msg(errno, "chmod tty");
- close(f);
- return -1;
- }
-#endif
- return f;
-}
-
-/*
- * Fields w_width, w_height, aflag, number (and w_tty)
- * are read from struct win *win. No fields written.
- * If pwin is nonzero, filedescriptors are distributed
- * between win->w_tty and open(ttyn)
- *
- */
-static int
-ForkWindow(win, args, ttyn)
-struct win *win;
-char **args, *ttyn;
-{
- int pid;
- char tebuf[25];
- char ebuf[10];
- char shellbuf[7 + MAXPATHLEN];
- char *proc;
-#ifndef TIOCSWINSZ
- char libuf[20], cobuf[20];
-#endif
- int newfd;
- int w = win->w_width;
- int h = win->w_height;
-#ifdef PSEUDOS
- int i, pat, wfdused;
- struct pseudowin *pwin = win->w_pwin;
-#endif
- int slave = -1;
-
-#ifdef O_NOCTTY
- if (pty_preopen)
- {
- debug("pre-opening slave...\n");
- if ((slave = open(ttyn, O_RDWR|O_NOCTTY)) == -1)
- {
- Msg(errno, "ttyn");
- return -1;
- }
- }
-#endif
- debug("forking...\n");
- proc = *args;
- if (proc == 0)
- {
- args = ShellArgs;
- proc = *args;
- }
- fflush(stdout);
- fflush(stderr);
- switch (pid = fork())
- {
- case -1:
- Msg(errno, "fork");
- break;
- case 0:
- signal(SIGHUP, SIG_DFL);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- signal(SIGTERM, SIG_DFL);
-#ifdef BSDJOBS
- signal(SIGTTIN, SIG_DFL);
- signal(SIGTTOU, SIG_DFL);
-#endif
-#ifdef SIGPIPE
- signal(SIGPIPE, SIG_DFL);
-#endif
-#ifdef SIGXFSZ
- signal(SIGXFSZ, SIG_DFL);
-#endif
-
- displays = 0; /* beware of Panic() */
- if (setgid(real_gid) || setuid(real_uid))
- Panic(errno, "Setuid/gid");
- eff_uid = real_uid;
- eff_gid = real_gid;
-#ifdef PSEUDOS
- if (!pwin) /* ignore directory if pseudo */
-#endif
- if (win->w_dir && *win->w_dir && chdir(win->w_dir))
- Panic(errno, "Cannot chdir to %s", win->w_dir);
-
- if (display)
- {
- brktty(D_userfd);
- freetty();
- }
- else
- brktty(-1);
-#ifdef DEBUG
- if (dfp && dfp != stderr)
- fclose(dfp);
-#endif
- if (slave != -1)
- {
- close(0);
- dup(slave);
- close(slave);
- closeallfiles(win->w_ptyfd);
- slave = dup(0);
- }
- else
- closeallfiles(win->w_ptyfd);
-#ifdef DEBUG
- if (dfp) /* do not produce child debug, when debug is "off" */
- {
- char buf[256];
-
- sprintf(buf, "%s/screen.child", DEBUGDIR);
- if ((dfp = fopen(buf, "a")) == 0)
- dfp = stderr;
- else
- (void) chmod(buf, 0666);
- }
- debug1("=== ForkWindow: pid %d\n", (int)getpid());
-#endif
- /* Close the three /dev/null descriptors */
- close(0);
- close(1);
- close(2);
- newfd = -1;
- /*
- * distribute filedescriptors between the ttys
- */
-#ifdef PSEUDOS
- pat = pwin ? pwin->p_fdpat :
- ((F_PFRONT<<(F_PSHIFT*2)) | (F_PFRONT<<F_PSHIFT) | F_PFRONT);
- debug1("Using window pattern 0x%x\n", pat);
- wfdused = 0;
- for(i = 0; i < 3; i++)
- {
- if (pat & F_PFRONT << F_PSHIFT * i)
- {
- if (newfd < 0)
- {
-# ifdef O_NOCTTY
- if (separate_sids)
- newfd = open(ttyn, O_RDWR);
- else
- newfd = open(ttyn, O_RDWR|O_NOCTTY);
-# else
- newfd = open(ttyn, O_RDWR);
-# endif
- if (newfd < 0)
- Panic(errno, "Cannot open %s", ttyn);
- }
- else
- dup(newfd);
- }
- else
- {
- dup(win->w_ptyfd);
- wfdused = 1;
- }
- }
- if (wfdused)
- {
- /*
- * the pseudo window process should not be surprised with a
- * nonblocking filedescriptor. Poor Backend!
- */
- debug1("Clearing NBLOCK on window-fd(%d)\n", win->w_ptyfd);
- if (fcntl(win->w_ptyfd, F_SETFL, 0))
- Msg(errno, "Warning: clear NBLOCK fcntl failed");
- }
-#else /* PSEUDOS */
-# ifdef O_NOCTTY
- if (separate_sids)
- newfd = open(ttyn, O_RDWR);
- else
- newfd = open(ttyn, O_RDWR|O_NOCTTY);
-# else
- newfd = open(ttyn, O_RDWR);
-# endif
- if (newfd != 0)
- Panic(errno, "Cannot open %s", ttyn);
- dup(0);
- dup(0);
-#endif /* PSEUDOS */
- close(win->w_ptyfd);
- if (slave != -1)
- close(slave);
- if (newfd >= 0)
- {
- struct mode fakemode, *modep;
- InitPTY(newfd);
- if (fgtty(newfd))
- Msg(errno, "fgtty");
- if (display)
- {
- debug("ForkWindow: using display tty mode for new child.\n");
- modep = &D_OldMode;
- }
- else
- {
- debug("No display - creating tty setting\n");
- modep = &fakemode;
- InitTTY(modep, 0);
-#ifdef DEBUG
- DebugTTY(modep);
-#endif
- }
- /* We only want echo if the users input goes to the pseudo
- * and the pseudo's stdout is not send to the window.
- */
-#ifdef PSEUDOS
- if (pwin && (!(pat & F_UWP) || (pat & F_PBACK << F_PSHIFT)))
- {
- debug1("clearing echo on pseudywin fd (pat %x)\n", pat);
-# if defined(POSIX) || defined(TERMIO)
- modep->tio.c_lflag &= ~ECHO;
- modep->tio.c_iflag &= ~ICRNL;
-# else
- modep->m_ttyb.sg_flags &= ~ECHO;
-# endif
- }
-#endif
- SetTTY(newfd, modep);
-#ifdef TIOCSWINSZ
- glwz.ws_col = w;
- glwz.ws_row = h;
- (void) ioctl(newfd, TIOCSWINSZ, (char *)&glwz);
-#endif
- /* Always turn off nonblocking mode */
- (void)fcntl(newfd, F_SETFL, 0);
- }
-#ifndef TIOCSWINSZ
- sprintf(libuf, "LINES=%d", h);
- sprintf(cobuf, "COLUMNS=%d", w);
- NewEnv[5] = libuf;
- NewEnv[6] = cobuf;
-#endif
-#ifdef MAPKEYS
- NewEnv[2] = MakeTermcap(display == 0 || win->w_aflag);
-#else
- if (win->w_aflag)
- NewEnv[2] = MakeTermcap(1);
- else
- NewEnv[2] = Termcap;
-#endif
- strcpy(shellbuf, "SHELL=");
- strncpy(shellbuf + 6, ShellProg + (*ShellProg == '-'), sizeof(shellbuf) - 7);
- shellbuf[sizeof(shellbuf) - 1] = 0;
- NewEnv[4] = shellbuf;
- debug1("ForkWindow: NewEnv[4] = '%s'\n", shellbuf);
- if (win->w_term && *win->w_term && strcmp(screenterm, win->w_term) &&
- (strlen(win->w_term) < 20))
- {
- char *s1, *s2, tl;
-
- sprintf(tebuf, "TERM=%s", win->w_term);
- debug2("Makewindow %d with %s\n", win->w_number, tebuf);
- tl = strlen(win->w_term);
- NewEnv[1] = tebuf;
- if ((s1 = index(NewEnv[2], '|')))
- {
- if ((s2 = index(++s1, '|')))
- {
- if (strlen(NewEnv[2]) - (s2 - s1) + tl < 1024)
- {
- bcopy(s2, s1 + tl, strlen(s2) + 1);
- bcopy(win->w_term, s1, tl);
- }
- }
- }
- }
- sprintf(ebuf, "WINDOW=%d", win->w_number);
- NewEnv[3] = ebuf;
-
- if (*proc == '-')
- proc++;
- if (!*proc)
- proc = DefaultShell;
- debug1("calling execvpe %s\n", proc);
- execvpe(proc, args, NewEnv);
- debug1("exec error: %d\n", errno);
- Panic(errno, "Cannot exec '%s'", proc);
- default:
- break;
- }
- if (slave != -1)
- close(slave);
- return pid;
-}
-
-void
-execvpe(prog, args, env)
-char *prog, **args, **env;
-{
- register char *path = NULL, *p;
- char buf[1024];
- char *shargs[MAXARGS + 1];
- register int i, eaccess = 0;
-
- if (rindex(prog, '/'))
- path = "";
- if (!path && !(path = getenv("PATH")))
- path = DefaultPath;
- do
- {
- for (p = buf; *path && *path != ':'; path++)
- if (p - buf < (int)sizeof(buf) - 2)
- *p++ = *path;
- if (p > buf)
- *p++ = '/';
- if (p - buf + strlen(prog) >= sizeof(buf) - 1)
- continue;
- strcpy(p, prog);
- execve(buf, args, env);
- switch (errno)
- {
- case ENOEXEC:
- shargs[0] = DefaultShell;
- shargs[1] = buf;
- for (i = 1; (shargs[i + 1] = args[i]) != NULL; ++i)
- ;
- execve(DefaultShell, shargs, env);
- return;
- case EACCES:
- eaccess = 1;
- break;
- case ENOMEM:
- case E2BIG:
- case ETXTBSY:
- return;
- }
- } while (*path++);
- if (eaccess)
- errno = EACCES;
-}
-
-#ifdef PSEUDOS
-
-int
-winexec(av)
-char **av;
-{
- char **pp;
- char *p, *s, *t;
- int i, r = 0, l = 0;
- struct win *w;
- extern struct display *display;
- extern struct win *windows;
- struct pseudowin *pwin;
- int type;
-
- if ((w = display ? fore : windows) == NULL)
- return -1;
- if (!*av || w->w_pwin)
- {
- Msg(0, "Filter running: %s", w->w_pwin ? w->w_pwin->p_cmd : "(none)");
- return -1;
- }
- if (w->w_ptyfd < 0)
- {
- Msg(0, "You feel dead inside.");
- return -1;
- }
- if (!(pwin = (struct pseudowin *)malloc(sizeof(struct pseudowin))))
- {
- Msg(0, strnomem);
- return -1;
- }
- bzero((char *)pwin, (int)sizeof(*pwin));
-
- /* allow ^a:!!./ttytest as a short form for ^a:exec !.. ./ttytest */
- for (s = *av; *s == ' '; s++)
- ;
- for (p = s; *p == ':' || *p == '.' || *p == '!'; p++)
- ;
- if (*p != '|')
- while (*p && p > s && p[-1] == '.')
- p--;
- if (*p == '|')
- {
- l = F_UWP;
- p++;
- }
- if (*p)
- av[0] = p;
- else
- av++;
-
- t = pwin->p_cmd;
- for (i = 0; i < 3; i++)
- {
- *t = (s < p) ? *s++ : '.';
- switch (*t++)
- {
- case '.':
- case '|':
- l |= F_PFRONT << (i * F_PSHIFT);
- break;
- case '!':
- l |= F_PBACK << (i * F_PSHIFT);
- break;
- case ':':
- l |= F_PBOTH << (i * F_PSHIFT);
- break;
- }
- }
-
- if (l & F_UWP)
- {
- *t++ = '|';
- if ((l & F_PMASK) == F_PFRONT)
- {
- *pwin->p_cmd = '!';
- l ^= F_PFRONT | F_PBACK;
- }
- }
- if (!(l & F_PBACK))
- l |= F_UWP;
- *t++ = ' ';
- pwin->p_fdpat = l;
- debug1("winexec: '%#x'\n", pwin->p_fdpat);
-
- l = MAXSTR - 4;
- for (pp = av; *pp; pp++)
- {
- p = *pp;
- while (*p && l-- > 0)
- *t++ = *p++;
- if (l <= 0)
- break;
- *t++ = ' ';
- }
- *--t = '\0';
- debug1("%s\n", pwin->p_cmd);
-
- if ((pwin->p_ptyfd = OpenDevice(av, 0, &type, &t)) < 0)
- {
- free((char *)pwin);
- return -1;
- }
- strncpy(pwin->p_tty, t, MAXSTR - 1);
- w->w_pwin = pwin;
- if (type != W_TYPE_PTY)
- {
- FreePseudowin(w);
- Msg(0, "Cannot only use commands as pseudo win.");
- return -1;
- }
- if (!(pwin->p_fdpat & F_PFRONT))
- evdeq(&w->w_readev);
-#ifdef TIOCPKT
- {
- int flag = 0;
-
- if (ioctl(pwin->p_ptyfd, TIOCPKT, (char *)&flag))
- {
- Msg(errno, "TIOCPKT pwin ioctl");
- FreePseudowin(w);
- return -1;
- }
- if (w->w_type == W_TYPE_PTY && !(pwin->p_fdpat & F_PFRONT))
- {
- if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
- {
- Msg(errno, "TIOCPKT win ioctl");
- FreePseudowin(w);
- return -1;
- }
- }
- }
-#endif /* TIOCPKT */
-
- pwin->p_readev.fd = pwin->p_writeev.fd = pwin->p_ptyfd;
- pwin->p_readev.type = EV_READ;
- pwin->p_writeev.type = EV_WRITE;
- pwin->p_readev.data = pwin->p_writeev.data = (char *)w;
- pwin->p_readev.handler = pseu_readev_fn;
- pwin->p_writeev.handler = pseu_writeev_fn;
- pwin->p_writeev.condpos = &pwin->p_inlen;
- if (pwin->p_fdpat & (F_PFRONT << F_PSHIFT * 2 | F_PFRONT << F_PSHIFT))
- evenq(&pwin->p_readev);
- evenq(&pwin->p_writeev);
- r = pwin->p_pid = ForkWindow(w, av, t);
- if (r < 0)
- FreePseudowin(w);
- return r;
-}
-
-void
-FreePseudowin(w)
-struct win *w;
-{
- struct pseudowin *pwin = w->w_pwin;
-
- ASSERT(pwin);
- if (fcntl(w->w_ptyfd, F_SETFL, FNBLOCK))
- Msg(errno, "Warning: FreePseudowin: NBLOCK fcntl failed");
-#ifdef TIOCPKT
- if (w->w_type == W_TYPE_PTY && !(pwin->p_fdpat & F_PFRONT))
- {
- int flag = 1;
- if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
- Msg(errno, "Warning: FreePseudowin: TIOCPKT win ioctl");
- }
-#endif
- /* should be able to use CloseDevice() here */
- (void)chmod(pwin->p_tty, 0666);
- (void)chown(pwin->p_tty, 0, 0);
- if (pwin->p_ptyfd >= 0)
- close(pwin->p_ptyfd);
- evdeq(&pwin->p_readev);
- evdeq(&pwin->p_writeev);
- if (w->w_readev.condneg == &pwin->p_inlen)
- w->w_readev.condpos = w->w_readev.condneg = 0;
- evenq(&w->w_readev);
- free((char *)pwin);
- w->w_pwin = NULL;
-}
-
-#endif /* PSEUDOS */
-
-
-#ifdef MULTIUSER
-/*
- * returns 0, if the lock really has been released
- */
-int
-ReleaseAutoWritelock(dis, w)
-struct display *dis;
-struct win *w;
-{
- debug2("ReleaseAutoWritelock: user %s, window %d\n",
- dis->d_user->u_name, w->w_number);
-
- /* release auto writelock when user has no other display here */
- if (w->w_wlock == WLOCK_AUTO && w->w_wlockuser == dis->d_user)
- {
- struct display *d;
-
- for (d = displays; d; d = d->d_next)
- if (( d != dis) && (d->d_fore == w) && (d->d_user == dis->d_user))
- break;
- debug3("%s %s autolock on win %d\n",
- dis->d_user->u_name, d ? "keeps" : "releases", w->w_number);
- if (!d)
- {
- w->w_wlockuser = NULL;
- return 0;
- }
- }
- return 1;
-}
-
-/*
- * returns 0, if the lock really could be obtained
- */
-int
-ObtainAutoWritelock(d, w)
-struct display *d;
-struct win *w;
-{
- if ((w->w_wlock == WLOCK_AUTO) &&
- !AclCheckPermWin(d->d_user, ACL_WRITE, w) &&
- !w->w_wlockuser)
- {
- debug2("%s obtained auto writelock for exported window %d\n",
- d->d_user->u_name, w->w_number);
- w->w_wlockuser = d->d_user;
- return 0;
- }
- return 1;
-}
-
-#endif /* MULTIUSER */
-
-
-
-/********************************************************************/
-
-#ifdef COPY_PASTE
-static void
-paste_slowev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct paster *pa = (struct paster *)data;
- struct win *p;
-
- int l = 1;
- flayer = pa->pa_pastelayer;
- if (!flayer)
- pa->pa_pastelen = 0;
- if (!pa->pa_pastelen)
- return;
- p = Layer2Window(flayer);
- DoProcess(p, &pa->pa_pasteptr, &l, pa);
- pa->pa_pastelen -= 1 - l;
- if (pa->pa_pastelen > 0)
- {
- SetTimeout(&pa->pa_slowev, p->w_slowpaste);
- evenq(&pa->pa_slowev);
- }
-}
-#endif
-
-
-static int
-muchpending(p, ev)
-struct win *p;
-struct event *ev;
-{
- struct canvas *cv;
- for (cv = p->w_layer.l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_status == STATUS_ON_WIN && !D_status_bell)
- {
- /* wait 'til status is gone */
- debug("BLOCKING because of status\n");
- ev->condpos = &const_one;
- ev->condneg = &D_status;
- return 1;
- }
- debug2("muchpending %s %d: ", D_usertty, D_blocked);
- debug3("%d %d %d\n", D_obufp - D_obuf, D_obufmax, D_blocked_fuzz);
- if (D_blocked)
- continue;
- if (D_obufp - D_obuf > D_obufmax + D_blocked_fuzz)
- {
- if (D_nonblock == 0)
- {
- debug1("obuf is full, stopping output to display %s\n", D_usertty);
- D_blocked = 1;
- continue;
- }
- debug("BLOCKING because of full obuf\n");
- ev->condpos = &D_obuffree;
- ev->condneg = &D_obuflenmax;
- if (D_nonblock > 0 && !D_blockedev.queued)
- {
- debug1("created timeout of %g secs\n", D_nonblock/1000.);
- SetTimeout(&D_blockedev, D_nonblock);
- evenq(&D_blockedev);
- }
- return 1;
- }
- }
- return 0;
-}
-
-static void
-win_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- char buf[IOSIZE], *bp;
- int size, len;
-#ifdef PSEUDOS
- int wtop;
-#endif
-
- bp = buf;
- size = IOSIZE;
-
-#ifdef PSEUDOS
- wtop = p->w_pwin && W_WTOP(p);
- if (wtop)
- {
- ASSERT(sizeof(p->w_pwin->p_inbuf) == IOSIZE);
- size = IOSIZE - p->w_pwin->p_inlen;
- if (size <= 0)
- {
- ev->condpos = &const_IOSIZE;
- ev->condneg = &p->w_pwin->p_inlen;
- return;
- }
- }
-#endif
- if (p->w_layer.l_cvlist && muchpending(p, ev))
- return;
-#ifdef ZMODEM
- if (!p->w_zdisplay)
-#endif
- if (p->w_blocked)
- {
- ev->condpos = &const_one;
- ev->condneg = &p->w_blocked;
- return;
- }
- if (ev->condpos)
- ev->condpos = ev->condneg = 0;
-
- if ((len = p->w_outlen))
- {
- p->w_outlen = 0;
- WriteString(p, p->w_outbuf, len);
- return;
- }
-
- debug1("going to read from window fd %d\n", ev->fd);
- if ((len = read(ev->fd, buf, size)) < 0)
- {
- if (errno == EINTR || errno == EAGAIN)
- return;
-#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
- if (errno == EWOULDBLOCK)
- return;
-#endif
- debug2("Window %d: read error (errno %d) - killing window\n", p->w_number, errno);
- WindowDied(p);
- return;
- }
- if (len == 0)
- {
- debug1("Window %d: EOF - killing window\n", p->w_number);
- WindowDied(p);
- return;
- }
- debug1(" -> %d bytes\n", len);
-#ifdef TIOCPKT
- if (p->w_type == W_TYPE_PTY)
- {
- if (buf[0])
- {
- debug1("PAKET %x\n", buf[0]);
- if (buf[0] & TIOCPKT_NOSTOP)
- WNewAutoFlow(p, 0);
- if (buf[0] & TIOCPKT_DOSTOP)
- WNewAutoFlow(p, 1);
- }
- bp++;
- len--;
- }
-#endif
-#ifdef BUILTIN_TELNET
- if (p->w_type == W_TYPE_TELNET)
- len = TelIn(p, bp, len, buf + sizeof(buf) - (bp + len));
-#endif
- if (len == 0)
- return;
-#ifdef ZMODEM
- if (zmodem_mode && zmodem_parse(p, bp, len))
- return;
-#endif
-#ifdef PSEUDOS
- if (wtop)
- {
- debug("sending input to pwin\n");
- bcopy(bp, p->w_pwin->p_inbuf + p->w_pwin->p_inlen, len);
- p->w_pwin->p_inlen += len;
- }
-#endif
- WriteString(p, bp, len);
- return;
-}
-
-
-static void
-win_writeev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- int len;
- if (p->w_inlen)
- {
- debug2("writing %d bytes to win %d\n", p->w_inlen, p->w_number);
- if ((len = write(ev->fd, p->w_inbuf, p->w_inlen)) <= 0)
- len = p->w_inlen; /* dead window */
- if ((p->w_inlen -= len))
- bcopy(p->w_inbuf + len, p->w_inbuf, p->w_inlen);
- }
-#ifdef COPY_PASTE
- if (p->w_paster.pa_pastelen && !p->w_slowpaste)
- {
- struct paster *pa = &p->w_paster;
- flayer = pa->pa_pastelayer;
- if (flayer)
- DoProcess(p, &pa->pa_pasteptr, &pa->pa_pastelen, pa);
- }
-#endif
- return;
-}
-
-
-
-#ifdef PSEUDOS
-
-static void
-pseu_readev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- char buf[IOSIZE];
- int size, ptow, len;
-
- size = IOSIZE;
-
- ptow = W_PTOW(p);
- if (ptow)
- {
- ASSERT(sizeof(p->w_inbuf) == IOSIZE);
- size = IOSIZE - p->w_inlen;
- if (size <= 0)
- {
- ev->condpos = &const_IOSIZE;
- ev->condneg = &p->w_inlen;
- return;
- }
- }
- if (p->w_layer.l_cvlist && muchpending(p, ev))
- return;
- if (p->w_blocked)
- {
- ev->condpos = &const_one;
- ev->condneg = &p->w_blocked;
- return;
- }
- if (ev->condpos)
- ev->condpos = ev->condneg = 0;
-
- if ((len = p->w_outlen))
- {
- p->w_outlen = 0;
- WriteString(p, p->w_outbuf, len);
- return;
- }
-
- if ((len = read(ev->fd, buf, size)) <= 0)
- {
- if (errno == EINTR || errno == EAGAIN)
- return;
-#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
- if (errno == EWOULDBLOCK)
- return;
-#endif
- debug2("Window %d: pseudowin read error (errno %d) -- removing pseudowin\n", p->w_number, len ? errno : 0);
- FreePseudowin(p);
- return;
- }
- /* no packet mode on pseudos! */
- if (ptow)
- {
- bcopy(buf, p->w_inbuf + p->w_inlen, len);
- p->w_inlen += len;
- }
- WriteString(p, buf, len);
- return;
-}
-
-static void
-pseu_writeev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- struct pseudowin *pw = p->w_pwin;
- int len;
-
- ASSERT(pw);
- if (pw->p_inlen == 0)
- return;
- if ((len = write(ev->fd, pw->p_inbuf, pw->p_inlen)) <= 0)
- len = pw->p_inlen; /* dead pseudo */
- if ((p->w_pwin->p_inlen -= len))
- bcopy(p->w_pwin->p_inbuf + len, p->w_pwin->p_inbuf, p->w_pwin->p_inlen);
-}
-
-
-#endif /* PSEUDOS */
-
-static void
-win_silenceev_fn(ev, data)
-struct event *ev;
-char *data;
-{
- struct win *p = (struct win *)data;
- struct canvas *cv;
- debug1("FOUND silence win %d\n", p->w_number);
- for (display = displays; display; display = display->d_next)
- {
- for (cv = D_cvlist; cv; cv = cv->c_next)
- if (cv->c_layer->l_bottom == &p->w_layer)
- break;
- if (cv)
- continue; /* user already sees window */
-#ifdef MULTIUSER
- if (!(ACLBYTE(p->w_lio_notify, D_user->u_id) & ACLBIT(D_user->u_id)))
- continue;
-#endif
- Msg(0, "Window %d: silence for %d seconds", p->w_number, p->w_silencewait);
- }
-}
-
-#ifdef ZMODEM
-
-static int
-zmodem_parse(p, bp, len)
-struct win *p;
-char *bp;
-int len;
-{
- int i;
- char *b2 = bp;
- for (i = 0; i < len; i++, b2++)
- {
- if (p->w_zauto == 0)
- {
- for (; i < len; i++, b2++)
- if (*b2 == 030)
- break;
- if (i == len)
- break;
- if (i > 1 && b2[-1] == '*' && b2[-2] == '*')
- p->w_zauto = 3;
- continue;
- }
- if (p->w_zauto > 5 || *b2 == "**\030B00"[p->w_zauto] || (p->w_zauto == 5 && *b2 == '1') || (p->w_zauto == 5 && p->w_zdisplay && *b2 == '8'))
- {
- if (++p->w_zauto < 6)
- continue;
- if (p->w_zauto == 6)
- p->w_zauto = 0;
- if (!p->w_zdisplay)
- {
- if (i > 6)
- WriteString(p, bp, i + 1 - 6);
- WriteString(p, "\r\n", 2);
- zmodem_found(p, *b2 == '1', b2 + 1, len - i - 1);
- return 1;
- }
- else if (p->w_zauto == 7 || *b2 == '8')
- {
- int se = p->w_zdisplay->d_blocked == 2 ? 'O' : '\212';
- for (; i < len; i++, b2++)
- if (*b2 == se)
- break;
- if (i < len)
- {
- zmodem_abort(p, 0);
- D_blocked = 0;
- D_readev.condpos = D_readev.condneg = 0;
- while (len-- > 0)
- AddChar(*bp++);
- Flush();
- Activate(D_fore ? D_fore->w_norefresh : 0);
- return 1;
- }
- p->w_zauto = 6;
- }
- }
- else
- p->w_zauto = *b2 == '*' ? (p->w_zauto == 2 ? 2 : 1) : 0;
- }
- if (p->w_zauto == 0 && bp[len - 1] == '*')
- p->w_zauto = len > 1 && bp[len - 2] == '*' ? 2 : 1;
- if (p->w_zdisplay)
- {
- display = p->w_zdisplay;
- while (len-- > 0)
- AddChar(*bp++);
- return 1;
- }
- return 0;
-}
-
-static void
-zmodem_fin(buf, len, data)
-char *buf;
-int len;
-char *data;
-{
- char *s;
- int n;
-
- if (len)
- RcLine(buf, strlen(buf) + 1);
- else
- {
- s = "\030\030\030\030\030\030\030\030\030\030";
- n = strlen(s);
- LayProcess(&s, &n);
- }
-}
-
-static void
-zmodem_found(p, send, bp, len)
-struct win *p;
-int send;
-char *bp;
-int len;
-{
- char *s;
- int i, n;
- extern int zmodem_mode;
-
- /* check for abort sequence */
- n = 0;
- for (i = 0; i < len ; i++)
- if (bp[i] != 030)
- n = 0;
- else if (++n > 4)
- return;
- if (zmodem_mode == 3 || (zmodem_mode == 1 && p->w_type != W_TYPE_PLAIN))
- {
- struct display *d, *olddisplay;
-
- olddisplay = display;
- d = p->w_lastdisp;
- if (!d || d->d_fore != p)
- for (d = displays; d; d = d->d_next)
- if (d->d_fore == p)
- break;
- if (!d && p->w_layer.l_cvlist)
- d = p->w_layer.l_cvlist->c_display;
- if (!d)
- d = displays;
- if (!d)
- return;
- display = d;
- RemoveStatus();
- p->w_zdisplay = display;
- D_blocked = 2 + send;
- flayer = &p->w_layer;
- ZmodemPage();
- display = d;
- evdeq(&D_blockedev);
- D_readev.condpos = &const_IOSIZE;
- D_readev.condneg = &p->w_inlen;
- ClearAll();
- GotoPos(0, 0);
- SetRendition(&mchar_blank);
- AddStr("Zmodem active\r\n\r\n");
- AddStr(send ? "**\030B01" : "**\030B00");
- while (len-- > 0)
- AddChar(*bp++);
- display = olddisplay;
- return;
- }
- flayer = &p->w_layer;
- Input(":", 100, INP_COOKED, zmodem_fin, NULL);
- s = send ? zmodem_sendcmd : zmodem_recvcmd;
- n = strlen(s);
- LayProcess(&s, &n);
-}
-
-void
-zmodem_abort(p, d)
-struct win *p;
-struct display *d;
-{
- struct display *olddisplay = display;
- struct layer *oldflayer = flayer;
- if (p)
- {
- if (p->w_savelayer && p->w_savelayer->l_next)
- {
- if (oldflayer == p->w_savelayer)
- oldflayer = flayer->l_next;
- flayer = p->w_savelayer;
- ExitOverlayPage();
- }
- p->w_zdisplay = 0;
- p->w_zauto = 0;
- LRefreshAll(&p->w_layer, 0);
- }
- if (d)
- {
- display = d;
- D_blocked = 0;
- D_readev.condpos = D_readev.condneg = 0;
- Activate(D_fore ? D_fore->w_norefresh : 0);
- }
- display = olddisplay;
- flayer = oldflayer;
-}
-
-#endif
diff --git a/src/window.h b/src/window.h
deleted file mode 100644
index 6b59f2a..0000000
--- a/src/window.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/* Copyright (c) 1993-2002
- * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
- * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
- * Copyright (c) 1987 Oliver Laumann
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program (see the file COPYING); if not, write to the
- * Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- ****************************************************************
- * $Id$ FAU
- */
-
-
-/* keep this in sync with the initialisations in window.c */
-struct NewWindow
-{
- int StartAt; /* where to start the search for the slot */
- char *aka; /* aka string */
- char **args; /* argv vector */
- char *dir; /* directory for chdir */
- char *term; /* TERM to be set instead of "screen" */
- int aflag;
- int flowflag;
- int lflag;
- int histheight;
- int monitor;
- int wlock; /* default writelock setting */
- int silence;
- int wrap;
- int Lflag; /* logging */
- int slow; /* inter character milliseconds */
- int gr;
- int c1;
- int bce;
- int encoding;
- char *hstatus;
- char *charset;
-};
-
-#ifdef PSEUDOS
-
-struct pseudowin
-{
- int p_fdpat;
- int p_pid;
- int p_ptyfd;
- struct event p_readev;
- struct event p_writeev;
- char p_cmd[MAXSTR];
- char p_tty[MAXSTR];
- char p_inbuf[IOSIZE]; /* buffered writing to p_ptyfd */
- int p_inlen;
-};
-
-/* bits for fdpat: */
-#define F_PMASK 0x0003
-#define F_PSHIFT 2
-#define F_PFRONT 0x0001 /* . */
-#define F_PBACK 0x0002 /* ! */
-#define F_PBOTH (F_PFRONT | F_PBACK) /* : */
-
-#define F_UWP 0x1000 /* | */
-
-/* The screen process ...)
- * ... wants to write to pseudo */
-#define W_WP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_PFRONT))
-
-/* ... wants to write to window: user writes to window
- * or stdout/stderr of pseudo are duplicated to window */
-#define W_WW(w) (!((w)->w_pwin) || \
-(((w)->w_pwin->p_fdpat & F_PMASK) == F_PBACK) || \
-((((w)->w_pwin->p_fdpat >> F_PSHIFT) & F_PMASK) == F_PBOTH) || \
-((((w)->w_pwin->p_fdpat >> (F_PSHIFT * 2)) & F_PMASK) == F_PBOTH))
-
-/* ... wants to read from pseudowin */
-#define W_RP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & \
-((F_PFRONT << (F_PSHIFT * 2)) | (F_PFRONT << F_PSHIFT)) ))
-
-/* ... wants to read from window */
-#define W_RW(w) (!((w)->w_pwin) || ((w)->w_pwin->p_fdpat & F_PFRONT))
-
-/* user input is written to pseudo */
-#define W_UWP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_UWP))
-
-/* pseudo output has to be stuffed in window */
-#define W_PTOW(w) (\
-((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT) == F_PBOTH << F_PSHIFT || \
-((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT * 2) == F_PBOTH << F_PSHIFT * 2 )
-
-/* window output has to be stuffed in pseudo */
-#define W_WTOP(w) (((w)->w_pwin->p_fdpat & F_PMASK) == F_PBOTH)
-
-#endif /* PSEUDOS */
-
-/* definitions for wlocktype */
-#define WLOCK_OFF 0 /* all in w_userbits can write */
-#define WLOCK_AUTO 1 /* who selects first, can write */
-#define WLOCK_ON 2 /* user writes even if deselected */
-
-
-#ifdef COPY_PASTE
-struct paster
-{
- char *pa_pastebuf; /* this gets pasted in the window */
- char *pa_pasteptr; /* pointer in pastebuf */
- int pa_pastelen; /* bytes left to paste */
- struct layer *pa_pastelayer; /* layer to paste into */
- struct event pa_slowev; /* slowpaste event */
-};
-#else
-struct paster;
-#endif
-
-struct win
-{
- struct win *w_next; /* next window */
- int w_type; /* type of window */
- void *w_data;
- struct layer w_layer; /* our layer */
- struct layer *w_savelayer; /* the layer to keep */
- int w_blocked; /* block input */
-#ifdef PSEUDOS
- struct pseudowin *w_pwin; /* ptr to pseudo */
-#endif
- struct display *w_pdisplay; /* display for printer relay */
- struct display *w_lastdisp; /* where the last input was made */
- int w_number; /* window number */
- struct event w_readev;
- struct event w_writeev;
- struct event w_silenceev; /* silence event */
- int w_ptyfd; /* fd of the master pty */
- char w_inbuf[IOSIZE];
- int w_inlen;
- char w_outbuf[IOSIZE];
- int w_outlen;
- int w_aflag; /* (-a option) */
- char *w_title; /* name of the window */
- char *w_akachange; /* autoaka hack */
- char w_akabuf[MAXSTR]; /* aka buffer */
- int w_autoaka; /* autoaka hack */
- int w_intermediate; /* char used while parsing ESC-seq */
- int w_args[MAXARGS]; /* emulator args */
- int w_NumArgs;
-
-#ifdef MULTIUSER
- int w_wlock; /* WLOCK_AUTO, WLOCK_OFF, WLOCK_ON */
- struct acluser *w_wlockuser; /* NULL when unlocked or user who writes */
- AclBits w_userbits[ACL_BITS_PER_WIN];
- AclBits w_lio_notify; /* whom to tell when lastio+seconds < time() */
- AclBits w_mon_notify; /* whom to tell monitor statis */
-#endif
-
- enum state_t w_state; /* parser state */
- enum string_t w_StringType;
- struct mline *w_mlines;
- struct mchar w_rend; /* current rendition */
-#ifdef FONT
- char w_FontL; /* character font GL */
- char w_FontR; /* character font GR */
-# ifdef ENCODINGS
- char w_FontE; /* character font GR locked */
-# endif
- int w_Charset; /* charset number GL */
- int w_CharsetR; /* charset number GR */
- int w_charsets[4]; /* Font = charsets[Charset] */
-#endif
- int w_ss;
- int w_saved;
- int w_Saved_x, w_Saved_y;
- struct mchar w_SavedRend;
-#ifdef FONT
- int w_SavedCharset;
- int w_SavedCharsetR;
- int w_SavedCharsets[4];
-#endif
- int w_top, w_bot; /* scrollregion */
- int w_wrap; /* autowrap */
- int w_origin; /* origin mode */
- int w_insert; /* window is in insert mode */
- int w_keypad; /* keypad mode */
- int w_cursorkeys; /* appl. cursorkeys mode */
- int w_revvid; /* reverse video */
- int w_curinv; /* cursor invisible */
- int w_curvvis; /* cursor very visible */
- int w_autolf; /* automatic linefeed */
- char *w_hstatus; /* hardstatus line */
- int w_gr; /* enable GR flag */
- int w_c1; /* enable C1 flag */
- int w_bce; /* enable backcol erase */
-#if 0
- int w_encoding; /* for input and paste */
-#endif
- int w_decodestate; /* state of our input decoder */
-#ifdef DW_CHARS
- int w_mbcs; /* saved char for multibytes charset */
-#endif
- char w_string[MAXSTR];
- char *w_stringp;
- char *w_tabs; /* line with tabs */
- int w_bell; /* bell status of this window */
- int w_flow; /* flow flags */
- struct logfile *w_log; /* log to file */
- int w_logsilence; /* silence in secs */
- int w_monitor; /* monitor status */
- int w_silencewait; /* wait for silencewait secs */
- int w_silence; /* silence status (Lloyd Zusman) */
- char w_vbwait;
- char w_norefresh; /* dont redisplay when switching to that win */
-#ifdef RXVT_OSC
- char w_xtermosc[4][MAXSTR]; /* special xterm/rxvt escapes */
-#endif
- int w_mouse; /* mouse mode 0,9,1000 */
-#ifdef HAVE_BRAILLE
- int w_bd_x, w_bd_y; /* Braille cursor position */
-#endif
-
-#ifdef COPY_PASTE
- int w_slowpaste; /* do careful writes to the window */
- int w_histheight; /* all histbases are malloced with width * histheight */
- int w_histidx; /* 0 <= histidx < histheight; where we insert lines */
- struct mline *w_hlines; /* history buffer */
- struct paster w_paster; /* paste info */
-#else
- int w_histheight; /* always 0 */
-#endif
- int w_pid; /* process at the other end of ptyfd */
-
- char *w_cmdargs[MAXARGS]; /* command line argument vector */
- char *w_dir; /* directory for chdir */
- char *w_term; /* TERM to be set instead of "screen" */
-
- int w_lflag; /* login flag */
- slot_t w_slot; /* utmp slot */
-#if defined (UTMPOK)
- struct utmp w_savut; /* utmp entry of this window */
-#endif
-
- char w_tty[MAXSTR];
-
- int w_zauto;
-#ifdef ZMODEM
- struct display *w_zdisplay;
-#endif
-#ifdef BUILTIN_TELNET
- struct sockaddr_in w_telsa;
- char w_telbuf[IOSIZE];
- int w_telbufl;
- char w_telmopts[256];
- char w_telropts[256];
- int w_telstate;
- char w_telsubbuf[128];
- int w_telsubidx;
- struct event w_telconnev;
-#endif
- struct mline *w_alt_mlines;
- int w_alt_width;
- int w_alt_height;
- int w_alt_histheight;
- int w_alt_x, w_alt_y;
-#ifdef COPY_PASTE
- struct mline *w_alt_hlines;
- int w_alt_histidx;
-#endif
-};
-
-
-#define w_encoding w_layer.l_encoding
-#define w_width w_layer.l_width
-#define w_height w_layer.l_height
-#define w_x w_layer.l_x
-#define w_y w_layer.l_y
-
-/* definitions for w_type */
-#define W_TYPE_PTY 0
-#define W_TYPE_PLAIN 1
-#define W_TYPE_TELNET 2
-
-
-/*
- * Definitions for flow
- * 000 -(-) flow off, auto would be off
- * 001 +(-) flow on , auto would be off
- * 010 -(+) flow off, auto would be on
- * 011 +(+) flow on , auto would be on
- * 100 - flow auto, currently off
- * 111 + flow auto, currently on
- * Application controls auto_flow via TIOCPKT, if available,
- * else via application keypad mode.
- */
-#define FLOW_NOW (1<<0)
-#define FLOW_AUTO (1<<1)
-#define FLOW_AUTOFLAG (1<<2)
-
-
-/*
- * WIN gives us a reference to line y of the *whole* image
- * where line 0 is the oldest line in our history.
- * y must be in whole image coordinate system, not in display.
- */
-
-#define WIN(y) ((y < fore->w_histheight) ? \
- &fore->w_hlines[(fore->w_histidx + y) % fore->w_histheight] \
- : &fore->w_mlines[y - fore->w_histheight])
-
-#define Layer2Window(l) ((struct win *)(l)->l_bottom->l_data)