| |
| C-Kermit 8.0 Unix Installation Instructions |
| |
| [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ] |
| |
| Frank da Cruz |
| The Kermit Project |
| Columbia University |
| |
| As of C-Kermit version: 8.0.211, 10 April 2004 |
| This file last updated: Tue Apr 13 10:14:33 2004 (New York City |
| time) |
| |
| IF YOU ARE READING A PLAIN-TEXT version of this document, note that |
| this file is a plain-text dump of a Web page. You can visit the |
| original (and possibly more up-to-date) Web page here: |
| |
| [4]http://www.columbia.edu/kermit/ckuins.html |
| __________________________________________________________________________ |
| |
| CONTENTS |
| |
| [5]OVERVIEW |
| |
| 1. [6]INTERNET QUICK START |
| 2. [7]INSTALLING FROM PACKAGES |
| 3. [8]INSTALLING PREBUILT BINARIES |
| 4. [9]BUILDING FROM SOURCE CODE |
| 5. [10]INSTALLING THE KERMIT FILES |
| 6. [11]INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES |
| 7. [12]CHECKING THE RESULTS |
| 8. [13]REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE |
| 9. [14]UNIX VERSIONS |
| 10. [15]DIALING OUT AND COORDINATING WITH UUCP |
| 11. [16]RUNNING UNIX C-KERMIT SETUID OR SETGID |
| 12. [17]CONFIGURING UNIX WORKSTATIONS |
| 13. [18]BIZARRE BEHAVIOR AT RUNTIME |
| 14. [19]CRASHES AND CORE DUMPS |
| 15. [20]SYSLOGGING |
| 16. [21]BUILDING SECURE VERSIONS OF C-KERMIT 8.0 |
| 17. [22]INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM |
| __________________________________________________________________________ |
| |
| OVERVIEW |
| |
| [ [23]Top ] [ [24]Contents ] [ [25]Next ] |
| |
| WARNING: This document contains notes that have been accumulating |
| since the early 1980s. Many of the products and Unix versions |
| mentioned here have not been heard of in a long while, but that |
| does not necessarily mean they are not still running in some |
| obscure nook. |
| |
| This file contains Unix-specific information. A lot of it. Unlike most |
| other packages, C-Kermit tries very hard to be portable to every Unix |
| variety (and every release of each one) known to exist, including many |
| that are quite old, as well as to other platforms like VMS, AOS/VS, |
| VOS, OS-9, the BeBox, the Amiga, etc. |
| |
| Since C-Kermit gets so deeply into the file system, i/o system, and |
| other areas that differ radically from one Unix platform to the next, |
| this means that a lot can go wrong when you try to install C-Kermit on |
| (for example) a new release of a particular variety of Unix, in which |
| certain things might have changed that C-Kermit depended upon. |
| |
| This file concentrates on installation. For a description of general |
| configuration options for C-Kermit, please read the [26]Configurations |
| Options document. For troubleshooting after installation, see the |
| [27]General Hints and Tips and [28]Unix-Specific Hints and Tips |
| documents. The latter, in particular, contains lots of information on |
| lots of specific Unix platforms. If you want to work on the source |
| code, see the [29]C-Kermit Program Logic Manual |
| |
| You may install C-Kermit: |
| |
| * From an "[30]install package", if one is available. |
| * As a [31]prebuilt binary, if available, plus accompanying text |
| files. |
| * By building from [32]source code. |
| __________________________________________________________________________ |
| |
| 1. INTERNET QUICK START |
| |
| [ [33]Top ] [ [34]Contents ] [ [35]Next ] [ [36]Previous ] |
| |
| If your Unix computer is on the Internet and it has a C compiler, |
| here's how to download, build, and install C-Kermit directly from the |
| "tarballs" or Zip archives: |
| |
| 1. Make a fresh directory and cd to it. |
| 2. Download the C-Kermit source code: |
| [37]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z |
| (compress format) or |
| [38]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz |
| (gunzip format). |
| 3. Uncompress the compressed tar file with "uncompress" or "gunzip", |
| according to which type of compressed file you downloaded. (If you |
| don't understand this, you could download a (much larger) |
| uncompressed tar archive directly: |
| [39]ftp://kermit.columbia.edu/kermit/archives/cku211.tar |
| 4. Now type "tar xvf cku211.tar" to unpack the individual files from |
| the tar archive. |
| 5. Type "rm cku211.tar" to get rid of the tar archive, which is no |
| longer needed. |
| 6. Read the comments at the top of the makefile to find out which |
| target to use and then type the appropriate "make" command, such |
| as "make linux", "make solaris8", etc. |
| 7. This produces a binary in your current directory called "wermit". |
| Start it by typing "./wermit" and [40]try it out to make sure it |
| works. Then read [41]Section 5 for how to install it, or simply |
| copy the wermit binary to the desired public directory, rename it |
| to kermit, and give it the needed permissions (and, if it is going |
| to be used to dial out, give it the same group and owner and |
| permissions as the cu, tip, or minicom program). |
| |
| For secure installations, see [42]Sections 5 and [43]16. |
| __________________________________________________________________________ |
| |
| 2. INSTALLING FROM PACKAGES |
| |
| [ [44]Top ] [ [45]Contents ] [ [46]Next ] [ [47]Previous ] |
| |
| Various Unix varieties -- Linux, Solaris, AIX, etc -- now incorporate |
| the idea of "install packages", and many users expect to find all new |
| applications in this format. A selection of install packages might be |
| available for any given release of C-Kermit, but there is a tradeoff |
| between convenience and safety. Unix presents several notable problems |
| to the builder of install packages: |
| |
| a. Since C-Kermit is portable to many non-Unix platforms (VMS, VOS, |
| AOS/VS, etc), some of the files in the C-Kermit distribution do |
| not fit into the Unix application model. In particular, C-Kermit |
| includes some plain text files (described in [48]Section 5) and |
| Unix has no standard place to put such files. Typical Unix package |
| managers do not allow for them. Where should they go, and how will |
| the user know where to find them? |
| b. Installation of any program that will be used to make modem calls |
| requires some important decisions from the installer regarding |
| security and privilege. |
| |
| Item (b) is discussed at length in [49]Sections 10 and [50]11 of this |
| document, but the package-related aspects are also given here. The |
| basic problem is that Unix dialout devices and the UUCP "lock files" |
| that regulate contention for them (described in [51]Section 10) are |
| usually protected against "world". Therefore, the install procedure |
| must either run as root in order to give the Kermit binary the |
| required permissions, group, and/or owner, or else the dialout devices |
| and associated directories must be open for group or world reading and |
| writing. Otherwise, the Kermit program just installed WILL NOT WORK |
| for dialing out. |
| |
| Thus, a well-crafted installation procedure should present the options |
| and allow the installer to choose the method, if any, for regulating |
| access to the dialout devices: |
| |
| a. Check the permissions of the lockfile directory and the dialout |
| devices. If they do not allow group or world R/W access, then: |
| b. "Your UUCP lockfile directory and/or dialout devices require |
| privilege to access. You must either change their permissions or |
| install Kermit with privileges." |
| c. "If you wish to install Kermit with privileges, it will be given |
| the same owner, group, and permissions as the cu program so it can |
| use the dialout devices." |
| d. If they choose (c) but the user is not root, give a message that |
| the install procedure can be run only by root and then quit. |
| |
| It should go without saying, of course, that any binaries that are to |
| be included in an install package should be built fresh on the exact |
| platform (e.g. Red Hat 8.0 on Intel) for which the package is |
| targeted; prebuilt binaries ([52]next section) from other sites are |
| likely to have library mismatches. [53]CLICK HERE for more about |
| building C-Kermit install packages. |
| |
| The Kermit Project does not have the resources or the expertise to |
| make install packages for every platform. Most install packages, |
| therefore, are contributed by others, and they do not necessarily |
| follow the guidelines given above. Pay attention to what they do. |
| |
| If you are an end user who has obtained a C-Kermit install package for |
| a particular platform, you should be aware that some additional steps |
| might needed if you want to use Kermit to dial out. Read [54]Section |
| 10 for details. |
| __________________________________________________________________________ |
| |
| 3. INSTALLING PREBUILT BINARIES |
| |
| [ [55]Top ] [ [56]Contents ] [ [57]Next ] [ [58]Previous ] |
| |
| Hundreds of prebuilt C-Kermit binaries are available on the CDROM in |
| the BINARY tree [NOTE: The C-Kermit CDROM is still for version 7.0], |
| and at our ftp site in the [59]kermit/bin area (with names starting |
| with "ck"), also accessible on the [60]C-Kermit website. To install a |
| prebuilt binary: |
| |
| a. Rename the binary to "wermit". |
| b. Make sure it works; some tests are suggested in [61]Section 7. |
| c. Follow steps (b) through (e) in [62]Section 4. |
| d. Install related files as described in [63]Section 5. |
| |
| But first... Please heed the following cautions: |
| |
| a. If you pick the wrong binary, it won't work (or worse). |
| b. Even when you pick the appropriate binary, it still might not work |
| due to shared-library mismatches, etc. (see [64]Section 4.0). |
| c. Don't expect a binary built on or for version n of your OS to work |
| on version n - x (where x > 0). However, it is usually safe to run |
| a binary built on (or for) an older OS release on a newer one. |
| |
| Therefore, it is better to build your own binary from source code |
| ([65]next section) if you can. But since it is increasingly for Unix |
| systems (not to mention VMS and other OS's) to be delivered without C |
| compilers, it is often impractical. In such cases, try the most |
| appropriate prebuilt binary or binaries, and if none of them work, |
| [66]contact us and we'll see what we can do to help. |
| __________________________________________________________________________ |
| |
| 4. BUILDING FROM SOURCE CODE |
| |
| [ [67]Top ] [ [68]Contents ] [ [69]Next ] [ [70]Previous ] |
| |
| Also see: [71]Section 8 and [72]Section 9. |
| |
| C-Kermit is designed to be built and used on as many platforms as |
| possible: Unix and non-Unix, old and new (and ancient), ANSI C and |
| K&R. The Unix version does not use or depend on any external tools for |
| building except the "make" utility, the C compiler, and the linker. It |
| does not use any automated configuration tools such as configure, |
| autoconf, automake, libtool, etc. Everything in C-Kermit has been |
| built by hand based on direct experience or reports or contributions |
| from users of each platform. |
| |
| The [73]C-Kermit makefile contains the rules for building the program |
| for each of the hundreds of different kinds of Unix systems that |
| C-Kermit attempts to support. It covers all Unix variations since |
| about 1980 -- pretty much everything after Unix V6. Separate makefiles |
| are used for [74]Plan 9 and [75]2.x BSD. |
| |
| Prerequisites: |
| |
| * The C compiler, linker, and make program must be installed. |
| * The C libraries and header files must be installed (*). |
| * The C-Kermit source code and makefile in your current directory. |
| * The C-Kermit text files ([76]Section 5) in your current directory. |
| |
| * This is becoming problematic in this new age of "selective |
| installs" e.g. of Linux packages. C-Kermit builds will often fail |
| because replying "no" to some obscure Linux installation option |
| will result in missing libraries or header files. Ditto on |
| platforms like AIX and Solaris that don't come with C compilers, |
| and then later have gcc installed, but are still missing crucial |
| libraries, like libm (math). |
| |
| Plus: |
| |
| * For TCP/IP networking support, the sockets library and related |
| header files must be installed. |
| * The math library for floating-point arithmetic support (can be |
| deselected by adding -DNOFLOAT to CFLAGS and removing -lm from |
| LIBS). |
| * Many and varied security libraries for building a secure version |
| (Kerberos, SSL/TLS, SRP, Zlib,...) These are required only if you |
| select a secure target. |
| * For the curses-based fullscreen file-ransfer display, the curses |
| or ncurses header file(s) and library, and probably also the |
| termcap and/or termlib library. Note that the names and locations |
| of these files and libraries are likely to change capriciously |
| with every new release of your Unix product. If you discover that |
| the C-Kermit build procedure fails because your curses and/or |
| termxxx headers or libraries are not named or located as expected, |
| please [77]let us know. In the meantime, work around by installing |
| symlinks. |
| * IMPORTANT: Modern Linux distributions might give you the choice |
| during installation of whether to install the "ncurses development |
| package" (perhaps called "ncurses-devel"). If you did not install |
| it, you won't be able to build C-Kermit with curses support |
| included. In this case, either go back and install ncurses, or |
| else choose (or create) a non-curses makefile target for your |
| platform. To install the ncurses developers tools in Red Hat |
| Linux, do: |
| |
| mount redhat cdrom |
| goto RedHat/RPMS |
| rpm -ivh ncurses-devel*.rpm |
| or to have the exact name ls ncurse* and load as |
| rpm -ivh filename |
| then leave the cdrom and unmount it. |
| |
| * In AIX you might have to go back and install any or all of: |
| |
| bos.adt.base |
| bos.adt.include |
| bos.adt.lib |
| bos.adt.libm |
| bos.adt.utils |
| |
| from the first installation CD. |
| |
| The makefile might need to be renamed from ckuker.mak to makefile. |
| Directions: |
| |
| a. Type "make xxx" where xxx is the name of the makefile target most |
| appropriate to your platform, e.g. "make linux", "make aix43", |
| etc. Read the [78]comments at the top of the makefile for a |
| complete list of available targets (it's a long list). |
| b. Test the resulting 'wermit' file (see [79]Section 7 for |
| suggestions). If it's OK, proceed; otherwise [80]notify us. |
| |
| NOTE: steps (c) through (e) can be accomplished using the |
| [81]makefile 'install' target as described in [82]Section 5.4. |
| c. Rename the 'wermit' file to 'kermit', copy it to the desired |
| binary directory (such as /usr/local/bin or /opt/something), and |
| if it is to be used for dialing out, give it the same owner, |
| group, and permissions as the 'cu' program (IMPORTANT: read |
| [83]Sections 10 and [84]11 for details). |
| d. Install the man page, ckuker.nr, with your other man pages. |
| e. Install the accompanying text files (see [85]Section 5). |
| f. If you want C-Kermit to also offer a Telnet command-line |
| personality, make a symbolic link as follows: |
| |
| cd directory-where-kermit-binary-is |
| ln -s kermit telnet |
| |
| If you want C-Kermit to be the default Telnet client, make sure |
| the directory in which you created the symlink is in the PATH |
| ahead of the where the regular Telnet client is. |
| g. If you want C-Kermit to also offer an FTP command-line |
| personality, make a symlink called "ftp" as in (f). |
| h. If you want C-Kermit to also offer an FTTP command-line |
| personality, make a symlink called "http" as in (f). |
| i. If you want to offer an Internet Kermit Service, follow the |
| directions in the [86]IKSD Administrator's Guide. |
| ________________________________________________________________________ |
| |
| 4.0. Special Considerations for C-Kermit 8.0 |
| |
| [ [87]Top ] [ [88]Contents ] [ [89]Next ] |
| |
| Also see: [90]C-Kermit Configuration Options |
| |
| SECTION CONTENTS |
| |
| 4.1. [91]The Unix Makefile |
| 4.2. [92]The C-Kermit Initialization File |
| 4.3. [93]The 2.x BSD Makefile |
| 4.4. [94]The Plan 9 Makefile |
| 4.5. [95]Makefile Failures |
| |
| (Also see the [96]Configurations Options document, [97]Section 8). |
| |
| Lots of new features have been added in versions 7.0 and 8.0 that |
| require access to new symbols, APIs, libraries, etc, and this will no |
| doubt cause problems in compiling, linking, or execution on platforms |
| where 6.0 and earlier built without incident. This section contains |
| what we know as of the date of this file. |
| |
| The first category concerns the new Kermit Service Daemon (IKSD; see |
| the [98]IKSD Administrator's Guide for details): |
| |
| The wtmp File |
| When C-Kermit is started as an IKSD (under inetd), it makes |
| syslog and wtmp entries, and also keeps its own ftpd-like log. |
| The code assumes the wtmp log is /var/log/wtmp on Linux and |
| /usr/adm/wtmp elsewhere. No doubt this assumption will need |
| adjustment. Use -DWTMPFILE=path to override at compile time |
| (there is also a runtime override). See [99]iksd.html for |
| details. |
| |
| UTMP, utsname(), etc |
| C-Kermit 7.0 gets as much info as it can about its job -- |
| mainly for IKSD logging -- from utmp. But of course utmp |
| formats and fields differ, and for that matter, there can be |
| two different header files, <utmp.h> and <utmpx.h>. Look for |
| HAVEUTMPX and HAVEUTHOST in [100]ckufio.c and let me know of |
| any needed adjustments. |
| |
| Password lookup |
| IKSD needs to authenticate incoming users against the password |
| list. In some cases, this requires the addition of -lcrypt |
| (e.g. in Unixware 2.x). In most others, the crypt functions are |
| in the regular C library. If you get "crypt" as an unresolved |
| symbol at link time, add -lcrypt to LIBS. If your site has |
| local replacement libraries for authentication, you might need |
| a special LIBS clause such as "LIBS=-L/usr/local/lib -lpwent". |
| |
| These days most Unix systems take advantage of shadow password |
| files or Plugable Authentication Modules (PAM). If your system |
| uses shadow passwords you must add -DCK_SHADOW to the CFLAGS |
| list. If your system requires PAM you must add -DCK_PAM to the |
| CFLAGS and -lpam -ldl to LIBS. |
| |
| getusershell() |
| This is called by the IKSD at login time to see if a user has |
| been "turned off". But many Unix platforms lack this function. |
| In that case, you will get unresolved symbol reports at link |
| time for _getusershell, _endusershell; to work around, add |
| -DNOGETUSERSHELL. |
| |
| initgroups() |
| This is called by IKSD after successful authentication. But |
| some platforms do not have this function, so obviously it can't |
| be called there, in which case add -DNOINITGROUPS. |
| |
| setreuid(), setreuid(), setregid() not found or "deprecated" |
| Find out what your Unix variety wants you to use instead, and |
| make appropriate substitutions in routine zvpass(), module |
| [101]ckufio.c, and [102]let us know. |
| |
| printf() |
| IKSD installs a printf() substitute to allow redirection of |
| printf-like output to the connection. However, this can |
| conflict with some curses libraries. In this case, separate |
| binaries must be built for IKSD and non-IKSD use. |
| |
| If you encounter difficulties with any of the above, and you are not |
| interested in running C-Kermit as an IKSD, then simply add NOIKSD to |
| CFLAGS and rebuild. Example: |
| |
| make sco286 |
| (get lots of errors) |
| make clean |
| make sco286 "KFLAGS=-DNOIKSD" |
| |
| Some non-IKSD things to watch out for: |
| |
| Return type of main() |
| The main() routine is in [103]ckcmai.c. If you get complaints |
| about "main: return type is not blah", define MAINTYPE on the |
| CC command line, e.g.: |
| |
| make xxx "KFLAGS=-DMAINTYPE=blah |
| |
| (where blah is int, long, or whatever). If the complaint is |
| "Attempt to return a value from a function of type void" then |
| add -DMAINISVOID: |
| |
| make xxx "KFLAGS=-DMAINISVOID=blah |
| |
| DNS Service Records |
| This feature allows a remote host to redirect C-Kermit to the |
| appropriate socket for the requested service; e.g. if C-Kermit |
| requests service "telnet" and the host offers Telnet service on |
| port 999 rather than the customary port 23. If you get |
| compile-time complaints about not being able to find |
| <resolv.h>, <netdb.h>, or <arpa/nameser.h>, add -DNO_DNS_SRV to |
| CFLAGS. If you get link-time complaints about unresolved |
| symbols res_search or dn_expand, try adding -lresolve to LIBS. |
| |
| \v(ipaddress) |
| If "echo \v(ipaddress)" shows an empty string rather than your |
| local IP address, add -DCKGHNLHOST to CFLAGS and rebuild. |
| |
| <sys/wait.h> |
| If this file can't be found at compile time, add -DNOREDIRECT |
| to CFLAGS. This disables the REDIRECT and PIPE commands and |
| anything else that needs the wait() system service. |
| |
| syslog() |
| C-Kermit can now write syslog records. Some older platforms |
| might not have the syslog facility. In that case, add |
| -DNOSYSLOG. Others might have it, but require addition of |
| -lsocket to LIBS (SCO OSR5 is an example). See [104]Section 15. |
| |
| putenv() |
| If "_putenv" comes up as an undefined symbol, add -DNOPUTENV to |
| CFLAGS and rebuild. |
| |
| "Passing arg1 of 'time' from incompatible pointer" |
| This is a mess. See the mass of #ifdefs in the appropriate |
| module, [105]ckutio.c or [106]ckufio.c. |
| |
| gettimeofday() |
| Wrong number of arguments. On most platforms, gettimeofday() |
| takes two arguments, but on a handful of others (e.g. Motorola |
| System V/88 V4, SNI Reliant UNIX 5.43, etc) it takes one. If |
| your version of gettimeofday() is being called with two args |
| but wants one, add -DGTODONEARG. |
| |
| "Assignment makes pointer from integer without a cast" |
| This warning might appear in [107]ckutio.c or [108]ckufio.c. |
| (or elsewhere), and usually can be traced to the use of a |
| system or library function that returns a pointer but that is |
| not declared in the system header files even though it should |
| be. Several functions are commonly associated with this error: |
| |
| + getcwd(): Add -DDCLGETCWD to CFLAGS and rebuild. |
| + popen() : Add -DDCLPOPEN to CFLAGS and rebuild. |
| + fdopen(): Add -DDCLFDOPEN to CFLAGS and rebuild. |
| |
| "Operands of = have incompatible types" |
| "Incompatible types in assignment" |
| If this comes from [109]ckcnet.c and comes from a statement |
| involving inet_addr(), try adding -DINADDRX to CFLAGS. If that |
| doesn't help, then try adding -DNOMHHOST. |
| |
| Complaints about args to get/setsockopt(), getpeername(), |
| getsockname() |
| These are all in [110]ckcnet.c. Different platforms and OS's |
| and versions of the same OS change this all the time: int, |
| size_t, unsigned long, etc. All the affected variables are |
| declared according to #ifdefs within ckcnet.c, so find the |
| declarations and adjust the #ifdefs accordingly. |
| |
| size_t |
| In case of complaints about "unknown type size_t", add |
| -DSIZE_T=int (or other appropriate type) to CFLAGS. |
| |
| 'tz' undefined |
| Use of undefined enum/struct/union 'timezone' |
| Left of 'tv_sec' specifies undefined struct/union 'timeval' And |
| similar complaints in [111]ckutio.c: Add -DNOGFTIMER and/or |
| -DNOTIMEVAL. |
| |
| Symlinks |
| The new built-in DIRECTORY command should show symlinks like |
| "ls -l" does. If it does not, check to see if your platform has |
| the lstat() and readlink() functions. If so, add -DUSE_LSTAT |
| and -DCKSYMLINK to CFLAGS and rebuild. On the other hand, if |
| lstat() is unresolved at link time, add -DNOLSTAT to CFLAGS. If |
| readlink() is also unresolved, add -DNOSYMLINK. |
| |
| realpath() |
| Link-time complains about realpath() -- find the library in |
| which it resides and add it to LIBS (example for Unixware 7.1: |
| "-lcudk70") or add -DNOREALPATH to CFLAGS and rebuild. If built |
| with realpath() but debug log file is truncated or mangled, |
| ditto (some realpath() implementations behave differently from |
| others). If built with realpath() and seemingly random core |
| dumps occur during file path resolution, ditto. |
| |
| Failure to locate header file <term.h> |
| Usually happens on Linux systems that have the C compiler |
| installed, but not the ncurses package (see comments about |
| selective installs above). Go back and install ncurses, or use |
| "make linuxnc" (Linux No Curses). |
| |
| "Can't find shared library libc.so.2.1" |
| "Can't find shared library libncurses.so.3.0", etc... |
| You are trying to run a binary that was built on a computer |
| that has different library versions than your computer, and |
| your computer's loader is picky about library version numbers. |
| Rebuild from source on your computer. |
| |
| Time (struct tm) related difficulties: |
| Errors like the following: |
| |
| "ckutio.c", line 11994: incomplete struct/union/enum tm: _tm |
| "ckutio.c", line 11995: error: cannot dereference non-pointer type |
| "ckutio.c", line 11995: error: assignment type mismatch |
| "ckutio.c", line 11997: warning: using out of scope declaration: localtime |
| "ckutio.c", line 11997: error: unknown operand size: op "=" |
| "ckutio.c", line 11997: error: assignment type mismatch |
| "ckutio.c", line 11998: error: undefined struct/union member: tm_year |
| "ckutio.c", line 12000: error: undefined struct/union member: tm_mon |
| "ckutio.c", line 12001: error: undefined struct/union member: tm_mday |
| "ckutio.c", line 12002: error: undefined struct/union member: tm_hour |
| "ckutio.c", line 12003: error: undefined struct/union member: tm_min |
| "ckutio.c", line 12004: error: undefined struct/union member: tm_sec |
| |
| are due to failure to include the appropriate time.h header |
| files. Unix platforms generally have one or more of the |
| following: <time.h>, <sys/time.h>, and <sys/timeb.h>. Any |
| combination of these might be required. Defaults are set up for |
| each makefile target. The defaults can be corrected on the CC |
| command line by adding the appropriate definition from the |
| following list to CFLAGS: |
| |
| -DTIMEH Include <time.h> |
| -DNOTIMEH Don't include <time.h> |
| -DSYSTIMEH Include <sys/time.h> |
| -DNOSYSTIMEH Don't include <sys/time.h> |
| -DSYSTIMEBH Include <sys/timeb.h> |
| -DNOSYSTIMEBH Don't include <sys/timeb.h> |
| |
| Note that <sys/timeb.h> is relatively scarce in the System V |
| and POSIX environments; the only platform of recent vintage |
| where it was/is used is OSF/1 and its derivatives (Digital Unix |
| and Tru64 Unix). |
| |
| Struct timeval and/or timezone not declared: |
| In some cases, merely including the appropriate time.h header |
| files is still not enough. POSIX.1 does not define the timeval |
| struct, and so the items we need from the header are protected |
| against us by #ifndef _POSIX_SOURCE or somesuch. In this case, |
| we have to declare the timeval (and timezone) structs |
| ourselves. To force this, include -DDCLTIMEVAL in CFLAGS. |
| |
| Warnings about dn_expand() Argument #4 |
| WARNING: argument is incompatible with prototyp. It's the old |
| char versus unsigned char stupidity again. Try to find a |
| compiler switch like GCC's "-funsigned-char". Failing that, add |
| -DCKQUERYTYPE=xxx to CFLAGS, where xxx is whatever 'man |
| dn_expand' tells you the type of the 4th argument should be |
| (presumably either char or unsigned char; in the latter case |
| use CHAR to avoid confusion caused by multiple words. |
| |
| Switch Table Overflow (in [112]ckcuni.c) |
| Add -DNOUNICODE to CFLAGS. |
| |
| Compile-time warnings about ck_out() or tgetstr() or tputs(): |
| Easy solution: Add -DNOTERMCAP to CFLAGS. But then you lose the |
| SCREEN function. Real solution: Try all different combinations |
| of the following CFLAGS: |
| |
| -DTPUTSARGTYPE=char -DTPUTSFNTYPE=int |
| -DTPUTSARGTYPE=int -DTPUTSFNTYPE=void |
| |
| Until the warnings go away, except maybe "ck_outc: return with |
| a value in a function returning void", and in that case also |
| add -DTPUTSISVOID. |
| |
| "Passing arg 1 of to tputs() makes pointer from integer without a |
| cast": |
| Add -DTPUTSARG1CONST to CFLAGS. |
| |
| "Undefined symbol: dup2" |
| Add -DNOZEXEC to CFLAGS. |
| |
| "header file 'termcap.h' not found" |
| Add -DNOHTERMCAP to CFLAGS. |
| |
| Other difficulties are generally of the "where is curses.h and what is |
| it called this week?" variety (most easily solved by making symlinks |
| in the include and lib directories), or overzealous complaints |
| regarding type mismatches in function calls because of the totally |
| needless and silly signed versus unsigned char conflict (*), etc. In |
| any case, please send any compilation or linking warnings or errors to |
| the author, preferably along with fixes. |
| |
| * C-Kermit does not use the signed property of chars at all |
| anywhere, ever. So if all chars and char *'s can be made unsigned |
| at compile time, as they can in gcc with "-funsigned-char", they |
| should be. |
| |
| IMPORTANT: If you find any of these hints necessary for a particular |
| make target (or you hit upon others not listed here), PLEASE SEND A |
| REPORT TO: |
| |
| [113]kermit-support@columbia.edu |
| ________________________________________________________________________ |
| |
| 4.1. The Unix Makefile |
| |
| [ [114]Top ] [ [115]Contents ] [ [116]Section Contents ] [ [117]Next ] |
| [ [118]Previous ] |
| |
| If your distribution does not contain a file with the name "makefile" |
| or "Makefile", then rename the file called ckuker.mak to makefile: |
| |
| mv ckuker.mak makefile |
| |
| Then type "make xxx", where xxx is the platform you want to build |
| C-Kermit for. These are listed in the [119]comments at the top of the |
| makefile. For example, to build C-Kermit for Linux, type: |
| |
| make linux |
| |
| Here are some typical examples: |
| |
| Target Description |
| linux Linux, any version on any hardware platform |
| openbsd OpenBSD, any version on any hardware platform |
| aix43 AIX 4.3 |
| aix43g AIX 4.3, built with gcc |
| solaris9 Solaris 9 |
| solaris9g Solaris 9 built with gcc |
| hpux1100 HP-UX 11-point-anything |
| |
| The makefile is quite long, and at least two versions of Unix, SCO |
| Xenix/286 and 2.x BSD, cannot cope with its length. An attempt to |
| "make sco286" gives the message "Make: Cannot alloc mem for env.. |
| Stop". Solution: edit away some or all of the nonrelevant material |
| from the makefile. (A separate version of the makefile is provided for |
| BSD 2.x: ckubs2.mak but C-Kermit 8.0 can't be built for BSD 2.x -- it |
| has simply grown too large.) |
| |
| Some make programs reportedly cannot handle continued lines (lines |
| ending in backslash (\)). If you have a problem with the makefile, try |
| editing the makefile to join the continued lines (remove the |
| backslashes and the following linefeed). |
| |
| Other makefile troubles may occur because tabs in the makefile have |
| somehow been converted to spaces. Spaces and tabs are distinct in Unix |
| makefiles. |
| |
| Similarly, carriage returns might have been added to the end of each |
| line, which also proves confusing to most Unix versions of make. |
| |
| Check to see if there are comments about your particular version in |
| its makefile target itself. In a text editor such as EMACS or VI, |
| search for the make entry name followed by a colon, e.g. "linux:" (if |
| you really are building C-Kermit for Linux, do this now). |
| |
| Check to see if there are comments about your particular version in |
| the [120]ckubwr.txt file ([121]CLICK HERE for the Web version). |
| |
| If you have trouble with building [122]ckwart.c, or running the |
| resulting wart preprocessor program on [123]ckcpro.w: |
| |
| 1. Just "touch" the [124]ckcpro.c file that comes in the distribution |
| and then give the "make" command again, or: |
| 2. Compile ckwart.c "by hand": cc -o wart ckwart.c, or: |
| 3. Try various other tricks. E.g. one Linux user reported that that |
| adding the "static" switch to the rule for building wart fixed |
| everything: |
| |
| wart: ckwart.$(EXT) |
| $(CC) -static -o wart ckwart.$(EXT) $(LIBS) |
| |
| If your compiler supports a compile-time option to treat ALL chars |
| (and char *'s, etc) as unsigned, by all means use it -- and send me |
| email to let me know what it is (I already know about gcc |
| -funsigned-char). |
| |
| To add compilation options (which are explained later in this |
| document) to your makefile target without editing the makefile, |
| include "KFLAGS=..." on the make command line, for example: |
| |
| make linux KFLAGS=-DNODEBUG |
| make bsd "KFLAGS=-DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET" |
| |
| Multiple options must be separated by spaces. Quotes are necessary if |
| the KFLAGS= clause includes spaces. The KFLAGS are added to the end of |
| the CFLAGS that are defined in the selected makefile target. For |
| example, the "bsd" entry includes -DBSD4 -DTCPSOCKET, so the second |
| example above compiles Kermit with the following options: |
| |
| -DBSD4 -DTCPSOCKET -DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET |
| |
| (Notice how "-UTCPSOCKET" is used to negate the effect of the |
| "-DTCPSOCKET" option that is included in the makefile target.) |
| |
| WARNING: Be careful with KFLAGS. If you build C-Kermit, change some |
| files, and then run make again using the same make entry but |
| specifying different KFLAGS than last time, make won't detect it and |
| you could easily wind up with inconsistent object modules, e.g. some |
| of them built with a certain option, others not. When in doubt, "make |
| clean" first to make sure all your object files are consistent. |
| Similarly, if you change CFLAGS, LIBS, or any other items in the |
| makefile, or you rebuild using a different makefile target, "make |
| clean" first. |
| |
| If you create a new makefile target, use static linking if possible. |
| Even though this makes your C-Kermit binary bigger, the resulting |
| binary will be more portable. Dynamically linked binaries tend to run |
| only on the exact configuration and version where they were built; on |
| others, invocation tends to fail with a message like: |
| |
| Can't find shared library "libc.so.2.1" |
| ________________________________________________________________________ |
| |
| 4.2. The C-Kermit Initialization File |
| |
| [ [125]Top ] [ [126]Contents ] [ [127]Section Contents ] [ [128]Next ] |
| [ [129]Previous ] |
| |
| (This section is obsolete.) Read [130]Section 5 about the |
| initialization file. |
| ________________________________________________________________________ |
| |
| 4.3. The 2.x BSD Makefile |
| |
| [ [131]Top ] [ [132]Contents ] [ [133]Section Contents ] [ [134]Next ] |
| [ [135]Previous ] |
| |
| This section is obsolete. C-Kermit 6.0 was the last release that |
| could be built on PDP-11 based BSD versions. |
| ________________________________________________________________________ |
| |
| 4.4. The Plan 9 Makefile |
| |
| [ [136]Top ] [ [137]Contents ] [ [138]Section Contents ] [ [139]Next ] |
| [ [140]Previous ] |
| |
| Use the separate makefile [141]ckpker.mk. NOTE: The Plan 9 version of |
| C-Kermit 8.0 has not yet been built. There should be no impediment to |
| building it. However, even when built successfully, certain key |
| features are missing, notably TCP/IP networking. |
| ________________________________________________________________________ |
| |
| 4.5. Makefile Failures |
| |
| [ [142]Top ] [ [143]Contents ] [ [144]Section Contents ] [ |
| [145]Previous ] |
| |
| First, be sure the source files are stored on your current disk and |
| directory with the right names (in lowercase). Second, make sure that |
| the makefile itself does not contain any lines with leading spaces: |
| indented lines must all start with horizontal TAB, and no spaces. |
| |
| Then make sure that your Unix PATH is defined to find the appropriate |
| compiler for your makefile target. For example, on SunOS systems, |
| "make sunos41" builds C-Kermit for the BSD environment, and assumes |
| that /usr/ucb/cc will be used for compilation and linking. If your |
| PATH has /usr/5bin ahead of /usr/ucb, you can have problems at compile |
| or link time (a commonly reported symptom is the inability to find |
| "ftime" during linking). Fix such problems by redefining your Unix |
| PATH, or by specifying the appropriate "cc" in CC= and CC2= statements |
| in your makefile target. |
| |
| During edits 166-167, considerable effort went into making C-Kermit |
| compilable by ANSI C compilers. This includes prototyping all of |
| C-Kermit's functions, and including the ANSI-defined system header |
| files for system and library functions, as defined in K&R, second |
| edition: <string.h>, <stdlib.h>, <unistd.h> (except in NeXTSTEP this |
| is <libc.h>), and <sys/stdtypes.h>. If you get warnings about any of |
| these header files not being found, or about argument mismatches |
| involving pid_t, uid_t, or gid_t, look in ckcdeb.h and make |
| amendments. C-Kermit assumes it is being compiled by an ANSI-compliant |
| C compiler if __STDC__ is defined, normally defined by the compiler |
| itself. You can force ANSI compilation without defining __STDC__ |
| (which some compilers won't let you define) by including -DCK_ANSIC on |
| the cc command line. |
| |
| On the other hand, if your compiler defines __STDC__ but still |
| complains about the syntax of Kermit's function prototypes, you can |
| disable the ANSI-style function prototyping by including -DNOANSI on |
| the command line. |
| |
| For SCO OpenServer, UNIX, ODT, and XENIX compilations, be sure to pick |
| the most appropriate [146]makefile target, and be sure you have |
| installed an SCO development system that is keyed to your exact SCO |
| operating system release, down to the minor version (like 2.3.1). |
| |
| Also note that SCO distributes some of its libraries in encrypted |
| form, and they must be decrypted before C-Kermit can be linked with |
| them. If not, you might see a message like: |
| |
| ld: file /usr/lib/libsocket.a is of unknown type: magic number = 6365 |
| |
| To decrypt, you must supply a key (password) that came with your |
| license. Call SCO for further info. |
| |
| If your compiler uses something other than int for the pid (process |
| id) data type, put -DPID_T=pid_t or whatever in your CFLAGS. |
| |
| If you get complaints about unknown data types uid_t and gid_t, put |
| -DUID_T=xxx -DGID_T=yyy in your CFLAGS, where xxx and yyy are the |
| appropriate types. |
| |
| If your compilation fails because of conflicting or duplicate |
| declarations for sys_errlist, add -DUSE_STRERROR or -DNDSYSERRLIST to |
| CFLAGS. |
| |
| If your compilation dies because getpwnam() is being redeclared (or |
| because of "conflicting types for getwpnam"), add -DNDGPWNAM to your |
| CFLAGS. If that doesn't work, then add -DDCGPWNAM to your CFLAGS (see |
| ckufio.c around line 440). |
| |
| If the compiler complains about the declaration of getpwnam() during |
| an ANSI C compilation, remove the declaration from ckufio.c or change |
| the argument in the prototype from (char *) to (const char *). |
| |
| If you get complaints that getpwuid() is being called with an improper |
| type, put -DPWID_T=xx in your CFLAGS. |
| |
| If you get compile-time warnings that t_brkc or t_eofc (tchars |
| structure members, used in BSD-based versions) are undefined, or |
| structure-member- related warnings that might be traced to this fact, |
| add -DNOBRKC to CFLAGS. |
| |
| If you get a linker message to the effect that _setreuid or _setregid |
| is not defined, add -DNOSETREU to CFLAGS, or add -DCKTYP_H=blah to |
| CFLAGS to make C-Kermit read the right <types.h>-kind-of-file to pick |
| up these definitions. |
| |
| If you get a message that _popen is undefined, add -DNOPOPEN to |
| CFLAGS. |
| |
| If you get a complaint at compile time about an illegal |
| pointer-integer combination in ckufio.c involving popen(), or at link |
| time that _popen is an undefined symbol, add the declaration "FILE |
| *popen();" to the function zxcmd() in ckufio.c (this declaration is |
| supposed to be in <stdio.h>). If making this change does not help, |
| then apparently your Unix does not have the popen() function, so you |
| should add -DNOPOPEN to your make entry, in which case certain |
| functions involving "file" i/o to the standard input and output of |
| subprocesses will not be available. |
| |
| If your linker complains that _getcwd is undefined, you can add a |
| getcwd() function to ckufio.c, or add it to your libc.a library using |
| ar: |
| |
| #include <stdio.h> |
| |
| char * |
| getcwd(buf,size) char *buf; int size; { |
| #ifndef NOPOPEN |
| #ifdef DCLPOPEN |
| FILE *popen(); |
| #endif |
| FILE *pfp; |
| |
| if (!buf) return(NULL); |
| if (!(pfp = popen("pwd","r"))) return(NULL); |
| fgets(buf,size-2,pfp); |
| pclose(pfp); |
| buf[strlen(buf)-1] = '\0'; |
| return((char *)buf); |
| #else |
| buf[0] = '\0'; |
| return(NULL); |
| #endif /* NOPOPEN */ |
| } |
| |
| #ifdef NOPOPEN |
| FILE *popen(s,t) char *s,*t; { |
| return(NULL); |
| } |
| #endif /* NOPOPEN */ |
| |
| If you get complaints about NPROC having an invalid value, add a valid |
| definition for it (depends on your system), as in the cray entry. |
| |
| If you get some symbol that's multiply defined, it probably means that |
| a variable name used by Kermit is also used in one of your system |
| libraries that Kermit is linked with. For example, under PC/IX some |
| library has a variable or function called "data", and the variable |
| "data" is also used extensively by Kermit. Rather than edit the Kermit |
| source files, just put a -D in the make entry CFLAGS to change the |
| Kermit symbol at compile time. In this example, it might be |
| -Ddata=xdata. |
| |
| Some symbol is defined in your system's header files, but it produces |
| conflicts with, or undesired results from, Kermit. Try undefining the |
| symbol in the makefile target's CFLAGS, for example -UFIONREAD. |
| |
| Some well-known symbol is missing from your system header files. Try |
| defining in the makefile target's CFLAGS, for example -DFREAD=1. |
| |
| You get many warnings about pointer mismatches. This probably means |
| that Kermit is assuming an int type for signal() when it should be |
| void, or vice-versa. Try adding -DSIG_I (for integer signal()) or |
| -DSIG_V (for void) to CFLAGS. Or just include KFLAGS=-DSIG_V (or |
| whatever) in your "make" command, for example: |
| |
| make bsd KFLAGS=-DSIG_V |
| |
| You get many messages about variables that are declared and/or set but |
| never used. It is difficult to avoid these because of all the |
| conditional compilation in the program. Ignore these messages. |
| |
| Some of C-Kermit's modules are so large, or contain so many character |
| string constants, or are so offensive in some other way, that some C |
| compilers give up and refuse to compile them. This is usually because |
| the -O (optimize) option is included in the make entry. If this |
| happens to you, you can (a) remove the -O option from the make entry, |
| which will turn off the optimizer for ALL modules; or (b) compile the |
| offending module(s) by hand, including all the switches from make |
| entry except for -O, and then give the appropriate "make" command |
| again; or (c) increase the value of the -Olimit option, if your |
| compiler supports this option; or (d) change the [147]makefile target |
| to first compile each offending module explicitly without |
| optimization, then compile the others normally (with optimization), |
| for example: |
| |
| #Fortune 32:16, For:Pro 2.1 (mostly like 4.1bsd) |
| ft21: |
| @echo 'Making C-Kermit $(CKVER) for Fortune 32:16 For:Pro 2.1...' |
| $(MAKE) ckuusx.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ |
| -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" |
| $(MAKE) ckuxla.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ |
| -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" |
| $(MAKE) ckudia.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ |
| -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" |
| $(MAKE) wermit "CFLAGS= -O -DNODEBUG -DBSD4 -DFT21 -DNOFILEH -SYM 800 \ |
| -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" \ |
| "LNKFLAGS= -n -s" "LIBS= -lcurses -ltermcap -lv -lnet" |
| |
| As an extreme example, some compilers (e.g. gcc on the DG AViiON) have |
| been known to dump core when trying to compile ckwart.c with |
| optimization. So just do this one "by hand": |
| |
| cc -o wart ckwart.c |
| |
| or: |
| |
| touch ckcpro.c |
| |
| and then give the "make" command again. |
| |
| Speaking of wart, it is unavoidable that some picky compilers might |
| generate "statement unreachable" messages when compiling ckcpro.c. |
| Unreachable statements can be generated by the wart program, which |
| generates ckcpro.c automatically from [148]ckcpro.w, which translates |
| lex-like state/input constructions into a big switch/case |
| construction. |
| |
| Some function in Kermit wreaks havoc when it is called. Change all |
| invocations of the function into a macro that evaluates to the |
| appropriate return code that would have been returned by the function |
| had it been called and failed, for example: -Dzkself()=0. Obviously |
| not a good idea if the function is really needed. |
| |
| If you have just installed SunOS 4.1.2 or 4.1.3, you might find that |
| C-Kermit (and any other C program) fails to link because of unresolved |
| references from within libc. This is because of a mistake in Sun's |
| /usr/lib/shlib.etc files for building the new libc. Change the libc |
| Makefile so that the "ld" lines have "-ldl" at the end. Change the |
| README file to say "mv xccs.multibyte. xccs.multibyte.o" and follow |
| that instruction. |
| __________________________________________________________________________ |
| |
| 5. INSTALLING THE KERMIT FILES |
| |
| [ [149]Top ] [ [150]Contents ] [ [151]Next ] [ [152]Previous ] |
| |
| SECTION CONTENTS |
| |
| 5.1. [153]The C-Kermit Initialization File |
| 5.2. [154]Text Files |
| 5.3. [155]Installing the Kermit Files |
| 5.4. [156]The Makefile Install Target |
| |
| The C-Kermit executable does not need any external files to run. |
| Unlike, say, the cu program, which on most platforms is useless unless |
| you (as root) edit the /usr/spool/uucp/Systems and |
| /usr/spool/uucp/Devices files to supply whatever obscure and |
| undocumented syntax is required to match some supposedly user-friendly |
| mnemonic to the real pathname of whatever device you want to use, |
| Kermit runs on its own without needing any external configuration |
| files, and lets you refer to device (and network hosts and services) |
| by their own natural undisguised names. |
| |
| Nevertheless, a number of external files can be installed along with |
| the C-Kermit executable if you wish. These include configuration and |
| customization files that are read by Kermit as well as documentation |
| files to be read by people. All of this material is (a) optional, and |
| (b) available on the Kermit website: |
| |
| [157]http://www.columbia.edu/kermit/ |
| |
| and usually in a more pleasant form, perhaps also with updated |
| content. So if your computer is on the Internet, there is no need to |
| install anything but the Kermit executable if users know how to find |
| the Kermit website (and if they don't, Kermit's "help" command tells |
| them). |
| |
| 5.1. The C-Kermit Initialization File |
| |
| In C-Kermit 7.0 and earlier, the standard initialization file was a |
| key C-Kermit component because: |
| |
| a. It "loaded" the dialing and network directories. |
| b. It defined all the macros and variables for the services |
| directory. |
| c. It defined macros for quickly changing Kermit's file-transfer |
| performance tuning. |
| |
| The standard initialization file is quite long (more than 600 lines) |
| and requires noticeable processing time (the slower the computer, the |
| more noticeable), yet few people actually use the services directory, |
| whose definition takes up most of its bulk. Meanwhile, in C-Kermit |
| 8.0, many of the remaining functions of the standard initialization |
| file are now built in; for example, the FAST, CAUTIOUS, and ROBUST |
| commands. |
| |
| More to the point, many of the settings that could be made only in the |
| initialization and customization files can now be picked up from |
| environment variables. The first group identifies initialization and |
| directory files: |
| |
| CKERMIT_INI |
| The path of your Kermit initialization file, if any. This |
| overrides the built-in search for $HOME/.kermrc. |
| |
| K_CHARSET |
| The character set used for encoding local text files. |
| Equivalent to SET FILE CHARACTER-SET. |
| |
| K_DIAL_DIRECTORY |
| The full pathname of one or more Kermit dialing directory |
| files. Equivalent to SET DIAL DIRECTORY. |
| |
| K_NET_DIRECTORY |
| The full pathname of one or more Kermit network directory |
| files. Equivalent to SET NETWORK DIRECTORY. |
| |
| K_INFO_DIRECTORY |
| K_INFO_DIR |
| The full pathname of a directory containing Kermit (if any) |
| containing ckubwr.txt and other Kermit text files. Overrides |
| Kermit's built-in search for this directory. |
| |
| The next group is related to dialing modems: |
| |
| K_COUNTRYCODE |
| The telephonic numeric country code for this location, e.g. 1 |
| for North America or 39 for Italy. It is recommended that this |
| one be set for all users, system-wide. Not only is it used to |
| process portable-format dialing directory entries, but it is |
| also compared against Kermit's built-in list of "tone |
| countries" to see if tone dialing can be used. Equivalent to |
| Kermit's SET DIAL COUNTRY-CODE command. |
| |
| K_AREACODE |
| The telephonic numeric area code for this location, e.g. 212 |
| for Manhattan, New York, USA. Recommend this one also be set |
| system-wide, so shared portable-format dialing directories will |
| work automatically for everybody. Equivalent to Kermit's SET |
| DIAL AREA-CODE command. |
| |
| K_DIAL_METHOD |
| TONE or PULSE. Equivalent to Kermit's SET DIAL METHOD command. |
| If a dial method is not set explicitly (or implicitly from the |
| country code), Kermit does not specify a dialing method, and |
| uses the modem's default method, which tends to be pulse. |
| |
| K_INTL_PREFIX |
| The telephonic numeric international dialing prefix for this |
| location. Equivalent to Kermit's SET DIAL INTL-PREFIX command. |
| |
| K_LD_PREFIX |
| The telephonic numeric long-distance dialing prefix for this |
| location. Equivalent to Kermit's SET DIAL LD-PREFIX command. |
| |
| K_PBX_ICP |
| The telephonic numeric PBX internal call prefix for this |
| location. Equivalent to Kermit's SET DIAL PBX-INSIDE-PREFIX |
| command. |
| |
| K_PBX_OCP |
| The telephonic numeric PBX external call prefix for this |
| location. Equivalent to Kermit's SET DIAL PBX-OUTSIDE-PREFIX |
| command. |
| |
| K_PBX_XCH |
| The telephonic numeric PBX exchange (first part of the |
| subscriber number). Equivalent to Kermit's SET DIAL |
| PBX-EXCHANGE command. |
| |
| K_TF_AREACODE |
| A list of one or more telephonic numeric toll-free area codes. |
| |
| K_TF_PREFIX |
| The telephonic numeric toll-free dialing prefix, in case it is |
| different from the long-distance prefix. Equivalent to Kermit's |
| SET DIAL TF-PREFIX command. |
| |
| The final group includes well-known environment variables that are |
| also used by Kermit: |
| |
| CDPATH |
| Where the CD command should look for relative directory names. |
| |
| SHELL |
| The path of your Unix shell. Used by the RUN (!) command to |
| choose the shell to execute its arguments. |
| |
| USER |
| Your Unix username. |
| |
| EDITOR |
| The name or path of your preferred editor (used by the EDIT |
| command). Equivalent to SET EDITOR. |
| |
| BROWSER |
| The name or path of your preferred web browser (used by the |
| BROWSE command). Equivalent to Kermit's SET BROWSER command. |
| |
| Does this mean the initialization file can be abolished? I think so. |
| Here's why: |
| |
| * Kermit already does everything most people want it to do without |
| one. |
| * Important site-specific customizations can be done with global |
| environment variables. |
| * There is no longer any need for everybody to have to use the |
| standard initialization file. |
| * This means that your initialization file, if you want one, can |
| contain your own personal settings, definitions, and preferences, |
| rather than 600 lines of "standard" setups. |
| * If you still want the services directory, you can either TAKE the |
| standard initialization file (which must be named anything other |
| than $HOME/.kermrc to avoid being executed automatically every |
| time you start Kermit), or you can make it a kerbang script and |
| execute it "directly" (the [158]makefile install target does this |
| for you by putting ckermit.ini in the same directory as the Kermit |
| binary, adding the appropriate Kerbang line to the top, and giving |
| it execute permission). |
| |
| In fact, you can put any number of kerbang scripts in your PATH to |
| start up C-Kermit in different ways, to have it adopt certain |
| settings, make particular connections, execute complicated scripts, |
| whatever you want. |
| |
| 5.2. Text Files |
| |
| These are entirely optional. Many of them are to be found at the |
| Kermit website in HTML form (i.e. as Web pages with clickable links, |
| etc), and very likely also more up to date. Plain-text files that |
| correspond to Web pages were simply "dumped" by Lynx from the website |
| to plain ASCII text. The format is whatever Lynx uses for this |
| purpose. If you wish, you can install them on your computer as |
| described in the [159]next section. |
| |
| [160]COPYING.TXT |
| Copyright notice, permissions, and disclaimer. |
| |
| [161]ckermit.ini |
| The standard initialization file, intended more for reference |
| (in most cases) than actual use; see [162]Section 5.1. |
| |
| [163]ckermod.ini |
| A sample customization file. |
| |
| [164]ckermit70.txt |
| Supplement to [165]Using C-Kermit for version 7.0. Available on |
| the Kermit website as: |
| [166]http://www.columbia.edu/kermit/ckermit70.html |
| |
| [167]ckermit80.txt |
| Supplement to [168]Using C-Kermit for version 8.0. Available on |
| the Kermit website as: |
| [169]http://www.columbia.edu/kermit/ckermit80.html |
| |
| [170]ckcbwr.txt |
| The general C-Kermit hints and tips ("beware") file. Available |
| on the Kermit website as: |
| [171]http://www.columbia.edu/kermit/ckcbwr.html |
| |
| [172]ckubwr.txt |
| The Unix-specific C-Kermit hints and tips file. Available on |
| the Kermit website as: |
| [173]http://www.columbia.edu/kermit/ckubwr.html |
| |
| [174]ckuins.txt |
| Unix C-Kermit Installation Instructions (this file). Available |
| on the Kermit website as: |
| [175]http://www.columbia.edu/kermit/ckuins.html |
| |
| [176]ckccfg.txt |
| C-Kermit compile-time configuration options. Available on the |
| Kermit website as: |
| [177]http://www.columbia.edu/kermit/ckccfg.html |
| |
| [178]ckcplm.txt |
| The C-Kermit program logic manual. Available on the Kermit |
| website as: |
| [179]http://www.columbia.edu/kermit/ckcplm.html |
| |
| [180]ca_certs.pem |
| Certificate Authority certificates for secure connections (see |
| [181]Section 16). |
| |
| 5.3. Installing the Kermit Files |
| |
| There is an "install" target in the [182]makefile that you can use if |
| you wish. However, since every site has its own layout and |
| requirements, it is often better to install the Kermit files by hand. |
| You don't have to use the makefile install target to install C-Kermit. |
| This is especially true since not all sites build C-Kermit from |
| source, and therefore might not even have the makefile. But you should |
| read this section in any case. |
| |
| If your computer already has an older version of C-Kermit |
| installed, you should rename it (e.g. to "kermit6" or "kermit7") so |
| in case you have any trouble with the new version, the old one is |
| still available. |
| |
| In most cases, you need to be root to install C-Kermit, if only to |
| gain write access to directories in which the binary and manual page |
| are to be copied. The C-Kermit binary should be installed in a |
| directory that is in the users' PATH, but that is not likely to be |
| overwritten when you install a new version of the operating system. A |
| good candidate would be the /usr/local/bin/ directory, but the |
| specific choice is site dependent. Example (assuming the appropriate |
| Kermit binary is stored in your current directory as "wermit", e.g. |
| because you just built it from source and that's the name the makefile |
| gave it): |
| |
| mv wermit /usr/local/bin/kermit |
| chmod 755 /usr/local/bin/kermit |
| |
| or (only after you finish reading this section!) simply: |
| |
| make install |
| |
| IMPORTANT: IF C-KERMIT IS TO BE USED FOR DIALING OUT, you must also do |
| something to give it access to the dialout devices and lockfile |
| directories. The 'install' target does not attempt to set Kermit's |
| owner, group, and permissions to allow dialing out. This requires |
| privileges, open eyes, and human decision-making. Please read |
| [183]Sections 10 and [184]11 below, make the necessary decisions, and |
| then implement them by hand as described in those sections. |
| |
| You should also install the man page, which is called ckuker.nr, in |
| the man page directory for local commands, such as /usr/man/man1/, |
| renamed appropriately, e.g. to kermit.1. This is also taken care of by |
| "make install". |
| |
| Optionally, the text files listed in the [185]previous section can be |
| placed in a publicly readable directory. Suggested directory names |
| are: |
| |
| /usr/local/doc/kermit/ |
| /usr/local/lib/kermit/ |
| /usr/share/lib/kermit/ |
| /opt/kermit/doc/ |
| |
| (or any of these without the "/kermit"). Upon startup, C-Kermit checks |
| the following environment variables whose purpose is to specify the |
| directory where the C-Kermit text files are, in the following order: |
| |
| K_INFO_DIRECTORY |
| K_INFO_DIR |
| |
| If either of these is defined, C-Kermit checks for the existence of |
| the ckubwr.txt file (Unix C-Kermit Hints and Tips). If not found, it |
| checks the directories listed above (both with and without the |
| "/kermit") plus several others to see if they contain the ckubwr.txt |
| file. If found, various C-Kermit messages can refer the user to this |
| directory. |
| |
| Finally, if you want to put the source code files somewhere for people |
| to look at, you can do that too. |
| |
| 5.4. The Makefile Install Target |
| |
| The makefile "install" target does almost everything for you if you |
| give it the information it needs by setting the variables described |
| below. You can use this target if: |
| |
| * You downloaded the [186]complete C-Kermit archive and built |
| C-Kermit from source; or: |
| * You downloaded an [187]individual C-Kermit binary and the |
| [188]C-Kermit text-file archive, and your computer has a "make" |
| command. |
| |
| Here are the parameters you need to know: |
| |
| BINARY |
| Name of the binary you want to install as "kermit". Default: |
| "wermit". |
| |
| prefix |
| (lower case) If you define this variable, its value is |
| prepended to all the following xxxDIR variables (8.0.211 and |
| later). |
| |
| DESTDIR |
| If you want to install the Kermit files in a directory |
| structure like /opt/kermit/bin/, /opt/kermit/doc/, |
| /opt/kermit/src/, then define DESTIR as the root of this |
| structure; for example, /opt/kermit. The DESTDIR string should |
| not end with a slash. By default, DESTDIR is not defined. If it |
| is defined, but the directory does not exist, the makefile |
| attempts to create it, which might require you to be root. Even |
| so, this can fail if any segments in the path except the last |
| one do not already exist. WARNING: If the makefile creates any |
| directories, it gives them a mode of 755, and the default owner |
| and group. Modify these by hand if necessary. |
| |
| BINDIR |
| Directory in which to install the Kermit binary (and the |
| standard C-Kermit initialization file, if it is found, as a |
| Kerbang script). If DESTDIR is defined, BINDIR must start with |
| a slash. BINDIR must not end with a slash. If DESTDIR is |
| defined, BINDIR is a subdirectory of DESTDIR. If BINDIR does |
| not exist, the makefile attempts to create it as with DESTDIR. |
| Default: /usr/local/bin. |
| |
| MANDIR |
| Directory in which to install the C-Kermit manual page as |
| "kermit" followed by the manual-chapter extension (next item). |
| Default: /usr/man/man1. If MANDIR is defined, the directory |
| must already exist. |
| |
| MANEXT |
| Extension for the manual page. Default: 1 (digit one). |
| |
| SRCDIR |
| Directory in which to install the C-Kermit source code. If |
| DESTDIR is defined, this is a subdirectory of DESTDIR. Default: |
| None. |
| |
| CERTDIR |
| For secure builds only: Directory in which to install the |
| ca_certs.pem file. This must be the verification directory used |
| by programs that use the SSL libraries at your site. Default: |
| none. Possibilities include: /usr/local/ssl, /opt/ssl, |
| /usr/lib/ssl, . . . If CERTDIR is defined, the directory |
| must already exist. |
| |
| INFODIR |
| Directory in which to install the C-Kermit text files. If |
| DESTDIR is defined, this is a subdirectory of DESTDIR. Default: |
| None. If INFODIR is defined but does not exist, the makefile |
| attempts to create it, as with DESTDIR. |
| |
| Examples: |
| |
| make install |
| Installs "wermit" as /usr/local/bin/kermit with permissions |
| 755, the default owner and group, and no special privileges. |
| The manual page is installed as /usr/man/man1/kermit.1. Text |
| files are not copied anywhere, nor are the sources. |
| |
| make MANDIR= install |
| Just like "make install" but does not attempt to install the |
| manual page. |
| |
| make DESTDIR=/opt/kermit BINDIR=/bin SRCDIR=/src INFODIR=/doc install |
| Installs the Kermit binary "wermit" as /opt/kermit/bin/kermit, |
| puts the source code in /opt/kermit/src, and puts the text |
| files in /opt/kermit/doc, creating the directories if they |
| don't already exist, and puts the man page in the default |
| location. |
| |
| make BINDIR=/usr/local/bin CERTDIR=/usr/local/ssl install |
| Installs the Kerberized Kermit binary "wermit" as |
| /usr/local/bin/kermit, puts the CA Certificates file in |
| /usr/local/ssl/, and the man page in the normal place. |
| |
| For definitive information, see the makefile. The following is |
| excerpted from the 8.0.211 makefile: |
| |
| # The following symbols are used to specify library and header file locations |
| # Redefine them to the values used on your system by: |
| # . editing this file |
| # . defining the values on the command line |
| # . defining the values in the environment and use the -e option |
| # |
| prefix = /usr/local |
| srproot = $(prefix) |
| sslroot = $(prefix) |
| manroot = $(prefix) |
| |
| K4LIB=-L/usr/kerberos/lib |
| K4INC=-I/usr/kerberos/include |
| K5LIB=-L/usr/kerberos/lib |
| K5INC=-I/usr/kerberos/include |
| SRPLIB=-L$(srproot)/lib |
| SRPINC=-I$(srproot)/include |
| SSLLIB=-L$(sslroot)/ssl/lib |
| SSLINC=-I$(sslroot)/ssl/include |
| ... |
| WERMIT = makewhat |
| BINARY = wermit |
| DESTDIR = |
| BINDIR = $(prefix)/bin |
| MANDIR = $(manroot)/man/man1 |
| MANEXT = 1 |
| SRCDIR = |
| INFODIR = |
| CERTDIR = |
| __________________________________________________________________________ |
| |
| 6. INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES |
| |
| [ [189]Top ] [ [190]Contents ] [ [191]Next ] [ [192]Previous ] |
| |
| This section is obsolete. We don't distribute C-Kermit on diskettes |
| any more because (a)there is no demand, and (b) it no longer fits. |
| |
| If you received a DOS-format diskette containing a binary executable |
| C-Kermit program plus supporting text files, be sure to chmod +x the |
| executable before attempting to run it. |
| |
| In version 5A(190) and later, all the text files on the C-Kermit |
| DOS-format diskettes are in Unix format: LF at the end of each line |
| rather than CRLF. This means that no conversions are necessary when |
| copying to your Unix file system, and that all the files on the |
| diskette, text and binary, can be copied together. The following |
| comments apply to the DOS-format diskettes furnished with version |
| 5A(189) and earlier or to other DOS-format diskettes you might have |
| obtained from other sources. |
| |
| If you have received C-Kermit on MS-DOS format diskettes (such as |
| those distributed by Columbia University), you should make sure that |
| your DOS-to-Unix conversion utility (such as "dosread") both: (1) |
| changes line terminators in all files from carriage-return linefeed |
| (CRLF) to just linefeed (LF) (such as "dosread -a") and remove any |
| Ctrl-Z's, and (2) that all filenames are converted from uppercase to |
| lowercase. If these conversions were not done, you can use the |
| following shell script on your Unix system to do them: |
| |
| ---(cut here)--- |
| #!/bin/sh |
| # |
| # Shell script to convert C-Kermit DOS-format files into Unix format. |
| # Lowercases the filenames, strips out carriage returns and Ctrl-Z's. |
| # |
| x=$1 # the name of the source directory |
| y=$2 # the name of the target directory if [ $# -lt 2 ]; then |
| echo "usage: $0 source-directory target-directory" |
| exit 1 |
| fi |
| if cd $1 ; then |
| echo "Converting files from $1 to $2" |
| else |
| echo "$0: cannot cd to $1" |
| exit 1 |
| fi |
| for i in *; do |
| j=`echo $i | tr 'A-Z' 'a-z'` |
| echo $x/$i =\> $y/$j |
| tr -d '\015\032' < $i > $y/$j |
| done |
| ---(cut here)--- |
| |
| Cut out this shell script, save it as "convert.sh" (or any other name |
| you prefer), then "chmod +x convert.sh". Then, create a new, empty |
| directory to put the converted files in, and then "convert.sh /xxx |
| /yyy" where /xxx is the name of the directory where the PC-format |
| files are, and /yyy is the name of the new, empty directory. The |
| converted files will appear in the new directory. |
| __________________________________________________________________________ |
| |
| 7. CHECKING THE RESULTS |
| |
| [ [193]Top ] [ [194]Contents ] [ [195]Next ] [ [196]Previous ] |
| |
| First some quick checks for problems that can be easily corrected by |
| recompiling with different options: |
| |
| DIRECTORY listing is garbage |
| Permissions, size, and date are random garbage (but the |
| filenames are correct) in a C-Kermit DIRECTORY listing. On some |
| platforms, the lstat() function is present but simply doesn't |
| work; try adding -DNOLSTAT to CFLAGS and rebuild. If that |
| doesn't fix it, also add -DNOLINKBITS. If it's still not fixed, |
| remove -DNOLSTAT and -DNOLINKBITS and add -DNOSYMLINK. |
| |
| curses |
| When you make a connection with C-Kermit and transfer files |
| using the fullscreen (curses) file-transfer display, and then |
| get the C-Kermit> prompt back afterwards, do characters echo |
| when you type them? If not, the curses library has altered the |
| buffering of /dev/tty. Try rebuilding with KFLAGS=-DCK_NEWTERM. |
| If it already has -DCK_NEWTERM in CFLAGS, try removing it. If |
| that doesn't help, then rebuild with -DNONOSETBUF (yes, two |
| NO's). If none of this works (and you can't fix the code), then |
| either don't use the fullscreen display, or rebuild with |
| -DNOCURSES. |
| |
| Ctrl-L or any SCREEN command crashes C-Kermit: |
| Rebuild with -DNOTERMCAP. |
| |
| No prompt after CONNECT: |
| After escaping back from CONNECT mode, does your C-Kermit> |
| prompt disappear? (Yet, typing "?" still produces a command |
| list, etc) In that case, add -DCKCONINTB4CB to CFLAGS and |
| rebuild. |
| |
| Here is a more thorough checklist can use to tell whether your version |
| of C-Kermit was built correctly for your Unix system, with hints on |
| how to fix or work around problems: |
| |
| a. Start C-Kermit (usually by typing "./wermit" in the directory |
| where you ran the makefile). Do you see the C-Kermit> prompt? If |
| not, C-Kermit incorrectly deduced that it was running in the |
| background. The test is in conbgt() in [197]ckutio.c. If you can |
| fix it for your system, please send in the fix (Hint: read about |
| "PID_T" below). Otherwise, you can force C-Kermit to foreground |
| mode by starting it with the -z command line option, as in "kermit |
| -z", or giving the interactive command SET BACKGROUND OFF. |
| b. When you type characters at the C-Kermit prompt, do they echo |
| immediately? If not, something is wrong with concb() and probably |
| the other terminal mode settings routines in [198]ckutio.c. Be |
| sure you have used the most appropriate make entry. |
| c. At the C-Kermit> prompt, type "send ./?". C-Kermit should list all |
| the files in the current directory. If not, it was built for the |
| wrong type of Unix file system. Details below. In the meantime, |
| try SET WILDCARD-EXPANSION SHELL as a workaround. |
| d. CD to a directory that contains a variety of files, symlinks, and |
| subdirectories and give a DIRECTORY command at the C-Kermit> |
| prompt. Do the permissions, size, and date appear correct? If not |
| see [199]Section 4.0. |
| e. Assuming your platform supports long file names, create a file |
| with a long name in your current directory, e.g.: |
| |
| $ touch thisisafilewithaveryveryveryveryveryveryveryverylooooooooongname |
| |
| (you might need to make it longer than this, perhaps as long as |
| 257 or even 1025 characters). |
| Check with ls to see if your version of Unix truncated the name. |
| Now start C-Kermit and type "send thisis<ESC>". Does Kermit |
| complete the name, showing the same name as ls did? If not, wrong |
| filesystem. Read on. |
| f. Make sure that Kermit has the maximum path length right. Just type |
| SHOW FILE and see what it says about this. If it is too short, |
| there could be some problems at runtime. To correct, look in |
| [200]ckcdeb.h to see how the symbol CKMAXPATH is set and make any |
| needed adjustments. |
| g. Send a file to your new Kermit program from a different Kermit |
| program that is known to work. Is the date/timestamp of the new |
| file identical to the original? If not, adjustments are needed in |
| zstrdt() in [201]ckufio.c. |
| h. Go to another computer (Computer B) from which you can send files |
| to C-Kermit. Connect Computer B to the computer (A) where you are |
| testing C-Kermit. Then: |
| i. Send a file from B to A. Make sure it transferred OK and was |
| created with the the right name. |
| j. Send a file from B to A, specifying an "as-name" that is very, |
| very long (longer than the maximum name length on computer A). |
| Check to make sure that the file was received OK and that its name |
| was truncated to Computer A's maximum length. If not, check the |
| MAXNAMLEN definition in [202]ckufio.c. |
| k. Tell C-Kermit on Computer A to "set receive pathnames relative" |
| and then send it a file from Computer B specifying an as-name that |
| contains several directory segments: |
| |
| send foo dir1/dir2/dir3/foo |
| |
| Check to make sure that dir1/dir2/dir3/foo was created in Computer |
| A's current directory (i.e. that three levels of directories were |
| created). |
| l. Repeat step k, but make each path segment in the pathname longer |
| than Computer A's maximum name length. Make sure each directory |
| name, and the final filename, were truncated properly. |
| m. Type Ctrl-C (or whatever your Unix interrupt character is) at the |
| prompt. Do you get "^C..." and a new prompt? If instead, you get a |
| core dump (this shouldn't happen any more) "rm core" and then |
| rebuild with -DNOCCTRAP added to your CFLAGS. If it did work, then |
| type another Ctrl-C. If this does the same thing as the first one, |
| then Ctrl-C handling is OK. Otherwise, the SIGINT signal is either |
| not getting re-armed (shouldn't happen) or is being masked off |
| after the first time it is caught, in which case, if your Unix is |
| POSIX-based, try rebuilding C-Kermit with -DCK_POSIX_SIG. |
| n. Type Ctrl-Z (or whatever your Unix suspend character is) to put |
| C-Kermit in the background. Did it work? If nothing happened, then |
| (a)your version of Unix does not support job control, or (b) your |
| version of C-Kermit was probably built with -DNOJC. If your |
| session became totally frozen, then you are probably running |
| C-Kermit on a Unix version that supports job control, but under a |
| shell that doesn't. If that's not the case, look in the congm() |
| and psuspend() routines in [203]ckutio.c and see if you can figure |
| out what's wrong. If you can't, rebuild with -DNOJC. |
| o. Give a SET LINE command for a dialout device, e.g. "set line |
| /dev/tty00". If you got some kind of permission or access denied |
| message, go read [204]Section 10 and then come back here. |
| p. After giving a successful SET LINE command, type "show comm" to |
| see the communication parameters. Do they make sense? |
| q. Type "set speed ?" and observe the list of available speeds. Is it |
| what you expected? If not, see [205]Section 2) of the |
| [206]Configurations Options document. |
| r. Give a SET SPEED command to change the device's speed. Did it |
| work? (Type "show comm" again to check.) |
| s. Try dialing out: SET MODEM TYPE , SET LINE , SET SPEED , DIAL . If |
| it doesn't work, keep reading. After dialing, can you REDIAL? |
| t. If your version was built with TCP/IP network support, try the |
| TELNET command. |
| u. Transfer some files in remote mode on incoming asynchronous serial |
| (direct or modem) connections, and on incoming network (telnet, |
| rlogin, terminal server) connections. If you get lots of errors, |
| try different SET FLOW settings on the remote Kermit program. |
| v. Establish a serial connection from C-Kermit to another computer |
| (direct or dialed) and transfer some files. If you have network |
| support, do the same with a network connection. |
| w. If your version was built with fullscreen file transfer display |
| support, check that it works during local-mode file transfer. |
| Also, check C-Kermit's operation afterwards: is the echoing funny? |
| etc etc. If there are problems, see [207]Section 4. |
| x. If your version was built with script programming language |
| support, TAKE the ckedemo.ksc file to give it a workout. |
| y. Does C-Kermit interlock correctly with UUCP-family programs (cu, |
| tip, uucp, etc)? If not, read the section [208]DIALING OUT AND |
| COORDINATING WITH UUCP below. |
| z. Modem signals... Give a SET LINE command to a serial device and |
| then type the SHOW MODEM command. If it says "Modem signals |
| unavailable in this version of Kermit", then you might want to |
| look at the ttgmdm() routine in [209]ckutio.c and add the needed |
| code -- if indeed your version of Unix provides a way to get modem |
| signals (some don't; e.g. modem signals are a foreign concept to |
| POSIX, requiring politically incorrect workarounds). |
| aa. If it says "Modem signals unavailable", then it is likely that the |
| API for getting modem signals is provided, but it doesn't actually |
| do anything (e.g. ioctl(ttyfd,TIOCMGET,&x) returns EINVAL). |
| ab. In any case, it still should be able to manipulate the DTR signal. |
| To test, SET LINE , SET MODEM NONE, and HANGUP. The DTR light |
| should go out momentarily. If it doesn't, see if you can add the |
| needed code for your system to the tthang() routine in |
| [210]ckutio.c. |
| ac. If your version of Kermit has the SET FLOW RTS/CTS command, check |
| to see if it works: give Kermit this command, set your modem for |
| RTS/CTS, transfer some files (using big packet and window sizes) |
| and watch the RTS and CTS lights on the modem. If they go on and |
| off (and Kermit does not get packet errors), then it works. If |
| your version of Kermit does not have this command, but your |
| version of Unix does support hardware flow control, take a look at |
| the tthflow() command in [211]ckutio.c and see if you can add the |
| needed code (see the section on [212]HARDWARE FLOW CONTROL below). |
| (And please [213]send back any added code, so that others can |
| benefit from it and it can be carried forward into future |
| releases.) |
| ad. If C-Kermit starts normally and issues its prompt, echoing is |
| normal, etc, but then after returning from a CONNECT session, the |
| prompt no longer appears, try rebuilding with -DCKCONINTB4CB. |
| ae. (8.0.206 or later) Type some commands at the C-Kermit prompt. Can |
| you use the Up-arrow and Down-arrow keys on your keyboard to |
| access Kermit's command history? If not, and you're a programmer, |
| take a look at the USE_ARROWKEYS sections of ckucmd.c. |
| __________________________________________________________________________ |
| |
| 8. REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE |
| |
| [ [214]Top ] [ [215]Contents ] [ [216]Next ] [ [217]Previous ] |
| |
| Also see: [218]C-Kermit Configuration Options |
| |
| a. Many of C-Kermit's options and features can be deselected at |
| compile time. The greatest savings at the least sacrifice in |
| functionality is to disable the logging of debug information by |
| defining NODEBUG during compilation. See the [219]Configurations |
| Options document for further information. |
| b. Use shared libraries rather than static linking. This is the |
| default on many Unix systems anyway. However, executables built |
| for dynamic linking with shared libraries are generally not |
| portable away from the machine they were built on, so this is |
| recommended if the binary is for your use only. |
| c. Most Unix systems have a "strip" command to remove symbol table |
| information from an executable program image. "man strip" for |
| further information. The same effect can be achieved by including |
| "-s" among the link flags when building C-Kermit. |
| d. SCO, Interactive, and some other Unix versions have an "mcs" |
| command. "mcs -d wermit" can be used to delete the contents of the |
| ".comment" section from the executable program image. |
| e. Many modern optimizers can be instructed to optimize for space |
| rather than execution efficiency. Check the CFLAGS in the makefile |
| target, adjust as desired. |
| __________________________________________________________________________ |
| |
| 9. UNIX VERSIONS |
| |
| [ [220]Top ] [ [221]Contents ] [ [222]Next ] [ [223]Previous ] |
| |
| SECTION CONTENTS |
| |
| 9.1 [224]Standards |
| 9.1.1. [225]POSIX |
| 9.1.2. [226]ANSI C |
| 9.1.3. [227]Other Standards |
| 9.2. [228]Library Issues |
| 9.3. [229]Unix File System Peculiarities |
| 9.4. [230]Hardware Flow Control |
| 9.5. [231]Terminal Speeds |
| 9.6. [232]Millisecond Sleeps |
| 9.7. [233]Nondestructive Input Buffer Peeking |
| 9.8. [234]Other System-Dependent Features |
| 9.9. [235]Terminal Interruption |
| |
| There are several major varieties of Unix: Bell Laboratories Seventh |
| Edition, AT&T System V, Berkeley Standard Distribution (BSD), and |
| POSIX. Each has many, many subvarieties and descendents, and there are |
| also hybrids that exhibit symptoms of two or more varieties, plus |
| special quirks of their own. |
| |
| Seventh edition versions of C-Kermit include the compile-time option |
| -DV7 in the CFLAGS string in the makefile target. Various V7-based |
| implementations are also supported: -DCOHERENT, -DMINIX, etc. |
| |
| AT&T-based versions of Unix Kermit include the compile-time option |
| -DATTSV (standing for AT∓T Unix System V). This applies to System |
| III and to System V up to and including Release 2. For System V |
| Release 3, the flag -DSVR3 should be used instead (which also implies |
| -DATTSV). This is because the data type of signal() and several other |
| functions was changed between SVR2 and SVR3. For System V Release 4, |
| include -DSVR4 because of changes in UUCP lockfile conventions; this |
| also implies -DSVR3 and -DATTSV. |
| |
| For BSD, the flag -BSDxx must be included, where xx is the BSD version |
| number, for example BSD4 (for version 4.2 or later, using only 4.2 |
| features), -DBSD41 (for BSD 4.1 only), -DBSD43 (for 4.3), -DBSD29 (BSD |
| 2.9 for DEC PDP-11s). -DBSD44 is for 4.4BSD, which is the basis of |
| FreeBSD, NetBSD, OpenBSD, BSDI, and Mac OS X, and which contains many |
| POSIX features, and has little relation to 4.3BSD and earlier. |
| |
| For POSIX, include the flag -DPOSIX. POSIX defines a whole new set of |
| terminal i/o functions that are not found in traditional AT&T or |
| Berkeley implementations, and also defines the symbol _POSIX_SOURCE, |
| which is used in many system and library header files, mainly to |
| disable non-POSIX (i.e. useful) features. |
| |
| Note (circa 1997): In order to enable serial speeds higher than 38400 |
| bps, it is generally necessary to add -DPOSIX (among other things), |
| since the older terminal APIs can not accommodate the new speeds -- |
| out o' bits. But this often also means wholesale conversion to POSIX |
| APIs. In general, just try adding -DPOSIX and then see what goes |
| wrong. Be wary of features disappearing: when _POSIX_SOURCE is |
| defined, all sorts of things that were perfectly OK before suddenly |
| become politically incorrect -- like reading modem signals, doing |
| hardware flow control, etc. POSIX was evidently not designed with |
| serial communication in mind! |
| |
| Case in point: In UnixWare 7.0, #define'ing POSIX causes strictness |
| clauses in the header files to take effect. These prevent <sys/time.h> |
| from defining the timeval and timezone structs, which are needed for |
| all sorts of things (like select()). Thus, if we want the high serial |
| speeds, we have to circumvent the POSIX clauses. |
| |
| Similarly in SCO OpenServer R5.0.4 where, again, we must use the POSIX |
| APIs to get at serial speeds higher than 38400, but then doing so |
| removes hardware flow control -- just when we need it most! In cases |
| like this, dirty tricks are the only recourse (search for SCO_OSR504 |
| in [236]ckutio.c for examples). |
| |
| For reasons like this, Unix implementations tend to be neither pure |
| AT&T nor pure BSD nor pure POSIX, but a mixture of two or more of |
| these, with "compatibility features" allowing different varieties of |
| programs to be built on the same computer. In general, Kermit tries |
| not to mix and match but to keep a consistent repertoire throughout. |
| However, there are certain Unix implementations that only work when |
| you mix and match. For example, the Silicon Graphics IRIX operating |
| system (prior to version 3.3) is an AT&T Unix but with a BSD file |
| system. The only way you can build Kermit successfully for this |
| configuration is to include -DSVR3 plus the special option -DLONGFN, |
| meaning "pretend I was built with -DBSDxx when it's time to compile |
| file-related code". See the "iris" makefile target. |
| ________________________________________________________________________ |
| |
| 9.1. Standards |
| |
| [ [237]Top ] [ [238]Section Contents ] [ [239]Contents ] [ [240]Next ] |
| |
| SUBSECTION CONTENTS |
| |
| 9.1.1. [241]POSIX |
| 9.1.2. [242]ANSI C |
| 9.1.3. [243]Other Standards |
| |
| In edits 166-167 (1988-89), C-Kermit was heavily modified to try to |
| keep abreast of new standards while still remaining compatible with |
| old versions of C and Unix. There are two new standards of interest: |
| ANSI C (as described in Kernighan and Ritchie, "The C Programming |
| Language", Second Edition, Prentice Hall, 1988) and POSIX.1 (IEEE |
| Standard 1003.1 and ISO/IEC 9945-1, 1990, "Portable Operating System |
| Interface"). These two standards have nothing to do with each other: |
| you can build C-Kermit with a non-ANSI compiler for a POSIX system, or |
| for a non-POSIX system with with an ANSI compiler. |
| |
| 9.1.1. POSIX |
| |
| POSIX.1 defines a repertoire of system functions and header files for |
| use by C language programs. Most notably, the ioctl() function is not |
| allowed in POSIX; all ioctl() functions have been replaced by |
| device-specific functions like tcsetattr(), tcsendbreak(), etc. |
| |
| Computer systems that claim some degree of POSIX compliance have made |
| some attempt to put their header files in the right places and give |
| them the right names, and to provide system library functions with the |
| right names and calling conventions. Within the header files, |
| POSIX-compliant functions are supposed to be within #ifdef |
| _POSIX_SOURCE..#endif conditionals, and non-POSIX items are not within |
| these conditionals. |
| |
| If Kermit is built with neither -D_POSIX_SOURCE nor -DPOSIX, the |
| functions and header files of the selected version of Unix (or VMS, |
| etc) are used according to the CFLAGS Kermit was built with. |
| |
| If Kermit is built with -D_POSIX_SOURCE but not -DPOSIX, then one of |
| the -DBSD or -DATTSV flags (or one that implies them) must also be |
| defined, but it still uses only the POSIX features in the system |
| header files. This allows C-Kermit to be built on BSD or AT&T systems |
| that have some degree of POSIX compliance, but still use BSD or AT&T |
| specific features. |
| |
| The dilimma is this: it is often necessary to define _POSIX_SOURCE to |
| get at new or modern features, such as high serial speeds and the APIs |
| to deal with them. But defining _POSIX_SOURCE also hides other APIs |
| that Kermit needs, for example the ones dealing with modem signals |
| (others are listed just below). Thus all sorts of hideous contortions |
| are often required to get a full set of features. |
| |
| The POSIX standard does not define anything about uucp lockfiles. |
| "make posix" uses NO (repeat, NO) lockfile conventions. If your |
| POSIX-compliant Unix version uses a lockfile convention such as |
| HDBUUCP (see below), use the "posix" entry, but include the |
| appropriate lockfile option in your KFLAGS on the "make" command line, |
| for example: |
| |
| make posix "KFLAGS=-DHDBUUCP" |
| |
| POSIX.1 also lacks certain other features that Kermit needs. For |
| example: |
| |
| * There is no defined way for an application to do wildcard matching |
| of filenames. Kermit uses the inode in the directory structure, |
| but POSIX.1 does not include this concept. (Later POSIX revisions |
| include functions named (I think) glob() and fnmatch(), but these |
| functions are not yet in Kermit, and might not be appropriate in |
| any case.) |
| * There is no POSIX mechanism for sensing or controlling modem |
| signals, nor to enable RTS/CTS or other hardware flow control. |
| * There is no select() for multiplexing i/o, and therefore no |
| TCP/IP. |
| * There is no way to check if characters are waiting in a |
| communications device (or console) input buffer, short of trying |
| to read them -- no select(), ioctl(fd,FIONREAD,blah), rdchk(), |
| etc. This is bad for CONNECT mode and bad for sliding windows. |
| * No way to do a millisecond sleep (no nap(), usleep(), select(), |
| etc). |
| * There is no popen(). |
| |
| So at this point, there cannot be one single fully functional POSIX |
| form of C-Kermit unless it also has "extensions", as do Linux, QNX, |
| etc. |
| |
| More on POSIX (quoting from a newsgroup posting by Dave Butenhof): |
| |
| Standards tend to look at themselves as "enabling". So POSIX |
| standards say that, in order to use POSIX functions, a program must |
| define some macro that will put the development environment in |
| "POSIX mode". For the ancient POSIX 1003.1-1990, the symbol is |
| _POSIX_SOURCE. For recent revisions, it's _POSIX_C_SOURCE with an |
| appropriate value. POSIX 1003.1-1996 says that, to use its features |
| in a portable manner, you must define _POSIX_C_SOURCE=199506L |
| before including any header files. |
| |
| But for Solaris, or Digital Unix, the picture is different. POSIX |
| is one important but small part of the universe. Yet POSIX |
| unconditionally and unambiguously REQUIRES that, when |
| _POSIX_C_SOURCE=199506L, ALL of the functions and definitions |
| required by the standard, and NO others (except in specific |
| restricted namespaces, specifically "_" followed by an uppercase |
| letter or "__" followed by a lowercase letter) shall be visible. |
| That kinda puts a cramp on BSD and SVID support, because those |
| require names that are not in the "protected" POSIX namespaces. |
| It's ILLEGAL to make those symbols visible, unless you've done |
| something else that's beyond the scope of POSIX to allow the system |
| to infer that you didn't really mean it. |
| |
| In most cases, you should just compile, with no standards-related |
| macros defined. The system will make available every interface and |
| definition that isn't incompatible with the "main stream". There |
| may indeed be cases where two standards cross, and you really can't |
| use both together. But, in general, they play nicely together as |
| long as you don't do anything rash -- like telling the system that |
| it's not allowed to let them. |
| |
| In the area of threads, both Solaris and Digital Unix support |
| incompatible thread APIs. We have POSIX and DCE, they have POSIX |
| and UI. The nasty areas are in the _r routines and in some aspects |
| of signal behavior. You cannot compile a single source file that |
| uses both semantics. That's life. It sounds as if Solaris defaults |
| to the UI variants, but allows you to define this |
| _POSIX_THREAD_SEMANTICS to get around it. We default to POSIX, and |
| allow you to define _PTHREAD_USE_D4 (automatically defined by the |
| cc "-threads" switch) to select the DCE thread variants. That |
| default, because you're operating outside of any individual |
| standard, is really just a marketing decision. |
| ______________________________________________________________________ |
| |
| 9.1.2. ANSI C |
| |
| [ [244]Top ] [ [245]Contents ] [ [246]Section Contents ] [ |
| [247]Subsection Contents ] [ [248]Next ] [ [249]Previous ] |
| |
| The major difference between ANSI C and earlier C compilers is |
| function prototyping. ANSI C allows function arguments to be checked |
| for type agreement, and (when possible) type coercion in the event of |
| a mismatch. For this to work, functions and their arguments must be |
| declared before they are called. The form for function declarations is |
| different in ANSI C and non-ANSI C (ANSI C also accepts the earlier |
| form, but then does not do type checking). |
| |
| As of edit 167, C-Kermit tries to take full advantage of ANSI C |
| features, especially function prototyping. This removes many bugs |
| introduced by differing data types used or returned by the same |
| functions on different computers. ANSI C features are automatically |
| enabled when the symbol __STDC__ is defined. Most ANSI C compilers, |
| such as GNU CC and the new DEC C compiler define this symbol |
| internally. |
| |
| On the downside, ANSI C compilation increases the |
| administrative/bureacratic burden, spewing out countless unneeded |
| warnings about mismatched types, especially when we are dealing with |
| signed and unsigned characters, requiring casts everywhere to shut up |
| the mindless complaints -- there is no use for signed chars in Kermit |
| (or probably anywhere else). Some compilers, mercifully, include a |
| "treat all chars as unsigned" option, and when available it should be |
| used -- not only to stop the warnings, but also to avoid unhelpful |
| sign extension on high-bit characters. |
| |
| To force use of ANSI C prototypes, include -DCK_ANSIC on the cc |
| command line. To disable the use of ANSI prototypes, include -DNOANSI. |
| ______________________________________________________________________ |
| |
| 9.1.3. Other Standards |
| |
| [ [250]Top ] [ [251]Contents ] [ [252]Section Contents ] [ |
| [253]Subsection Contents ] [ [254]Next ] [ [255]Previous ] |
| |
| As the years go by, standards with-which-all-must-comply continue to |
| pile up: AES, XPG2, XPG3, XPG4, FIPS 151-2, successive generations of |
| POSIX, OSF/1, X/Open, Spec 1170, UNIX95, Open Group UNIX98, ISO/IEC |
| 9945 parts 1-4, ISO 9899, 88Open, OS 99, Single Unix Specification |
| (SUS, [256]IEEE 1003.1-2001, not to mention "mature standards" like |
| V7, 4.2/4.3BSD, System V R3 and R4 (SVID2 and SVID3), 4.4BSD (the |
| basis for BSDI, OpenBSD, NetBSD, FreeBSD, Mac OS X etc), /usr/group, |
| plus assorted seismic pronouncements of the neverending series of |
| ephemeral corporate consortia, not to mention the libc-vs-glibc |
| turmoil in the Linux arena and who knows what else. |
| |
| None of these standards simplifies life for portable applications like |
| C-Kermit -- each one is simply one more environment to support (or |
| circumvent, as in many cases these standards do more harm than good by |
| denying access to facilities we need, e.g. as noted in above in |
| [257]9.1.1). |
| ________________________________________________________________________ |
| |
| 9.2. Library Issues |
| |
| [ [258]Top ] [ [259]Contents ] [ [260]Section Contents ] [ |
| [261]Subsection Contents ] [ [262]Next ] [ [263]Previous ] |
| |
| On most modern platforms, applications are -- and often must be -- |
| dynamically linked. This has numerous advantages (smaller executables, |
| ability to patch a library and thereby patch all applications that use |
| it, etc), but also causes some headaches: most commonly, the library |
| ID built into the executable at link time does not match the ID of the |
| corresponding library on the target system, and so the loader refuses |
| to let the application run. |
| |
| This problem only gets worse over time. In the Linux and *BSD world, |
| we also have totally different libraries (each with their own names |
| and numbering systems) that cover the same territory; for example, |
| curses vs ncurses, libc versus glibc. Combinations proliferate and any |
| given Unix computer might have any combination. For this reason it is |
| becoming increasingly difficult to produce a "Linux binary" for a |
| given architecture (e.g. PC or Alpha). There has to be a separate |
| binary for (at least) every combination of curses vs ncurses and libc |
| vs glibc. |
| |
| In such cases, the best advice is for every user to build C-Kermit |
| from source code on the system where it will run. Too bad most |
| commercial Unix vendors have stopped including C compilers with the |
| operating system! |
| ________________________________________________________________________ |
| |
| 9.3. Unix File System Peculiarities |
| |
| [ [264]Top ] [ [265]Contents ] [ [266]Section Contents ] [ [267]Next ] |
| [ [268]Previous ] |
| |
| Normally, including a BSD, System-V, POSIX, or DIRENT flag in the make |
| entry selects the right file system code. But some versions of Unix |
| are inconsistent in this regard, and building in the normal way either |
| gives compiler or linker errors, or results in problems at runtime, |
| typically failure to properly expand wildcard file specifications when |
| you do something like "send *.*", or failure to recognize long |
| filenames, as in "send filewithaveryveryveryveryverylongname". |
| |
| C-Kermit is supposed to know about all the various styles of Unix file |
| systems, but it has to be told which one to use when you build it, |
| usually in the makefile target CFLAGS as shown below, but you might |
| also have to add something like -I/usr/include/bsd to CFLAGS, or |
| something like -lbsd to LIBS. |
| |
| C-Kermit gives you the following CFLAGS switches to adapt to your file |
| system's peculiarities: |
| |
| -DDIRENT - #include <dirent.h> |
| -DSDIRENT - #include <sys/dirent.h> |
| -DNDIR - #include <ndir.h> |
| -DXNDIR - #include <sys/ndir.h> |
| -DRTU - #include "/usr/lib/ndir.h", only if NDIR and XNDIR not defined. |
| -DSYSUTIMH - #include <sys/utime.h> for setting file creation dates. |
| -DUTIMEH - #include <utime.h> for setting file creation dates. |
| |
| (Note, RTU should only be used for Masscomp RTU systems, because it |
| also selects certain other RTU-specific features.) |
| |
| If none of these is defined, then <sys/dir.h> is used. IMPORTANT: If |
| your system has the file /usr/include/dirent.h then be sure to add |
| -DDIRENT to your makefile target's CFLAGS. "dirent" should be used in |
| preference to any of the others, because it supports all the features |
| of your file system, and the others probably don't. |
| |
| Having selected the appropriate directory header file, you might also |
| need to tell Kermit how to declare the routines and variables it needs |
| to read the directory. This happens most commonly on AT&T System-V |
| based UNIXes, particularly System V R3 and earlier, that provide long |
| file and directory names (longer than 14 characters). Examples include |
| certain releases of HP-UX, DIAB DNIX, older versions of Silicon |
| Graphics IRIX, and perhaps also MIPS. In this case, try adding |
| -DLONGFN to your makefile target. |
| |
| Another problem child is <sys/file.h>. Most Unix C-Kermit versions |
| need to #include this file from within [269]ckufio.c and |
| [270]ckutio.c, but some not only do not need to include it, but MUST |
| not include it because (a) it doesn't exist, or (b) it has already |
| been included by some other header file and it doesn't protect itself |
| against multiple inclusion, or (c) some other reason that prevents |
| successful compilation. If you have compilation problems that seem to |
| stem from including this file, then add the following switch to CFLAGS |
| in your makefile target: |
| |
| -DNOFILEH |
| |
| There are a few odd cases where <sys/file.h> must be included in one |
| of the cku[ft]io.c files, but not the other. In that case, add the |
| aforementioned switch, but go into the file that needs <sys/file.h> |
| and add something like this: |
| |
| #ifdef XXX /* (where XXX is a symbol unique to your system) */ |
| #undef NOFILEH |
| #endif /* XXX */ |
| |
| before the section that includes <sys/file.h>. |
| |
| Kermit's SEND command expands wildcard characters "?" and "*" itself. |
| Before version 5A, commands like "send *" would send all regular |
| (non-directory) files, including "hidden files" (whose names start |
| with "."). In version 5A, the default behavior is to match like the |
| Bourne shell or the ls command, and not include files whose names |
| start with dot. Such files can still be sent if the dot is included |
| explicitly in the SEND command: "send .oofa, send .*". To change back |
| to the old way and let leading wildcard characters match dot files, |
| include the following in your CFLAGS: |
| |
| -DMATCHDOT |
| |
| (In C-Kermit 6.0, there is also a command to control this at runtime.) |
| |
| Complaints about data-type mismatches: |
| |
| * If you get compile-time complaints about data type mismatches for |
| process-ID related functions like getpid(), add -DPID_T=pid_t. |
| * If you get compile-time complaints about data type mismatches for |
| user ID related functions like getuid(), add -DUID_T=uid_t. |
| * If you get compile-time complaints about data type mismatches for |
| user-ID related functions like getgid(), add -DGID_T=gid_t. |
| * If you get compile-time complaints about data type mismatches for |
| getpwuid(), add -DPWID_T=uid_t (or whatever it should be). |
| |
| File creation dates: C-Kermit attempts to set the creation date/time |
| of an incoming file according to the date/time given in the file's |
| attribute packet, if any. If you find that the dates are set |
| incorrectly, you might need to build Kermit with the -DSYSUTIMEH flag, |
| to tell it to include <sys/utime.h>. If that doesn't help, look at the |
| code in zstrdt() in [271]ckufio.c. |
| ________________________________________________________________________ |
| |
| 9.4. Hardware Flow Control |
| |
| [ [272]Top ] [ [273]Contents ] [ [274]Section Contents ] [ [275]Next ] |
| [ [276]Previous ] |
| |
| Hardware flow control is a problematic concept in many popular Unix |
| implementations. Often it is lacking altogether, and when available, |
| the application program interface (API) to it is inconsistent from |
| system to system. Here are some examples: |
| |
| a. POSIX does not support hardware flow control. |
| b. RTS/CTS flow control support MIGHT be available for System V R3 |
| and later if /usr/include/termiox.h exists (its successful |
| operation also depends on the device driver, and the device |
| itself, not to mention the cable, etc, actually supporting it). If |
| your SVR3-or-later Unix system does have this file, add: |
| |
| -DTERMIOX |
| |
| to your CFLAGS. If the file is in /usr/include/sys instead, add: |
| |
| -DSTERMIOX |
| |
| Note that the presence of this file does not guarantee that |
| RTS/CTS will actually work -- that depends on the device-driver |
| implementation (reportedly, many Unix versions treat |
| hardware-flow-control related ioctl's as no-ops). |
| c. Search ("grep -i") through /usr/include/*.h and |
| /usr/include/sys/*.h for RTS or CTS and see what turns up. For |
| example, in SunOS 4.x we find "CRTSCTS". Figuring out how to use |
| it is another question entirely! In IBM AIX RS/6000 3.x, we have |
| to "add" a new "line discipline" (and you won't find uppercase RTS |
| or CTS symbols in the header files). |
| d. NeXTSTEP and IRIX, and possibly others, support hardware flow |
| control, but do not furnish an API to control it, and thus on |
| these systems Kermit has no command to select it -- instead, a |
| special device name must be used. (NeXTSTEP: /dev/cufa instead of |
| /dev/cua; IRIX: /dev/ttyf00) |
| |
| See the routine tthflow() in [277]ckutio.c for details. If you find |
| that your system offers hardware flow control selection under program |
| control, you can add this capability to C-Kermit as follows: |
| |
| a. See if it agrees with one of the methods already used in |
| tthflow(). if not, add new code, appropriately #ifdef'd. |
| b. Add -DCK_RTSCTS to the compiler CFLAGS in your makefile target or |
| define this symbol within the appropriate #ifdefs in |
| [278]ckcdeb.h. |
| |
| To illustrate the difficulties with RTS/CTS, here is a tale from Jamie |
| Watson <jw@adasoft.ch>, who added the RTS/CTS code for the RS/6000, |
| about his attempts to do the same for DEC ULTRIX: |
| |
| "The number and type of hardware signals available to/from a serial |
| port vary between different machines and different types of serial |
| interfaces on each machine. This means that, for example, there are |
| virtually no hardware signals in or out available on the DECsystem |
| 3000/3100 series; on the DECsystem 5000/2xx series all modem |
| signals in/out are present on both built-in serial ports; on the |
| DECsystem 5100 some ports have all signals and some only have some; |
| and so on... It looks to me as if this pretty well rules out any |
| attempt to use hardware flow control on these platforms, even if we |
| could figure out how to do it. The confusion on the user level |
| about whether or not it should work for any given platform or port |
| would be tremendous. And then it isn't clear how to use the |
| hardware signals even in the cases where the device supports them." |
| ________________________________________________________________________ |
| |
| 9.5. Terminal Speeds |
| |
| [ [279]Top ] [ [280]Contents ] [ [281]Section Contents ] [ [282]Next ] |
| [ [283]Previous ] |
| |
| The allowable speeds for the SET SPEED command are defined in |
| [284]ckcdeb.h. If your system supports speeds that are not listed in |
| "set speed ?", you can add definitions for them to ckcdeb.h. |
| |
| Then if the speed you are adding is one that was never used before in |
| Kermit, such as 921600, you'll also need to add the appropriate |
| keywords to spdtab[] in [285]ckuus3.c, and the corresponding case to |
| ttsspd() in [286]ckutio.c. |
| ________________________________________________________________________ |
| |
| 9.6. Millisecond Sleeps |
| |
| [ [287]Top ] [ [288]Contents ] [ [289]Section Contents ] [ [290]Next ] |
| [ [291]Previous ] |
| |
| There is no standard for millisecond sleeps, but at least five |
| different functions have appeared in various Unix versions that can be |
| used for this purpose: nap() (mostly in System V), usleep() (found at |
| least in SunOS and NeXT OS), select() (found in 4.2BSD and later, and |
| part of any TCP/IP sockets library), nanosleep(), and sginap(). If you |
| have any of these available, pick one (in this order of preference, if |
| you have more than one): |
| |
| -DSELECT: Include this in CFLAGS if your system has the select() function. |
| -DNAP: Include this in CFLAGS if your system has the nap() function. |
| -USLEEP: Include this in CFLAGS if your system has the usleep() function. |
| |
| NOTE: The nap() function is assumed to be a function that puts the |
| process to sleep for the given number of milliseconds. If your |
| system's nap() function does something else or uses some other units |
| of time (like the NCR Tower 32, which uses clock-ticks), do not |
| include -DNAP. |
| |
| Reportedly, all versions of System V R4 for Intel-based computers, and |
| possibly also SVR3.2, include nap() as a kernel call, but it's not in |
| the library. To include code to use it via syscall(3112,x), without |
| having to include Xenix compatibility features, include the following |
| compile-time option: |
| |
| -DNAPHACK |
| ________________________________________________________________________ |
| |
| 9.7. Nondestructive Input Buffer Peeking |
| |
| [ [292]Top ] [ [293]Contents ] [ [294]Section Contents ] [ [295]Next ] |
| [ [296]Previous ] |
| |
| Some AT&T Unix versions have no way to check if input is waiting on a |
| tty device, but this is a very important feature for Kermit. Without |
| it, sliding windows might not work very well (or at all), and you also |
| have to type your escape character to get Kermit's attention in order |
| to interrupt a local-mode file transfer. If your system offers an |
| FIONREAD ioctl, the build procedure should pick that up automatically |
| and use it, which is ideal. |
| |
| If your system lacks FIONREAD but has a select() function, this can be |
| used instead. If the build procedure fails to include it (SHOW |
| FEATURES will list SELECT), then you can add it to your CFLAGS: |
| |
| -DSELECT |
| |
| Conversely, if the build procedure tries to use select() when it |
| really is not there, add: |
| |
| -DNOSELECT |
| |
| Note: select() is not part of System V nor of POSIX, but it has been |
| added to various System-V- and POSIX-based systems as an extension. |
| |
| Some System-V variations (SCO Xenix/UNIX/ODT and DIAB DNIX) include a |
| rdchk() function that can be used for buffer peeking. It returns 0 if |
| no characters are waiting and 1 if characters are waiting (but unlike |
| FIONREAD, it does not tell the actual number). If your system has |
| rdchk(), add: |
| |
| -DRDCHK: Include this in CFLAGS if your system has the rdchk() function. |
| |
| Otherwise, if your version of Unix has the poll() function (and the |
| /usr/include/poll.h file) -- which appears to be a standard part of |
| System V going back to at least SVR3, include: |
| |
| -DCK_POLL |
| ________________________________________________________________________ |
| |
| 9.8. Other System-Dependent Features |
| |
| [ [297]Top ] [ [298]Contents ] [ [299]Section Contents ] [ [300]Next ] |
| [ [301]Previous ] |
| |
| Systems with <termios.h> might have the symbol IEXTEN defined. This is |
| used to turn "extended features" in the tty device driver on and off, |
| such as Ctrl-O to toggle output flushing, Ctrl-V to quote input |
| characters, etc. |
| |
| In most Unix implementations, it should be turned off during Kermit |
| operation, so if [302]ckutio.c finds this symbol, it uses it. This is |
| necessary, at least, on BSDI. On some systems, however, IEXTEN is |
| either misdefined or misimplemented. The symptom is that CR, when |
| typed to the command processor, is echoed as LF, rather than CRLF. |
| This happens (at least) on Convex/OS 9.1. The solution is to add the |
| following symbol to the makefile target's CFLACS: |
| |
| -DNOIEXTEN |
| |
| However, in at least one Unix implementation, QNX 4.21, IEXTEN must be |
| set before hardware flow control can be used. |
| |
| In edits 177 and earlier, workstation users noticed a "slow screen |
| writing" phenomenon during interactive command parsing. This was |
| traced to a setbuf() call in [303]ckutio.c that made console (stdout) |
| writes unbuffered. This setbuf() call has been there forever, and |
| could not be removed without some risk. Kermit's operation was tested |
| on the NeXT in edit 178 with the setbuf() call removed, and the |
| slow-writing symptom was cured, and everything else (command parsing, |
| proper wakeup on ?, ESC, Ctrl-U, and other editing characters, |
| terminal emulation, remote-mode and local-mode file transfer, etc) |
| seemed to work as well as or better than before. In subsequent edits, |
| this change was made to many other versions too, with no apparent ill |
| effects. To remove the setbuf() call for your version of Kermit, add: |
| |
| -DNOSETBUF |
| |
| Later reports indicate that adding -DNOSETBUF has other beneficial |
| effects, like cutting down on swapping when Kermit is run on |
| workstations with small memories. But BEWARE: on certain small Unix |
| systems, notably the AT&T 6300 and 3B1 (the very same ones that |
| benefit from NOSETBUF), NOSETBUF seems to conflict with CK_CURSES. The |
| program builds and runs OK, but after once using the curses display, |
| echoing is messed up. In this case, we use a System-V specific |
| variation in the curses code, using newterm() to prevent System V from |
| altering the buffering. See makefile entries for AT&T 6300 and 3B1. |
| |
| The Unix version of C-Kermit includes code to switch to file |
| descriptor zero (stdin) for remote-mode file transfer. This code is |
| necessary to prevent Kermit from giving the impression that it is |
| "idle" during file transfers, which, at some sites, can result in the |
| job being logged out in the middle of an active file transfer by |
| idle-job monitors. |
| |
| However, this feature can interfere with certain setups; for example, |
| there is a package which substitutes a pty/tty pair for /dev/tty and |
| sets file descriptor 0 to be read-only, preventing Kermit from sending |
| packets. Or... When a Unix shell is invoked under the PICK |
| environment, file descriptor 0 is inoperative. |
| |
| To remove this feature and allow Kermit to work in such environments, |
| add the compile-time option: |
| |
| -DNOFDZERO |
| |
| On some versions of Unix, earlier releases of C-Kermit were reported |
| to render a tty device unusable after a hangup operation. Examples |
| include IBM AIX on the RT PC and RS/6000. A typical symptom of this |
| phenomenon is that the DIAL command doesn't work, but CONNECTing to |
| the device and dialing manually do work. A further test is to SET DIAL |
| HANGUP OFF, which should make dialing work once by skipping the |
| pre-dial hangup. However, after the connection is broken, it can't be |
| used any more: subsequent attempts to DIAL the same device don't work. |
| The cure is usually to close and reopen the device as part of the |
| hangup operation. To do this, include the following compile-time |
| option: |
| |
| -DCLSOPN |
| |
| Similarly, there is a section of code in ttopen(), which does another |
| close(open()) to force the O_NDELAY mode change. On some systems, the |
| close(open()) is required to make the mode change take effect, and |
| apparently on most others it does no harm. But reportedly on at least |
| one System V R4 implementation, and on SCO Xenix 3.2, the |
| close(open()) operation hangs if the device lacks carrier, EVEN THOUGH |
| the CLOCAL characteristic has just been set to avoid this very |
| problem. If this happens to you, add this to your CFLAGS: |
| |
| -DNOCOTFMC |
| |
| or, equivalently, in your KFLAGS on the make command line. It stands |
| for NO Close(Open()) To Force Mode Change. |
| |
| C-Kermit renames files when you give a RENAME command and also |
| according to the current SET FILE COLLISION option when receiving |
| files. The normal Unix way to rename a file is via two system calls: |
| link() and unlink(). But this leaves open a window of vulnerability. |
| Some Unix systems also offer an atomic rename(oldname,newname) |
| function. If your version of Unix has this function, add the following |
| to your CFLAGS: |
| |
| -DRENAME |
| |
| C-Kermit predefines the RENAME for several Unix versions in |
| [304]ckcdeb.h (SVR4, SUNOS41, BSD44, AIXRS, etc). You can tell if |
| rename() is being used if the SHOW FEATURES command includes RENAME in |
| the compiler options list. If the predefined RENAME symbol causes |
| trouble, then add NORENAME to your CFLAGS. Trouble includes: |
| |
| a. Linker complains that _rename is an unresolved symbol. |
| b. Linking works, but Kermit's RENAME command doesn't work (which |
| happens because older versions of rename() might have their |
| arguments reversed). |
| |
| If rename() is not used, then Kermit uses link()/unlink(), which is |
| equivalent except it is not atomic: there is a tiny interval in which |
| some other process might "do something" to one of the files or links. |
| |
| Some Unix systems (Olivetti X/OS, Amdahl UTS/V, ICL SVR3, etc) define |
| the S_ISREG and S_ISDIR macros incorrectly. This is compensated for |
| automatically in [305]ckufio.c. Other systems might have this same |
| problem. If you get a compile-time error message regarding S_ISREG |
| and/or S_ISDIR, add the following to your CFLAGS: |
| |
| -DISDIRBUG |
| |
| Finally, here's a symbol you should NEVER define: |
| |
| -DCOMMENT |
| |
| It's used for commenting out blocks of code. If for some reason you |
| find that your compiler has COMMENT defined, then add -UCOMMENT to |
| CFLAGS or KFLAGS! Similarly, some header files have been known to |
| define COMMENT, in which case you must add "#undef COMMENT" to each |
| C-Kermit source module, after all the #includes. |
| ________________________________________________________________________ |
| |
| 9.9. Terminal Interruption |
| |
| [ [306]Top ] [ [307]Contents ] [ [308]Section Contents ] [ [309]Next ] |
| [ [310]Previous ] |
| |
| When C-Kermit enters interactive command mode, it sets a Control-C |
| (terminal keyboard interrupt = SIGINT) trap to allow it to return to |
| the command prompt whenever the user types Control-C (or whatever is |
| assigned to be the interrupt character). This is implemented using |
| setjmp() and longjmp(). On some systems, depending on the machine |
| architecture and C compiler and who knows what else, you might get |
| "Memory fault (coredump)" or "longjmp botch" instead of the desired |
| effect (this should not happen in 5A(190) and later). In that case, |
| add -DNOCCTRAP to your CFLAGS and rebuild the program. |
| |
| Job control -- the ability to "suspend" C-Kermit on a Unix system by |
| typing the "susp" character (normally Ctrl-Z) and then resume |
| execution later (with the "fg" command) -- is a tricky business. |
| C-Kermit must trap suspend signals so it can put the terminal back |
| into normal mode when you suspend it (Kermit puts the terminal into |
| various strange modes during interactive command parsing, CONNECT, and |
| file transfer). Supporting code is compiled into C-Kermit |
| automatically if <signal.h> includes a definition for the SIGTSTP |
| signal. HOWEVER... some systems define this signal without supporting |
| job control correctly. You can build Kermit to ignore SIGTSTP signals |
| by including the -DNOJC option in CFLAGS. (You can also do this at |
| runtime by giving the command SET SUSPEND OFF.) |
| |
| NOTE: As of version 5A(190), C-Kermit makes another safety check. |
| Even if job control is available in the operating system (according |
| to the numerous checks made in congm()), it will still disable the |
| catching of SIGTSTP signals if SIGTSTP was set to SIG_IGN at the |
| time C-Kermit was started. |
| |
| System V R3 and earlier systems normally do not support job control. |
| If you have an SVR3 system that does, include the following option in |
| your CFLAGS: |
| |
| -DSVR3JC |
| |
| On systems that correctly implement POSIX signal handling, signals can |
| be handled more reliably than in Bell, Berkeley, or AT&T Unixes. On |
| systems (such as QNX) that are "strictly POSIX", POSIX signal handling |
| *must* be used, otherwise no signal will work more than once. If you |
| have POSIX-based system and you find that your version of Kermit |
| responds to Ctrl-C (SIGINT) or Ctrl-Z (SIGTSTP) only once, then you |
| should add the following option to your CFLAGS: |
| |
| -DCK_POSIX_SIG |
| |
| But be careful; some POSIX implementations, notably 4.4BSD, include |
| POSIX signal handling symbols and functions as "stubs" only, which do |
| nothing. Look in <signal.h> for sigsetjmp and siglongjmp and read the |
| comments. |
| __________________________________________________________________________ |
| |
| 10. DIALING OUT AND COORDINATING WITH UUCP |
| |
| [ [311]Top ] [ [312]Contents ] [ [313]Next ] [ [314]Previous ] |
| |
| NOTE: Red Hat Linux 7.2 and later include a new API that allows |
| serial-port arbitration by non-setuid/gid programs. This API has |
| not yet been added to C-Kermit. If C-Kermit is to be used for |
| dialing out on Red Hat 7.2 or later, it must still be installed as |
| described in this section and the next. |
| |
| The short version: |
| |
| In order for C-Kermit to be able to dial out from your Unix |
| computer, you need to give it the same owner, group, and |
| permissions as your other dialout programs, such as cu, tip, |
| minicom, uucp, seyon, etc. |
| |
| The long version: |
| |
| Make sure your dialout line is correctly configured for dialing out |
| (as opposed to login). The method for doing this is different for each |
| kind of Unix. Consult your system documentation for configuring lines |
| for dialing out (for example, Sun SPARCstation IPC users should read |
| the section "Setting up Modem Software" in the Desktop SPARC Sun |
| System and Network Manager's Guide, or the Terminals and Modems |
| section of the HP manual, "Configuring HP-UX for Peripherals" (e.g. |
| /usr/sbin/sam => Peripheral Devices => Terminals and Modems => Add |
| Modem). |
| |
| Unlike most other multiuser, multitasking operating systems, Unix |
| allows multiple users to access the same serial device at the same |
| time, even though there is no earthly reason why two users should do |
| this. When they do, user A will read some of the incoming characters, |
| and user B will read the others. In all likelihood, neither user will |
| see them all. Furthermore, User B can hang up User A's call, etc. |
| |
| Rather than change Unix to enforce exclusive access to serial devices |
| such as ttys, Unix developers chose instead to use a "lock file". Any |
| process that wants to open a tty device should first check to see if a |
| file of a certain name exists, and if so, not to open the device. If |
| the file does not exist, the process creates the file and then opens |
| the device. When the process closes the device, it destroys the |
| lockfile. This procedure was originated for use with Unix's UUCP, CU, |
| and TIP programs, and so these lockfiles are commonly called "UUCP |
| lockfiles" (UUCP = Unix-to-Unix Copy Program). |
| |
| As you can imagine, this method is riddled with pitfalls: |
| |
| * If a process does not observe the prevailing lockfile convention, |
| then it can interfere with other "polite" processes. And in fact, |
| very few Unix applications or commands handle lockfiles at all; an |
| original design goal of Unix was that "everything is a file", and |
| countless utilities operate on files directly (by opening them) or |
| indirectly through redirection of standard i/o, without creating |
| or looking for lockfiles. |
| * If a process crashes while it has the device open, the lockfile is |
| left behind, preventing further processes from using the device. |
| * Various versions of Unix use different names for the lockfiles, |
| put them in different directories, with different owners and |
| groups and permissions, and specify their contents differently. |
| * On a given platform, the lockfile conventions may change from one |
| Unix release to the next (for example, SunOS 4.0 to 4.1) or, in |
| the case of Linux, across different distributions. |
| * The same tty device might have more than one name, and most |
| lockfile conventions don't allow for this. Similarly for symbolic |
| links. |
| |
| In an attempt to address the problem of "stale" lockfiles, most UUCP |
| implementations put the PID (Process ID) of the creating process in |
| the lockfile. Thus, another process that wants to open the |
| corresponding device can check not only for the lockfile itself, but |
| also can check the PID for validity. But this doesn't work well |
| either: |
| |
| * PIDs are stored in diverse formats that change with every new |
| release (short, integer, long, or string in any of various |
| formats). If the reading program does not follow the same |
| convention as the writing program, it can diagnose a valid PID to |
| be invalid, and therefore not honor the lock. |
| * PIDs recycle. If the lockfile was created by PID 1234, which later |
| crashed without removing the lockfile, and then a new process 1234 |
| exists a the time the lockfile is checked, the lockfile will be |
| improperly taken as valid, and access to the device denied |
| unnecessarily. |
| |
| Several techniques address the problem of multiple names for the same |
| device: |
| |
| * Multiple lockfiles. For example, if the user opens a device |
| through a symlink, a lockfile is created for both the symlink name |
| and the true name (obtained from readlink()). However, when |
| multiple drivers are installed for the same device (e.g. /dev/cua, |
| /dev/cufa, etc), this approach won't work unless all applications |
| *know* all the different names for the same device and make |
| lockfiles for all of them, which is obviously not practical. |
| * Lockfiles whose names are not based on the device name. These |
| lockfiles generally have names like LK.inode/major/minor, where |
| inode, major, and minor are numbers, which will always be the same |
| for any physical device, no matter what its name. This form of |
| lockfile is used in System V R4 and its derivatives, such as |
| Solaris, UnixWare, etc. If lockfiles must be used (as opposed to, |
| say, kernel-based locks), this would seem to be the most effective |
| form. |
| |
| Most versions of Unix were not designed to accommodate third-party |
| communications software; thus vendors of these Unix products feel no |
| compunction about changing lockfile conventions from release to |
| release, since they also change their versions of the cu, uucp, tip, |
| etc, programs at the same time to match. And since the source code to |
| these programs might not be published, it is difficult for makers of |
| third-party products like C-Kermit to find out what the new |
| conventions are. It also forces release of new versions of C-Kermit |
| whenever the OS vendor makes a change like this. |
| |
| Some Unix vendors have taken a small step to simplify communications |
| application development for their products: the inclusion of lockfile |
| routines in the standard system C runtime libraries to shield the |
| application from the details of lockfile management (IBM AIX is an |
| example). When such routines are used, communications applications do |
| not need modification when lockfile conventions change (although they |
| will need recompiling if the routines are statically linked into the |
| application). In the AIX example, the simple function calls ttylock(), |
| ttyunlock(), and ttylocked() replace hundreds of lines of ugly code in |
| C-Kermit that attempts to keep pace with every release of every Unix |
| product over the last 20 years. Inclusion of ttylock() code occurs |
| when: |
| |
| -DUSETTYLOCK |
| |
| is included in the CFLAGS. |
| |
| If such routines are available, they should be used. The rest of this |
| section applies when they are not. |
| |
| To fit in with UUCP and other Unix-based communication software, |
| C-Kermit must have the same idea as your system's uucp, cu, and tip |
| programs about what the UUCP lock directory is called, what the |
| lockfile itself is called, and what its contents should be. In most |
| cases, C-Kermit preprocessor flags create the appropriate |
| configuration at compile time if the appropriate makefile target was |
| used (see [315]ckutio.c). The following CFLAGS options can be used to |
| override the built-in configuration: |
| |
| -DLCKDIR |
| Tells Kermit that the UUCP lock directory is |
| /usr/spool/uucp/LCK. |
| |
| -DACUCNTRL |
| Tells Kermit to use the BSD 4.3 acucntrl() program to turn off |
| getty (login) on the line before using it, and restore getty |
| when done. |
| |
| -DHDBUUCP |
| Include this if your system uses Honey DanBer UUCP, in which |
| the lockfile directory and format are relatively standardized. |
| |
| -DLOCK_DIR=\\\"/xxx/yyy\\\" |
| Gives the lock directory name explicitly. The triple quoting is |
| necessary. For example: |
| |
| CFLAGS= -DBSD4 -DLOCK_DIR=\\\"/usr/local/locks\\\" -DNODEBUG |
| |
| (NOTE: The triple quoting assumes this is a "top-level" make |
| entry, and not a make entry that calls another one.) |
| |
| -DLFDEVNO The lockfile name uses the tty device inode and major and |
| minor |
| numbers: LK.dev.maj.min, as in Sys V R4, e.g. LK.035.044.008. |
| |
| When the LK.inode.major.minor form is used, a single lockfile is |
| enough. Otherwise, a single lockfile rarely suffices. For example, in |
| Linux, it is common to have a /dev/modem symbolic link to an actual |
| dialout device, like /dev/cua0 or /dev/ttyS0, whose purpose is to hide |
| the details of the actual driver from the user. So if one user opens |
| /dev/modem, a lockfile called LCK..modem is created, which does not |
| prevent another user from simulataneously opening the same device by |
| its real name. |
| |
| On SCO Unix platforms, we have a slightly different problem: the same |
| device is, by convention, known by "lowercase" and "uppercase" names, |
| depending on whether it has modem control. So by convention, |
| communications programs are supposed to create the lockfiles based on |
| the lowercase name. But some programs don't follow this convention. In |
| HP-UX, we have several different names for each serial device. And so |
| on. |
| |
| For this reason, on platforms where the LK.inode.major.minor form is |
| not used, C-Kermit also creates a secondary lockfile (which is simply |
| a link to the first) if: |
| |
| a. The given device name is a symbolic link. The secondary link is |
| based on the device's real name. |
| b. On SCO: The device name is not a symbolic link, but it contains |
| uppercase letters. The primary link is based on the lowercase |
| name; the secondary link is based on the name that was given. |
| c. On HP-UX: The device name starts with "cu". The primary link is |
| based on the name that was given; the secondary link is based on |
| the corresponding "ttyd" device, e.g. "LCK..cua0p0" and |
| "LCK..ttyd0p0". |
| |
| NOTE: symlinks are not handled in HP-UX. |
| |
| Honey DanBer (HDB) UUCP, which is becoming increasingly popular, has |
| two characteristics: |
| |
| a. Lockfiles are kept in /usr/spool/locks/ (usually). |
| b. A lockfile contains the process id (pid) in ASCII, rather than as |
| an int. |
| |
| Non-HDB selections assume the lockfile contains the pid in int form |
| (or, more precisely, in PID_T form, where PID_T is either int or |
| pid_t, depending on your system's C library and header files). (b), by |
| the way, is subject to interpretation: the numeric ASCII string may or |
| may not be terminated by a newline, it may or may not have leading |
| spaces (or zeros), and the number of leading spaces or zeros can |
| differ, and the differences can be significant. |
| |
| Even if you build the program with the right lockfile option, you can |
| still have problems when you try to open the device. Here are the |
| error messages you can get from SET LINE, and what they mean: |
| |
| a. "Timed out, no carrier." This one is not related to lockfiles. It |
| means that you have SET CARRIER ON xx, where xx is the number of |
| seconds to wait for carrier, and carrier did not appear within xx |
| seconds. Solution: SET CARRIER AUTO or OFF. |
| b. "Sorry, access to lock denied." Kermit has been configured to use |
| lockfiles, but (a)the lockfile directory is write-protected |
| against you, or (b) it does not exist. The "access to lock denied" |
| message will tell you the reason. If the directory does not exist, |
| check to make sure Kermit is using the right name. Just because |
| version n of your Unix used a certain lockfile directory is no |
| gurantee that version n.1 does not use a different one. |
| Workaround: ask the system administrator to install a symbolic |
| link from the old name to the new name. Other solutions: (see |
| below) |
| c. "Sorry, access to tty device denied." The tty device that you |
| specified in your SET LINE command is read/write protected against |
| you. Solution: (see below) |
| d. "Sorry, device is in use." The tty device you have specified is |
| currently being used by another user. A prefatory message gives |
| you an "ls -l" listing of the lockfile, which should show the |
| username of the person who created it, plus a message "pid = nnn" |
| to show you the process id of the user's program. Solutions: try |
| another device, wait until the other user is finished, ask the |
| other user to hurry up, or ask the system manager for help. |
| e. "Sorry, can't open connection: reason". The device cannot be |
| opened for some other reason, which is listed. |
| f. "sh: /usr/lib/uucp/acucntrl: not found". This means your Kermit |
| program was built with the -DACUCNTRL switch, but your computer |
| system does not have the BSD 4.3 acucntrl program. Solution: |
| install the acucntrl program if you have it, or rebuild Kermit |
| without the -DACUCNTRL switch. |
| |
| There are two solutions for problems (b) and (c), both of which |
| involve intervention by your Unix system administrator (superuser): |
| |
| a. Have the superuser change the permission of the lockfile directory |
| and to the tty devices so that everyone on the system has |
| read/write permission. |
| |
| su% chmod 777 /usr/spool/locks (or whatever the path is) |
| su% chmod 666 /dev/ttyXX |
| |
| One risk here is that people can write lots of junk into the |
| lockfile directory, delete other people's files in the lockfile |
| directory, and intercept other people's data as it goes in and out |
| of the tty device. The major danger here would be intercepting a |
| privileged password. Of course, any user could write a short, |
| ordinary, unprivileged program to do exactly the same thing if the |
| tty device was world read/writeable. The other risk as that |
| telephone calls are not controlled -- anybody on your system can |
| make them, without having to belong to any particular group, and |
| this could run up your phone bill. |
| b. Use groups to regulate access. Normally the lockfile directory and |
| and the dialout devices will have the same group (such as uucp). |
| If so, then put everybody who's allowed to dial out into that |
| group, and make sure that the lockfile directory and the tty |
| devices have group read AND write permission. Example: |
| |
| su% chmod 770 /usr/spool/locks (or whatever the path is) |
| su% chmod 660 /dev/ttyXX |
| |
| User whatever tool is available on your platform to add users to |
| the appropropriate group (e.g. edit the /etc/group file). |
| c. Have the superuser change Kermit to run setuid and/or setgid to |
| the owner and/or group of the lockfile directory and the tty |
| devices if necessary), typically uucp (see [316]next section), but |
| NOT root. Example: |
| |
| su% chown uucp kermit - or - chgrp uucp kermit |
| su% chmod u+s kermit (setuid) - or - chmod g+s kermit (setgid) |
| |
| and then make sure the lockfile directory, and the tty devices, |
| have owner (setuid) and/or group (setgid) write permission. For |
| example: |
| |
| su% chmod o+rwx /usr/spool/uucp |
| su% chown uucp /dev/ttyXX ; chmod 600 /dev/ttyXX |
| |
| In some cases, the owner and group must be distinct; the key point |
| is that read/write access is required to both the UUCP lockfile |
| directory and the tty itself. |
| |
| If you make C-Kermit setuid or setgid to root, it refuses to run: |
| |
| Fatal: C-Kermit setuid to root! |
| |
| Example: |
| |
| crw-r----- 1 uucp uucp 5, 67 Feb 11 06:23 /dev/cua3 |
| drwxrwxr-x 3 root uucp 1024 Feb 11 06:22 /var/lock |
| |
| requires suid uucp to get read/write access on /dev/cua3 and sgid to |
| get read/write access on /var/lock (since you can't set Kermit's uid |
| or gid to root). |
| |
| The reason Kermit can't be setuid or setgid to root has to do with |
| the fact that some Unix OS's can't switch user or group IDs in that |
| case. Unfortunately, the prohibition against making Kermit setuid |
| or setgid to root means that Unix C-Kermit can't be used to make |
| rlogin connections by non-root users. (The rlogin port is |
| privileged, which is why the regular rlogin command is setuid root |
| -- which is safe because the rlogin program never has to create or |
| access files like Kermit does.) |
| |
| For the lockfile mechanism to achieve its desired purpose -- |
| prevention of access to the same tty device by more than one process |
| at a time -- ALL programs on a given computer that open, read or |
| write, and close tty devices must use the SAME lockfile conventions. |
| Unfortunately, this is often not the case. Here is a typical example |
| of how this can go wrong: In SunOS 4.0 and earler, the lockfile |
| directory was /usr/spool/uucp; in 4.1 it was changed to |
| /var/spool/locks in the quest for political correctness. Consequently, |
| any third-party programs (such as C-Kermit) that were not modified to |
| account for this change, recompiled, and reinstalled, did not use the |
| same lockfiles as uucp, tip, etc, and so the entire purpose of the |
| lockfile is defeated. |
| |
| What if your Unix system does not have UUCP installed? For example, |
| you have a Unix workstation, and you do not use uucp, cu, or tip, or |
| UUCP was not even supplied with your version of Unix (QNX is an |
| example). In this case, you have two choices: |
| |
| a. If there may be more than one person running Kermit at the same |
| time, competing for the same tty device, then create a special |
| lockfile directory just for Kermit, for example, |
| /usr/spool/kermit, and make sure you have read/write access to it. |
| Then add the following to your makefile target CFLAGS, as shown |
| earlier: |
| |
| -DLOCK_DIR=\\\"/usr/spool/kermit\\\" |
| |
| b. If you are the only user on your workstation, and no other |
| processes will ever be competing with Kermit for the dialout tty |
| device, then add -DNOUUCP to your makefile target's CFLAGS and |
| rebuild Kermit. |
| __________________________________________________________________________ |
| |
| 11. RUNNING UNIX C-KERMIT SETUID OR SETGID |
| |
| [ [317]Top ] [ [318]Contents ] [ [319]Next ] [ [320]Previous ] |
| |
| Even if you don't intend to run C-Kermit setuid, somebody else might |
| come along and chown and chmod it after it has been built. You should |
| be sure that it is built correctly to run setuid on your system. For |
| POSIX and AT&T Unix based versions, you don't have to do anything |
| special. |
| |
| For 4.2 and 4.3 BSD-based Unix versions, you normally need not add |
| anything special to the makefile. The program assumes that the |
| setreuid() and setregid() functions are available, without which we |
| cannot switch back and forth between real and effective uids. If |
| "make" complains that _setreuid or _setregid is/are not defined, add |
| -DNOSETREU to CFLAGS. In this case it is very likely (but not certain) |
| that you cannot protect ttys and lockfiles against people and have |
| them run Kermit setuid. |
| |
| If make does not complain about this, you should find out whether your |
| BSD version (4.3 or other systems like SunOS 4.x that claim to include |
| BSD 4.3 compatibility) includes the saved-setuid feature (see long |
| notes under edit 146 in ckc178.upd). If it does, then add -DSAVEDUID |
| to CFLAGS. |
| |
| IMPORTANT NOTE: Most Unix system documentation will not give you |
| the required information. To determine whether your Unix system |
| supplies the the saved-original-effective-user/group-id feature, |
| use the ckuuid.c program. Read and follow the instructions in the |
| comments at the beginning. |
| |
| C-Kermit for 4.4BSD-based systems automatically use sete[ug]id(). See |
| [321]ckutio.c. |
| |
| If you have a version of Unix that is not BSD-based, but which |
| supplies the setreuid() and setregid() functions, and these are the |
| only way to switch between real and effective uid, add -DSETREUID to |
| your makefile target. |
| |
| WARNING: There are two calls to access() in [322]ckufio.c, by which |
| Kermit checks to see if it can create an output file. These calls |
| will not work correctly when (a)you have installed C-Kermit setuid |
| or setgid on a BSD-based Unix system, and (b) the |
| saved-original-effective-uid/gid feature is not present, and (c) |
| the access() function always checks what it believes to be the real |
| ID rather than the effective ID. This is the case, for example, in |
| Olivetti X/OS and in NeXTSTEP. In such cases, you can force correct |
| operation of access() calls by defining the symbol SW_ACC_ID at |
| compile time in CFLAGS. |
| |
| If you have a version of Unix that does not allow a process to switch |
| back and forth between its effective and real user and group ids |
| multiple times, you probably should not attempt to run Kermit setuid, |
| because once having given up its effective uid or gid (which it must |
| do in order to transfer files, fork a shell, etc) it can never get it |
| back, and so it can not use the original effective uid or gid to |
| create or delete uucp lockfiles. In this case, you'll either have to |
| set the permissions on your lockfile directory to make them publicly |
| read/writable, or dispense with locking altogether. |
| |
| MORAL: Are you thoroughly sickened and/or frightened by all that you |
| have just read? You should be. What is the real answer? Simple. Serial |
| devices -- such as ttys and magnetic tapes -- in Unix should be opened |
| with exclusive access only, enforced by the Unix kernel. Shared access |
| has no conceivable purpose, legitimate or otherwise, except by |
| privileged system programs such as getty. The original design dates |
| from the late 1960s, when Unix was developed for laboratory use under |
| a philosophy of trust by people within shouting distance of each other |
| -- but even then, no useful purpose was served by this particular form |
| of openness; it was probably more of a political statement. Since the |
| emergence of Unix from the laboratory into the commercial market, we |
| have seen every vestige of openness -- but this one -- stripped away. |
| I'd like to see some influential Unix maker take the bold step of |
| making the simple kernel change required to enforce exclusive access |
| to serial devices. (Well, perhaps not so simple when bidirectionality |
| must also be a goal -- but then other OS's like VMS solved this |
| problem decades ago.) |
| __________________________________________________________________________ |
| |
| 12. CONFIGURING UNIX WORKSTATIONS |
| |
| [ [323]Top ] [ [324]Contents ] [ [325]Next ] [ [326]Previous ] |
| |
| On desktop workstations that are used by only the user at the console |
| keyboard, C-Kermit is always used in local mode. But as delivered, |
| C-Kermit runs in remote mode by default. To put it in local mode at |
| startup, you can put a SET LINE command in your .mykermrc. |
| |
| You can also build C-Kermit to start up in local mode by default. To |
| do this, include the following in the CFLAGS in your makefile target: |
| |
| -DDFTTY=\\\"/dev/ttyxx\\\" |
| |
| where ttyxx is the name of the device you will be using for |
| communications. Presently there is no way of setting the default modem |
| type at compile time, so use this option only for direct lines. |
| |
| C-Kermit does not work well on certain workstations if it is not run |
| from within a terminal window. For example, you cannot start C-Kermit |
| on a NeXT by launching it directly from NeXTstep. Similarly for Sun |
| workstations in the Open Windows environment. Run Kermit in a terminal |
| window. |
| __________________________________________________________________________ |
| |
| 13. BIZARRE BEHAVIOR AT RUNTIME |
| |
| [ [327]Top ] [ [328]Contents ] [ [329]Next ] [ [330]Previous ] |
| |
| See the "beware file", |
| |
| [331]ckubwr.txt, for hints about runtime misbehavior. This section |
| lists some runtime problems that can be cured by rebuilding C-Kermit. |
| |
| The program starts, but there is no prompt, and certain operations |
| don't work (you see error messages like "Kermit command error in |
| background execution"). This is because Kermit thinks it is running in |
| the background. See conbgt() in [332]ckutio.c. Try rebuilding Kermit |
| with: |
| |
| -DPID_T=pid_t |
| |
| added to your CFLAGS. If that doesn't help, find out the actual data |
| type for pids (look in types.h or similar file) and use it in place of |
| "pid_t", for example: |
| |
| -DPID_T=short |
| |
| Unexplainable and inappropriate error messages ("Sockets not supported |
| on this device", etc) have been traced in at least one case to a lack |
| of agreement between the system header files and the actual kernel. |
| This happened because the GNU C compiler (gcc) was being used. gcc |
| wants to have ANSI-C-compliant header files, and so part of the |
| installation procedure for gcc is (or was) to run a shell script |
| called "fixincludes", which translates the system's header files into |
| a separate set of headers that gcc likes. So far so good. Later, a new |
| version of the operating system is installed and nobody remembers to |
| run fixincludes again. From that point, any program compiled with gcc |
| that makes use of header files (particularly ioctl.h) is very likely |
| to misbehave. Solution: run fixincludes again, or use your system's |
| regular C compiler, libraries, and header files instead of gcc. |
| __________________________________________________________________________ |
| |
| 14. CRASHES AND CORE DUMPS |
| |
| [ [333]Top ] [ [334]Contents ] [ [335]Next ] [ [336]Previous ] |
| |
| If C-Kermit constitently dumps core at the beginning of a file |
| transfer, look in SHOW FEATURES for CKREALPATH. If found, rebuild with |
| -DNOREALPATH and see if that fixes the problem (some UNIXes have |
| realpath() but it doesn't work). |
| |
| Total failure of the Kermit program can occur because of bad memory |
| references, bad system calls, or problems with dynamic memory |
| allocation. First, try to reproduce the problem with debugging turned |
| on: run Kermit with the -d command-line option (for example, "wermit |
| -d") and then examine the resulting debug.log file. The last entry |
| should be in the vicinity of the crash. In VMS, a crash automatically |
| produces a "stack dump" which shows the routine where the crash |
| occurs. In some versions of Unix, you can get a stack dump with "adb" |
| -- just type "adb wermit core" and then give the command "$c", then |
| Ctrl-D to quit (note: replace "wermit" by "kermit" or by the full |
| pathname of the executable that crashed if it is not in the current |
| directory). Or use gdb to get a backtrace, etc. |
| |
| In edit 186, one implementation, UNISYS 5000/95 built with "make |
| sys5r3", has been reported to run out of memory very quickly (e.g. |
| while executing a short initialization file that contains a SET DIAL |
| DIRECTORY command). Debug logs show that malloc calls are failing, |
| reason unknown. For this and any other implementation that gives error |
| messages about "malloc failure" or "memory allocation failure", |
| rebuild the program *without* the -DDYNAMIC CFLAGS definition, for |
| example: |
| |
| make sys5r3 KFLAGS=-UDYNAMIC |
| |
| As of edit 169, C-Kermit includes a malloc() debugging package which |
| you may link with the Kermit program to catch runtime malloc errors. |
| See the makefile entries for sunos41md and nextmd for examples of how |
| to select malloc debugging. Once you have linked Kermit with the |
| malloc debugger, it will halt with an informative message if a |
| malloc-related error occurs and, if possible, dump core. For this |
| reason, malloc-debugging versions of Kermit should be built without |
| the "-s" link option (which removes symbols, preventing analysis of |
| the core dump). You have several ways to track down the malloc error: |
| Analyze the core dump with adb. Or reproduce the problem with "log |
| debug" and then look at the code around the last debug.log entry. If |
| you have gcc, build the program with "-g" added to CFLAGS and then |
| debug it with gdb, e.g. |
| |
| gdb wermit |
| break main |
| run |
| .. set other breakpoints or watchpoints |
| continue |
| |
| Watchpoints are especially useful for finding memory leaks, but they |
| make the program run about a thousand times slower than usual, so |
| don't set them until the last possible moment. When a watchpoint is |
| hit, you can use the "where" command to find out which C-Kermit source |
| statement triggered it. |
| |
| If you have the Pure Software Inc "Purify" product, see the sunos41cp |
| makefile entry for an example of how to use it to debug C-Kermit. |
| __________________________________________________________________________ |
| |
| 15. SYSLOGGING |
| |
| [ [337]Top ] [ [338]Contents ] [ [339]Next ] [ [340]Previous ] |
| |
| "Syslogging" means recording selected in the system log via the Unix |
| syslog() facility, which is available in most Unix versions. |
| Syslogging is not done unless C-Kermit is started with: |
| |
| --syslog:n |
| |
| on the command-line, where n is a number greater than 0 to indicate |
| the level of syslogging. See [341]Section 4.2 of the [342]IKSD |
| Administrator's Guide for details. |
| |
| Obviously you can't depend on users to include --syslog:3 (or |
| whatever) on the command line every time they start C-Kermit, so if |
| you want certain kinds of records to be recorded in the system log, |
| you can build C-Kermit with forced syslogging at the desired level, |
| e.g.: |
| |
| make linux KFLAGS=-DSYSLOGLEVEL=2 |
| |
| Levels 2 and 3 are the most likely candidates for this treatment. |
| Level 2 forces logging of all successful dialout calls (e.g. for |
| checking against or phone bills), and level 3 records all connections |
| (SET LINE or SET HOST / TELNET / RLOGIN, etc) so you can see who is |
| connecting out from your system, and to where. |
| |
| Level 2 and 3 records are equivalent to those in the connection log; |
| see the [343]C-Kermit 7.0 Supplement) for a detailed description of |
| the connection log. |
| __________________________________________________________________________ |
| |
| 16. BUILDING SECURE VERSIONS OF C-KERMIT 8.0 |
| |
| [ [344]Top ] [ [345]Contents ] [ [346]Next ] [ [347]Previous ] |
| |
| C-Kermit 7.0 and later may be built with Kerberos(TM) and/or SRP(TM) |
| (Secure Remote Password) and/or SSL/TLS security for strong |
| authentication and encryption of Internet connections. These security |
| methods require external libraries that, in their binary forms, are |
| restricted from export by USA law. See the [348]Kermit Security |
| Reference) for details. C-Kermit binaries themselves are likewise |
| restricted; the C-Kermit binaries that are available for public |
| download on the Internet are not allowed to contain the security |
| options. |
| |
| Sample makefile entries are provided for Linux and many other |
| operating systems. A list of secure makefile entries is included in |
| the Makefile. Complete instructions on building C-Kermit 8.0 with MIT |
| Kerberos; Secure Remote Password; and/or OpenSSL can be found in the |
| [349]Kermit Security Reference. |
| |
| C-Kermit 8.0 comes with a current list of Certificate Authority |
| certificates, including one for the Kermit Project that can be used |
| for authentication to Columbia's [350]Internet Kermit Service (IKSD). |
| You can use C-Kermit 7.0 or later to access Columbia's IKSD securely |
| by installing the Kermit Project certificate in |
| /usr/local/ssl/cert.pem (or the appropriate location based upon the |
| installation of OpenSSL on your system). You can find a copy of the |
| certificates file at: |
| |
| [351]ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem |
| __________________________________________________________________________ |
| |
| 17. INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM |
| |
| [ [352]Top ] [ [353]Contents ] [ [354]Previous ] |
| |
| This requires C-Kermit 8.0.206 or later and an SSH v2 server. If you |
| list C-Kermit as a Subsystem in the SSH v2 server configuration file |
| (as, for example, SFTP is listed), users can make SSH connections |
| direct to a Kermit server as explained here: |
| |
| [355]http://www.columbia.edu/kermit/skermit.html |
| |
| The name and location of the SSH server configuration file depends on |
| your platform, which SSH product(s) you have, etc. C-Kermit itself |
| must be referred to in this file as "kermit-sshsub". On the host, |
| install the C-Kermit 8.0.211 binary in the normal way. Then, in the |
| same directory as the C-Kermit binary, make a symbolic link: |
| |
| ln -s kermit kermit-sshsub |
| |
| (Note: the "make install" makefile target does this for you.) Then in |
| the sshd configuration file, add a line: |
| |
| Subsystem kermit /some/path/kermit-sshsub |
| |
| (where /some/path is the fully specified directory where the symlink |
| is.) This is similar to the line that sets up the SFTP susbsystem. |
| Example: |
| |
| Subsystem sftp /usr/local/libexec/sftp-server |
| Subsystem kermit /usr/local/bin/kermit-sshsub |
| |
| The mechanics might vary for other SSH servers; "man sshd" for |
| details. The method shown here is used because the OpenSSH server does |
| not permit the subsystem invocation to include command-line options. |
| C-Kermit would have no way of knowing that it should enter Server mode |
| if it were not called by a special name. |
| |
| [ [356]Top ] [ [357]Contents ] [ [358]C-Kermit Home ] [ [359]C-Kermit |
| 8.0 Overview ] [ [360]Kermit Home ] |
| _________________________________________________________________ |
| |
| |
| C-Kermit 8.0 Unix Installation Instructions / The Kermit Project / |
| Columbia University / 10 April 2004 |
| |
| References |
| |
| 1. http://www.columbia.edu/kermit/ckuins.html#contents |
| 2. http://www.columbia.edu/kermit/ckermit.html |
| 3. http://www.columbia.edu/kermit/index.html |
| 4. http://www.columbia.edu/kermit/ckuins.html |
| 5. http://www.columbia.edu/kermit/ckuins.html#x0 |
| 6. http://www.columbia.edu/kermit/ckuins.html#x1 |
| 7. http://www.columbia.edu/kermit/ckuins.html#x2 |
| 8. http://www.columbia.edu/kermit/ckuins.html#x3 |
| 9. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 10. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 11. http://www.columbia.edu/kermit/ckuins.html#x6 |
| 12. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 13. http://www.columbia.edu/kermit/ckuins.html#x8 |
| 14. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 15. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 16. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 17. http://www.columbia.edu/kermit/ckuins.html#x12 |
| 18. http://www.columbia.edu/kermit/ckuins.html#x13 |
| 19. http://www.columbia.edu/kermit/ckuins.html#x14 |
| 20. http://www.columbia.edu/kermit/ckuins.html#x15 |
| 21. http://www.columbia.edu/kermit/ckuins.html#x16 |
| 22. http://www.columbia.edu/kermit/ckuins.html#x16 |
| 23. http://www.columbia.edu/kermit/ckuins.html#top |
| 24. http://www.columbia.edu/kermit/ckuins.html#contents |
| 25. http://www.columbia.edu/kermit/ckuins.html#x1 |
| 26. http://www.columbia.edu/kermit/ckccfg.html |
| 27. http://www.columbia.edu/kermit/ckcbwr.html |
| 28. http://www.columbia.edu/kermit/ckubwr.html |
| 29. http://www.columbia.edu/kermit/ckcplm.html |
| 30. http://www.columbia.edu/kermit/ckuins.html#x2 |
| 31. http://www.columbia.edu/kermit/x3 |
| 32. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 33. http://www.columbia.edu/kermit/ckuins.html#top |
| 34. http://www.columbia.edu/kermit/ckuins.html#contents |
| 35. http://www.columbia.edu/kermit/ckuins.html#x2 |
| 36. http://www.columbia.edu/kermit/ckuins.html#x0 |
| 37. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z |
| 38. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz |
| 39. ftp://kermit.columbia.edu/kermit/archives/cku211.tar |
| 40. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 41. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 42. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 43. http://www.columbia.edu/kermit/ckuins.html#x16 |
| 44. http://www.columbia.edu/kermit/ckuins.html#top |
| 45. http://www.columbia.edu/kermit/ckuins.html#contents |
| 46. http://www.columbia.edu/kermit/ckuins.html#x3 |
| 47. http://www.columbia.edu/kermit/ckuins.html#x1 |
| 48. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 49. http://www.columbia.edu/kermit/ckuins.html#X10 |
| 50. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 51. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 52. http://www.columbia.edu/kermit/ckuins.html#x3 |
| 53. http://www.columbia.edu/kermit/ck80packages.html |
| 54. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 55. http://www.columbia.edu/kermit/ckuins.html#top |
| 56. http://www.columbia.edu/kermit/ckuins.html#contents |
| 57. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 58. http://www.columbia.edu/kermit/ckuins.html#x2 |
| 59. ftp://kermit.columbia.edu/kermit/bin/ |
| 60. http://www.columbia.edu/kermit/ck80binaries.html |
| 61. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 62. http://www.columbia.edu/kermit/ckuins.html#build |
| 63. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 64. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 65. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 66. mailto:kermit@columbia.edu |
| 67. http://www.columbia.edu/kermit/ckuins.html#top |
| 68. http://www.columbia.edu/kermit/ckuins.html#contents |
| 69. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 70. http://www.columbia.edu/kermit/ckuins.html#x3 |
| 71. http://www.columbia.edu/kermit/ckuins.html#x8 |
| 72. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 73. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 74. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk |
| 75. ftp://kermit.columbia.edu/kermit/c-kermit/ckubsd.mak |
| 76. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 77. mailto:kermit-support@columbia.edu |
| 78. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 79. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 80. mailto:kermit-support@columbia.edu |
| 81. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 82. http://www.columbia.edu/kermit/ckuins.html#x5.4 |
| 83. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 84. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 85. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 86. http://www.columbia.edu/kermit/iksd.html |
| 87. http://www.columbia.edu/kermit/ckuins.html#top |
| 88. http://www.columbia.edu/kermit/ckuins.html#contents |
| 89. http://www.columbia.edu/kermit/ckuins.html#x4.1 |
| 90. http://www.columbia.edu/kermit/ckccfg.html |
| 91. http://www.columbia.edu/kermit/ckuins.html#x4.1 |
| 92. http://www.columbia.edu/kermit/ckuins.html#x4.2 |
| 93. http://www.columbia.edu/kermit/ckuins.html#x4.3 |
| 94. http://www.columbia.edu/kermit/ckuins.html#x4.4 |
| 95. http://www.columbia.edu/kermit/ckuins.html#x4.5 |
| 96. http://www.columbia.edu/kermit/ckccfg.html |
| 97. http://www.columbia.edu/kermit/ckccfg.html#x8 |
| 98. http://www.columbia.edu/kermit/iksd.html |
| 99. http://www.columbia.edu/kermit/iksd.html |
| 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 102. mailto:kermit-support@columbia.edu |
| 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c |
| 104. http://www.columbia.edu/kermit/ckuins.html#x15 |
| 105. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 106. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 109. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c |
| 110. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c |
| 111. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c |
| 113. mailto:kermit-support@columbia.edu |
| 114. http://www.columbia.edu/kermit/ckuins.html#top |
| 115. http://www.columbia.edu/kermit/ckuins.html#contents |
| 116. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 117. http://www.columbia.edu/kermit/ckuins.html#x4.2 |
| 118. http://www.columbia.edu/kermit/ckuins.html#x4.0 |
| 119. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 120. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt |
| 121. http://www.columbia.edu/kermit/ckubwr.html |
| 122. ftp://kermit.columbia.edu/kermit/c-kermit/ckwart.c |
| 123. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w |
| 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.c |
| 125. http://www.columbia.edu/kermit/ckuins.html#top |
| 126. http://www.columbia.edu/kermit/ckuins.html#contents |
| 127. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 128. http://www.columbia.edu/kermit/ckuins.html#x4.3 |
| 129. http://www.columbia.edu/kermit/ckuins.html#x4.1 |
| 130. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 131. http://www.columbia.edu/kermit/ckuins.html#top |
| 132. http://www.columbia.edu/kermit/ckuins.html#contents |
| 133. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 134. http://www.columbia.edu/kermit/ckuins.html#x4.4 |
| 135. http://www.columbia.edu/kermit/ckuins.html#x4.2 |
| 136. http://www.columbia.edu/kermit/ckuins.html#top |
| 137. http://www.columbia.edu/kermit/ckuins.html#contents |
| 138. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 139. http://www.columbia.edu/kermit/ckuins.html#x4.5 |
| 140. http://www.columbia.edu/kermit/ckuins.html#x4.3 |
| 141. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk |
| 142. http://www.columbia.edu/kermit/ckuins.html#top |
| 143. http://www.columbia.edu/kermit/ckuins.html#contents |
| 144. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 145. http://www.columbia.edu/kermit/ckuins.html#x4.4 |
| 146. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 147. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 148. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w |
| 149. http://www.columbia.edu/kermit/ckuins.html#top |
| 150. http://www.columbia.edu/kermit/ckuins.html#contents |
| 151. http://www.columbia.edu/kermit/ckuins.html#x6 |
| 152. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 153. http://www.columbia.edu/kermit/ckuins.html#x5.1 |
| 154. http://www.columbia.edu/kermit/ckuins.html#x5.2 |
| 155. http://www.columbia.edu/kermit/ckuins.html#x5.3 |
| 156. http://www.columbia.edu/kermit/ckuins.html#x5.4 |
| 157. http://www.columbia.edu/kermit/ |
| 158. http://www.columbia.edu/kermit/ckuins.html#x5.4 |
| 159. http://www.columbia.edu/kermit/ckuins.html#x5.3 |
| 160. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT |
| 161. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit.ini |
| 162. http://www.columbia.edu/kermit/ckuins.html#x5.1 |
| 163. ftp://kermit.columbia.edu/kermit/c-kermit/ckermod.ini |
| 164. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit70.txt |
| 165. http://www.columbia.edu/kermit/ck60manual |
| 166. http://www.columbia.edu/kermit/ckermit70.html |
| 167. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit80.txt |
| 168. http://www.columbia.edu/kermit/ck60manual |
| 169. http://www.columbia.edu/kermit/ckermit80.html |
| 170. ftp://kermit.columbia.edu/kermit/c-kermit/ckcbwr.txt |
| 171. http://www.columbia.edu/kermit/ckcbwr.html |
| 172. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt |
| 173. http://www.columbia.edu/kermit/ckubwr.html |
| 174. ftp://kermit.columbia.edu/kermit/c-kermit/ckuins.txt |
| 175. http://www.columbia.edu/kermit/ckuins.html |
| 176. ftp://kermit.columbia.edu/kermit/c-kermit/ckccfg.txt |
| 177. http://www.columbia.edu/kermit/ckccfg.html |
| 178. ftp://kermit.columbia.edu/kermit/c-kermit/ckcplm.txt |
| 179. http://www.columbia.edu/kermit/ckcplm.html |
| 180. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem |
| 181. http://www.columbia.edu/kermit/ckuins.html#x16" |
| 182. ftp://kermit.columbia.edu/kermit/c-kermit/makefile |
| 183. http://www.columbia.edu/kermit/ckuins.html#x? |
| 184. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 185. http://www.columbia.edu/kermit/ckuins.html#x5.2 |
| 186. http://www.columbia.edu/kermit/ckermit.html#download |
| 187. http://www.columbia.edu/kermit/ck80binaries.html |
| 188. http://www.columbia.edu/kermit/ckermit.html#download |
| 189. http://www.columbia.edu/kermit/ckuins.html#top |
| 190. http://www.columbia.edu/kermit/ckuins.html#contents |
| 191. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 192. http://www.columbia.edu/kermit/ckuins.html#x5 |
| 193. http://www.columbia.edu/kermit/ckuins.html#top |
| 194. http://www.columbia.edu/kermit/ckuins.html#contents |
| 195. http://www.columbia.edu/kermit/ckuins.html#x8 |
| 196. http://www.columbia.edu/kermit/ckuins.html#x6 |
| 197. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 198. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 199. http://www.columbia.edu/kermit/ckuins.html#x4.0 |
| 200. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h |
| 201. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 202. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 203. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 204. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 205. http://www.columbia.edu/kermit/ckccfg.html#x2 |
| 206. http://www.columbia.edu/kermit/ckccfg.html |
| 207. http://www.columbia.edu/kermit/ckuins.html#x4 |
| 208. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 209. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 210. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 211. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 212. http://www.columbia.edu/kermit/ckuins.html#x9.4 |
| 213. mailto:kermit-support@columbia.edu |
| 214. http://www.columbia.edu/kermit/ckuins.html#top |
| 215. http://www.columbia.edu/kermit/ckuins.html#contents |
| 216. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 217. http://www.columbia.edu/kermit/ckuins.html#x7 |
| 218. http://www.columbia.edu/kermit/ckccfg.html |
| 219. http://www.columbia.edu/kermit/ckccfg.html |
| 220. http://www.columbia.edu/kermit/ckuins.html#top |
| 221. http://www.columbia.edu/kermit/ckuins.html#contents |
| 222. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 223. http://www.columbia.edu/kermit/ckuins.html#x8 |
| 224. http://www.columbia.edu/kermit/ckuins.html#x9.1 |
| 225. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 |
| 226. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 |
| 227. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 |
| 228. http://www.columbia.edu/kermit/ckuins.html#x9.2 |
| 229. http://www.columbia.edu/kermit/ckuins.html#x9.3 |
| 230. http://www.columbia.edu/kermit/ckuins.html#x9.4 |
| 231. http://www.columbia.edu/kermit/ckuins.html#x9.5 |
| 232. http://www.columbia.edu/kermit/ckuins.html#x9.6 |
| 233. http://www.columbia.edu/kermit/ckuins.html#x9.7 |
| 234. http://www.columbia.edu/kermit/ckuins.html#x9.8 |
| 235. http://www.columbia.edu/kermit/ckuins.html#x9.9 |
| 236. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 237. http://www.columbia.edu/kermit/ckuins.html#top |
| 238. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 239. http://www.columbia.edu/kermit/ckuins.html#contents |
| 240. http://www.columbia.edu/kermit/ckuins.html#x9.2 |
| 241. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 |
| 242. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 |
| 243. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 |
| 244. http://www.columbia.edu/kermit/ckuins.html#top |
| 245. http://www.columbia.edu/kermit/ckuins.html#contents |
| 246. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 247. http://www.columbia.edu/kermit/ckuins.html#x9.1 |
| 248. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 |
| 249. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 |
| 250. http://www.columbia.edu/kermit/ckuins.html#top |
| 251. http://www.columbia.edu/kermit/ckuins.html#contents |
| 252. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 253. http://www.columbia.edu/kermit/ckuins.html#x9.1 |
| 254. http://www.columbia.edu/kermit/ckuins.html#x9.2 |
| 255. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 |
| 256. http://www.opengroup.org/onlinepubs/007904975/ |
| 257. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 |
| 258. http://www.columbia.edu/kermit/ckuins.html#top |
| 259. http://www.columbia.edu/kermit/ckuins.html#contents |
| 260. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 261. http://www.columbia.edu/kermit/ckuins.html#x9.1 |
| 262. http://www.columbia.edu/kermit/ckuins.html#x9.3 |
| 263. http://www.columbia.edu/kermit/ckuins.html#x9.1 |
| 264. http://www.columbia.edu/kermit/ckuins.html#top |
| 265. http://www.columbia.edu/kermit/ckuins.html#contents |
| 266. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 267. http://www.columbia.edu/kermit/ckuins.html#x9.4 |
| 268. http://www.columbia.edu/kermit/ckuins.html#x9.2 |
| 269. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 270. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 271. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 272. http://www.columbia.edu/kermit/ckuins.html#top |
| 273. http://www.columbia.edu/kermit/ckuins.html#contents |
| 274. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 275. http://www.columbia.edu/kermit/ckuins.html#x9.5 |
| 276. http://www.columbia.edu/kermit/ckuins.html#x9.3 |
| 277. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 278. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h |
| 279. http://www.columbia.edu/kermit/ckuins.html#top |
| 280. http://www.columbia.edu/kermit/ckuins.html#contents |
| 281. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 282. http://www.columbia.edu/kermit/ckuins.html#x9.6 |
| 283. http://www.columbia.edu/kermit/ckuins.html#x9.4 |
| 284. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h |
| 285. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c |
| 286. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 287. http://www.columbia.edu/kermit/ckuins.html#top |
| 288. http://www.columbia.edu/kermit/ckuins.html#contents |
| 289. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 290. http://www.columbia.edu/kermit/ckuins.html#x9.7 |
| 291. http://www.columbia.edu/kermit/ckuins.html#x9.5 |
| 292. http://www.columbia.edu/kermit/ckuins.html#top |
| 293. http://www.columbia.edu/kermit/ckuins.html#contents |
| 294. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 295. http://www.columbia.edu/kermit/ckuins.html#x9.8 |
| 296. http://www.columbia.edu/kermit/ckuins.html#x9.6 |
| 297. http://www.columbia.edu/kermit/ckuins.html#top |
| 298. http://www.columbia.edu/kermit/ckuins.html#contents |
| 299. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 300. http://www.columbia.edu/kermit/ckuins.html#x9.9 |
| 301. http://www.columbia.edu/kermit/ckuins.html#x9.7 |
| 302. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 303. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 304. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h |
| 305. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 306. http://www.columbia.edu/kermit/ckuins.html#top |
| 307. http://www.columbia.edu/kermit/ckuins.html#contents |
| 308. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 309. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 310. http://www.columbia.edu/kermit/ckuins.html#x9.8 |
| 311. http://www.columbia.edu/kermit/ckuins.html#top |
| 312. http://www.columbia.edu/kermit/ckuins.html#contents |
| 313. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 314. http://www.columbia.edu/kermit/ckuins.html#x9 |
| 315. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 316. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 317. http://www.columbia.edu/kermit/ckuins.html#top |
| 318. http://www.columbia.edu/kermit/ckuins.html#contents |
| 319. http://www.columbia.edu/kermit/ckuins.html#x12 |
| 320. http://www.columbia.edu/kermit/ckuins.html#x10 |
| 321. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 322. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
| 323. http://www.columbia.edu/kermit/ckuins.html#top |
| 324. http://www.columbia.edu/kermit/ckuins.html#contents |
| 325. http://www.columbia.edu/kermit/ckuins.html#x13 |
| 326. http://www.columbia.edu/kermit/ckuins.html#x11 |
| 327. http://www.columbia.edu/kermit/ckuins.html#top |
| 328. http://www.columbia.edu/kermit/ckuins.html#contents |
| 329. http://www.columbia.edu/kermit/ckuins.html#x14 |
| 330. http://www.columbia.edu/kermit/ckuins.html#x12 |
| 331. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt |
| 332. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
| 333. http://www.columbia.edu/kermit/ckuins.html#top |
| 334. http://www.columbia.edu/kermit/ckuins.html#contents |
| 335. http://www.columbia.edu/kermit/ckuins.html#x15 |
| 336. http://www.columbia.edu/kermit/ckuins.html#x13 |
| 337. http://www.columbia.edu/kermit/ckuins.html#top |
| 338. http://www.columbia.edu/kermit/ckuins.html#contents |
| 339. http://www.columbia.edu/kermit/ckuins.html#x16 |
| 340. http://www.columbia.edu/kermit/ckuins.html#x14 |
| 341. http://www.columbia.edu/kermit/iksd.html#x4.2 |
| 342. http://www.columbia.edu/kermit/iksd.html |
| 343. http://www.columbia.edu/kermit/ckermit2.html |
| 344. http://www.columbia.edu/kermit/ckuins.html#top |
| 345. http://www.columbia.edu/kermit/ckuins.html#contents |
| 346. http://www.columbia.edu/kermit/ckuins.html#x17 |
| 347. http://www.columbia.edu/kermit/ckuins.html#x15 |
| 348. http://www.columbia.edu/kermit/security.html |
| 349. http://www.columbia.edu/kermit/security80.html |
| 350. http://www.columbia.edu/kermit/cuiksd.html |
| 351. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem |
| 352. http://www.columbia.edu/kermit/ckuins.html#top |
| 353. http://www.columbia.edu/kermit/ckuins.html#contents |
| 354. http://www.columbia.edu/kermit/ckuins.html#x16 |
| 355. http://www.columbia.edu/kermit/skermit.html |
| 356. http://www.columbia.edu/kermit/ckuins.html#top |
| 357. http://www.columbia.edu/kermit/ckuins.html#contents |
| 358. http://www.columbia.edu/kermit/ckermit.html |
| 359. http://www.columbia.edu/kermit/ck80.html |
| 360. http://www.columbia.edu/kermit/index.html |