diff options
author | jnweiger <jnweiger> | 2005-12-16 14:34:48 +0000 |
---|---|---|
committer | jnweiger <jnweiger> | 2005-12-16 14:34:48 +0000 |
commit | 30f597b9f18d355253b9484bb2f4a1fa5e2e3fb8 (patch) | |
tree | b1a4294758cee774101d18c45d20cf9fa0efec52 /src | |
parent | 64434f463765093be5bc53f313848a897ef49c66 (diff) | |
download | screen-30f597b9f18d355253b9484bb2f4a1fa5e2e3fb8.tar.gz |
go to ATTIC now.
Diffstat (limited to 'src')
-rw-r--r-- | src/COPYING | 339 | ||||
-rw-r--r-- | src/ChangeLog | 409 | ||||
-rw-r--r-- | src/FAQ | 253 | ||||
-rw-r--r-- | src/INSTALL | 110 | ||||
-rw-r--r-- | src/Makefile.in | 331 | ||||
-rw-r--r-- | src/NEWS | 14 | ||||
-rw-r--r-- | src/NEWS.3.5 | 119 | ||||
-rw-r--r-- | src/NEWS.3.6 | 48 | ||||
-rw-r--r-- | src/NEWS.3.7 | 39 | ||||
-rw-r--r-- | src/NEWS.3.9 | 205 | ||||
-rw-r--r-- | src/TODO | 7 | ||||
-rw-r--r-- | src/acls.c | 1135 | ||||
-rw-r--r-- | src/acls.h | 93 | ||||
-rw-r--r-- | src/ansi.h | 170 | ||||
-rw-r--r-- | src/attacher.c | 959 | ||||
-rw-r--r-- | src/braille.c | 945 | ||||
-rw-r--r-- | src/braille.h | 83 | ||||
-rw-r--r-- | src/braille_tsi.c | 320 | ||||
-rw-r--r-- | src/comm.c | 327 | ||||
-rw-r--r-- | src/comm.h.dist | 227 | ||||
-rw-r--r-- | src/comm.sh | 89 | ||||
-rw-r--r-- | src/config.h.in | 663 | ||||
-rwxr-xr-x | src/configure | 9194 | ||||
-rw-r--r-- | src/configure.in | 1307 | ||||
-rw-r--r-- | src/display.c | 3922 | ||||
-rw-r--r-- | src/display.h | 345 | ||||
-rw-r--r-- | src/encoding.c | 1708 | ||||
-rw-r--r-- | src/extern.h | 492 | ||||
-rw-r--r-- | src/fileio.c | 836 | ||||
-rw-r--r-- | src/help.c | 1628 | ||||
-rw-r--r-- | src/image.h | 163 | ||||
-rw-r--r-- | src/input.c | 402 | ||||
-rwxr-xr-x | src/install.sh | 119 | ||||
-rw-r--r-- | src/kmapdef.c.dist | 144 | ||||
-rw-r--r-- | src/layer.c | 1114 | ||||
-rw-r--r-- | src/layer.h | 105 | ||||
-rw-r--r-- | src/loadav.c | 351 | ||||
-rw-r--r-- | src/logfile.c | 294 | ||||
-rw-r--r-- | src/logfile.h | 82 | ||||
-rw-r--r-- | src/mark.c | 1379 | ||||
-rw-r--r-- | src/mark.h | 49 | ||||
-rw-r--r-- | src/misc.c | 798 | ||||
-rw-r--r-- | src/nethack.c | 133 | ||||
-rw-r--r-- | src/os.h | 533 | ||||
-rw-r--r-- | src/osdef.h.in | 201 | ||||
-rw-r--r-- | src/osdef.sh | 71 | ||||
-rw-r--r-- | src/patchlevel.h | 529 | ||||
-rw-r--r-- | src/process.c | 6220 | ||||
-rw-r--r-- | src/pty.c | 387 | ||||
-rw-r--r-- | src/putenv.c | 211 | ||||
-rw-r--r-- | src/resize.c | 1104 | ||||
-rw-r--r-- | src/sched.c | 285 | ||||
-rw-r--r-- | src/sched.h | 43 | ||||
-rw-r--r-- | src/search.c | 373 | ||||
-rw-r--r-- | src/socket.c | 1426 | ||||
-rw-r--r-- | src/teln.c | 564 | ||||
-rw-r--r-- | src/term.c | 284 | ||||
-rw-r--r-- | src/term.h.dist | 252 | ||||
-rw-r--r-- | src/term.sh | 169 | ||||
-rw-r--r-- | src/termcap.c | 1509 | ||||
-rw-r--r-- | src/tty.c.dist | 1887 | ||||
-rw-r--r-- | src/tty.sh | 1563 | ||||
-rw-r--r-- | src/utmp.c | 878 | ||||
-rw-r--r-- | src/window.c | 2179 | ||||
-rw-r--r-- | src/window.h | 317 |
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) |