[20080] | 1 | |
---|
| 2 | C-Kermit Program Logic Manual |
---|
| 3 | |
---|
| 4 | Frank da Cruz |
---|
| 5 | [1]The Kermit Project |
---|
| 6 | [2]Columbia University |
---|
| 7 | |
---|
| 8 | As of: C-Kermit 8.0.209, 17 March 2003 |
---|
| 9 | This page last updated: Sun Mar 23 19:25:30 2003 (New York USA Time) |
---|
| 10 | |
---|
| 11 | IF YOU ARE READING A PLAIN-TEXT version of this document, note that |
---|
| 12 | this file is a plain-text dump of a Web page. You can visit the |
---|
| 13 | original (and possibly more up-to-date) Web page here: |
---|
| 14 | |
---|
| 15 | [3]http://www.columbia.edu/kermit/ckcplm.html |
---|
| 16 | |
---|
| 17 | [ [4]C-Kermit Home ] [ [5]Kermit Home ] |
---|
| 18 | ________________________________________________________________________ |
---|
| 19 | |
---|
| 20 | CONTENTS |
---|
| 21 | |
---|
| 22 | 1. [6]INTRODUCTION |
---|
| 23 | 2. [7]FILES |
---|
| 24 | 3. [8]SOURCE CODE PORTABILITY AND STYLE |
---|
| 25 | 4. [9]MODULES |
---|
| 26 | 4.A. [10]Group A: Library Routines |
---|
| 27 | 4.B. [11]Group B: Kermit File Transfer |
---|
| 28 | 4.C. [12]Group C: Character-Set Conversion |
---|
| 29 | 4.D. [13]Group D: User Interface |
---|
| 30 | 4.E. [14]Group E: Platform-Dependent I/O |
---|
| 31 | 4.F. [15]Group F: Network Support |
---|
| 32 | 4.G. [16]Group G: Formatted Screen Support |
---|
| 33 | 4.H. [17]Group H: Pseudoterminal Support |
---|
| 34 | 4.I. [18]Group I: Security |
---|
| 35 | I. [19]APPENDIX I: FILE PERMISSIONS |
---|
| 36 | ________________________________________________________________________ |
---|
| 37 | |
---|
| 38 | 1. INTRODUCTION |
---|
| 39 | |
---|
| 40 | The Kermit Protocol is specified in the book Kermit, A File Transfer |
---|
| 41 | Protocol by Frank da Cruz, Digital Press / Butterworth Heinemann, |
---|
| 42 | Newton, MA, USA (1987), 379 pages, ISBN 0-932376-88-6. It is assumed |
---|
| 43 | the reader is familiar with the Kermit protocol specification. |
---|
| 44 | |
---|
| 45 | This file describes the relationship among the modules and functions |
---|
| 46 | of C-Kermit 5A and later, and other programming considerations. |
---|
| 47 | C-Kermit is designed to be portable to any kind of computer that has a |
---|
| 48 | C compiler. The source code is broken into many files that are grouped |
---|
| 49 | according to their function, as shown in the [20]Contents. |
---|
| 50 | |
---|
| 51 | C-Kermit has seen constant development since 1985. Throughout its |
---|
| 52 | history, there has been a neverending tug-of-war among: |
---|
| 53 | |
---|
| 54 | a. Functionality: adding new features, fixing bugs, improving |
---|
| 55 | performance. |
---|
| 56 | b. Adding support for new platforms. |
---|
| 57 | c. "Buzzword 1.0 compliance". |
---|
| 58 | |
---|
| 59 | The latter category is the most frustrating, since it generally |
---|
| 60 | involves massive changes just to keep the software doing what it did |
---|
| 61 | before in some new setting: e.g. the K&R-to-ANSIC conversion (which |
---|
| 62 | had to be done, of course, without breaking K&R); Y2K (not a big deal |
---|
| 63 | in our case); the many and varied UNIX and other API "standards"; |
---|
| 64 | IPv6. |
---|
| 65 | |
---|
| 66 | [ [21]Contents ] [ [22]C-Kermit ] [ [23]Kermit Home ] |
---|
| 67 | ________________________________________________________________________ |
---|
| 68 | |
---|
| 69 | 2. FILES |
---|
| 70 | |
---|
| 71 | C-Kermit source files begin with the two letters "ck", for example |
---|
| 72 | ckutio.c. Filenames are kept short (6.3) for maximum portability and |
---|
| 73 | (obviously I hope) do not contain spaces or more than one period. The |
---|
| 74 | third character in the name denotes something about the function group |
---|
| 75 | and the expected level of portability: |
---|
| 76 | |
---|
| 77 | a General descriptive material and documentation (text) |
---|
| 78 | b BOO file encoders and decoders (obsolete) |
---|
| 79 | c All platforms with C compilers (*) |
---|
| 80 | d Data General AOS/VS |
---|
| 81 | e Reserved for "ckermit" files, like ckermit.ini, ckermit2.txt |
---|
| 82 | f (reserved) |
---|
| 83 | g (reserved) |
---|
| 84 | h (reserved) |
---|
| 85 | i Commodore Amiga (Intuition) |
---|
| 86 | j (unused) |
---|
| 87 | k (unused) |
---|
| 88 | l Stratus VOS |
---|
| 89 | m Macintosh with Mac OS 1-9 |
---|
| 90 | n Microsoft Windows NT/2000/XP |
---|
| 91 | o OS/2 and/or Microsoft Windows 9x/ME/NT/2000/XP |
---|
| 92 | p Plan 9 from Bell Labs |
---|
| 93 | q (reserved) |
---|
| 94 | r DEC PDP-11 with RSTS/E (never used, open for reassigment) |
---|
| 95 | s Atari ST GEMDOS (last supported in version 5A(189)) |
---|
| 96 | t DEC PDP-11 with RT-11 (never used, open for reassigment) |
---|
| 97 | u Unix-based operating systems (*) |
---|
| 98 | v VMS and OpenVMS |
---|
| 99 | w Wart (Lex-like preprocessor, platform independent) |
---|
| 100 | x (reserved) |
---|
| 101 | y (reserved) |
---|
| 102 | z (reserved) |
---|
| 103 | 0-3 (reserved) |
---|
| 104 | 4 IBM AS/400 |
---|
| 105 | 5-8 (reserved) |
---|
| 106 | 9 Microware OS-9 |
---|
| 107 | _ Encryption modules |
---|
| 108 | |
---|
| 109 | (*) In fact there is little distinction between the ckc*.* and cku*.* |
---|
| 110 | categories. It would make more sense for all cku*.* modules to be |
---|
| 111 | ckc*.* ones, except ckufio.c, ckutio.c, ckucon.c, ckucns.c, and |
---|
| 112 | ckupty.c, which truly are specific to Unix. The rest (ckuus*.c, |
---|
| 113 | ckucmd.c, etc) are quite portable. |
---|
| 114 | |
---|
| 115 | One hint before proceeding: functions are scattered all over the |
---|
| 116 | ckc*.c and cku*.c modules, where function size has begun to take |
---|
| 117 | precedence over the desirability of grouping related functions |
---|
| 118 | together, the aim being to keep any particular module from growing |
---|
| 119 | disproportionately large. The easiest way (in UNIX) to find out in |
---|
| 120 | what source file a given function is defined is like this (where the |
---|
| 121 | desired function is foo()...): |
---|
| 122 | |
---|
| 123 | grep ^foo\( ck*.c |
---|
| 124 | |
---|
| 125 | This works because the coding convention has been to make function |
---|
| 126 | names always start on the left margin with their contents indented, |
---|
| 127 | for example: |
---|
| 128 | |
---|
| 129 | static char * |
---|
| 130 | foo(x,y) int x, y; { |
---|
| 131 | ... |
---|
| 132 | } |
---|
| 133 | |
---|
| 134 | Also note the style for bracket placement. This allows |
---|
| 135 | bracket-matching text editors (such as EMACS) to help you make sure |
---|
| 136 | you know which opening bracket a closing bracket matches, particularly |
---|
| 137 | when the opening bracket is above the visible screen, and it also |
---|
| 138 | makes it easy to find the end of a function (search for '}' on the |
---|
| 139 | left margin). |
---|
| 140 | |
---|
| 141 | Of course EMACS tags work nicely with this format too: |
---|
| 142 | |
---|
| 143 | $ cd kermit-source-directory |
---|
| 144 | $ etags ck[cu]*.c |
---|
| 145 | $ emacs |
---|
| 146 | Esc-X Visit-Tags-Table<CR><CR> |
---|
| 147 | |
---|
| 148 | (but remember that the source file for ckcpro.c is [24]ckcpro.w!) |
---|
| 149 | |
---|
| 150 | Also: |
---|
| 151 | |
---|
| 152 | * Tabs should be set every 8 spaces, as on a VT100. |
---|
| 153 | * All lines must no more than 79 characters wide after tab |
---|
| 154 | expansion. |
---|
| 155 | * Note the distinction between physical tabs (ASCII 9) and the |
---|
| 156 | indentation conventions, which are: 4 for block contents, 2 for |
---|
| 157 | most other stuff (obviously this is not a portability issue, just |
---|
| 158 | style). |
---|
| 159 | |
---|
| 160 | [ [25]Contents ] [ [26]C-Kermit ] [ [27]Kermit Home ] |
---|
| 161 | ________________________________________________________________________ |
---|
| 162 | |
---|
| 163 | 3. SOURCE CODE PORTABILITY AND STYLE |
---|
| 164 | |
---|
| 165 | C-Kermit was designed in 1985 as a platform-independent replacement |
---|
| 166 | for the earlier Unix Kermit. c-Kermit's design was expected to promote |
---|
| 167 | portability, and judging from the number of platforms to which it has |
---|
| 168 | been adapted since then, the model is effective, if not ideal |
---|
| 169 | (obviously if we had it all to do over, we'd change a few things). To |
---|
| 170 | answer the oft-repeated question: "Why are there so many #ifdefs?", |
---|
| 171 | it's because: |
---|
| 172 | |
---|
| 173 | * Many of them are related to feature selection and program size, |
---|
| 174 | and so need to be there anyway. |
---|
| 175 | * Those that treat compiler, library, platform, header-file, and |
---|
| 176 | similar differences have built up over time as hundreds of people |
---|
| 177 | all over the world adapted C-Kermit to their particular |
---|
| 178 | environments and sent back their changes. There might be more |
---|
| 179 | politically-correct ways to achieve portability, but this one is |
---|
| 180 | natural and proven. The basic idea is to introduce changes that |
---|
| 181 | can be selected by defining a symbol, which, if not defined, |
---|
| 182 | leaves the program exactly as it was before the changes. |
---|
| 183 | * Although it might be possible to "clean up" the "#ifdef mess", |
---|
| 184 | nobody has access to all the hundreds of platforms served by the |
---|
| 185 | #ifdefs to check the results. |
---|
| 186 | |
---|
| 187 | And to answer the second-most-oft-repeated question: "Why don't you |
---|
| 188 | just use GNU autoconfig / automake / autowhatever instead of |
---|
| 189 | hard-coding all those #ifdefs?" Answers: |
---|
| 190 | |
---|
| 191 | * The GNU tools are not available on all the platforms where |
---|
| 192 | C-Kermit must be built and I wouldn't necessarily trust them if |
---|
| 193 | they were. |
---|
| 194 | * Each platform is a moving target, so the tools themselves would |
---|
| 195 | need to updated before Kermit could be updated. |
---|
| 196 | * It would only add another layer of complexity to an already |
---|
| 197 | complex process. |
---|
| 198 | * Conversion at this point would not be practical unless there was a |
---|
| 199 | way to test the results on all the hundreds of platforms where |
---|
| 200 | C-Kermit is supposed to build. |
---|
| 201 | |
---|
| 202 | When writing code for the system-indendent C-Kermit modules, please |
---|
| 203 | stick to the following coding conventions to ensure portability to the |
---|
| 204 | widest possible variety of C preprocessors, compilers, and linkers, as |
---|
| 205 | well as certain network and/or email transports. The same holds true |
---|
| 206 | for many of the "system dependent" modules too; particularly the Unix |
---|
| 207 | ones, since they must be buildable by a wide variety of compilers and |
---|
| 208 | linkers, new and old. |
---|
| 209 | |
---|
| 210 | This list does not purport to be comprehensive, and although some |
---|
| 211 | items on it might seem far-fetched, they would not be listed unless I |
---|
| 212 | had encountered them somewhere, some time. I wish I had kept better |
---|
| 213 | records so I could cite specific platforms and compilers. |
---|
| 214 | |
---|
| 215 | * Try to keep variable and function names unique within 6 |
---|
| 216 | characters, especially if they are used across modules, since 6 is |
---|
| 217 | the maximum for some old linkers (actually, this goes back to |
---|
| 218 | TOPS-10 and -20 and other old DEC OS's where C-Kermit never ran |
---|
| 219 | anyway; a more realistic maximum is probably somewhere between 8 |
---|
| 220 | and 16). We know for certain that VAX C has a 31-character max |
---|
| 221 | because it complains -- others might not complain, but just |
---|
| 222 | silently truncate, thus folding two or more routines/variables |
---|
| 223 | into one. |
---|
| 224 | * Keep preprocessor symbols unique within 8 characters; that's the |
---|
| 225 | max for some preprocessors (sorry, I can't give a specific |
---|
| 226 | example, but in 1988 or thereabouts, I had to change character-set |
---|
| 227 | symbols like TC_LATIN1 and TC_LATIN2 to TC_1LATIN and TC_2LATIN |
---|
| 228 | because the digits were being truncated and ignored on a platform |
---|
| 229 | where I actually had to build C-Kermit 5A; unfortunately I didn't |
---|
| 230 | note which platform -- maybe some early Ultrix version?) |
---|
| 231 | * Don't create preprocessor symbols, or variable or function names, |
---|
| 232 | that start with underscore (_). These are usually reserved for |
---|
| 233 | internal use by the compiler and header files. |
---|
| 234 | * Don't put #include directives inside functions or { blocks }. |
---|
| 235 | * Don't use the #if or #elif preprocessor constructions, only use |
---|
| 236 | #ifdef, #ifndef, #define, #undef, and #endif. |
---|
| 237 | * Put tokens after #endif in comment brackets, e.g. |
---|
| 238 | #endif /* FOO */. |
---|
| 239 | * Don't indent preprocessor statements - # must always be first char |
---|
| 240 | on line. |
---|
| 241 | * Don't put whitespace after # in preprocessor statements. |
---|
| 242 | * Don't use #pragma, even within #ifdefs -- it makes some |
---|
| 243 | preprocessors give up. |
---|
| 244 | * Same goes for #module, #if, etc - #ifdefs do NOT protect them. |
---|
| 245 | * Don't use logical operators in preprocessor constructions. |
---|
| 246 | * Avoid #ifdefs inside argument list to function calls (I can't |
---|
| 247 | remember why this one is here, but probably needn't be; we do this |
---|
| 248 | all the time). |
---|
| 249 | * Always cast strlen() in expressions to int: |
---|
| 250 | if ((int)strlen(foo) < x)... |
---|
| 251 | * Any variable whose value might exceed 16383 should be declared as |
---|
| 252 | long, or if that is not possible, then as unsigned. |
---|
| 253 | * Avoid typedefs; they might be portable but they are very confusing |
---|
| 254 | and there's no way to test for their presence or absence at |
---|
| 255 | compile time. Use preprocessor symbols instead if possible; at |
---|
| 256 | least you can test their definitions. |
---|
| 257 | * Unsigned long is not portable; use a preprocessor symbol (Kermit |
---|
| 258 | uses ULONG for this). |
---|
| 259 | * Long long is not portable. If you really need it, be creative. |
---|
| 260 | * Similarly 1234LL is not portable, nor almost any other constant |
---|
| 261 | modifier other than L. |
---|
| 262 | * Unsigned char is not portable, use CHAR (a preprocessor symbol |
---|
| 263 | defined in the Kermit header files) and always take precautions |
---|
| 264 | against character signage (more about this [28]below). |
---|
| 265 | * Don't use initializers with automatic arrays or structs: it's not |
---|
| 266 | portable. |
---|
| 267 | * Don't use big automatic arrays or structs in functions that might |
---|
| 268 | be called recursively; some platforms have fixed-size stacks (e.g. |
---|
| 269 | Windows 9x: 256K) and recursive functions crash with stack |
---|
| 270 | overflow. Even when there is not a compiler limitation, this |
---|
| 271 | causes memory to be consumed without bound, and can end up filling |
---|
| 272 | swap space. |
---|
| 273 | * Don't assume that struct assignment performs a copy, or that it |
---|
| 274 | even exists. |
---|
| 275 | * Don't use sizeof to get the size of an array; someone might come |
---|
| 276 | along later and and change it from static to malloc'd. Always use |
---|
| 277 | a symbol to refer to the array's size. |
---|
| 278 | * Don't put prototypes for static functions into header files that |
---|
| 279 | are used by modules that don't contain that function; the link |
---|
| 280 | step can fail with unresolved references (e.g. on AOS/VS). |
---|
| 281 | * Avoid the construction *++p (the order of evaluation varies; it |
---|
| 282 | shouldn't but at least one compiler had a bug that made me include |
---|
| 283 | this item). |
---|
| 284 | * Don't use triple assignments, like a = b = c = 0; (or quadruple, |
---|
| 285 | etc). Some compilers generate bad code for these, or crash, etc |
---|
| 286 | (some version of DEC C as I recall). |
---|
| 287 | * Some compilers don't allow structure members to have the same |
---|
| 288 | names as other identifiers. Try to give structure members unique |
---|
| 289 | names. |
---|
| 290 | * Don't assume anything about order of evaluation in boolean |
---|
| 291 | expressions, or that they will stop early if a required condition |
---|
| 292 | is not true, e.g.: |
---|
| 293 | |
---|
| 294 | if (i > 0 && p[i-1] == blah) |
---|
| 295 | can still dump core if i == 0 (hopefully this is not true of any |
---|
| 296 | modern compiler, but I would not have said this if it did not |
---|
| 297 | actually happen somewhere). |
---|
| 298 | * Don't have a switch() statement with no cases (e.g. because of |
---|
| 299 | #ifdefs); this is a fatal error in some compilers. |
---|
| 300 | * Don't put lots of code in a switch case; move it out to a separate |
---|
| 301 | function; some compilers run out of memory when presented with a |
---|
| 302 | huge switch() statement -- it's not the number of cases that |
---|
| 303 | matters; it's the overall amount of code. |
---|
| 304 | * Some compilers might also limit the number of switch() cases, e.g. |
---|
| 305 | to 254. |
---|
| 306 | * Don't put anything between "switch() {" and "case:" -- switch |
---|
| 307 | blocks are not like other blocks. |
---|
| 308 | * Don't jump into or out of switches. |
---|
| 309 | * Don't make character-string constants longer than about 250 bytes. |
---|
| 310 | Longer strings should be broken up into arrays of strings. |
---|
| 311 | * Don't write into character-string constants (obviously). Even when |
---|
| 312 | you know you are not writing past the end; the compiler or linker |
---|
| 313 | might have put them into read-only and/or shared memory, and/or |
---|
| 314 | coalesced multiple equal constants so if you change one you change |
---|
| 315 | them all. |
---|
| 316 | * Don't depend on '\r' being carriage return. |
---|
| 317 | * Don't depend on '\n' being linefeed or for that matter any SINGLE |
---|
| 318 | character. |
---|
| 319 | * Don't depend on '\r' and '\n' being different (e.g. as separate |
---|
| 320 | switch() cases). |
---|
| 321 | * In other words, don't use \n or \r to stand for specific |
---|
| 322 | characters; use \012 and \015 instead. |
---|
| 323 | * Don't code for "buzzword 1.0 compliance", unless "buzzword" is K&R |
---|
| 324 | and "1.0" is the first edition. |
---|
| 325 | * Don't use or depend on anything_t (size_t, pid_t, etc), except |
---|
| 326 | time_t, without #ifdef protection (time_t is the only one I've |
---|
| 327 | found that is accepted everywhere). This is a tough one because |
---|
| 328 | the same function might require (say) a size_t arg on one |
---|
| 329 | platform, whereas size_t is unheard of on another; or worse, it |
---|
| 330 | might require a totally different data type, like int or long or |
---|
| 331 | some other typedef'd thing. It has often proved necessary to |
---|
| 332 | define a symbol to stand for the type of a particular argument to |
---|
| 333 | a particular library or system function to get around this |
---|
| 334 | problem. |
---|
| 335 | * Don't use or depend on internationalization ("i18n") features, |
---|
| 336 | wchar_t, locales, etc, in portable code; they are not portable. |
---|
| 337 | Anyway, locales are not the right model for Kermit's |
---|
| 338 | multi-character-set support. Kermit does all character-set |
---|
| 339 | conversion itself and does not use any external libraries or |
---|
| 340 | functions. |
---|
| 341 | * In particular, don't use any library functions that deal with wide |
---|
| 342 | characters or Unicode in any form. These are not only nonportable, |
---|
| 343 | but a constantly shifting target (e.g. the ones in glibc). |
---|
| 344 | * Don't make any assumption about signal handler type. It can be |
---|
| 345 | void, int, long, or anything else. Always declare signal handlers |
---|
| 346 | as SIGTYP (see definition in ckcdeb.h and augment it if necessary) |
---|
| 347 | and always use SIGRETURN at exit points from signal handlers. |
---|
| 348 | * Signals should always be re-armed to be used again (this barely |
---|
| 349 | scratches the surface -- the differences between BSD/V7 and System |
---|
| 350 | V and POSIX signal handling are numerous, and some platforms do |
---|
| 351 | not even support signals, alarms, or longjmps correctly or at all |
---|
| 352 | -- avoid all of this if you can). |
---|
| 353 | * On the other hand, don't assume that signals are disarmed after |
---|
| 354 | being raised. In some platforms you have to re-arm them, in others |
---|
| 355 | they stay armed. |
---|
| 356 | * Don't call malloc() and friends from a signal handler; don't do |
---|
| 357 | anything but setting integer global variables in a signal handler. |
---|
| 358 | * malloc() does not initialize allocated memory -- it never said it |
---|
| 359 | did. Don't expect it to be all 0's. |
---|
| 360 | * Did You Know: malloc() can succeed and the program can still dump |
---|
| 361 | core later when it attempts to use the malloc'd memory? (This |
---|
| 362 | happens when allocation is deferred until use and swap space is |
---|
| 363 | full.) |
---|
| 364 | * memset(), memmove(), and memcpy() are not portable, don't use them |
---|
| 365 | without protecting them in ifdefs (we have USE_MEMCPY for this). |
---|
| 366 | bzero()/bcopy() too, except we're guaranteed to have |
---|
| 367 | bzero()/bcopy() when using the sockets library (not really). See |
---|
| 368 | examples in the source. |
---|
| 369 | * Don't assume that strncpy() stops on the first null byte -- most |
---|
| 370 | versions always copy the number of bytes given in arg 3, padding |
---|
| 371 | out with 0's and overwriting whatever was there before. Use |
---|
| 372 | C-Kermit ckstrncpy() if you want predictable non-padding behavior, |
---|
| 373 | guaranteed NUL-termination, and a useful return code. |
---|
| 374 | * DID YOU KNOW.. that some versions of inet_blah() routines return |
---|
| 375 | IP addresses in network byte order, while others return them local |
---|
| 376 | machine byte order? So passing them to ntohs() or whatever is not |
---|
| 377 | always the right thing to do. |
---|
| 378 | * Don't use ANSI-format function declarations without #ifdef |
---|
| 379 | CK_ANSIC, and always provide an #else for the non-ANSI case. |
---|
| 380 | * Use the Kermit _PROTOTYP() macro for declaring function |
---|
| 381 | prototypes; it works in both the ANSI and non-ANSI cases. |
---|
| 382 | * Don't depend on any other ANSI preprocessor features like |
---|
| 383 | "pasting" -- they are often missing or nonoperational. |
---|
| 384 | * Don't assume any C++ syntax or semantics. |
---|
| 385 | * Don't use // as a comment introducer. C is not C++. |
---|
| 386 | * Don't declare a string as "char foo[]" in one module and "extern |
---|
| 387 | char * foo" in another, or vice-versa: this causes core dumps. |
---|
| 388 | * With compiler makers falling all over themselves trying to outdo |
---|
| 389 | each other in ANSI strictness, it has become increasingly |
---|
| 390 | necessary to cast EVERYTHING. This is increasingly true for char |
---|
| 391 | vs unsigned char. We need to use unsigned chars if we want to deal |
---|
| 392 | with 8-bit character sets, but most character- and string-oriented |
---|
| 393 | APIs want (signed) char arguments, so explicit casts are |
---|
| 394 | necessary. It would be nice if every compiler had a |
---|
| 395 | -funsigned-char option (as gcc does), but they don't. |
---|
| 396 | * a[x], where x is an unsigned char, can produce a wild memory |
---|
| 397 | reference if x, when promoted to an int, becomes negative. Cast it |
---|
| 398 | to (unsigned), even though it ALREADY IS unsigned. |
---|
| 399 | * Be careful how you declare functions that have char or long |
---|
| 400 | arguments; for ANSI compilers you MUST use ANSI declarations to |
---|
| 401 | avoid promotion problems, but you can't use ANSI declarations with |
---|
| 402 | non-ANSI compilers. Thus declarations of such functions must be |
---|
| 403 | hideously entwined in #ifdefs. Example: latter: |
---|
| 404 | |
---|
| 405 | int /* Put character in server command buffer */ |
---|
| 406 | #ifdef CK_ANSIC |
---|
| 407 | putsrv(char c) |
---|
| 408 | #else |
---|
| 409 | putsrv(c) char c; |
---|
| 410 | #endif /* CK_ANSIC */ |
---|
| 411 | /* putsrv */ { |
---|
| 412 | *srvptr++ = c; |
---|
| 413 | *srvptr = '\0'; /* Make sure buffer is null-terminated */ |
---|
| 414 | return(0); |
---|
| 415 | } |
---|
| 416 | * Be careful how you return characters from functions that return |
---|
| 417 | int values -- "getc-like functions" -- in the ANSI world. Unless |
---|
| 418 | you explicitly cast the return value to (unsigned), it is likely |
---|
| 419 | to be "promoted" to an int and have its sign extended. |
---|
| 420 | * At least one compiler (the one on DEC OSF/1 1.3) treats "/*" and |
---|
| 421 | "*/" within string constants as comment begin and end. No amount |
---|
| 422 | of #ifdefs will get around this one. You simply can't put these |
---|
| 423 | sequences in a string constant, e.g. "/usr/local/doc/*.*". |
---|
| 424 | * Avoid putting multiple macro references on a single line, e.g.: |
---|
| 425 | |
---|
| 426 | putchar(BS); putchar(SP); putchar(BS) |
---|
| 427 | |
---|
| 428 | This overflows the CPP output buffer of more than a few C |
---|
| 429 | preprocessors (this happened, for example, with SunOS 4.1 cc, which |
---|
| 430 | evidently has a 1K macro expansion buffer). |
---|
| 431 | |
---|
| 432 | C-Kermit needs constant adjustment to new OS and compiler releases. |
---|
| 433 | Every new OS release shuffles header files or their contents, or |
---|
| 434 | prototypes, or data types, or levels of ANSI strictness, etc. Every |
---|
| 435 | time you make an adjustment to remove a new compilation error, BE VERY |
---|
| 436 | CAREFUL to #ifdef it on a symbol unique to the new configuration so |
---|
| 437 | that the previous configuration (and all other configurations on all |
---|
| 438 | other platforms) remain as before. |
---|
| 439 | |
---|
| 440 | Assume nothing. Don't assume header files are where they are supposed |
---|
| 441 | to be, that they contain what you think they contain, that they define |
---|
| 442 | specific symbols to have certain values -- or define them at all! |
---|
| 443 | Don't assume system header files protect themselves against multiple |
---|
| 444 | inclusion. Don't assume that particular system or library calls are |
---|
| 445 | available, or that the arguments are what you think they are -- order, |
---|
| 446 | data type, passed by reference vs value, etc. Be conservative when |
---|
| 447 | attempting to write portable code. Avoid all advanced features. |
---|
| 448 | |
---|
| 449 | If you see something that does not make sense, don't assume it's a |
---|
| 450 | mistake -- it might be there for a reason, and changing it or removing |
---|
| 451 | is likely to cause compilation, linking, or runtime failures sometime, |
---|
| 452 | somewhere. Some huge percentage of the code, especially in the |
---|
| 453 | platform-dependent modules, is workarounds for compiler, linker, or |
---|
| 454 | API bugs. |
---|
| 455 | |
---|
| 456 | But finally... feel free to violate any or all of these rules in |
---|
| 457 | platform-specific modules for environments in which the rules are |
---|
| 458 | certain not to apply. For example, in VMS-specific code, it is OK to |
---|
| 459 | use #if, because VAX C, DEC C, and VMS GCC all support it. |
---|
| 460 | |
---|
| 461 | [ [29]Contents ] [ [30]C-Kermit ] [ [31]Kermit Home ] |
---|
| 462 | ________________________________________________________________________ |
---|
| 463 | |
---|
| 464 | 3.1. Memory Leaks |
---|
| 465 | |
---|
| 466 | The C language and standard C library are notoriously inadequate and |
---|
| 467 | unsafe. Strings are arrays of characters, usually referenced through |
---|
| 468 | pointers. There is no native string datatype. Buffers are fixed size, |
---|
| 469 | and C provides no runtime bounds checking, thus allowing overwriting |
---|
| 470 | of other data or even program code. With the popularization of the |
---|
| 471 | Internet, the "buffer exploit" has become a preferred method for |
---|
| 472 | hackers to hijack privileged programs; long data strings are fed to a |
---|
| 473 | program in hopes that it uses unsafe C library calls such as strcpy() |
---|
| 474 | or sprintf() to copy strings into automatic arrays, thus overwriting |
---|
| 475 | the call stack, and therefore the routine's return address. When such |
---|
| 476 | a hole is discovered, a "string" can be constructed that contains |
---|
| 477 | machine code to hijack the program's privileges and penetrate the |
---|
| 478 | system. |
---|
| 479 | |
---|
| 480 | This problem is partially addressed by the strn...() routines, which |
---|
| 481 | should always be used in preference to their str...() equivalents |
---|
| 482 | (except when the copy operation has already been prechecked, or there |
---|
| 483 | is a good reason for not using them, e.g. the sometimes undesirable |
---|
| 484 | side effect of strncpy() zeroing the remainder of the buffer). The |
---|
| 485 | most gaping whole, however, is sprintf(), which performs no length |
---|
| 486 | checking on its destination buffer, and is not easy to replace. |
---|
| 487 | Although snprintf() routines are starting to appear, they are not yet |
---|
| 488 | widespread, and certainly not universal, nor are they especially |
---|
| 489 | portable, or even full-featured. |
---|
| 490 | |
---|
| 491 | For these reasons, we have started to build up our own little library |
---|
| 492 | of C Library replacements, ckclib.[ch]. These are safe and highly |
---|
| 493 | portable primitives for memory management and string manipulation, |
---|
| 494 | such as: |
---|
| 495 | |
---|
| 496 | ckstrncpy() |
---|
| 497 | Like strncpy but returns a useful value, doesn't zero buffer. |
---|
| 498 | |
---|
| 499 | ckitoa() |
---|
| 500 | Opposite of atoi() |
---|
| 501 | |
---|
| 502 | ckltoa() |
---|
| 503 | Opposite of atol() |
---|
| 504 | |
---|
| 505 | ckctoa() |
---|
| 506 | Returns character as string |
---|
| 507 | |
---|
| 508 | ckmakmsg() |
---|
| 509 | Used with ck?to?() as a safe sprintf() replacement for up to 4 |
---|
| 510 | items |
---|
| 511 | |
---|
| 512 | ckmakxmsg() |
---|
| 513 | Like ckmakmsg() but accepts up to 12 items |
---|
| 514 | |
---|
| 515 | More about library functions in [32]Section 4.A. |
---|
| 516 | |
---|
| 517 | [ [33]Contents ] [ [34]C-Kermit ] [ [35]Kermit Home ] |
---|
| 518 | ________________________________________________________________________ |
---|
| 519 | |
---|
| 520 | 3.2. The "char" vs "unsigned char" Dilemma |
---|
| 521 | |
---|
| 522 | This is one of the most aggravating and vexing characteristics of the |
---|
| 523 | C language. By design, chars (and char *'s) are SIGNED. But in the |
---|
| 524 | modern era, however, we need to process characters that can have (or |
---|
| 525 | include) 8-bit values, as in the ISO Latin-1, IBM CP 850, or UTF-8 |
---|
| 526 | character sets, so this data must be treated as unsigned. But some C |
---|
| 527 | compilers (such as those based on the Bell UNIX V7 compiler) do not |
---|
| 528 | support "unsigned char" as a data type. Therefore we have the macro or |
---|
| 529 | typedef CHAR, which we use when we need chars to be unsigned, but |
---|
| 530 | which, unfortunately, resolves itself to "char" on those compilers |
---|
| 531 | that don't support "unsigned char". AND SO... We have to do a lot of |
---|
| 532 | fiddling at runtime to avoid sign extension and so forth. |
---|
| 533 | |
---|
| 534 | Some modern compilers (e.g. IBM, DEC, Microsoft) have options that say |
---|
| 535 | "make all chars be unsigned" (e.g. GCC "-funsigned-char") and we use |
---|
| 536 | them when they are available. Other compilers don't have this option, |
---|
| 537 | and at the same time, are becoming increasingly strict about type |
---|
| 538 | mismatches, and spew out torrents of warnings when we use a CHAR where |
---|
| 539 | a char is expected, or vice versa. We fix these one by one using |
---|
| 540 | casts, and the code becomes increasingly ugly. But there remains a |
---|
| 541 | serious problem, namely that certain library and kernel functions have |
---|
| 542 | arguments that are declared as signed chars (or pointers to them), |
---|
| 543 | whereas our character data is unsigned. Fine, we can can use casts |
---|
| 544 | here too -- but who knows what happens inside these routines. |
---|
| 545 | |
---|
| 546 | [ [36]Contents ] [ [37]C-Kermit ] [ [38]Kermit Home ] |
---|
| 547 | ________________________________________________________________________ |
---|
| 548 | |
---|
| 549 | 4. MODULES |
---|
| 550 | |
---|
| 551 | When C-Kermit is on the far end of a connection, it is said to be in |
---|
| 552 | remote mode. When C-Kermit has made a connection to another computer, |
---|
| 553 | it is in local mode. (If C-Kermit is "in the middle" of a multihop |
---|
| 554 | connection, it is still in local mode.) |
---|
| 555 | |
---|
| 556 | On another axis, C-Kermit can be in any of several major states: |
---|
| 557 | |
---|
| 558 | Command State |
---|
| 559 | Reading and writing from the job's controlling terminal or |
---|
| 560 | "console". In this mode, all i/o is handled by the Group E |
---|
| 561 | conxxx() (console i/o) routines. |
---|
| 562 | |
---|
| 563 | Protocol State |
---|
| 564 | Reading and writing from the communicatons device. In this |
---|
| 565 | mode, all i/o is handled by the Group E ttxxx() (terminal i/o) |
---|
| 566 | routines. |
---|
| 567 | |
---|
| 568 | Terminal State |
---|
| 569 | Reading from the keyboard with conxxx() routines and writing to |
---|
| 570 | the communications device with ttxxx() routines AND vice-versa. |
---|
| 571 | |
---|
| 572 | When in local mode, the console and communications device are |
---|
| 573 | distinct. During file transfer, Kermit may put up a file-transfer |
---|
| 574 | display on the console and sample the console for interruption |
---|
| 575 | signals. |
---|
| 576 | |
---|
| 577 | When in remote mode, the console and communications device are the |
---|
| 578 | same, and therefore there can be no file-transfer display on the |
---|
| 579 | console or interruptions from it (except for "in-band" interruptions |
---|
| 580 | such as ^C^C^C). |
---|
| 581 | |
---|
| 582 | [ [39]Contents ] [ [40]C-Kermit ] [ [41]Kermit Home ] |
---|
| 583 | ________________________________________________________________________ |
---|
| 584 | |
---|
| 585 | 4.A. Group A: Library Functions |
---|
| 586 | |
---|
| 587 | Library functions, strictly portable, can be used by all modules on |
---|
| 588 | all platforms: [42]ckclib.h, [43]ckclib.c. |
---|
| 589 | |
---|
| 590 | (To be filled in... For now, see [44]Section 3.1 and the comments in |
---|
| 591 | ckclib.c.) |
---|
| 592 | |
---|
| 593 | [ [45]Contents ] [ [46]C-Kermit ] [ [47]Kermit Home ] |
---|
| 594 | ________________________________________________________________________ |
---|
| 595 | |
---|
| 596 | 4.B. Group B: Kermit File Transfer |
---|
| 597 | |
---|
| 598 | The Kermit protocol kernel. These files, whose names start with "ckc |
---|
| 599 | are supposed to be totally portable C, and are expected to compile |
---|
| 600 | correctly on any platform with any C compiler. "Portable" does not |
---|
| 601 | mean the same as as "ANSI" -- these modules must compile on 10- and |
---|
| 602 | 20-year old computers, with C preprocessors, compilers, and/or linkers |
---|
| 603 | that have all sorts of restrictions. The Group B modules do not |
---|
| 604 | include any header files other than those that come with Kermit |
---|
| 605 | itself. They do not contain any library calls except from the standard |
---|
| 606 | C library (e.g. printf()). They most certainly do not contain any |
---|
| 607 | system calls. Files: |
---|
| 608 | |
---|
| 609 | [48]ckcsym.h |
---|
| 610 | For use by C compilers that don't allow -D on the command line. |
---|
| 611 | |
---|
| 612 | [49]ckcasc.h |
---|
| 613 | ASCII character symbol definitions. |
---|
| 614 | |
---|
| 615 | [50]ckcsig.h |
---|
| 616 | System-independent signal-handling definitions and prototypes. |
---|
| 617 | |
---|
| 618 | [51]ckcdeb.h |
---|
| 619 | Originally, debugging definitions. Now this file also contains |
---|
| 620 | all definitions and prototypes that are shared by all modules |
---|
| 621 | in all groups. |
---|
| 622 | |
---|
| 623 | [52]ckcker.h |
---|
| 624 | Kermit protocol symbol definitions. |
---|
| 625 | |
---|
| 626 | [53]ckcxla.h |
---|
| 627 | Character-set-related symbol definitions (see next section). |
---|
| 628 | |
---|
| 629 | [54]ckcmai.c |
---|
| 630 | The main program. This module contains the declarations of all |
---|
| 631 | the protocol-related global variables that are shared among the |
---|
| 632 | other modules. |
---|
| 633 | |
---|
| 634 | [55]ckcpro.w |
---|
| 635 | The protocol module itself, written in "wart", a lex-like |
---|
| 636 | preprocessor that is distributed with Kermit under the name |
---|
| 637 | CKWART.C. |
---|
| 638 | |
---|
| 639 | [56]ckcfns.c, [57]ckcfn2.c, [58]ckcfn3.c |
---|
| 640 | The protocol support functions used by the protocol module. |
---|
| 641 | |
---|
| 642 | [59]Group B modules may call upon functions from [60]Group E, but not |
---|
| 643 | from [61]Group D modules (with the single exception that the main |
---|
| 644 | program invokes the user interface, which is in Group D). (This last |
---|
| 645 | assertion is really only a conjecture.) |
---|
| 646 | |
---|
| 647 | [ [62]Contents ] [ [63]C-Kermit ] [ [64]Kermit Home ] |
---|
| 648 | ________________________________________________________________________ |
---|
| 649 | |
---|
| 650 | 4.C. Group C: Character-Set Conversion |
---|
| 651 | |
---|
| 652 | Character set translation tables and functions. Used by the [65]Group |
---|
| 653 | B, protocol modules, but may be specific to different computers. (So |
---|
| 654 | far, all character character sets supported by C-Kermit are supported |
---|
| 655 | in [66]ckuxla.c and [67]ckuxla.h, including Macintosh and IBM |
---|
| 656 | character sets). These modules should be completely portable, and not |
---|
| 657 | rely on any kind of system or library services. |
---|
| 658 | |
---|
| 659 | [68]ckcxla.h |
---|
| 660 | Character-set definitions usable by all versions of C-Kermit. |
---|
| 661 | |
---|
| 662 | ck?xla.h |
---|
| 663 | Character-set definitions for computer "?", e.g. [69]ckuxla.h |
---|
| 664 | for UNIX, [70]ckmxla.h for Macintosh. |
---|
| 665 | |
---|
| 666 | [71]ck?xla |
---|
| 667 | Character-set translation tables and functions for computer |
---|
| 668 | "?", For example, CKUXLA.C for UNIX, CKMXLA.C for Macintosh. So |
---|
| 669 | far, these are the only two such modules. The UNIX module is |
---|
| 670 | used for all versions of C-Kermit except the Macintosh version. |
---|
| 671 | |
---|
| 672 | [72]ckcuni.h |
---|
| 673 | Unicode definitions |
---|
| 674 | |
---|
| 675 | [73]ckcuni.c |
---|
| 676 | Unicode module |
---|
| 677 | |
---|
| 678 | Here's how to add a new file character set in the original |
---|
| 679 | (non-Unicode modules). Assuming it is based on the Roman (Latin) |
---|
| 680 | alphabet. Let's call it "Barbarian". First, in ck?xla.h, add a |
---|
| 681 | definition for FC_BARBA (8 chars maximum length) and increase |
---|
| 682 | MAXFCSETS by 1. Then, in ck?xla.c: |
---|
| 683 | |
---|
| 684 | * Add a barbarian entry into the fcsinfo array. |
---|
| 685 | * Add a "barbarian" entry to file character set keyword table, |
---|
| 686 | fcstab. |
---|
| 687 | * Add a "barbarian" entry to terminal character set keyword table, |
---|
| 688 | ttcstab. |
---|
| 689 | * Add a translation table from Latin-1 to barbarian: yl1ba[]. |
---|
| 690 | * Add a translation table from barbarian to Latin-1: ybal1[]. |
---|
| 691 | * Add a translation function from Barbarian to ASCII: xbaas(). |
---|
| 692 | * Add a translation function from Barbarian to Latin-1: xbal1(). |
---|
| 693 | * Add a translation function from Latin-1 to Barbarian: xl1ba(). |
---|
| 694 | * etc etc for each transfer character set... |
---|
| 695 | * Add translation function pointers to the xls and xlr tables. |
---|
| 696 | |
---|
| 697 | Other translations involving Barbarian (e.g. from Barbarian to |
---|
| 698 | Latin-Cyrillic) are performed through these tables and functions. See |
---|
| 699 | ckuxla.h and ckuxla.c for extensive examples. |
---|
| 700 | |
---|
| 701 | To add a new Transfer Character Set, e.g. Latin Alphabet 9 (for the |
---|
| 702 | Euro symbol), again in the "old" character-set modules: |
---|
| 703 | |
---|
| 704 | In ckcxla.h: |
---|
| 705 | |
---|
| 706 | + Add a TC_xxxx definition and increase MAXTCSETS accordingly. |
---|
| 707 | |
---|
| 708 | In ck?xla.h (since any transfer charset is also a file charset): |
---|
| 709 | |
---|
| 710 | + Add an FC_xxxx definition and increase MAXFCSETS accordingly. |
---|
| 711 | |
---|
| 712 | In ck?xla.c: |
---|
| 713 | |
---|
| 714 | + Add a tcsinfo[] entry. |
---|
| 715 | + Make a tcstab[] keyword table entry. |
---|
| 716 | + Make an fcsinfo[] table entry. |
---|
| 717 | + Make an fcstab[] keyword table entry. |
---|
| 718 | + Make a tcstab[] keyword table entry. |
---|
| 719 | + If necessary, make a langinfo[] table entry. |
---|
| 720 | + Make entries in the function pointer arrays. |
---|
| 721 | + Provide any needed functions. |
---|
| 722 | |
---|
| 723 | As of C-Kermit 7.0, character sets are also handled in parallel by the |
---|
| 724 | new (and very large) Unicode module, ckcuni.[ch]. Eventually we should |
---|
| 725 | phase out the old way, described just above, and operate entirely in |
---|
| 726 | (and through) Unicode. The advantages are many. The disadvantages are |
---|
| 727 | size and performance. To add a character to the Unicode modules: |
---|
| 728 | |
---|
| 729 | In ckcuni.h: |
---|
| 730 | |
---|
| 731 | + (To be filled in...) |
---|
| 732 | |
---|
| 733 | In ckcuni.c: |
---|
| 734 | |
---|
| 735 | + (To be filled in...) |
---|
| 736 | |
---|
| 737 | [ [74]Contents ] [ [75]C-Kermit ] [ [76]Kermit Home ] |
---|
| 738 | ________________________________________________________________________ |
---|
| 739 | |
---|
| 740 | 4.D. Group D: User Interface |
---|
| 741 | |
---|
| 742 | This is the code that communicates with the user, gets her commands, |
---|
| 743 | informs her of the results. It may be command-line oriented, |
---|
| 744 | interactive prompting dialog, menus and arrow keys, windows and mice, |
---|
| 745 | speech recognition, telepathy, etc. The one provided is command-and |
---|
| 746 | prompt, with the ability to read commands from various sources: the |
---|
| 747 | console keyboard, a file, or a macro definition. The user interface |
---|
| 748 | has three major functions: |
---|
| 749 | |
---|
| 750 | 1. Sets the parameters for the file transfer and then starts it. This |
---|
| 751 | is done by setting certain (many) global variables, such as the |
---|
| 752 | protocol machine start state, the file specification, file type, |
---|
| 753 | communication parameters, packet length, window size, character |
---|
| 754 | set, etc. |
---|
| 755 | 2. Displays messages on the user's screen during the file transfer, |
---|
| 756 | using the screen() function, which is called by the group-1 |
---|
| 757 | modules. |
---|
| 758 | 3. Executes any commands directly that do not require Kermit |
---|
| 759 | protocol, such as the CONNECT command, local file management |
---|
| 760 | commands, parameter-setting commands, FTP client commands, etc. |
---|
| 761 | |
---|
| 762 | If you plan to imbed the [77]Group B, files into a program with a |
---|
| 763 | different user interface, your interface must supply an appropriate |
---|
| 764 | screen() function, plus a couple related ones like chkint() and |
---|
| 765 | intmsg() for handling keyboard (or mouse, etc) interruptions during |
---|
| 766 | file transfer. The best way to find out about this is to link all the |
---|
| 767 | C-Kermit modules together except the ckuu*.o and ckucon.o modules, and |
---|
| 768 | see which missing symbols turn up. |
---|
| 769 | |
---|
| 770 | C-Kermit's character-oriented user interface (as opposed to the |
---|
| 771 | Macintosh version's graphical user interface) consists of the |
---|
| 772 | following modules. C-Kermit can be built with an interactive command |
---|
| 773 | parser, a command-line-option-only parser, a graphical user interface, |
---|
| 774 | or any combination, and it can even be built with no user interface at |
---|
| 775 | all (in which case it runs as a remote-mode Kermit server). |
---|
| 776 | |
---|
| 777 | [78]ckucmd.h |
---|
| 778 | |
---|
| 779 | [79]ckucmd.c |
---|
| 780 | The command parsing primitives used by the interactive command |
---|
| 781 | parser to parse keywords, numbers, filenames, etc, and to give |
---|
| 782 | help, complete fields, supply defaults, allow abbreviations and |
---|
| 783 | editing, etc. This package is totally independent of Kermit, |
---|
| 784 | but does depend on the [80]Group E functions. |
---|
| 785 | |
---|
| 786 | [81]ckuusr.h |
---|
| 787 | Definitions of symbols used in Kermit's commands. |
---|
| 788 | |
---|
| 789 | ckuus*.c |
---|
| 790 | Kermit's interactive command parser, including the script |
---|
| 791 | programming language: [82]ckuusr.c (includes top-level keyword |
---|
| 792 | tables); [83]ckuus2.c (HELP command text); [84]ckuus3.c (most |
---|
| 793 | of the SET command); [85]ckuus4.c (includes variables and |
---|
| 794 | functions); ckuus[567].c (miscellaneous); |
---|
| 795 | |
---|
| 796 | [86]ckuusy.c |
---|
| 797 | The command-line-option parser. |
---|
| 798 | |
---|
| 799 | [87]ckuusx.c |
---|
| 800 | User interface functions common to both the interactive and |
---|
| 801 | command-line parsers. |
---|
| 802 | |
---|
| 803 | [88]ckuver.h |
---|
| 804 | Version heralds for different implementations. |
---|
| 805 | |
---|
| 806 | [89]ckuscr.c |
---|
| 807 | The (old, uucp-like) SCRIPT command |
---|
| 808 | |
---|
| 809 | [90]ckudia.c |
---|
| 810 | The DIAL command. Includes specific knowledge of many types of |
---|
| 811 | modems. |
---|
| 812 | |
---|
| 813 | Note that none of the above files is actually Unix-specific. Over time |
---|
| 814 | they have proven to be portable among all platforms where C-Kermit is |
---|
| 815 | built: Unix, VMS, AOS/VS, Amiga, OS-9, VOS, etc etc. Thus the third |
---|
| 816 | letter should more properly be "c", but changing it would be too |
---|
| 817 | confusing. |
---|
| 818 | |
---|
| 819 | ck?con.c, ckucns.c |
---|
| 820 | The CONNECT command. Terminal connection, and in some cases |
---|
| 821 | (Macintosh, Windows) also terminal emulation. NOTE: As of |
---|
| 822 | C-Kermit 7.0, there are two different CONNECT modules for UNIX: |
---|
| 823 | [91]ckucon.c -- the traditional, portable, fork()-based version |
---|
| 824 | -- and [92]ckucns.c, a new version that uses select() rather |
---|
| 825 | than forks so it can handle encryption. ckucns.c is the |
---|
| 826 | preferred version for Unix; ckucon.c is not likely to keep pace |
---|
| 827 | with it in terms of upgrades, etc. However, since select() is |
---|
| 828 | not portable to every platform, ckucon.c will be kept |
---|
| 829 | indefinitely for those platforms that can't use ckucns.c. NOTE: |
---|
| 830 | SunLink X.25 support is available only in ckucon.c. |
---|
| 831 | |
---|
| 832 | ck_*.*, ckuat*.* |
---|
| 833 | Modules having to do with authentication and encryption. Since |
---|
| 834 | the relaxation of USA export laws, they are included with the |
---|
| 835 | general source-code distribution. Secure C-Kermit binaries can |
---|
| 836 | be built using special targets in the standard makefile. |
---|
| 837 | However, secure prebuilt binaries may not be distributed. |
---|
| 838 | |
---|
| 839 | For other implementations, the files may, and probably do, have |
---|
| 840 | different names. For example, the Macintosh graphical user interface |
---|
| 841 | filenames start with "ckm". Kermit 95 uses the ckucmd and ckuus* |
---|
| 842 | modules, but has its own CONNECT command modules. And so on. |
---|
| 843 | |
---|
| 844 | Here is a brief description of C-Kermit's "user interface interface", |
---|
| 845 | from ckuusr.c. It is nowhere near complete; in particular, hundreds of |
---|
| 846 | global variables are shared among the many modules. These should, some |
---|
| 847 | day, be collected into classes or structures that can be passed around |
---|
| 848 | as needed; not only for purity's sake, but also to allow for multiple |
---|
| 849 | simultaneous communication sessions and or user interfaces. Our list |
---|
| 850 | of things to do is endless, and reorganizing the source is almost |
---|
| 851 | always at the bottom. |
---|
| 852 | |
---|
| 853 | The ckuus*.c modules (like many of the ckc*.c modules) depend on the |
---|
| 854 | existence of C library features like fopen, fgets, feof, (f)printf, |
---|
| 855 | argv/argc, etc. Other functions that are likely to vary among |
---|
| 856 | operating systems -- like setting terminal modes or interrupts -- are |
---|
| 857 | invoked via calls to functions that are defined in the [93]Group E |
---|
| 858 | platform-dependent modules, ck?[ft]io.c. The command line parser |
---|
| 859 | processes any arguments found on the command line, as passed to main() |
---|
| 860 | via argv/argc. The interactive parser uses the facilities of the cmd |
---|
| 861 | package (developed for this program, but, in theory, usable by any |
---|
| 862 | program). Any command parser may be substituted for this one. The only |
---|
| 863 | requirements for the Kermit command parser are these: |
---|
| 864 | |
---|
| 865 | 1. Set parameters via global variables like duplex, speed, ttname, |
---|
| 866 | etc. See [94]ckcmai.c for the declarations and descriptions of |
---|
| 867 | these variables. |
---|
| 868 | 2. If a command can be executed without the use of Kermit protocol, |
---|
| 869 | then execute the command directly and set the sstate (start state) |
---|
| 870 | variable to 0. Examples include SET commands, local directory |
---|
| 871 | listings, the CONNECT command. |
---|
| 872 | 3. If a command requires the Kermit protocol, set the following |
---|
| 873 | variables: |
---|
| 874 | |
---|
| 875 | sstate string data |
---|
| 876 | 'x' (enter server mode) (none) |
---|
| 877 | 'r' (send a 'get' command) cmarg, cmarg2 |
---|
| 878 | 'v' (enter receive mode) cmarg2 |
---|
| 879 | 'g' (send a generic command) cmarg |
---|
| 880 | 's' (send files) nfils, cmarg & cmarg2 OR cmlist |
---|
| 881 | 'c' (send a remote host command) cmarg |
---|
| 882 | |
---|
| 883 | cmlist is an array of pointers to strings. |
---|
| 884 | cmarg, cmarg2 are pointers to strings. |
---|
| 885 | nfils is an integer (hmmm, probably should be an unsigned long). |
---|
| 886 | |
---|
| 887 | cmarg can be: |
---|
| 888 | A filename string (possibly wild), or: |
---|
| 889 | a pointer to a prefabricated generic command string, or: |
---|
| 890 | a pointer to a host command string. |
---|
| 891 | |
---|
| 892 | cmarg2 is: |
---|
| 893 | The name to send a single file under, or: |
---|
| 894 | the name under which to store an incoming file; must not |
---|
| 895 | be wild. |
---|
| 896 | If it's the name for receiving, a null value means to |
---|
| 897 | store the file under the name it arrives with. |
---|
| 898 | |
---|
| 899 | cmlist is: |
---|
| 900 | A list of nonwild filenames, such as passed via argv. |
---|
| 901 | |
---|
| 902 | nfils is an integer, interpreted as follows: |
---|
| 903 | -1: filespec (possibly wild) in cmarg, must be expanded |
---|
| 904 | internally. |
---|
| 905 | 0: send from stdin (standard input). |
---|
| 906 | >0: number of files to send, from cmlist. |
---|
| 907 | |
---|
| 908 | The screen() function is used to update the screen during file |
---|
| 909 | transfer. The tlog() function writes to a transaction log (if TLOG is |
---|
| 910 | defined). The debug() function writes to a debugging log (if DEBUG is |
---|
| 911 | defined). The intmsg() and chkint() functions provide the user i/o for |
---|
| 912 | interrupting file transfers. |
---|
| 913 | |
---|
| 914 | [ [95]Contents ] [ [96]C-Kermit ] [ [97]Kermit Home ] |
---|
| 915 | ________________________________________________________________________ |
---|
| 916 | |
---|
| 917 | 4.E. Group E: Platform-Dependent I/O |
---|
| 918 | |
---|
| 919 | Platform-dependent function definitions. All the Kermit modules, |
---|
| 920 | including the command package, call upon these functions, which are |
---|
| 921 | designed to provide system-independent primitives for controlling and |
---|
| 922 | manipulating devices and files. For Unix, these functions are defined |
---|
| 923 | in the files [98]ckufio.c (files), [99]ckutio.c (communications), and |
---|
| 924 | [100]ckusig.c (signal handling). |
---|
| 925 | |
---|
| 926 | For VMS, the files are [101]ckvfio.c, ckvtio.c, and [102]ckusig.c (VMS |
---|
| 927 | can use the same signal handling routines as Unix). It doesn't really |
---|
| 928 | matter what the files are called, except for Kermit distribution |
---|
| 929 | purposes (grouping related files together alphabetically), only that |
---|
| 930 | each function is provided with the name indicated, observes the same |
---|
| 931 | calling and return conventions, and has the same type. |
---|
| 932 | |
---|
| 933 | The Group E modules contain both functions and global variables that |
---|
| 934 | are accessed by modules in the other groups. These are now described. |
---|
| 935 | |
---|
| 936 | (By the way, I got this list by linking all the C-Kermit modules |
---|
| 937 | together except ckutio and ckufio. These are the symbols that ld |
---|
| 938 | reported as undefined. But that was a long time ago, probably circa |
---|
| 939 | Version 6.) |
---|
| 940 | |
---|
| 941 | 4.E.1. Global Variables |
---|
| 942 | |
---|
| 943 | char *DELCMD; |
---|
| 944 | Pointer to string containing command for deleting files. |
---|
| 945 | Example: char *DELCMD = "rm -f "; (UNIX) |
---|
| 946 | Example: char *DELCMD = "delete "; (VMS) |
---|
| 947 | Note trailing space. Filename is concatenated to end of this |
---|
| 948 | string. NOTE: DELCMD is used only in versions that do not |
---|
| 949 | provide their own built-in DELETE command. |
---|
| 950 | |
---|
| 951 | char *DIRCMD; |
---|
| 952 | Pointer to string containing command for listing files when a |
---|
| 953 | filespec is given. |
---|
| 954 | Example: char *DIRCMD = "/bin/ls -l "; (UNIX) |
---|
| 955 | Example: char *DIRCMD = "directory "; (VMS) |
---|
| 956 | Note trailing space. Filename is concatenated to end of this |
---|
| 957 | string. NOTE: DIRCMD is used only in versions that do not |
---|
| 958 | provide their own built-in DIRECTORY command. |
---|
| 959 | |
---|
| 960 | char *DIRCM2; |
---|
| 961 | Pointer to string containing command for listing files when a |
---|
| 962 | filespec is not given. (currently not used, handled in another |
---|
| 963 | way.) |
---|
| 964 | Example: char *DIRCMD2 = "/bin/ls -ld *"; |
---|
| 965 | NOTE: DIRCMD2 is used only in versions that do not provide |
---|
| 966 | their own built-in DIRECTORY command. |
---|
| 967 | |
---|
| 968 | char *PWDCMD; |
---|
| 969 | Pointer to string containing command to display current |
---|
| 970 | directory. |
---|
| 971 | Example: char *PWDCMD = "pwd "; |
---|
| 972 | NOTE: PWDCMD is used only in versions that do not provide their |
---|
| 973 | own built-in PWD command. |
---|
| 974 | |
---|
| 975 | char *SPACMD; |
---|
| 976 | Pointer to command to display free disk space in current |
---|
| 977 | device/directory. |
---|
| 978 | Example: char *SPACMD = "df ."; |
---|
| 979 | NOTE: SPACMD is used only in versions that do not provide their |
---|
| 980 | own built-in SPACE command. |
---|
| 981 | |
---|
| 982 | char *SPACM2; |
---|
| 983 | Pointer to command to display free disk space in another |
---|
| 984 | device/directory. |
---|
| 985 | Example: char *SPACM2 = "df "; |
---|
| 986 | Note trailing space. Device or directory name is added to this |
---|
| 987 | string. NOTE: SPACMD2 is used only in versions that do not |
---|
| 988 | provide their own built-in SPACE command. |
---|
| 989 | |
---|
| 990 | char *TYPCMD; |
---|
| 991 | Pointer to command for displaying the contents of a file. |
---|
| 992 | Example: char *TYPCMD = "cat "; |
---|
| 993 | Note trailing space. Device or directory name is added to this |
---|
| 994 | string. NOTE: TYPCMD is used only in versions that do not |
---|
| 995 | provide their own built-in TYPE command. |
---|
| 996 | |
---|
| 997 | char *WHOCMD; |
---|
| 998 | Pointer to command for displaying logged-in users. |
---|
| 999 | Example: char *WHOCMD = "who "; |
---|
| 1000 | Note trailing space. Specific user name may be added to this |
---|
| 1001 | string. |
---|
| 1002 | |
---|
| 1003 | int backgrd = 0; |
---|
| 1004 | Flag for whether program is running in foreground (0) or |
---|
| 1005 | background (nonzero). Background operation implies that screen |
---|
| 1006 | output should not be done and that all errors should be fatal. |
---|
| 1007 | |
---|
| 1008 | int ckxech; |
---|
| 1009 | Flag for who is to echo console typein: |
---|
| 1010 | 1: The program (system is not echoing). |
---|
| 1011 | 0: The OS, front end, terminal, etc (not this program). |
---|
| 1012 | |
---|
| 1013 | char *ckxsys; |
---|
| 1014 | Pointer to string that names the computer and operating system. |
---|
| 1015 | Example: char *ckxsys = " NeXT Mach 1.0"; |
---|
| 1016 | Tells what computer system ckxv applies to. In UNIX Kermit, |
---|
| 1017 | this variable is also used to print the program herald, and in |
---|
| 1018 | the SHOW VERSION command. |
---|
| 1019 | |
---|
| 1020 | char *ckxv; |
---|
| 1021 | Pointer to version/edit info of ck?tio.c module. |
---|
| 1022 | Example: char *ckxv = "UNIX Communications Support, 6.0.169, 6 |
---|
| 1023 | Sep 96"; |
---|
| 1024 | Used by SHOW VERSION command. |
---|
| 1025 | |
---|
| 1026 | char *ckzsys; |
---|
| 1027 | Like ckxsys, but briefer. |
---|
| 1028 | Example: char *ckzsys = " 4.3 BSD"; |
---|
| 1029 | Tells what platform ckzv applies to. Used by the SHOW VERSION |
---|
| 1030 | command. |
---|
| 1031 | |
---|
| 1032 | char *ckzv; |
---|
| 1033 | Pointer to version/edit info of ck?fio.c module. |
---|
| 1034 | Example: char *ckzv = "UNIX File support, 6.0.113, 6 Sep 96"; |
---|
| 1035 | Used by SHOW VERSION command. |
---|
| 1036 | |
---|
| 1037 | int dfflow; |
---|
| 1038 | Default flow control. 0 = none, 1 = Xon/Xoff, ... (see FLO_xxx |
---|
| 1039 | symbols in ckcdeb.h) |
---|
| 1040 | Set by Group E module. Used by [103]ckcmai.c to initialize flow |
---|
| 1041 | control variable. |
---|
| 1042 | |
---|
| 1043 | int dfloc; |
---|
| 1044 | Default location. 0 = remote, 1 = local. Set by Group E module. |
---|
| 1045 | Used by ckcmai.c to initialize local variable. Used in various |
---|
| 1046 | places in the user interface. |
---|
| 1047 | |
---|
| 1048 | int dfprty; |
---|
| 1049 | Default parity. 0 = none, 'e' = even, 'o' = odd, 'm' = mark, |
---|
| 1050 | 's' = space. Set by Group E module. Used by ckcmai.c to |
---|
| 1051 | initialize parity variable. |
---|
| 1052 | |
---|
| 1053 | char *dftty; |
---|
| 1054 | Default communication device. Set by Group E module. Used in |
---|
| 1055 | many places. This variable should be initialized the the symbol |
---|
| 1056 | CTTNAM, which is defined in ckcdeb.h, e.g. as "/dev/tty" for |
---|
| 1057 | UNIX, "TT:" for VMS, etc. Example: char *dftty = CTTNAM; |
---|
| 1058 | |
---|
| 1059 | char *mtchs[]; |
---|
| 1060 | Array of string pointers to filenames that matched the most |
---|
| 1061 | recent wildcard match, i.e. the most recent call to zxpand(). |
---|
| 1062 | Used (at least) by command parsing package for partial filename |
---|
| 1063 | completion. |
---|
| 1064 | |
---|
| 1065 | int tilde_expand; |
---|
| 1066 | Flag for whether to attempt to expand leading tildes in |
---|
| 1067 | directory names (used in UNIX only, and then only when the |
---|
| 1068 | symbol DTILDE is defined. |
---|
| 1069 | |
---|
| 1070 | int ttnproto; |
---|
| 1071 | The protocol being used to communicate over a network device. |
---|
| 1072 | Values are defined in ckcnet.h. Example: NP_TELNET is network |
---|
| 1073 | protocol "telnet". |
---|
| 1074 | |
---|
| 1075 | int maxnam; |
---|
| 1076 | The maximum length for a filename, exclusive of any device or |
---|
| 1077 | directory information, in the format of the host operating |
---|
| 1078 | system. |
---|
| 1079 | |
---|
| 1080 | int maxpath; |
---|
| 1081 | The maximum length for a fully specified filename, including |
---|
| 1082 | device designator, directory name, network node name, etc, in |
---|
| 1083 | the format of the host operating system, and including all |
---|
| 1084 | punctuation. |
---|
| 1085 | |
---|
| 1086 | int ttyfd; |
---|
| 1087 | File descriptor of the communication device. -1 if there is no |
---|
| 1088 | open or usable connection, including when C-Kermit is in remote |
---|
| 1089 | mode. Since this is not implemented everywhere, references to |
---|
| 1090 | it are in #ifdef CK_TTYFD..#endif. |
---|
| 1091 | |
---|
| 1092 | [ [104]Contents ] [ [105]C-Kermit ] [ [106]Kermit Home ] |
---|
| 1093 | ________________________________________________________________________ |
---|
| 1094 | |
---|
| 1095 | 4.E.2. Functions |
---|
| 1096 | |
---|
| 1097 | These are divided into three categories: file-related functions (B.1), |
---|
| 1098 | communication functions (B.2), and miscellaneous functions (B.3). |
---|
| 1099 | |
---|
| 1100 | 4.E.2.1. File-Related Functions |
---|
| 1101 | |
---|
| 1102 | In most implementations, these are collected together into a module |
---|
| 1103 | called ck?fio.c, where ? = "u" ([107]ckutio.c for Unix), "v" |
---|
| 1104 | ([108]ckvtio.c for VMS), [109]etc. To be totally platform-independent, |
---|
| 1105 | C-Kermit maintains its own file numbers, and provides the functions |
---|
| 1106 | described in this section to deal with the files associated with them. |
---|
| 1107 | The file numbers are referred to symbolically, and are defined as |
---|
| 1108 | follows in ckcker.h: |
---|
| 1109 | |
---|
| 1110 | #define ZCTERM 0 /* Console terminal */ |
---|
| 1111 | #define ZSTDIO 1 /* Standard input/output */ |
---|
| 1112 | #define ZIFILE 2 /* Current input file for SEND command */ |
---|
| 1113 | #define ZOFILE 3 /* Current output file for RECEIVE command */ |
---|
| 1114 | #define ZDFILE 4 /* Current debugging log file */ |
---|
| 1115 | #define ZTFILE 5 /* Current transaction log file */ |
---|
| 1116 | #define ZPFILE 6 /* Current packet log file */ |
---|
| 1117 | #define ZSFILE 7 /* Current session log file */ |
---|
| 1118 | #define ZSYSFN 8 /* Input from a system function (pipe) */ |
---|
| 1119 | #define ZRFILE 9 /* Local file for READ command */ (NEW) |
---|
| 1120 | #define ZWFILE 10 /* Local file for WRITE command */ (NEW) |
---|
| 1121 | #define ZMFILE 11 /* Auxilliary file for internal use */ (NEW) |
---|
| 1122 | #define ZNFILS 12 /* How many defined file numbers */ |
---|
| 1123 | |
---|
| 1124 | In the descriptions below, fn refers to a filename, and n refers to |
---|
| 1125 | one of these file numbers. Functions are of type int unless otherwise |
---|
| 1126 | noted, and are listed mostly alphabetically. |
---|
| 1127 | |
---|
| 1128 | int |
---|
| 1129 | chkfn(n) int n; |
---|
| 1130 | Checks the file number n. Returns: |
---|
| 1131 | -1: File number n is out of range |
---|
| 1132 | 0: n is in range, but file is not open |
---|
| 1133 | 1: n in range and file is open |
---|
| 1134 | |
---|
| 1135 | int |
---|
| 1136 | iswild(filspec) char *filespec; |
---|
| 1137 | Checks if the file specification is "wild", i.e. contains |
---|
| 1138 | metacharacters or other notations intended to match multiple |
---|
| 1139 | filenames. Returns: |
---|
| 1140 | 0: not wild |
---|
| 1141 | 1: wild. |
---|
| 1142 | |
---|
| 1143 | int |
---|
| 1144 | isdir(string) char *string; |
---|
| 1145 | Checks if the string is the name of an existing directory. The |
---|
| 1146 | idea is to check whether the string can be "cd'd" to, so in |
---|
| 1147 | some cases (e.g. DOS) it might also indicate any file |
---|
| 1148 | structured device, such as a disk drive (like A:). Other |
---|
| 1149 | nonzero returns indicate system-dependent information; e.g. in |
---|
| 1150 | VMS isdir("[.FOO]") returns 1 but isdir("FOO.DIR;1") returns 2 |
---|
| 1151 | to indicate the directory-file name is in a format that needs |
---|
| 1152 | conversion before it can be combined with a filename. Returns: |
---|
| 1153 | 0: not a directory (including any kind of error) |
---|
| 1154 | 1: it is an existing directory |
---|
| 1155 | |
---|
| 1156 | char * |
---|
| 1157 | zfcdat(name) char *name; |
---|
| 1158 | Returns modification (preferably, otherwise creation) date/time |
---|
| 1159 | of file whose name is given in the argument string. Return |
---|
| 1160 | value is a pointer to a string of the form yyyymmdd hh:mm:ss, |
---|
| 1161 | for example 19931231 23:59:59, which represents the local time |
---|
| 1162 | (no timezone or daylight savings time finagling required). |
---|
| 1163 | Returns the null string ("") on failure. The text pointed to by |
---|
| 1164 | the string pointer might be in a static buffer, and so should |
---|
| 1165 | be copied to a safe place by the caller before any subsequent |
---|
| 1166 | calls to this function. |
---|
| 1167 | |
---|
| 1168 | struct zfnfp * |
---|
| 1169 | zfnqfp(fn, buflen, buf) char * fn; int buflen; char * buf; |
---|
| 1170 | Given the filename fn, the corresponding fully qualified, |
---|
| 1171 | absolute filename is placed into the buffer buf, whose length |
---|
| 1172 | is buflen. On failure returns a NULL pointer. On success |
---|
| 1173 | returns a pointer to a struct zfnfp containing pointers to the |
---|
| 1174 | full pathname and to just the filename, and an int giving the |
---|
| 1175 | length of the full pathname. All references to this function in |
---|
| 1176 | mainline code must be protected by #ifdef ZFNQFP..#endif, |
---|
| 1177 | because it is not present in all of the ck*fio.c modules. So if |
---|
| 1178 | you implement this function in a version that did not have it |
---|
| 1179 | before, be sure to add #define ZFNQFP in the appropriate spot |
---|
| 1180 | in ckcdeb.h or in the build-procedure CFLAGS. |
---|
| 1181 | |
---|
| 1182 | int |
---|
| 1183 | zcmpfn(s1,s2) char * s2, * s2; |
---|
| 1184 | Compares two filenames to see if they refer to the same. |
---|
| 1185 | Internally, the arguments can be converted to fully qualified |
---|
| 1186 | pathnames, e.g. with zfnqfp(), realpath(), or somesuch. In Unix |
---|
| 1187 | or other systems where symbolic links exist, the link should be |
---|
| 1188 | resolved before making the comparison or looking at the inodes. |
---|
| 1189 | Returns: |
---|
| 1190 | 0: Files are not identical. |
---|
| 1191 | 1: Files are identical. |
---|
| 1192 | |
---|
| 1193 | int |
---|
| 1194 | zfseek(pos) long pos; |
---|
| 1195 | Positions the input pointer on the current input file to the |
---|
| 1196 | given position. The pos argument is 0-based, the offset |
---|
| 1197 | (distance in bytes) from beginning of the file. Needed for |
---|
| 1198 | RESEND, PSEND, and other recovery operations. This function is |
---|
| 1199 | not necessarily possible on all systems, e.g. record-oriented |
---|
| 1200 | systems. It should only be used on binary files (i.e. files we |
---|
| 1201 | are sending in binary mode) and stream-oriented file systems. |
---|
| 1202 | Returns: |
---|
| 1203 | -1: on failure. |
---|
| 1204 | 0: On success. |
---|
| 1205 | |
---|
| 1206 | int |
---|
| 1207 | zchdir(dirnam) char *dirnam; |
---|
| 1208 | Changes current or default directory to the one given in |
---|
| 1209 | dirnam. Returns: |
---|
| 1210 | 0: On failure. |
---|
| 1211 | 1: on success. |
---|
| 1212 | |
---|
| 1213 | long |
---|
| 1214 | zchki(fn) char *fn; |
---|
| 1215 | Check to see if file with name fn is a regular, readable, |
---|
| 1216 | existing file, suitable for Kermit to send -- not a directory, |
---|
| 1217 | not a symbolic link, etc. Returns: |
---|
| 1218 | -3: if file exists but is not accessible (e.g. |
---|
| 1219 | read-protected); |
---|
| 1220 | -2: if file exists but is not of a readable type (e.g. a |
---|
| 1221 | directory); |
---|
| 1222 | -1: on error (e.g. file does not exist, or fn is garbage); |
---|
| 1223 | >=0: (length of file) if file exists and is readable. |
---|
| 1224 | Also see isdir(), zgetfs(). |
---|
| 1225 | |
---|
| 1226 | int |
---|
| 1227 | zchkpid(pid) unsigned long pid; |
---|
| 1228 | Returns: |
---|
| 1229 | 1: If the given process ID (e.g. pid in UNIX) is valid and |
---|
| 1230 | active |
---|
| 1231 | 0: otherwise. |
---|
| 1232 | |
---|
| 1233 | long |
---|
| 1234 | zgetfs(fn) char *fn; |
---|
| 1235 | Gets the size of the given file, regardless of accessibility. |
---|
| 1236 | Used for directory listings. Unlike zchki(), should return the |
---|
| 1237 | size of any kind of file, even a directory. zgetfs() also |
---|
| 1238 | should serve as a mini "get file info" function that can be |
---|
| 1239 | used until we design a better one, by also setting some global |
---|
| 1240 | variables: |
---|
| 1241 | int zgfs_link = 1/0 = file is (not) a symbolic link. |
---|
| 1242 | int zgfs_dir = 1/0 = file is (not) a directory. |
---|
| 1243 | char linkname[] = if zgfs_link != 0, name of file link points |
---|
| 1244 | to. |
---|
| 1245 | Returns: |
---|
| 1246 | -1: on error (e.g. file does not exist, or fn is garbage); |
---|
| 1247 | >=0: (length of file) if file exists and is readable. |
---|
| 1248 | |
---|
| 1249 | int |
---|
| 1250 | zchko(fn) char *fn; |
---|
| 1251 | Checks to see if a file of the given name can be created. |
---|
| 1252 | Returns: |
---|
| 1253 | -1: if file cannot be created, or on any kind of error. |
---|
| 1254 | 0: if file can be created. |
---|
| 1255 | |
---|
| 1256 | int |
---|
| 1257 | zchkspa(fn,len) char *f; long len; |
---|
| 1258 | Checks to see if there is sufficient space to store the file |
---|
| 1259 | named fn, which is len bytes long. If you can't write a |
---|
| 1260 | function to do this, then just make a dummy that always returns |
---|
| 1261 | 1; higher level code will recover from disk-full errors. The |
---|
| 1262 | receiving Kermit uses this function to refuse an incoming file |
---|
| 1263 | based on its size, via the attribute mechanism. Returns: |
---|
| 1264 | -1: on error. |
---|
| 1265 | 0: if there is not enough space. |
---|
| 1266 | 1: if there is enough space. |
---|
| 1267 | |
---|
| 1268 | int |
---|
| 1269 | zchin(n,c) int n; int *c; |
---|
| 1270 | Gets a character from file number n, return it in c (call with |
---|
| 1271 | &c). Returns: |
---|
| 1272 | -1: on failure, including EOF. |
---|
| 1273 | 0: on success with character in c. |
---|
| 1274 | |
---|
| 1275 | int |
---|
| 1276 | zchout(n,c) int n; char c; |
---|
| 1277 | Writes the character c to file number n. Returns: |
---|
| 1278 | -1: on error. |
---|
| 1279 | 0: on success. |
---|
| 1280 | |
---|
| 1281 | int |
---|
| 1282 | zclose(n) int n; |
---|
| 1283 | Closes file number n. Returns: |
---|
| 1284 | -1: on error. |
---|
| 1285 | 1: on success. |
---|
| 1286 | |
---|
| 1287 | int |
---|
| 1288 | zdelet(fn) char *name; |
---|
| 1289 | Attempts to delete (remove, erase) the named file. Returns: |
---|
| 1290 | -1: on error. |
---|
| 1291 | 1: if file was deleted successfully. |
---|
| 1292 | |
---|
| 1293 | char * |
---|
| 1294 | zgperm(char * f) |
---|
| 1295 | Returns a pointer to the system-dependent numeric |
---|
| 1296 | permissions/protection string for file f, or NULL upon failure. |
---|
| 1297 | Used if CK_PERMS is defined. |
---|
| 1298 | |
---|
| 1299 | char * |
---|
| 1300 | ziperm(char * f) |
---|
| 1301 | Returns a pointer to the system-dependent symbolic |
---|
| 1302 | permissions/protection string for file f, or NULL upon failure. |
---|
| 1303 | Used if CK_PERMS is defined. Example: In UNIX zgperm(f) might |
---|
| 1304 | return "100770", but ziperm() might return "-rwxrwx---". In |
---|
| 1305 | VMS, zgperm() would return a hexadecimal string, but ziperm() |
---|
| 1306 | would return something like "(RWED,RWED,RE,)". |
---|
| 1307 | |
---|
| 1308 | char * |
---|
| 1309 | zgtdir() |
---|
| 1310 | Returns a pointer to the name of the current directory, folder, |
---|
| 1311 | etc, or a NULL pointer if the current directory cannot be |
---|
| 1312 | determined. If possible, the directory specification should be |
---|
| 1313 | (a) fully specified, e.g. as a complete pathname, and (b) be |
---|
| 1314 | suitable for appending a filename. Thus, for example, Unix |
---|
| 1315 | directory names should end with '/'. VMS directory names should |
---|
| 1316 | look like DEV:[NAME] (rather than, say, NAME.DIR;1). |
---|
| 1317 | |
---|
| 1318 | char * |
---|
| 1319 | zhome() |
---|
| 1320 | Returns a pointer to a string containing the user's home |
---|
| 1321 | directory, or NULL upon error. Should be formatted like |
---|
| 1322 | zgtdir() (q.v.). |
---|
| 1323 | |
---|
| 1324 | int |
---|
| 1325 | zinfill() |
---|
| 1326 | Fill buffer from input file. This function is used by the macro |
---|
| 1327 | zminchar(), which is defined in ckcker.h. zminchar() manages |
---|
| 1328 | its own buffer, and calls zinfill() to fill it whenever it |
---|
| 1329 | becomes empty. It is used only for sending files, and reads |
---|
| 1330 | characters only from file number ZIFILE. zinfill() returns -1 |
---|
| 1331 | upon end of file, -2 upon fatal error, and -3 upon timeout |
---|
| 1332 | (e.g. when reading from a pipe); otherwise it returns the first |
---|
| 1333 | character from the buffer it just read. |
---|
| 1334 | |
---|
| 1335 | int |
---|
| 1336 | zkself() |
---|
| 1337 | Kills the current job, session, process, etc, logs out, |
---|
| 1338 | disappears. Used by the Kermit server when it receives a BYE |
---|
| 1339 | command. On failure, returns -1. On success, does not return at |
---|
| 1340 | all! This function should not be called until all other steps |
---|
| 1341 | have been taken to close files, etc. |
---|
| 1342 | |
---|
| 1343 | VOID |
---|
| 1344 | zstrip(fn,&fn2) char *fn1, **fn2; |
---|
| 1345 | Strips device and directory, etc, from file specification fn, |
---|
| 1346 | leaving only the filename (including "extension" or "filetype" |
---|
| 1347 | -- the part after the dot). For example DUA0:[PROGRAMS]OOFA.C;3 |
---|
| 1348 | becomes OOFA.C, or /usr/fdc/oofa.c becomes oofa.c. Returns a |
---|
| 1349 | pointer to result in fn2. |
---|
| 1350 | |
---|
| 1351 | int |
---|
| 1352 | zsetperm(char * file, unsigned int code) |
---|
| 1353 | Set permissions of file to given system-dependent code. 0: On |
---|
| 1354 | failure. |
---|
| 1355 | 1: on success. |
---|
| 1356 | |
---|
| 1357 | int |
---|
| 1358 | zsetroot(char * dir) |
---|
| 1359 | Sets the root for the user's file access, like Unix chroot(), |
---|
| 1360 | but does not require privilege. In Unix, this must be |
---|
| 1361 | implemented entirely by Kermit's own file access routines. |
---|
| 1362 | Returns: |
---|
| 1363 | 1: Success |
---|
| 1364 | -1: Invalid argument |
---|
| 1365 | -2: |
---|
| 1366 | -3: Internal error |
---|
| 1367 | -4: Access to given directory denied |
---|
| 1368 | -5: New root not within old root |
---|
| 1369 | |
---|
| 1370 | int |
---|
| 1371 | zinroot(char * file) |
---|
| 1372 | If no root is set (zsetroot()), returns 1. |
---|
| 1373 | Otherwise, if given file is in the root, returns 1. |
---|
| 1374 | Otherwise, returns 0. |
---|
| 1375 | |
---|
| 1376 | VOID |
---|
| 1377 | zltor(fn,fn2) char *fn1, *fn2; |
---|
| 1378 | Local-To-Remote filename translation. OBSOLETE: replaced by |
---|
| 1379 | nzltor() (q.v.). Translates the local filename fn into a format |
---|
| 1380 | suitable for transmission to an arbitrary type of computer, and |
---|
| 1381 | copies the result into the buffer pointed to by fn2. |
---|
| 1382 | Translation may involve (a) stripping the device and/or |
---|
| 1383 | directory/path name, (b) converting lowercase to uppercase, (c) |
---|
| 1384 | removing spaces and strange characters, or converting them to |
---|
| 1385 | some innocuous alphabetic character like X, (d) discarding or |
---|
| 1386 | converting extra periods (there should not be more than one). |
---|
| 1387 | Does its best. Returns no value. name2 is a pointer to a |
---|
| 1388 | buffer, furnished by the caller, into which zltor() writes the |
---|
| 1389 | resulting name. No length checking is done. |
---|
| 1390 | |
---|
| 1391 | #ifdef NZLTOR |
---|
| 1392 | VOID |
---|
| 1393 | nzltor(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int |
---|
| 1394 | convert,pathnames,max; |
---|
| 1395 | Replaces zltor(). This new version handles pathnames and checks |
---|
| 1396 | length. fn1 and fn2 are as in zltor(). This version is called |
---|
| 1397 | unconditionally for each file, rather than only when filename |
---|
| 1398 | conversion is enabled. Pathnames can have the following values: |
---|
| 1399 | |
---|
| 1400 | PATH_OFF: Pathname, if any, is to be stripped |
---|
| 1401 | PATH_REL: The relative pathname is to be included |
---|
| 1402 | PATH_ABS: The full pathname is to be included |
---|
| 1403 | |
---|
| 1404 | After handling pathnames, conversion is done to the result as |
---|
| 1405 | in the zltor() description if convert != 0; if relative or |
---|
| 1406 | absolute pathnames are included, they are converted to UNIX |
---|
| 1407 | format, i.e. with slash (/) as the directory separator. The max |
---|
| 1408 | parameter specifies the maximum size of fn2. If convert > 0, |
---|
| 1409 | the regular conversions are done; if convert < 0, minimal |
---|
| 1410 | conversions are done (we skip uppercasing the letters, we allow |
---|
| 1411 | more than one period, etc; this can be used when we know our |
---|
| 1412 | partner is UNIX or similar). |
---|
| 1413 | |
---|
| 1414 | #endif /* NZLTOR */ |
---|
| 1415 | |
---|
| 1416 | int |
---|
| 1417 | nzxpand(fn,flags) char *fn; int flags; |
---|
| 1418 | Replaces zxpand(), which is obsolete as of C-Kermit 7.0. |
---|
| 1419 | Call with: |
---|
| 1420 | fn = Pointer to filename or pattern. |
---|
| 1421 | flags = option bits: |
---|
| 1422 | flags & ZX_FILONLY Match regular files |
---|
| 1423 | flags & ZX_DIRONLY Match directories |
---|
| 1424 | flags & ZX_RECURSE Descend through directory tree |
---|
| 1425 | flags & ZX_MATCHDOT Match "dot files" |
---|
| 1426 | flags & ZX_NOBACKUP Don't match "backup files" |
---|
| 1427 | flags & ZX_NOLINKS Don't follow symlinks. |
---|
| 1428 | |
---|
| 1429 | Returns the number of files that match fn, with data structures |
---|
| 1430 | set up so the first file (if any) will be returned by the next |
---|
| 1431 | znext() call. If ZX_FILONLY and ZX_DIRONLY are both set, or |
---|
| 1432 | neither one is set, files and directories are matched. Notes: |
---|
| 1433 | |
---|
| 1434 | 1. It is essential that the number returned by nzxpand() reflect |
---|
| 1435 | the actual number of filenames that will be returned by |
---|
| 1436 | znext() calls. In other words: |
---|
| 1437 | |
---|
| 1438 | for (n = nzxpand(string,flags); n > 0; n--) { |
---|
| 1439 | znext(buf); |
---|
| 1440 | printf("%s\n", buf); |
---|
| 1441 | } |
---|
| 1442 | should print all the file names; no more, no less. |
---|
| 1443 | 2. In UNIX, DOS, OS-9, etc, where directories contain entries |
---|
| 1444 | for themselves (.) and the superior directory (..), these |
---|
| 1445 | should NOT be included in the list under any circumstances, |
---|
| 1446 | including when ZX_MATCHDOT is set. |
---|
| 1447 | 3. Additional option bits might be added in the future, e.g. for |
---|
| 1448 | sorting (sort by date/name/size, reverse/ascending, etc). |
---|
| 1449 | Currently this is done only in higher level code (through a |
---|
| 1450 | hack in which the nzxpand() exports its filename array, which |
---|
| 1451 | is not portable because not all OS's can use this mechanism). |
---|
| 1452 | |
---|
| 1453 | int |
---|
| 1454 | zmail(addr,fn) char *addr, fn; |
---|
| 1455 | Send the local, existing file fn as e-mail to the address addr. |
---|
| 1456 | Returns: |
---|
| 1457 | 0: on success |
---|
| 1458 | 2: if mail delivered but temp file can't be deleted |
---|
| 1459 | -2: if mail can't be delivered |
---|
| 1460 | |
---|
| 1461 | int |
---|
| 1462 | zmkdir(path) char *path; |
---|
| 1463 | The path can be a file specification that might contain |
---|
| 1464 | directory information, in which the filename is expected to be |
---|
| 1465 | included, or an unambiguous directory specification (e.g. in |
---|
| 1466 | UNIX it must end with "/"). This routine attempts to create any |
---|
| 1467 | directories in the given path that don't already exist. Returns |
---|
| 1468 | 0 or greater success: no directories needed creation, or else |
---|
| 1469 | all directories that needed creation were created successfully; |
---|
| 1470 | the return code is the number of directories that were created. |
---|
| 1471 | Returns -1 on failure to create any of the needed directories. |
---|
| 1472 | |
---|
| 1473 | int |
---|
| 1474 | zrmdir(path) char *path; |
---|
| 1475 | Attempts to remove the given directory. Returns 0 on success, |
---|
| 1476 | -1 on failure. The detailed semantics are open -- should it |
---|
| 1477 | fail if the directory contains any files or subdirectories, |
---|
| 1478 | etc. It is probably best for this routine to behave in whatever |
---|
| 1479 | manner is customary on the underlying platform; e.g. in UNIX, |
---|
| 1480 | VMS, DOS, etc, where directories can not be removed unless they |
---|
| 1481 | are empty. |
---|
| 1482 | |
---|
| 1483 | VOID |
---|
| 1484 | znewn(fn,s) char *fn, **s; |
---|
| 1485 | Transforms the name fn into a filename that is guaranteed to be |
---|
| 1486 | unique. If the file fn does not exist, then the new name is the |
---|
| 1487 | same as fn; Otherwise, it's different. this function does its |
---|
| 1488 | best, returns no value. New name is created in caller's space. |
---|
| 1489 | Call like this: znewn(old,&new);. The second parameter is a |
---|
| 1490 | pointer to the new name. This pointer is set by znewn() to |
---|
| 1491 | point to a static string in its own space, so be sure to the |
---|
| 1492 | result to a safe place before calling this function again. |
---|
| 1493 | |
---|
| 1494 | int |
---|
| 1495 | znext(fn) char *fn; |
---|
| 1496 | Copies the next file name from a file list created by zxpand() |
---|
| 1497 | into the string pointed to by fn (see zxpand). If no more |
---|
| 1498 | files, then the null string is placed there. Returns 0 if there |
---|
| 1499 | are no more filenames, with 0th element the array pointed to by |
---|
| 1500 | fn set to NUL. If there is a filename, it is stored in the |
---|
| 1501 | array pointed to by fn and a positive number is returned. NOTE: |
---|
| 1502 | This is a change from earlier definitions of this function |
---|
| 1503 | (pre-1999), which returned the number of files remaining; thus |
---|
| 1504 | 0 was the return value when returning the final file. However, |
---|
| 1505 | no mainline code ever depended on the return value, so this |
---|
| 1506 | change should be safe. |
---|
| 1507 | |
---|
| 1508 | int |
---|
| 1509 | zopeni(n,fn) int n; char *fn; |
---|
| 1510 | Opens the file named fn for input as file number n. Returns: |
---|
| 1511 | 0: on failure. |
---|
| 1512 | 1: on success. |
---|
| 1513 | |
---|
| 1514 | int |
---|
| 1515 | zopeno(n,fn,zz,fcb) int n; char *name; struct zattr *zz; struct |
---|
| 1516 | filinfo *fcb; |
---|
| 1517 | Attempts to open the named file for output as file number n. zz |
---|
| 1518 | is a Kermit file attribute structure as defined in ckcdeb.h, |
---|
| 1519 | containing various information about the file, including its |
---|
| 1520 | size, creation date, and so forth. This function should attempt |
---|
| 1521 | to honor as many of these as possible. fcb is a "file control |
---|
| 1522 | block" in the traditional sense, defined in ckcdeb.h, |
---|
| 1523 | containing information relevant to complicated file systems |
---|
| 1524 | like VMS (RMS), IBM MVS, etc, like blocksize, record length, |
---|
| 1525 | organization, record format, carriage control, etc. Returns: |
---|
| 1526 | 0: on failure. |
---|
| 1527 | 1: on success. |
---|
| 1528 | |
---|
| 1529 | int |
---|
| 1530 | zoutdump() |
---|
| 1531 | Dumps a file output buffer. Used with the macro zmchout() |
---|
| 1532 | defined in ckcker.h. Used only with file number ZOFILE, i.e. |
---|
| 1533 | the file that is being received by Kermit during file transfer. |
---|
| 1534 | Returns: |
---|
| 1535 | -1: on failure. |
---|
| 1536 | 0: on success. |
---|
| 1537 | |
---|
| 1538 | int |
---|
| 1539 | zprint(p,fn) char *p, *f; |
---|
| 1540 | Prints the file with name fn on a local printer, with options |
---|
| 1541 | p. Returns: |
---|
| 1542 | 0: on success |
---|
| 1543 | 3: if file sent to printer but can't be deleted |
---|
| 1544 | -3: if file can't be printed |
---|
| 1545 | |
---|
| 1546 | int |
---|
| 1547 | zrename(fn,fn2) char *fn, *fn2; |
---|
| 1548 | Changes the name of file fn to fn2. If fn2 is the name of an |
---|
| 1549 | existing directory, or a file-structured device, then file fn |
---|
| 1550 | is moved to that directory or device, keeping its original |
---|
| 1551 | name. If fn2 lacks a directory separator when passed to this |
---|
| 1552 | function, an appropriate one is supplied. Returns: |
---|
| 1553 | -1: on failure. |
---|
| 1554 | 0: on success. |
---|
| 1555 | |
---|
| 1556 | int |
---|
| 1557 | zcopy(source,dest) char * source, * dest; |
---|
| 1558 | Copies the source file to the destination. One file only. No |
---|
| 1559 | wildcards. The destination string may be a filename or a |
---|
| 1560 | directory name. Returns: |
---|
| 1561 | 0: on success. |
---|
| 1562 | <0: on failure: |
---|
| 1563 | -2: source file is not a regular file. |
---|
| 1564 | -3: source file not found. |
---|
| 1565 | -4: permission denied. |
---|
| 1566 | -5: source and destination are the same file. |
---|
| 1567 | -6: i/o error. |
---|
| 1568 | -1: other error. |
---|
| 1569 | |
---|
| 1570 | char * |
---|
| 1571 | zlocaltime(char *) |
---|
| 1572 | Call with: "yyyymmdd hh:mm:ss" GMT/UTC date-time. Returns |
---|
| 1573 | pointer to local date-time string "yyyymmdd hh:mm:ss" on |
---|
| 1574 | success, NULL on failure. |
---|
| 1575 | |
---|
| 1576 | VOID |
---|
| 1577 | zrtol(fn,fn2) char *fn, *fn2; |
---|
| 1578 | Remote-To-Local filename translation. OBSOLETE: replaced by |
---|
| 1579 | nzrtol(). Translates a "standard" filename to a local filename. |
---|
| 1580 | For example, in Unix this function might convert an |
---|
| 1581 | all-uppercase name to lowercase, but leave lower- or mix-case |
---|
| 1582 | names alone. Does its best, returns no value. New name is in |
---|
| 1583 | string pointed to by fn2. No length checking is done. |
---|
| 1584 | |
---|
| 1585 | #ifdef NZLTOR |
---|
| 1586 | |
---|
| 1587 | int |
---|
| 1588 | nzrtol(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int |
---|
| 1589 | convert,pathnames,max; |
---|
| 1590 | Replaces zrtol. Like zrtol but handles pathnames and checks |
---|
| 1591 | length. See nzltor for detailed description of parameters. |
---|
| 1592 | |
---|
| 1593 | #endif /* NZLTOR */ |
---|
| 1594 | |
---|
| 1595 | int |
---|
| 1596 | zsattr(xx) struct zattr *xx; |
---|
| 1597 | Fills in a Kermit file attribute structure for the file which |
---|
| 1598 | is to be sent, namely the currently open ZIFILE. Note that this |
---|
| 1599 | is not a very good design, but we're stuck with it. Callers |
---|
| 1600 | must ensure that zsattr() is called only on real files, not on |
---|
| 1601 | pipes, internally generated file-like objects such as server |
---|
| 1602 | REMOTE command responses, etc. Returns: |
---|
| 1603 | -1: on failure. |
---|
| 1604 | 0: on success with the structure filled in. |
---|
| 1605 | If any string member is null, it should be ignored by the |
---|
| 1606 | caller. |
---|
| 1607 | If any numeric member is -1, it should be ignored by the |
---|
| 1608 | caller. |
---|
| 1609 | |
---|
| 1610 | int |
---|
| 1611 | zshcmd(s) char *s; |
---|
| 1612 | s contains to pointer to a command to be executed by the host |
---|
| 1613 | computer's shell, command parser, or operating system. If the |
---|
| 1614 | system allows the user to choose from a variety of command |
---|
| 1615 | processors (shells), then this function should employ the |
---|
| 1616 | user's preferred shell. If possible, the user's job |
---|
| 1617 | (environment, process, etc) should be set up to catch keyboard |
---|
| 1618 | interruption signals to allow the user to halt the system |
---|
| 1619 | command and return to Kermit. The command must run in ordinary, |
---|
| 1620 | unprivileged user mode. If possible, this function should |
---|
| 1621 | return -1 on failure to start the command, or else it should |
---|
| 1622 | return 1 if the command succeeded and 0 if it failed. |
---|
| 1623 | |
---|
| 1624 | int |
---|
| 1625 | pexitstatus |
---|
| 1626 | zshcmd() and zsyscmd() should set this to the command's actual |
---|
| 1627 | exit status code if possible. |
---|
| 1628 | |
---|
| 1629 | int |
---|
| 1630 | zsyscmd(s) char *s; |
---|
| 1631 | s contains to pointer to a command to be executed by the host |
---|
| 1632 | computer's shell, command parser, or operating system. If the |
---|
| 1633 | system allows the user to choose from a variety of command |
---|
| 1634 | processors (shells), then this function should employ the |
---|
| 1635 | system standard shell (e.g. /bin/sh for Unix), so that the |
---|
| 1636 | results will always be the same for everybody. If possible, the |
---|
| 1637 | user's job (environment, process, etc) should be set up to |
---|
| 1638 | catch keyboard interruption signals to allow the user to halt |
---|
| 1639 | the system command and return to Kermit. The command must run |
---|
| 1640 | in ordinary, unprivileged user mode. If possible, this function |
---|
| 1641 | should return -1 on failure to start the command, or else it |
---|
| 1642 | should return 1 if the command succeeded and 0 if it failed. |
---|
| 1643 | |
---|
| 1644 | VOID |
---|
| 1645 | z_exec(s,args) char * s; char * args[]; |
---|
| 1646 | This one executes the command s (which is searched for using |
---|
| 1647 | the system's normal searching mechanism, such as PATH in UNIX), |
---|
| 1648 | with the given argument vector, which follows the conventions |
---|
| 1649 | of UNIX argv[]: the name of the command pointed to by element |
---|
| 1650 | 0, the first arg by element 1, and so on. A null args[] pointer |
---|
| 1651 | indicates the end of the arugment list. All open files must |
---|
| 1652 | remain open so the exec'd process can use them. Returns only if |
---|
| 1653 | unsuccessful. |
---|
| 1654 | |
---|
| 1655 | int |
---|
| 1656 | zsinl(n,s,x) int n, x; char *s; |
---|
| 1657 | Reads a line from file number n. Writes the line into the |
---|
| 1658 | address s provided by the caller. Writing terminates when |
---|
| 1659 | newline is read, but with newline discarded. Writing also |
---|
| 1660 | terminates upon EOF or if length x is exhausted. Returns: |
---|
| 1661 | -1: on EOF or error. |
---|
| 1662 | 0: on success. |
---|
| 1663 | |
---|
| 1664 | int |
---|
| 1665 | zsout(n,s) int n; char *s; |
---|
| 1666 | Writes the string s out to file number n. Returns: |
---|
| 1667 | -1: on failure. |
---|
| 1668 | 0: on success. |
---|
| 1669 | |
---|
| 1670 | int |
---|
| 1671 | zsoutl(n,s) int n; char *s; |
---|
| 1672 | Writes the string s out to file number n and adds a line |
---|
| 1673 | (record) terminator (boundary) appropriate for the system and |
---|
| 1674 | the file format. Returns: |
---|
| 1675 | -1: on failure. |
---|
| 1676 | 0: on success. |
---|
| 1677 | |
---|
| 1678 | int |
---|
| 1679 | zsoutx(n,s,x) int n, x; char *s; |
---|
| 1680 | Writes exactly x characters from string s to file number n. If |
---|
| 1681 | s has fewer than x characters, then the entire string s is |
---|
| 1682 | written. Returns: |
---|
| 1683 | -1: on failure. |
---|
| 1684 | >= 0: on success, the number of characters actually written. |
---|
| 1685 | |
---|
| 1686 | int |
---|
| 1687 | zstime(fn,yy,x) char *fn; struct zattr *yy; int x; |
---|
| 1688 | Sets the creation date (and other attributes) of an existing |
---|
| 1689 | file, or compares a file's creation date with a given date. |
---|
| 1690 | Call with: |
---|
| 1691 | fn: pointer to name of existing file. |
---|
| 1692 | yy: Pointer to a Kermit file attribute structure in which |
---|
| 1693 | yy->date.val is a date of the form yyyymmdd hh:mm:ss, e.g. |
---|
| 1694 | 19900208 13:00:00, which is to be used for setting or comparing |
---|
| 1695 | the file date. Other attributes in the struct can also be set, |
---|
| 1696 | such as the protection/permission (See [110]Appendix I), when |
---|
| 1697 | it makes sense (e.g. "yy->lprotect.val" can be set if the |
---|
| 1698 | remote system ID matches the local one). |
---|
| 1699 | x: A function code: 0 means to set the file's creation date as |
---|
| 1700 | given. 1 means compare the date from the yy struct with the |
---|
| 1701 | file's date. |
---|
| 1702 | Returns: |
---|
| 1703 | -1: on any kind of error. |
---|
| 1704 | 0: if x is 0 and the file date was set successfully. |
---|
| 1705 | 0: if x is 1 and date from attribute structure > file |
---|
| 1706 | creation date. |
---|
| 1707 | 1: if x is 1 and date from attribute structure <= file |
---|
| 1708 | creation date. |
---|
| 1709 | |
---|
| 1710 | VOID |
---|
| 1711 | zstrip(name,name2) char *name, **name2; |
---|
| 1712 | Strips pathname from filename "name". Constructs the resulting |
---|
| 1713 | string in a static buffer in its own space and returns a |
---|
| 1714 | pointer to it in name2. Also strips device name, file version |
---|
| 1715 | numbers, and other "non-name" material. |
---|
| 1716 | |
---|
| 1717 | int |
---|
| 1718 | zxcmd(n,s) char *s; |
---|
| 1719 | Runs a system command so its output can be accessed as if it |
---|
| 1720 | were file n. The command is run in ordinary, unprivileged user |
---|
| 1721 | mode. |
---|
| 1722 | If n is ZSTDIO or ZCTERM, returns -1. |
---|
| 1723 | If n is ZIFILE or ZRFILE, then Kermit reads from the command, |
---|
| 1724 | otherwise Kermit writes to the command. |
---|
| 1725 | Returns 0 on error, 1 on success. |
---|
| 1726 | |
---|
| 1727 | int |
---|
| 1728 | zxpand(fn) char *fn; |
---|
| 1729 | OBSOLETE: Replaced by nzxpand(), q.v. |
---|
| 1730 | |
---|
| 1731 | #ifdef ZXREWIND |
---|
| 1732 | |
---|
| 1733 | int |
---|
| 1734 | zxrewind() |
---|
| 1735 | Returns the number of files returned by the most recent |
---|
| 1736 | nzxpand() call, and resets the list to the beginning so the |
---|
| 1737 | next znext() call returns the first file. Returns -1 if zxpand |
---|
| 1738 | has not yet been called. If this function is available, |
---|
| 1739 | ZXREWIND should be defined; otherwise it should not be |
---|
| 1740 | referenced. |
---|
| 1741 | |
---|
| 1742 | #endif /* ZXREWIND */ |
---|
| 1743 | |
---|
| 1744 | int |
---|
| 1745 | xsystem(cmd) char *cmd; |
---|
| 1746 | Executes the system command without redirecting any of its i/o, |
---|
| 1747 | similar (well, identical) to system() in Unix. But before |
---|
| 1748 | passing the command to the system, xsystem() ensures that all |
---|
| 1749 | privileges are turned off, so that the system command executes |
---|
| 1750 | in ordinary unprivileged user mode. If possible, xsystem() |
---|
| 1751 | returns the return code of the command that was executed. |
---|
| 1752 | |
---|
| 1753 | 4.E.2.2. IKSD Variables and Functions |
---|
| 1754 | |
---|
| 1755 | These must be implemented in any C-Kermit version that is to be |
---|
| 1756 | installed as an Internet Kermit Service Daemon (IKSD). IKSD is |
---|
| 1757 | expected to be started by the Internet Daemon (e.g. inetd) with its |
---|
| 1758 | standard i/o redirected to the incoming connection. |
---|
| 1759 | |
---|
| 1760 | int ckxanon; |
---|
| 1761 | Nonzero if anonymous logins allowed. |
---|
| 1762 | |
---|
| 1763 | extern int inserver; |
---|
| 1764 | Nonzero if started in IKSD mode. |
---|
| 1765 | |
---|
| 1766 | extern int isguest; |
---|
| 1767 | Nonzero if IKSD and user logged in anonymously. |
---|
| 1768 | |
---|
| 1769 | extern char * homdir; |
---|
| 1770 | Pointer to user's home directory. |
---|
| 1771 | |
---|
| 1772 | extern char * anonroot; |
---|
| 1773 | Pointer to file-system root for anonymous users. |
---|
| 1774 | |
---|
| 1775 | Existing functions must make "if (inserver && isguest)" checks for |
---|
| 1776 | actions that would not be legal for guests: zdelete(), zrmdir(), |
---|
| 1777 | zprint(), zmail(), etc. |
---|
| 1778 | |
---|
| 1779 | int |
---|
| 1780 | zvuser(name) char * name; |
---|
| 1781 | Verifies that user "name" exists and is allowed to log in. If |
---|
| 1782 | the name is "ftp" or "anonymous" and ckxanon != 0, a guest |
---|
| 1783 | login is set up. Returns 0 if user not allowed to log in, |
---|
| 1784 | nonzero if user may log in. |
---|
| 1785 | |
---|
| 1786 | int |
---|
| 1787 | zvpass(string) char * string; |
---|
| 1788 | Verifies password of the user from the most recent zvuser() |
---|
| 1789 | call. Returns nonzero if password is valid for user, 0 if it |
---|
| 1790 | isn't. Makes any appropriate system log entries (IKSD logins, |
---|
| 1791 | failed login attempts, etc). If password is valid, logs the |
---|
| 1792 | user in as herself (if real user), or sets up restricted |
---|
| 1793 | anonymous access if user is guest (e.g. changes file-system |
---|
| 1794 | root to anonroot and sets isguest = 1). |
---|
| 1795 | |
---|
| 1796 | VOID |
---|
| 1797 | zsyslog() |
---|
| 1798 | Begins any desired system logging of an IKSD session. |
---|
| 1799 | |
---|
| 1800 | VOID |
---|
| 1801 | zvlogout() |
---|
| 1802 | Terminates an IKSD session. In most cases this is simply a |
---|
| 1803 | wrapper for exit() or doexit(), with some system logging added. |
---|
| 1804 | |
---|
| 1805 | 4.E.2.3. Privilege Functions |
---|
| 1806 | |
---|
| 1807 | These functions are used by C-Kermit to adapt itself to operating |
---|
| 1808 | systems where the program can be made to run in a "privileged" mode, |
---|
| 1809 | e.g. setuid or setgid in Unix. C-Kermit should NOT read and write |
---|
| 1810 | files or start subprocesses as a privileged program. This would |
---|
| 1811 | present a serious threat to system security. The security package has |
---|
| 1812 | been installed to prevent such security breaches by turning off the |
---|
| 1813 | program's special privileges at all times except when they are needed. |
---|
| 1814 | |
---|
| 1815 | In UNIX, the only need Kermit has for privileged status is access to |
---|
| 1816 | the UUCP lockfile directory, in order to read, create, and destroy |
---|
| 1817 | lockfiles, and to open communication devices that are normally |
---|
| 1818 | protected against the user (see the [111]Unix C-Kermit Installation |
---|
| 1819 | Instructions for discussion). Therefore, privileges should only be |
---|
| 1820 | enabled for these operations and disabled at all other times. This |
---|
| 1821 | relieves the programmer of the responsibility of putting expensive and |
---|
| 1822 | unreliable access checks around every file access and subprocess |
---|
| 1823 | creation. |
---|
| 1824 | |
---|
| 1825 | Strictly speaking, these functions are not required in all C-Kermit |
---|
| 1826 | implementations, because their use (so far, at least) is internal to |
---|
| 1827 | the Group E modules. However, they should be included in all C-Kermit |
---|
| 1828 | implementations for operating systems that support the notion of a |
---|
| 1829 | privileged program (UNIX, RSTS/E, what others?). |
---|
| 1830 | |
---|
| 1831 | int |
---|
| 1832 | priv_ini() |
---|
| 1833 | Determine whether the program is running in privileged status. |
---|
| 1834 | If so, turn off the privileges, in such a way that they can be |
---|
| 1835 | turned on again when needed. Called from sysinit() at program |
---|
| 1836 | startup time. Returns: |
---|
| 1837 | 0 on success |
---|
| 1838 | nonzero on failure, in which case the program should halt |
---|
| 1839 | immediately. |
---|
| 1840 | |
---|
| 1841 | int |
---|
| 1842 | priv_on() |
---|
| 1843 | If the program is not privileged, this function does nothing. |
---|
| 1844 | If the program is privileged, this function returns it to |
---|
| 1845 | privileged status. priv_ini() must have been called first. |
---|
| 1846 | Returns: |
---|
| 1847 | 0 on success |
---|
| 1848 | nonzero on failure |
---|
| 1849 | |
---|
| 1850 | int |
---|
| 1851 | priv_off() |
---|
| 1852 | Turns privileges off (if they are on) in such a way that they |
---|
| 1853 | can be turned back on again. Returns: |
---|
| 1854 | 0 on success |
---|
| 1855 | nonzero on failure |
---|
| 1856 | |
---|
| 1857 | int |
---|
| 1858 | priv_can() |
---|
| 1859 | Turns privileges off in such a way that they cannot be turned |
---|
| 1860 | back on. Returns: |
---|
| 1861 | 0 on success |
---|
| 1862 | nonzero on failure |
---|
| 1863 | |
---|
| 1864 | int |
---|
| 1865 | priv_chk() |
---|
| 1866 | Attempts to turns privileges off in such a way that they can be |
---|
| 1867 | turned on again later. Then checks to make sure that they were |
---|
| 1868 | really turned off. If they were not really turned off, then |
---|
| 1869 | they are cancelled permanently. Returns: |
---|
| 1870 | 0 on success |
---|
| 1871 | nonzero on failure |
---|
| 1872 | |
---|
| 1873 | 4.E.2.4. Console-Related Functions |
---|
| 1874 | |
---|
| 1875 | These relate to the program's "console", or controlling terminal, i.e. |
---|
| 1876 | the terminal that the user is logged in on and types commands at, or |
---|
| 1877 | on a PC or workstation, the actual keyboard and screen. |
---|
| 1878 | |
---|
| 1879 | int |
---|
| 1880 | conbin(esc) char esc; |
---|
| 1881 | Puts the console into "binary" mode, so that Kermit's command |
---|
| 1882 | parser can control echoing and other treatment of characters |
---|
| 1883 | that the user types. esc is the character that will be used to |
---|
| 1884 | get Kermit's attention during packet mode; puts this in a |
---|
| 1885 | global place. Sets the ckxech variable. Returns: |
---|
| 1886 | -1: on error. |
---|
| 1887 | 0: on success. |
---|
| 1888 | |
---|
| 1889 | int |
---|
| 1890 | concb(esc) char esc; |
---|
| 1891 | Put console in "cbreak" (single-character wakeup) mode. That |
---|
| 1892 | is, ensure that each console character is available to the |
---|
| 1893 | program immediately when the user types it. Otherwise just like |
---|
| 1894 | conbin(). Returns: |
---|
| 1895 | -1: on error. |
---|
| 1896 | 0: on success. |
---|
| 1897 | |
---|
| 1898 | int |
---|
| 1899 | conchk() |
---|
| 1900 | Returns a number, 0 or greater, the number of characters |
---|
| 1901 | waiting to be read from the console, i.e. the number of |
---|
| 1902 | characters that the user has typed that have not been read yet |
---|
| 1903 | by Kermit. |
---|
| 1904 | |
---|
| 1905 | long |
---|
| 1906 | congspd(); |
---|
| 1907 | Returns the speed ("baud rate") of the controlling terminal, if |
---|
| 1908 | known, otherwise -1L. |
---|
| 1909 | |
---|
| 1910 | int |
---|
| 1911 | congks(timo) int timo; |
---|
| 1912 | Get Keyboard Scancode. Reads a keyboard scan code from the |
---|
| 1913 | physical console keyboard. If the timo parameter is greater |
---|
| 1914 | than zero, then times out and returns -2 if no character |
---|
| 1915 | appears within the given number of seconds. Upon any other kind |
---|
| 1916 | of error, returns -1. Upon success returns a scan code, which |
---|
| 1917 | may be any positive integer. For situations where scan codes |
---|
| 1918 | cannot be read (for example, when an ASCII terminal is used as |
---|
| 1919 | the job's controlling terminal), this function is identical to |
---|
| 1920 | coninc(), i.e. it returns an 8-bit character value. congks() is |
---|
| 1921 | for use with workstations whose keyboards have Alternate, |
---|
| 1922 | Command, Option, and similar modifier keys, and Function keys |
---|
| 1923 | that generate codes greater than 255. |
---|
| 1924 | |
---|
| 1925 | int |
---|
| 1926 | congm() |
---|
| 1927 | Console get modes. Gets the current console terminal modes and |
---|
| 1928 | saves them so that conres() can restore them later. Returns 1 |
---|
| 1929 | if it got the modes OK, 0 if it did nothing (e.g. because |
---|
| 1930 | Kermit is not connected with any terminal), -1 on error. |
---|
| 1931 | |
---|
| 1932 | int |
---|
| 1933 | coninc(timo) int timo; |
---|
| 1934 | Console Input Character. Reads a character from the console. If |
---|
| 1935 | the timo parameter is greater than zero, then coninc() times |
---|
| 1936 | out and returns -2 if no character appears within the given |
---|
| 1937 | number of seconds. Upon any other kind of error, returns -1. |
---|
| 1938 | Upon success, returns the character itself, with a value in the |
---|
| 1939 | range 0-255 decimal. |
---|
| 1940 | |
---|
| 1941 | VOID |
---|
| 1942 | conint(f,s) SIGTYP (*f)(), (*s)(); |
---|
| 1943 | Sets the console to generate an interrupt if the user types a |
---|
| 1944 | keyboard interrupt character, and to transfer control the |
---|
| 1945 | signal-handling function f. For systems with job control, s is |
---|
| 1946 | the address of the function that suspends the job. Sets the |
---|
| 1947 | global variable "backgrd" to zero if Kermit is running in the |
---|
| 1948 | foreground, and to nonzero if Kermit is running in the |
---|
| 1949 | background. See ckcdeb.h for the definition of SIGTYP. No |
---|
| 1950 | return value. |
---|
| 1951 | |
---|
| 1952 | VOID |
---|
| 1953 | connoi() |
---|
| 1954 | Console no interrupts. Disable keyboard interrupts on the |
---|
| 1955 | console. No return value. |
---|
| 1956 | |
---|
| 1957 | int |
---|
| 1958 | conoc(c) char c; |
---|
| 1959 | Writes character c to the console terminal. Returns: |
---|
| 1960 | 0 on failure, 1 on success. |
---|
| 1961 | |
---|
| 1962 | int |
---|
| 1963 | conol(s) char *s; |
---|
| 1964 | Writes string s to the console. Returns -1 on error, 0 or |
---|
| 1965 | greater on success. |
---|
| 1966 | |
---|
| 1967 | int |
---|
| 1968 | conola(s) char *s[]; { |
---|
| 1969 | Writes an array of strings to the console. Returns -1 on error, |
---|
| 1970 | 0 or greater on success. |
---|
| 1971 | |
---|
| 1972 | int |
---|
| 1973 | conoll(s) char *s; |
---|
| 1974 | Writes string s to the console, followed by the necessary line |
---|
| 1975 | termination characters to put the console cursor at the |
---|
| 1976 | beginning of the next line. Returns -1 on error, 0 or greater |
---|
| 1977 | on success. |
---|
| 1978 | |
---|
| 1979 | int |
---|
| 1980 | conres() |
---|
| 1981 | Restores the console terminal to the modes obtained by congm(). |
---|
| 1982 | Returns: -1 on error, 0 on success. |
---|
| 1983 | |
---|
| 1984 | int |
---|
| 1985 | conxo(x,s) int x; char *s; |
---|
| 1986 | Write x characters from string s to the console. Returns 0 or |
---|
| 1987 | greater on success, -1 on error. |
---|
| 1988 | |
---|
| 1989 | char * |
---|
| 1990 | conkbg(); |
---|
| 1991 | Returns a pointer to the designator of the console keyboard |
---|
| 1992 | type. For example, on a PC, this function would return "88", |
---|
| 1993 | "101", etc. Upon failure, returns a pointer to the empty |
---|
| 1994 | string. |
---|
| 1995 | |
---|
| 1996 | 4.E.2.5. Communications Functions |
---|
| 1997 | |
---|
| 1998 | The communication device is the device used for terminal emulation and |
---|
| 1999 | file transfer. It may or may not be the same device as the console, |
---|
| 2000 | and it may or may not be a terminal (serial-port) device; it could |
---|
| 2001 | also be a network connection. For brevity, the communication device is |
---|
| 2002 | referred to here as the "tty". When the communication device is the |
---|
| 2003 | same as the console device, Kermit is said to be in remote mode. When |
---|
| 2004 | the two devices are different, Kermit is in local mode. |
---|
| 2005 | |
---|
| 2006 | int |
---|
| 2007 | ttchk() |
---|
| 2008 | Returns the number of characters that have arrived at the |
---|
| 2009 | communication device but have not yet been read by ttinc(), |
---|
| 2010 | ttinl(), and friends. If communication input is buffered (and |
---|
| 2011 | it should be), this is the sum of the number of unread |
---|
| 2012 | characters in Kermit's buffer PLUS the number of unread |
---|
| 2013 | characters in the operating system's internal buffer. The call |
---|
| 2014 | must be nondestructive and nonblocking, and as inexpensive as |
---|
| 2015 | possible. Returns: |
---|
| 2016 | 0: or greater on success, |
---|
| 2017 | 0: in case of internal error, |
---|
| 2018 | -1: or less when it determines the connection has been broken, |
---|
| 2019 | or there is no connection. |
---|
| 2020 | |
---|
| 2021 | That is, a negative return from ttchk() should reliably |
---|
| 2022 | indicate that there is no usable connection. Furthermore, |
---|
| 2023 | ttchk() should be callable at any time to see if the connection |
---|
| 2024 | is open. When the connection is open, every effort must be made |
---|
| 2025 | to ensure that ttchk returns an accurate number of characters |
---|
| 2026 | waiting to be read, rather than just 0 (no characters) or 1 (1 |
---|
| 2027 | or more characters), as would be the case when we use select(). |
---|
| 2028 | This aspect of ttchk's operation is critical to successful |
---|
| 2029 | operation of sliding windows and streaming, but "nondestructive |
---|
| 2030 | buffer peeking" is an obscure operating system feature, and so |
---|
| 2031 | when it is not available, we have to do it ourselves by |
---|
| 2032 | managing our own internal buffer at a level below ttinc(), |
---|
| 2033 | ttinl(), etc, as in the UNIX version (non-FIONREAD case). |
---|
| 2034 | |
---|
| 2035 | An external global variable, clsondisc, if nonzero, means that |
---|
| 2036 | if a serial connection drops (carrier on-to-off transition |
---|
| 2037 | detected by ttchk()), the device should be closed and released |
---|
| 2038 | automatically. |
---|
| 2039 | |
---|
| 2040 | int |
---|
| 2041 | ttclos() |
---|
| 2042 | Closes the communication device (tty or network). If there were |
---|
| 2043 | any kind of exclusive access locks connected with the tty, |
---|
| 2044 | these are released. If the tty has a modem connection, it is |
---|
| 2045 | hung up. For true tty devices, the original tty device modes |
---|
| 2046 | are restored. Returns: |
---|
| 2047 | -1: on failure. |
---|
| 2048 | 0: on success. |
---|
| 2049 | |
---|
| 2050 | int |
---|
| 2051 | ttflui() |
---|
| 2052 | Flush communications input buffer. If any characters have |
---|
| 2053 | arrived but have not yet been read, discard these characters. |
---|
| 2054 | If communications input is buffered by Kermit (and it should |
---|
| 2055 | be), this function flushes Kermit's buffer as well as the |
---|
| 2056 | operating system's internal input buffer. Returns: |
---|
| 2057 | -1: on failure. |
---|
| 2058 | 0: on success. |
---|
| 2059 | |
---|
| 2060 | int |
---|
| 2061 | ttfluo() |
---|
| 2062 | Flush tty output buffer. If any characters have been written |
---|
| 2063 | but not actually transmitted (e.g. because the system has been |
---|
| 2064 | flow-controlled), remove them from the system's output buffer. |
---|
| 2065 | (Note, this function is not actually used, but it is |
---|
| 2066 | recommended that all C-Kermit programmers add it for future |
---|
| 2067 | use, even if it is only a dummy function that returns 0 |
---|
| 2068 | always.) |
---|
| 2069 | |
---|
| 2070 | int |
---|
| 2071 | ttgmdm() |
---|
| 2072 | Looks for the modem signals CTS, DSR, and CTS, and returns |
---|
| 2073 | those that are on in as its return value, in a bit mask as |
---|
| 2074 | described for ttwmdm, in which a bit is on (1) or off (0) |
---|
| 2075 | according to whether the corresponding signal is on (asserted) |
---|
| 2076 | or off (not asserted). Return values: |
---|
| 2077 | -3: Not implemented |
---|
| 2078 | -2: if the line does not have modem control |
---|
| 2079 | -1: on error |
---|
| 2080 | >=0: on success, with bit mask containing the modem signals. |
---|
| 2081 | |
---|
| 2082 | long |
---|
| 2083 | ttgspd() |
---|
| 2084 | Returns the current tty speed in BITS (not CHARACTERS) per |
---|
| 2085 | second, or -1 if it is not known or if the tty is really a |
---|
| 2086 | network, or upon any kind of error. On success, the speed |
---|
| 2087 | returned is the actual number of bits per second, like 1200, |
---|
| 2088 | 9600, 19200, etc. |
---|
| 2089 | |
---|
| 2090 | int |
---|
| 2091 | ttgwsiz() |
---|
| 2092 | Get terminal window size. Returns -1 on error, 0 if the window |
---|
| 2093 | size can't be obtained, 1 if the window size has been |
---|
| 2094 | successfully obtained. Upon success, the external global |
---|
| 2095 | variables tt_rows and tt_cols are set to the number of screen |
---|
| 2096 | rows and number of screen columns, respectively. As this |
---|
| 2097 | function is not implemented in all ck*tio.c modules, calls to |
---|
| 2098 | it must be wrapped in #ifdef CK_TTGWSIZ..#endif. NOTE: This |
---|
| 2099 | function must be available to use the TELNET NAWS feature |
---|
| 2100 | (Negotiate About Window Size) as well as Rlogin. |
---|
| 2101 | |
---|
| 2102 | int |
---|
| 2103 | tthang() |
---|
| 2104 | Hang up the current tty device. For real tty devices, turn off |
---|
| 2105 | DTR for about 1/3-1/2 second (or other length of time, |
---|
| 2106 | depending on the system). If the tty is really a network |
---|
| 2107 | connection, close it. Returns: |
---|
| 2108 | -1: on failure. |
---|
| 2109 | 0: if it does not even try to hang up. |
---|
| 2110 | 1: if it believes it hung up successfully. |
---|
| 2111 | |
---|
| 2112 | VOID |
---|
| 2113 | ttimoff() |
---|
| 2114 | Turns off all pending timer interrupts. |
---|
| 2115 | |
---|
| 2116 | int |
---|
| 2117 | ttinc(timo) int timo; (function is old, return codes are new) |
---|
| 2118 | Reads one character from the communication device. If timo is |
---|
| 2119 | greater than zero, wait the given number of seconds and then |
---|
| 2120 | time out if no character arrives, otherwise wait forever for a |
---|
| 2121 | character. Returns: |
---|
| 2122 | -3: internal error (e.g. tty modes set wrong) |
---|
| 2123 | -2: communications disconnect |
---|
| 2124 | -1: timeout or other error |
---|
| 2125 | >=0: the character that was read. |
---|
| 2126 | It is HIGHLY RECOMMENDED that ttinc() be internally buffered so |
---|
| 2127 | that calls to it are relatively inexpensive. If it is possible |
---|
| 2128 | to to implement ttinc() as a macro, all the better, for example |
---|
| 2129 | something like: |
---|
| 2130 | |
---|
| 2131 | #define ttinc(t) ( (--txbufn >= 0) ? txbuf[ttbufp++] : txbufr(t) ) |
---|
| 2132 | |
---|
| 2133 | (see description of txbufr() below) |
---|
| 2134 | |
---|
| 2135 | int |
---|
| 2136 | ttinl(dest,max,timo,eol,start,turn) int max,timo,turn; CHAR |
---|
| 2137 | *dest, eol, start; |
---|
| 2138 | ttinl() is Kermit's packet reader. Reads a packet from the |
---|
| 2139 | communications device, or up to max characters, whichever |
---|
| 2140 | occurs first. A line is a string of characters starting with |
---|
| 2141 | the start character up to and including the character given in |
---|
| 2142 | eol or until the length is exhausted, or, if turn != 0, until |
---|
| 2143 | the line turnaround character (turn) is read. If turn is 0, |
---|
| 2144 | ttinl() *should* use the packet length field to detect the end, |
---|
| 2145 | to allow for the possibility that the eol character appears |
---|
| 2146 | unprefixed in the packet data. (The turnaround character is for |
---|
| 2147 | half-duplex linemode connections.) |
---|
| 2148 | |
---|
| 2149 | If timo is greater than zero, ttinl() times out if the eol |
---|
| 2150 | character is not encountered within the given number of seconds |
---|
| 2151 | and returns -1. |
---|
| 2152 | |
---|
| 2153 | The characters that were input are copied into "dest" with |
---|
| 2154 | their parity bits stripped if parity is not none. The first |
---|
| 2155 | character copied into dest should be the start character, and |
---|
| 2156 | the last should be the final character of the packet (the last |
---|
| 2157 | block check character). ttinl() should also absorb and discard |
---|
| 2158 | the eol and turn characters, and any other characters that are |
---|
| 2159 | waiting to be read, up until the next start character, so that |
---|
| 2160 | subsequent calls to ttchk() will not succeed simply because |
---|
| 2161 | there are some terminators still sitting in the buffer that |
---|
| 2162 | ttinl() didn't read. This operation, if performed, MUST NOT |
---|
| 2163 | BLOCK (so if it can't be performed in a guaranteed nonblocking |
---|
| 2164 | way, don't do it). |
---|
| 2165 | |
---|
| 2166 | On success, ttinl() returns the number of characters read. |
---|
| 2167 | Optionally, ttinl() can sense the parity of incoming packets. |
---|
| 2168 | If it does this, then it should set the global variable ttprty |
---|
| 2169 | accordingly. ttinl() should be coded to be as efficient as |
---|
| 2170 | possible, since it is at the "inner loop" of packet reception. |
---|
| 2171 | ttinl() returns: |
---|
| 2172 | -1: Timeout or other possibly correctable error. |
---|
| 2173 | -2: Interrupted from keyboard. |
---|
| 2174 | -3: Uncorrectable i/o error -- connection lost, configuration |
---|
| 2175 | problem, etc. |
---|
| 2176 | >=0: on success, the number of characters that were actually |
---|
| 2177 | read and placed in the dest buffer, not counting the trailing |
---|
| 2178 | null. |
---|
| 2179 | |
---|
| 2180 | int |
---|
| 2181 | ttoc(c) char c; |
---|
| 2182 | Outputs the character c to the communication line. If the |
---|
| 2183 | operation fails to complete within two seconds, this function |
---|
| 2184 | returns -1. Otherwise it returns the number of characters |
---|
| 2185 | actually written to the tty (0 or 1). This function should only |
---|
| 2186 | be used for interactive, character-mode operations, like |
---|
| 2187 | terminal connection, script execution, dialer i/o, where the |
---|
| 2188 | overhead of the signals and alarms does not create a |
---|
| 2189 | bottleneck. (THIS DESCRIPTION NEEDS IMPROVEMENT -- If the |
---|
| 2190 | operation fails within a "certain amount of time"... which |
---|
| 2191 | might be dependent on the communication method, speed, etc. In |
---|
| 2192 | particular, flow-control deadlocks must be accounted for and |
---|
| 2193 | broken out of to prevent the program from hanging indefinitely, |
---|
| 2194 | etc.) |
---|
| 2195 | |
---|
| 2196 | int |
---|
| 2197 | ttol(s,n) int n; char *s; |
---|
| 2198 | Kermit's packet writer. Writes the n characters of the string |
---|
| 2199 | pointed to to by s. NOTE: It is ttol's responsibility to write |
---|
| 2200 | ALL of the characters, not just some of them. Returns: |
---|
| 2201 | -1: on a possibly correctable error (so it can be retried). |
---|
| 2202 | -3: on a fatal error, e.g. connection lost. |
---|
| 2203 | >=0: on success, the actual number of characters written (the |
---|
| 2204 | specific number is not actually used for anything). |
---|
| 2205 | |
---|
| 2206 | int |
---|
| 2207 | ttopen(ttname,lcl,modem,timo) char *ttname; int *lcl, modem, |
---|
| 2208 | timo; |
---|
| 2209 | Opens a tty device, if it is not already open. ttopen must |
---|
| 2210 | check to make sure the SAME device is not already open; if it |
---|
| 2211 | is, ttopen returns successfully without doing anything. If a |
---|
| 2212 | DIFFERENT device is currently open, ttopen() must call ttclos() |
---|
| 2213 | to close it before opening the new one. |
---|
| 2214 | |
---|
| 2215 | Parameters: |
---|
| 2216 | |
---|
| 2217 | ttname: |
---|
| 2218 | character string - device name or network host |
---|
| 2219 | name. |
---|
| 2220 | |
---|
| 2221 | lcl: |
---|
| 2222 | If called with lcl < 0, sets value of lcl as |
---|
| 2223 | follows: |
---|
| 2224 | 0: the terminal named by ttname is the job's |
---|
| 2225 | controlling terminal. |
---|
| 2226 | 1: the terminal named by ttname is not the job's |
---|
| 2227 | controlling terminal. |
---|
| 2228 | If the device is already open, or if the requested |
---|
| 2229 | device can't be opened, then lcl remains (and is |
---|
| 2230 | returned as) -1. |
---|
| 2231 | |
---|
| 2232 | modem: |
---|
| 2233 | Less than zero: this is the negative of the network |
---|
| 2234 | type, and ttname is a network host name. Network |
---|
| 2235 | types (from [112]ckcnet.h: |
---|
| 2236 | |
---|
| 2237 | |
---|
| 2238 | NET_TCPB 1 TCP/IP Berkeley (socket) (implemented in [113]ckutio.c) |
---|
| 2239 | NET_TCPA 2 TCP/IP AT&T (streams) (not yet implemented) |
---|
| 2240 | NET_DEC 3 DECnet (not yet implemented) |
---|
| 2241 | |
---|
| 2242 | Zero or greater: ttname is a terminal device name. Zero |
---|
| 2243 | means a direct connection (don't use modem |
---|
| 2244 | signals). Positive means use modem signals |
---|
| 2245 | depending on the current setting of ttcarr (see |
---|
| 2246 | ttscarr()). |
---|
| 2247 | |
---|
| 2248 | timo: |
---|
| 2249 | > 0: number of seconds to wait for open() to return |
---|
| 2250 | before timing out. |
---|
| 2251 | <=0: no timer, wait forever (e.g. for incoming |
---|
| 2252 | call). |
---|
| 2253 | For real tty devices, ttopen() attempts to gain |
---|
| 2254 | exclusive access to the tty device, for example in |
---|
| 2255 | UNIX by creating a "lockfile" (in other operating |
---|
| 2256 | systems, like VMS, exclusive access probably |
---|
| 2257 | requires no special action). |
---|
| 2258 | |
---|
| 2259 | Side effects: |
---|
| 2260 | Copies its arguments and the tty file descriptor to |
---|
| 2261 | global variables that are available to the other |
---|
| 2262 | tty-related functions, with the lcl value altered as |
---|
| 2263 | described above. Gets all parameters and settings |
---|
| 2264 | associated with the line and puts them in a global area, |
---|
| 2265 | so that they can be restored by ttres(), e.g. when the |
---|
| 2266 | device is closed. |
---|
| 2267 | |
---|
| 2268 | Returns: |
---|
| 2269 | 0: on success |
---|
| 2270 | -5: if device is in use |
---|
| 2271 | -4: if access to device is denied |
---|
| 2272 | -3: if access to lock mechanism denied |
---|
| 2273 | -2: upon timeout waiting for device to open |
---|
| 2274 | -1: on other error |
---|
| 2275 | |
---|
| 2276 | int |
---|
| 2277 | ttpkt(speed,flow,parity) long speed; int flow, parity; |
---|
| 2278 | Puts the currently open tty device into the appropriate modes |
---|
| 2279 | for transmitting and receiving Kermit packets. |
---|
| 2280 | |
---|
| 2281 | Arguments: |
---|
| 2282 | |
---|
| 2283 | speed: |
---|
| 2284 | if speed > -1, and the device is a true tty device, |
---|
| 2285 | and Kermit is in local mode, ttpkt also sets the |
---|
| 2286 | speed. |
---|
| 2287 | |
---|
| 2288 | flow: |
---|
| 2289 | if in the range 0-3, ttpkt selects the |
---|
| 2290 | corresponding type of flow control. Currently 0 is |
---|
| 2291 | defined as no flow control, 1 is Xon/Xoff, and no |
---|
| 2292 | other types are defined. If (and this is a horrible |
---|
| 2293 | hack, but it goes back many years and will be hard |
---|
| 2294 | to eradicate) flow is 4, then the appropriate tty |
---|
| 2295 | modes are set for modem dialing, a special case in |
---|
| 2296 | which we talk to a modem-controlled line without |
---|
| 2297 | requiring carrier. If flow is 5, then we require |
---|
| 2298 | carrier. |
---|
| 2299 | |
---|
| 2300 | parity: |
---|
| 2301 | This is simply copied into a global variable so |
---|
| 2302 | that other functions (like ttinl, ttinc, etc) can |
---|
| 2303 | use it. |
---|
| 2304 | |
---|
| 2305 | Side effects: |
---|
| 2306 | Copies its arguments to global variables, flushes the |
---|
| 2307 | terminal device input buffer. |
---|
| 2308 | |
---|
| 2309 | Returns: |
---|
| 2310 | -1: on error. |
---|
| 2311 | 0: on success. |
---|
| 2312 | |
---|
| 2313 | int |
---|
| 2314 | ttsetflow(int) |
---|
| 2315 | Enables the given type of flow control on the open serial |
---|
| 2316 | communications device immediately. Arguments are the FLO_xxx |
---|
| 2317 | values from ckcdeb.h, except FLO_DIAL, FLO_DIAX, or FLO_AUTO, |
---|
| 2318 | which are not actual flow-control types. Returns 0 on success, |
---|
| 2319 | -1 on failure. |
---|
| 2320 | |
---|
| 2321 | #ifdef TTSPDLIST |
---|
| 2322 | |
---|
| 2323 | long * |
---|
| 2324 | ttspdlist() |
---|
| 2325 | Returns a pointer to an array of longs, or NULL on failure. On |
---|
| 2326 | success, element 0 of the array contains number, n, indicating |
---|
| 2327 | how many follow. Elements 1-n are serial speeds, expressed in |
---|
| 2328 | bits per second, that are legal on this platform. The user |
---|
| 2329 | interface may use this list to construct a menu, keyword table, |
---|
| 2330 | etc. |
---|
| 2331 | |
---|
| 2332 | #endif /* TTSPDLIST */ |
---|
| 2333 | |
---|
| 2334 | int |
---|
| 2335 | ttres() |
---|
| 2336 | Restores the tty device to the modes and settings that were in |
---|
| 2337 | effect at the time it was opened (see ttopen). Returns: |
---|
| 2338 | -1: on error. |
---|
| 2339 | 0: on success. |
---|
| 2340 | |
---|
| 2341 | int |
---|
| 2342 | ttruncmd(string) char * string; |
---|
| 2343 | Runs the given command on the local system, but redirects its |
---|
| 2344 | input and output to the communication (SET LINE, SET PORT, or |
---|
| 2345 | SET HOST) device. Returns: |
---|
| 2346 | 0: on failure. |
---|
| 2347 | 1: on success. |
---|
| 2348 | |
---|
| 2349 | int |
---|
| 2350 | ttscarr(carrier) int carrier; |
---|
| 2351 | Copies its argument to a variable that is global to the other |
---|
| 2352 | tty-related functions, and then returns it. The values for |
---|
| 2353 | carrier are defined in ckcdeb.h: CAR_ON, CAR_OFF, CAR_AUTO. |
---|
| 2354 | ttopen(), ttpkt(), and ttvt() use this variable when deciding |
---|
| 2355 | how to open the tty device and what modes to select. The |
---|
| 2356 | meanings are these: |
---|
| 2357 | |
---|
| 2358 | CAR_OFF: Ignore carrier at all times. |
---|
| 2359 | CAR_ON: Require carrier at all times, except when dialing. This |
---|
| 2360 | means, for example, that ttopen() could hang forever waiting |
---|
| 2361 | for carrier if it is not present. |
---|
| 2362 | CAR_AUTO: If the modem type is zero (i.e. the connection is |
---|
| 2363 | direct), this is the same as CAR_OFF. If the modem type is |
---|
| 2364 | positive, then heed carrier during CONNECT (ttvt mode), but |
---|
| 2365 | ignore it at other times (packet mode, during SET LINE, etc). |
---|
| 2366 | Compatible with pre-5A versions of C-Kermit. This should be the |
---|
| 2367 | default carrier mode. |
---|
| 2368 | |
---|
| 2369 | Kermit's DIAL command ignores the carrier setting, but |
---|
| 2370 | ttopen(), ttvt(), and ttpkt() all honor the carrier option in |
---|
| 2371 | effect at the time they are called. None of this applies to |
---|
| 2372 | remote mode (the tty device is the job's controlling terminal) |
---|
| 2373 | or to network host connections (modem type is negative). |
---|
| 2374 | |
---|
| 2375 | int |
---|
| 2376 | ttsndb() |
---|
| 2377 | Sends a BREAK signal on the tty device. On a real tty device, |
---|
| 2378 | send a real BREAK lasting approximately 275 milliseconds. If |
---|
| 2379 | this is not possible, simulate a BREAK by (for example) |
---|
| 2380 | dropping down some very low baud rate, like 50, and sending a |
---|
| 2381 | bunch of null characters. On a network connection, do the |
---|
| 2382 | appropriate network protocol for BREAK. Returns: |
---|
| 2383 | -1: on error. |
---|
| 2384 | 0: on success. |
---|
| 2385 | |
---|
| 2386 | int |
---|
| 2387 | ttsndlb() |
---|
| 2388 | Like ttsndb(), but sends a "Long BREAK" (approx 1.5 seconds). |
---|
| 2389 | For network connections, it is identical to ttsndb(). |
---|
| 2390 | Currently, this function is used only if CK_LBRK is defined (as |
---|
| 2391 | it is for UNIX and VMS). |
---|
| 2392 | |
---|
| 2393 | int |
---|
| 2394 | ttsspd(cps) int cps; |
---|
| 2395 | For serial devices only, set the device transmission speed to |
---|
| 2396 | (note carefully) TEN TIMES the argument. The argument is in |
---|
| 2397 | characters per second, but transmission speeds are in bits per |
---|
| 2398 | second. cps are used rather than bps because high speeds like |
---|
| 2399 | 38400 are not expressible in a 16-bit int but longs cannot be |
---|
| 2400 | used because keyword-table values are ints and not longs. If |
---|
| 2401 | the argument is 7, then the bps is 75, not 70. If the argument |
---|
| 2402 | is 888, this is a special code for 75/1200 split-speed |
---|
| 2403 | operation (75 bps out, 1200 bps in). Returns: |
---|
| 2404 | -1: on error, meaning the requested speed is not valid or |
---|
| 2405 | available. |
---|
| 2406 | >=0: on success (don't try to use this value for anything). |
---|
| 2407 | |
---|
| 2408 | int |
---|
| 2409 | ttvt(speed,flow) long speed; int flow; |
---|
| 2410 | Puts the currently open tty device into the appropriate modes |
---|
| 2411 | for terminal emulation. The arguments are interpreted as in |
---|
| 2412 | ttpkt(). Side effects: ttvt() stores its arguments in global |
---|
| 2413 | variables, and sets a flag that it has been called so that |
---|
| 2414 | subsequent calls can be ignored so long as the arguments are |
---|
| 2415 | the same as in the last effective call. Other functions, such |
---|
| 2416 | as ttopen(), ttclose(), ttres(), ttvt(), etc, that change the |
---|
| 2417 | tty device in any way must unset this flag. In UNIX Kermit, |
---|
| 2418 | this flag is called tvtflg. |
---|
| 2419 | |
---|
| 2420 | int |
---|
| 2421 | ttwmdm(mdmsig,timo) int mdmsig, timo; |
---|
| 2422 | Waits up to timo seconds for all of the given modem signals to |
---|
| 2423 | appear. mdmsig is a bit mask, in which a bit is on (1) or off |
---|
| 2424 | (0) according to whether the corresponding signal is to be |
---|
| 2425 | waited for. These symbols are defined in ckcdeb.h: |
---|
| 2426 | BM_CTS (bit 0) means wait for Clear To Send |
---|
| 2427 | BM_DSR (bit 1) means wait for Data Set Ready |
---|
| 2428 | BM_DCD (bit 2) means wait for Carrier Detect |
---|
| 2429 | Returns: |
---|
| 2430 | -3: Not implemented. |
---|
| 2431 | -2: This line does not have modem control. |
---|
| 2432 | -1: Timeout: time limit exceeded before all signals were |
---|
| 2433 | detected. |
---|
| 2434 | 1: Success. |
---|
| 2435 | |
---|
| 2436 | int |
---|
| 2437 | ttxin(n,buf) int n; CHAR *buf; |
---|
| 2438 | Reads x characters from the tty device into the specified buf, |
---|
| 2439 | stripping parity if parity is not none. This call waits |
---|
| 2440 | forever, there is no timeout. This function is designed to be |
---|
| 2441 | called only when you know that at least x characters are |
---|
| 2442 | waiting to be read (as determined, for example, by ttchk()). |
---|
| 2443 | This function should use the same buffer as ttinc(). |
---|
| 2444 | |
---|
| 2445 | int |
---|
| 2446 | txbufr(timo) int timo; |
---|
| 2447 | Reads characters into the internal communications input buffer. |
---|
| 2448 | timo is a timeout interval, in seconds. 0 means no timeout, |
---|
| 2449 | wait forever. Called by ttinc() (and possibly ttxin() and |
---|
| 2450 | ttinl()) when the communications input buffer is empty. The |
---|
| 2451 | buffer should be called ttxbuf[], its length is defined by the |
---|
| 2452 | symbol TXBUFL. The global variable txbufn is the number of |
---|
| 2453 | characters available to be read from ttxbuf[], and txbufp is |
---|
| 2454 | the index of the next character to be read. Should not be |
---|
| 2455 | called if txbufn > 0, in which case the buffer does not need |
---|
| 2456 | refilling. This routine returns: |
---|
| 2457 | -2: Communications disconnect |
---|
| 2458 | -1: Timeout |
---|
| 2459 | >=0: A character (0 - 255) On success, the first character that |
---|
| 2460 | was read, with the variables txbufn and txbufp set |
---|
| 2461 | appropriately for any remaining characters. |
---|
| 2462 | NOTE: Currently this routine is used internally only by the |
---|
| 2463 | UNIX and VMS versions. The aim is to make it available to all |
---|
| 2464 | versions so there is one single coherent and efficient way of |
---|
| 2465 | reading from the communications device or network. |
---|
| 2466 | |
---|
| 2467 | 4.E.2.6. Miscellaneous system-dependent functions |
---|
| 2468 | |
---|
| 2469 | VOID |
---|
| 2470 | ztime(s) char **s; |
---|
| 2471 | Returns a pointer, s, to the current date-and-time string in s. |
---|
| 2472 | This string must be in the fixed-field format associated with |
---|
| 2473 | the C runtime asctime() function, like: "Sun Sep 16 13:23:45 |
---|
| 2474 | 1973\n" so that callers of this function can extract the |
---|
| 2475 | different fields. The pointer value is filled in by ztime, and |
---|
| 2476 | the data it points to is not safe, so should be copied to a |
---|
| 2477 | safe place before use. ztime() has no return value. As a side |
---|
| 2478 | effect, this routine can also fill in the following two |
---|
| 2479 | external variables (which must be defined in the |
---|
| 2480 | system-dependendent modules for each platform): |
---|
| 2481 | long ztusec: Fraction of seconds of clock time, microseconds. |
---|
| 2482 | long ztmsec: Fraction of seconds of clock time, milliseconds. |
---|
| 2483 | If these variables are not set by zstime(), they remain at |
---|
| 2484 | their initial value of -1L. |
---|
| 2485 | |
---|
| 2486 | int |
---|
| 2487 | gtimer() |
---|
| 2488 | Returns the current value of the elapsed time counter in |
---|
| 2489 | seconds (see rtimer), or 0 on any kind of error. |
---|
| 2490 | |
---|
| 2491 | #ifdef GFTIMER |
---|
| 2492 | CKFLOAT |
---|
| 2493 | gftimer() |
---|
| 2494 | Returns the current value of the elapsed time counter in |
---|
| 2495 | seconds, as a floating point number, capable of representing |
---|
| 2496 | not only whole seconds, but also the fractional part, to the |
---|
| 2497 | millisecond or microsecond level, whatever precision is |
---|
| 2498 | available. Requires a function to get times at subsecond |
---|
| 2499 | precision, as well as floating-point support. That's why it's |
---|
| 2500 | #ifdef'd. |
---|
| 2501 | |
---|
| 2502 | #endif /* GFTIMER */ |
---|
| 2503 | |
---|
| 2504 | int |
---|
| 2505 | msleep(m) int m; |
---|
| 2506 | Sleeps (pauses, does nothing) for m milliseconds (a millisecond |
---|
| 2507 | is one thousandth of a second). Returns: |
---|
| 2508 | -1: on failure. |
---|
| 2509 | 0: on success. |
---|
| 2510 | |
---|
| 2511 | VOID |
---|
| 2512 | rtimer() |
---|
| 2513 | Sets the elapsed time counter to zero. If you want to time how |
---|
| 2514 | long an operation takes, call rtimer() when it starts and |
---|
| 2515 | gtimer when it ends. rtimer() has no return value. |
---|
| 2516 | |
---|
| 2517 | #ifdef GFTIMER |
---|
| 2518 | VOID |
---|
| 2519 | rftimer() |
---|
| 2520 | Sets the elapsed time counter to zero. If you want to time how |
---|
| 2521 | long an operation takes, call rftimer() when it starts and |
---|
| 2522 | gftimer when it ends. rftimer() has no return value. Note: |
---|
| 2523 | rftimer() is to be used with gftimer() and rtimer() is to be |
---|
| 2524 | used with gtimer(). See the rftimer() description. |
---|
| 2525 | |
---|
| 2526 | #endif /* GFTIMER */ |
---|
| 2527 | |
---|
| 2528 | int |
---|
| 2529 | sysinit() |
---|
| 2530 | Does whatever needs doing upon program start. In particular, if |
---|
| 2531 | the program is running in any kind of privileged mode, turns |
---|
| 2532 | off the privileges (see priv_ini()). Returns: |
---|
| 2533 | -1: on error. |
---|
| 2534 | 0: on success. |
---|
| 2535 | |
---|
| 2536 | int |
---|
| 2537 | syscleanup() |
---|
| 2538 | Does whatever needs doing upon program exit. Returns: |
---|
| 2539 | -1: on error. |
---|
| 2540 | 0: on success. |
---|
| 2541 | |
---|
| 2542 | int |
---|
| 2543 | psuspend() |
---|
| 2544 | Suspends the Kermit process, puts it in the background so it |
---|
| 2545 | can be continued ("foregrounded") later. Returns: |
---|
| 2546 | -1: if this function is not supported. |
---|
| 2547 | 0: on success. |
---|
| 2548 | |
---|
| 2549 | [ [114]Contents ] [ [115]C-Kermit ] [ [116]Kermit Home ] |
---|
| 2550 | ________________________________________________________________________ |
---|
| 2551 | |
---|
| 2552 | 4.F. Group F: Network Support |
---|
| 2553 | |
---|
| 2554 | As of version 5A, C-Kermit includes support for several networks. |
---|
| 2555 | Originally, this was just worked into the ttopen(), ttclos(), ttinc(), |
---|
| 2556 | ttinl(), and similar routines in [117]ckutio.c. But this made it |
---|
| 2557 | impossible to share this code with non-UNIX versions, like VMS, |
---|
| 2558 | AOS/VS, OS/2, etc. So as of edit 168, network code has been separated |
---|
| 2559 | out into its own module and header file, ckcnet.c and ckcnet.h: |
---|
| 2560 | |
---|
| 2561 | [118]ckcnet.h: Network-related symbol definitions. |
---|
| 2562 | [119]ckcnet.c: Network i/o (TCP/IP, X.25, etc), shared by most |
---|
| 2563 | platforms. |
---|
| 2564 | [120]cklnet.c: Network i/o (TCP/IP, X.25, etc) specific to Stratus |
---|
| 2565 | VOS. |
---|
| 2566 | |
---|
| 2567 | The routines and variables in these modules fall into two categories: |
---|
| 2568 | |
---|
| 2569 | 1. Support for specific network packages like SunLink X.25 and TGV |
---|
| 2570 | MultiNet, and: |
---|
| 2571 | 2. support for specific network virtual terminal protocols like CCITT |
---|
| 2572 | X.3 and TCP/IP Telnet. |
---|
| 2573 | |
---|
| 2574 | Category (1) functions are analogs to the tt*() functions, and have |
---|
| 2575 | names like netopen, netclos, nettinc, etc. Group A-D modules do not |
---|
| 2576 | (and must not) know anything about these functions -- they continue to |
---|
| 2577 | call the old Group E functions (ttopen, ttinc, etc). Category (2) |
---|
| 2578 | functions are protocol specific and have names prefixed by a protocol |
---|
| 2579 | identifier, like tn for telnet x25 for X.25. |
---|
| 2580 | |
---|
| 2581 | ckcnet.h contains prototypes for all these functions, as well as |
---|
| 2582 | symbol definitions for network types, protocols, and network- and |
---|
| 2583 | protocol- specific symbols, as well as #includes for the header files |
---|
| 2584 | necessary for each network and protocol. |
---|
| 2585 | |
---|
| 2586 | The following functions are to be provided for networks that do not |
---|
| 2587 | use normal system i/o (open, read, write, close): |
---|
| 2588 | |
---|
| 2589 | int |
---|
| 2590 | netopen() |
---|
| 2591 | To be called from within ttopen() when a network connection is |
---|
| 2592 | requested. Calling conventions and purpose same as Group E |
---|
| 2593 | ttopen(). |
---|
| 2594 | |
---|
| 2595 | int |
---|
| 2596 | netclos() |
---|
| 2597 | To be called from within ttclos() when a network connection is |
---|
| 2598 | being closed. Calling conventions and purpose same as Group E |
---|
| 2599 | ttclos(). |
---|
| 2600 | |
---|
| 2601 | int |
---|
| 2602 | nettchk() |
---|
| 2603 | To be called from within ttchk(). Calling conventions and |
---|
| 2604 | purpose same as Group E ttchk(). |
---|
| 2605 | |
---|
| 2606 | int |
---|
| 2607 | netflui() |
---|
| 2608 | To be called from within ttflui(). Calling conventions and |
---|
| 2609 | purpose same as Group E ttflui(). |
---|
| 2610 | |
---|
| 2611 | int |
---|
| 2612 | netbreak() |
---|
| 2613 | To send a network break (attention) signal. Calling conventions |
---|
| 2614 | and purpose same as Group E ttsndbrk(). |
---|
| 2615 | |
---|
| 2616 | int |
---|
| 2617 | netinc() |
---|
| 2618 | To get a character from the network. Calling conventions same |
---|
| 2619 | as Group E ttsndbrk(). |
---|
| 2620 | |
---|
| 2621 | int |
---|
| 2622 | nettoc() |
---|
| 2623 | Send a "character" (byte) to the network. Calling conventions |
---|
| 2624 | same as Group E ttoc(). |
---|
| 2625 | |
---|
| 2626 | int |
---|
| 2627 | nettol() |
---|
| 2628 | Send a "line" (sequence of bytes) to the network. Calling |
---|
| 2629 | conventions same as Group E ttol(). |
---|
| 2630 | |
---|
| 2631 | Conceivably, some systems support network connections simply by |
---|
| 2632 | letting you open a device of a certain name and letting you do i/o to |
---|
| 2633 | it. Others (like the Berkeley sockets TCP/IP library on UNIX) require |
---|
| 2634 | you to open the connection in a special way, but then do normal i/o |
---|
| 2635 | (read, write). In such a case, you would use netopen(), but you would |
---|
| 2636 | not use nettinc, nettoc, etc. |
---|
| 2637 | |
---|
| 2638 | VMS TCP/IP products have their own set of functions for all network |
---|
| 2639 | operations, so in that case the full range of netxxx() functions is |
---|
| 2640 | used. |
---|
| 2641 | |
---|
| 2642 | The technique is to put a test in each corresponding ttxxx() function |
---|
| 2643 | to see if a network connection is active (or is being requested), test |
---|
| 2644 | for which kind of network it is, and if necessary route the call to |
---|
| 2645 | the corresponding netxxx() function. The netxxx() function must also |
---|
| 2646 | contain code to test for the network type, which is available via the |
---|
| 2647 | global variable ttnet. |
---|
| 2648 | |
---|
| 2649 | [ [121]Contents ] [ [122]C-Kermit ] [ [123]Kermit Home ] |
---|
| 2650 | ______________________________________________________________________ |
---|
| 2651 | |
---|
| 2652 | 4.F.1. Telnet Protocol |
---|
| 2653 | |
---|
| 2654 | (This section needs a great deal of updating...) |
---|
| 2655 | |
---|
| 2656 | As of edit 195, Telnet protocol is split out into its own files, since |
---|
| 2657 | it can be implemented in remote mode, which does not have a network |
---|
| 2658 | connection: |
---|
| 2659 | |
---|
| 2660 | [124]ckctel.h: Telnet protocol symbol definitions. |
---|
| 2661 | [125]ckctel.c: Telnet protocol. |
---|
| 2662 | |
---|
| 2663 | The Telnet protocol is supported by the following variables and |
---|
| 2664 | routines: |
---|
| 2665 | |
---|
| 2666 | int tn_init |
---|
| 2667 | Nonzero if telnet protocol initialized, zero otherwise. |
---|
| 2668 | |
---|
| 2669 | int |
---|
| 2670 | tn_init() |
---|
| 2671 | Initialize the telnet protocol (send initial options). |
---|
| 2672 | |
---|
| 2673 | int |
---|
| 2674 | tn_sopt() |
---|
| 2675 | Send a telnet option. |
---|
| 2676 | |
---|
| 2677 | int |
---|
| 2678 | tn_doop() |
---|
| 2679 | Receive and act on a telnet option from the remote. |
---|
| 2680 | |
---|
| 2681 | int |
---|
| 2682 | tn_sttyp() |
---|
| 2683 | Send terminal type using telnet protocol. |
---|
| 2684 | ______________________________________________________________________ |
---|
| 2685 | |
---|
| 2686 | 4.F.2. FTP Protocol |
---|
| 2687 | |
---|
| 2688 | (To be filled in...) |
---|
| 2689 | ______________________________________________________________________ |
---|
| 2690 | |
---|
| 2691 | 4.F.3. HTTP Protocol |
---|
| 2692 | |
---|
| 2693 | (To be filled in...) |
---|
| 2694 | ______________________________________________________________________ |
---|
| 2695 | |
---|
| 2696 | 4.F.4. X.25 Networks |
---|
| 2697 | |
---|
| 2698 | These routines were written SunLink X.25 and have since been adapted |
---|
| 2699 | to at least on one other: IBM AIXLink/X.25. |
---|
| 2700 | |
---|
| 2701 | int |
---|
| 2702 | x25diag() |
---|
| 2703 | Reads and prints X.25 diagnostics |
---|
| 2704 | |
---|
| 2705 | int |
---|
| 2706 | x25oobh() |
---|
| 2707 | X.25 out of band signal handler |
---|
| 2708 | |
---|
| 2709 | int |
---|
| 2710 | x25intr() |
---|
| 2711 | Sends X.25 interrupt packet |
---|
| 2712 | |
---|
| 2713 | int |
---|
| 2714 | x25reset() |
---|
| 2715 | Resets X.25 virtual circuit |
---|
| 2716 | |
---|
| 2717 | int |
---|
| 2718 | x25clear() |
---|
| 2719 | Clear X.25 virtual circuit |
---|
| 2720 | |
---|
| 2721 | int |
---|
| 2722 | x25stat() |
---|
| 2723 | X.25 status |
---|
| 2724 | |
---|
| 2725 | int |
---|
| 2726 | setqbit() |
---|
| 2727 | Sets X.25 Q-bit |
---|
| 2728 | |
---|
| 2729 | int |
---|
| 2730 | resetqbit() |
---|
| 2731 | Resets X.25 Q-bit |
---|
| 2732 | |
---|
| 2733 | int |
---|
| 2734 | x25xin() |
---|
| 2735 | Reads n characters from X.25 circuit. |
---|
| 2736 | |
---|
| 2737 | int |
---|
| 2738 | x25inl() |
---|
| 2739 | Read a Kermit packet from X.25 circuit. |
---|
| 2740 | |
---|
| 2741 | [ [126]Contents ] [ [127]C-Kermit ] [ [128]Kermit Home ] |
---|
| 2742 | ______________________________________________________________________ |
---|
| 2743 | |
---|
| 2744 | 4.F.5. Adding New Network Types |
---|
| 2745 | |
---|
| 2746 | Example: Adding support for IBM X.25 and Hewlett Packard X.25. First, |
---|
| 2747 | add new network type symbols for each one. There are already some |
---|
| 2748 | network types defined for other X.25 packages: |
---|
| 2749 | |
---|
| 2750 | NET_SX25 is the network-type ID for SunLink X.25. |
---|
| 2751 | NET_VX25 is the network-type ID for VOS X.25. |
---|
| 2752 | |
---|
| 2753 | So first you should new symbols for the new network types, giving them |
---|
| 2754 | the next numbers in the sequence, e.g.: |
---|
| 2755 | |
---|
| 2756 | #define NET_HX25 11 /* Hewlett-Packard X.25 */ |
---|
| 2757 | #define NET_IX25 12 /* IBM X.25 */ |
---|
| 2758 | |
---|
| 2759 | This is in ckcnet.h. |
---|
| 2760 | |
---|
| 2761 | Then we need symbols to say that we are actually compiling in the code |
---|
| 2762 | for these platforms. These would be defined on the cc command line: |
---|
| 2763 | |
---|
| 2764 | -DIBMX25 (for IBM) |
---|
| 2765 | -DHPX25 (for HP) |
---|
| 2766 | |
---|
| 2767 | So we can build C-Kermit versions for AIX and HP-UX both with and |
---|
| 2768 | without X.25 support (since not all AIX and IBM systems have the |
---|
| 2769 | needed libraries, and so an executable that was linked with them might |
---|
| 2770 | no load). |
---|
| 2771 | |
---|
| 2772 | Then in ckcnet.h: |
---|
| 2773 | |
---|
| 2774 | #ifdef IBMX25 |
---|
| 2775 | #define ANYX25 |
---|
| 2776 | #endif /* IBMX25 */ |
---|
| 2777 | |
---|
| 2778 | #ifdef HPX25 |
---|
| 2779 | #define ANYX25 |
---|
| 2780 | #endif /* HPX25 */ |
---|
| 2781 | |
---|
| 2782 | And then use ANYX25 for code that is common to all of them, and IBMX25 |
---|
| 2783 | or HPX25 for code specific to IBM or HP. |
---|
| 2784 | |
---|
| 2785 | It might also happen that some code can be shared between two or more |
---|
| 2786 | of these, but not the others. Suppose, for example, that you write |
---|
| 2787 | code that applies to both IBM and HP, but not Sun or VOS X.25. Then |
---|
| 2788 | you add the following definition to ckcnet.h: |
---|
| 2789 | |
---|
| 2790 | #ifndef HPORIBMX25 |
---|
| 2791 | #ifdef HPX25 |
---|
| 2792 | #define HPORIBMX25 |
---|
| 2793 | #else |
---|
| 2794 | #ifdef IBMX25 |
---|
| 2795 | #define HPORIBMX25 |
---|
| 2796 | #endif /* IBMX25 */ |
---|
| 2797 | #endif /* HPX25 */ |
---|
| 2798 | #endif /* HPORIBMX25 */ |
---|
| 2799 | |
---|
| 2800 | You can NOT use constructions like "#if defined (HPX25 || IBMX25)"; |
---|
| 2801 | they are not portable. |
---|
| 2802 | |
---|
| 2803 | [ [129]Contents ] [ [130]C-Kermit ] [ [131]Kermit Home ] |
---|
| 2804 | ________________________________________________________________________ |
---|
| 2805 | |
---|
| 2806 | 4.G. Group G: Formatted Screen Support |
---|
| 2807 | |
---|
| 2808 | So far, this is used only for the fullscreen local-mode file transfer |
---|
| 2809 | display. In the future, it might be extended to other uses. The |
---|
| 2810 | fullscreen display code is in and around the routine screenc() in |
---|
| 2811 | [132]ckuusx.c. |
---|
| 2812 | |
---|
| 2813 | In the UNIX version, we use the curses library, plus one call from the |
---|
| 2814 | termcap library. In other versions (OS/2, VMS, etc) we insert dummy |
---|
| 2815 | routines that have the same names as curses routines. So far, there |
---|
| 2816 | are two methods for simulating curses routines: |
---|
| 2817 | |
---|
| 2818 | 1. In VMS, we use the Screen Management Library (SMG), and insert |
---|
| 2819 | stubs to convert curses calls into SMG calls. |
---|
| 2820 | 2. In OS/2, we use the MYCURSES code, in which the stub routines |
---|
| 2821 | actually emit the appropriate escape sequences themselves. |
---|
| 2822 | |
---|
| 2823 | Here are the stub routines: |
---|
| 2824 | |
---|
| 2825 | int |
---|
| 2826 | tgetent(char *buf, char *term) |
---|
| 2827 | Arguments are ignored. Returns 1 if the user has a supported |
---|
| 2828 | terminal type, 0 otherwise. Sets a global variable (for |
---|
| 2829 | example, "isvt52" or "isdasher") to indicate the terminal type. |
---|
| 2830 | |
---|
| 2831 | VOID |
---|
| 2832 | move(int row, int col) |
---|
| 2833 | Sends the escape sequence to position the cursor at the |
---|
| 2834 | indicated row and column. The numbers are 0-based, e.g. the |
---|
| 2835 | home position is 0,0. |
---|
| 2836 | |
---|
| 2837 | int |
---|
| 2838 | clear() |
---|
| 2839 | Sends the escape sequence to clear the screen. |
---|
| 2840 | |
---|
| 2841 | int |
---|
| 2842 | clrtoeol() |
---|
| 2843 | Sends the escape sequence to clear from the current cursor |
---|
| 2844 | position to the end of the line. |
---|
| 2845 | |
---|
| 2846 | In the MYCURSES case, code must be added to each of the last three |
---|
| 2847 | routines to emit the appropriate escape sequences for a new terminal |
---|
| 2848 | type. |
---|
| 2849 | |
---|
| 2850 | clearok(curscr), wrefresh() |
---|
| 2851 | In real curses, these two calls are required to refresh the |
---|
| 2852 | screen, for example after it was fractured by a broadcast |
---|
| 2853 | message. These are useful only if the underlying screen |
---|
| 2854 | management service keeps a copy of the entire screen, as curses |
---|
| 2855 | and SMG do. C-Kermit does not do this itself. |
---|
| 2856 | |
---|
| 2857 | [ [133]Contents ] [ [134]C-Kermit ] [ [135]Kermit Home ] |
---|
| 2858 | ________________________________________________________________________ |
---|
| 2859 | |
---|
| 2860 | 4.H. Group H: Pseudoterminal Support |
---|
| 2861 | |
---|
| 2862 | (To be filled in...) |
---|
| 2863 | ________________________________________________________________________ |
---|
| 2864 | |
---|
| 2865 | 4.I. Group I: Security |
---|
| 2866 | |
---|
| 2867 | (To be filled in...) |
---|
| 2868 | |
---|
| 2869 | [ [136]Contents ] [ [137]C-Kermit ] [ [138]Kermit Home ] |
---|
| 2870 | ________________________________________________________________________ |
---|
| 2871 | |
---|
| 2872 | APPENDIX I. FILE PERMISSIONS |
---|
| 2873 | |
---|
| 2874 | I.1. Format of System-Dependent File Permissions in A-Packets |
---|
| 2875 | |
---|
| 2876 | The format of this field (the "," attribute) is interpreted according |
---|
| 2877 | to the System ID ("." Attribute). |
---|
| 2878 | |
---|
| 2879 | For UNIX (System ID = U1), it's the familiar 3-digit octal number, the |
---|
| 2880 | low-order 9 bits of the filemode: Owner, Group, World, e.g. 660 = |
---|
| 2881 | read/write access for owner and group, none for world, recorded as a |
---|
| 2882 | 3-digit octal string. High-order UNIX permission bits are not |
---|
| 2883 | transmitted. |
---|
| 2884 | |
---|
| 2885 | For VMS (System ID = D7), it's a 4-digit hex string, representing the |
---|
| 2886 | 16-bit file protection WGOS fields (World,Group,Owner,System), in that |
---|
| 2887 | order (which is the reverse of how they're shown in a directory |
---|
| 2888 | listing); in each field, Bit 0 = Read, 1 = Write, 2 = Execute, 3 = |
---|
| 2889 | Delete. A bit value of 0 means permission is granted, 1 means |
---|
| 2890 | permission is denied. Sample: |
---|
| 2891 | |
---|
| 2892 | r-01-00-^A/!FWERMIT.EXE'" |
---|
| 2893 | s-01-00-^AE!Y/amd/watsun/w/fdc/new/wermit.exe.DV |
---|
| 2894 | r-02-01-^A]"A."D7""B8#119980101 18:14:05!#8531&872960,$A20B-!7(#512@ #.Y |
---|
| 2895 | s-02-01-^A%"Y.5! |
---|
| 2896 | |
---|
| 2897 | A VMS directory listing shows the file's protection as (E,RWED,RED,RE) |
---|
| 2898 | which really means (S=E,O=RWED,G=RED,W=RE), which is reverse order |
---|
| 2899 | from the internal storage, so (RE,RED,RWED,E). Now translate each |
---|
| 2900 | letter to its corresponding bit: |
---|
| 2901 | |
---|
| 2902 | RE=0101, RED=1101, RWED=1111, E=0010 |
---|
| 2903 | |
---|
| 2904 | Now reverse the bits: |
---|
| 2905 | |
---|
| 2906 | RE=1010, RED=0010, RWED=0000, E=1101 |
---|
| 2907 | |
---|
| 2908 | This gives the 16-bit quantity: |
---|
| 2909 | |
---|
| 2910 | 1010001000001101 |
---|
| 2911 | |
---|
| 2912 | This is the internal representation of the VMS file permission; in |
---|
| 2913 | hex: |
---|
| 2914 | |
---|
| 2915 | A20B |
---|
| 2916 | |
---|
| 2917 | as shown in the sample packet above. |
---|
| 2918 | |
---|
| 2919 | The VMS format probably would also apply to RSX or any other FILES-11 |
---|
| 2920 | system. |
---|
| 2921 | |
---|
| 2922 | I.2. Handling of Generic Protection |
---|
| 2923 | |
---|
| 2924 | To be used when the two systems are different (and/or do not recognize |
---|
| 2925 | or understand each other's local protection codes). |
---|
| 2926 | |
---|
| 2927 | First of all, the book is wrong. This should not be the World |
---|
| 2928 | protection, but the Owner protection. The other fields should be set |
---|
| 2929 | according to system defaults (e.g. UNIX umask, VMS default protection, |
---|
| 2930 | etc), except that no non-Owner field should give more permissions than |
---|
| 2931 | the Owner field. |
---|
| 2932 | |
---|
| 2933 | [ [139]Top ] [ [140]Contents ] [ [141]C-Kermit Home ] [ [142]Kermit |
---|
| 2934 | Home ] |
---|
| 2935 | _________________________________________________________________ |
---|
| 2936 | |
---|
| 2937 | |
---|
| 2938 | C-Kermit Program Logic Manual / [143]The Kermit Project / |
---|
| 2939 | [144]Columbia University / [145]kermit@columbia.edu / 17 March 2003 |
---|
| 2940 | |
---|
| 2941 | References |
---|
| 2942 | |
---|
| 2943 | 1. http://www.columbia.edu/kermit/ |
---|
| 2944 | 2. http://www.columbia.edu/ |
---|
| 2945 | 3. http://www.columbia.edu/kermit/ckcplm.html |
---|
| 2946 | 4. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2947 | 5. http://www.columbia.edu/kermit/index.html |
---|
| 2948 | 6. http://www.columbia.edu/kermit/ckcplm.html#x1 |
---|
| 2949 | 7. http://www.columbia.edu/kermit/ckcplm.html#x2 |
---|
| 2950 | 8. http://www.columbia.edu/kermit/ckcplm.html#x3 |
---|
| 2951 | 9. http://www.columbia.edu/kermit/ckcplm.html#x4 |
---|
| 2952 | 10. http://www.columbia.edu/kermit/ckcplm.html#x4.A |
---|
| 2953 | 11. http://www.columbia.edu/kermit/ckcplm.html#x4.B |
---|
| 2954 | 12. http://www.columbia.edu/kermit/ckcplm.html#x4.C |
---|
| 2955 | 13. http://www.columbia.edu/kermit/ckcplm.html#x4.D |
---|
| 2956 | 14. http://www.columbia.edu/kermit/ckcplm.html#x4.E |
---|
| 2957 | 15. http://www.columbia.edu/kermit/ckcplm.html#x4.F |
---|
| 2958 | 16. http://www.columbia.edu/kermit/ckcplm.html#x4.G |
---|
| 2959 | 17. http://www.columbia.edu/kermit/ckcplm.html#x4.H |
---|
| 2960 | 18. http://www.columbia.edu/kermit/ckcplm.html#x4.I |
---|
| 2961 | 19. http://www.columbia.edu/kermit/ckcplm.html#xa1 |
---|
| 2962 | 20. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2963 | 21. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2964 | 22. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2965 | 23. http://www.columbia.edu/kermit/index.html |
---|
| 2966 | 24. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w |
---|
| 2967 | 25. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2968 | 26. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2969 | 27. http://www.columbia.edu/kermit/index.html |
---|
| 2970 | 28. http://www.columbia.edu/kermit/ckcplm.html#x3.2 |
---|
| 2971 | 29. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2972 | 30. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2973 | 31. http://www.columbia.edu/kermit/index.html |
---|
| 2974 | 32. http://www.columbia.edu/kermit/ckcplm.html#x4.A |
---|
| 2975 | 33. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2976 | 34. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2977 | 35. http://www.columbia.edu/kermit/index.html |
---|
| 2978 | 36. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2979 | 37. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2980 | 38. http://www.columbia.edu/kermit/index.html |
---|
| 2981 | 39. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2982 | 40. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2983 | 41. http://www.columbia.edu/kermit/index.html |
---|
| 2984 | 42. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.h |
---|
| 2985 | 43. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.c |
---|
| 2986 | 44. http://www.columbia.edu/kermit/ckcplm.html#x3.1 |
---|
| 2987 | 45. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 2988 | 46. http://www.columbia.edu/kermit/ckermit.html |
---|
| 2989 | 47. http://www.columbia.edu/kermit/index.html |
---|
| 2990 | 48. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsym.h |
---|
| 2991 | 49. ftp://kermit.columbia.edu/kermit/c-kermit/ckcasc.h |
---|
| 2992 | 50. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsig.h |
---|
| 2993 | 51. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h |
---|
| 2994 | 52. ftp://kermit.columbia.edu/kermit/c-kermit/ckcker.h |
---|
| 2995 | 53. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h |
---|
| 2996 | 54. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c |
---|
| 2997 | 55. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w |
---|
| 2998 | 56. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfns.c |
---|
| 2999 | 57. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn2.c |
---|
| 3000 | 58. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn3.c |
---|
| 3001 | 59. http://www.columbia.edu/kermit/ckcplm.html#x4.B |
---|
| 3002 | 60. http://www.columbia.edu/kermit/ckcplm.html#x4.E |
---|
| 3003 | 61. http://www.columbia.edu/kermit/ckcplm.html#x4.D |
---|
| 3004 | 62. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3005 | 63. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3006 | 64. http://www.columbia.edu/kermit/index.html |
---|
| 3007 | 65. http://www.columbia.edu/kermit/ckcplm.html#x4.B |
---|
| 3008 | 66. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.c |
---|
| 3009 | 67. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h |
---|
| 3010 | 68. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h |
---|
| 3011 | 69. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h |
---|
| 3012 | 70. ftp://kermit.columbia.edu/kermit/c-kermit/ckmxla.h |
---|
| 3013 | 71. ftp://kermit.columbia.edu/kermit/c-kermit/ck?xla |
---|
| 3014 | 72. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.h |
---|
| 3015 | 73. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c |
---|
| 3016 | 74. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3017 | 75. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3018 | 76. http://www.columbia.edu/kermit/index.html |
---|
| 3019 | 77. http://www.columbia.edu/kermit/ckcplm.html#x4.B |
---|
| 3020 | 78. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.h |
---|
| 3021 | 79. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.c |
---|
| 3022 | 80. http://www.columbia.edu/kermit/ckcplm.html#x4.E |
---|
| 3023 | 81. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h |
---|
| 3024 | 82. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.c |
---|
| 3025 | 83. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus2.c |
---|
| 3026 | 84. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c |
---|
| 3027 | 85. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus4.c |
---|
| 3028 | 86. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusy.c |
---|
| 3029 | 87. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c |
---|
| 3030 | 88. ftp://kermit.columbia.edu/kermit/c-kermit/ckuver.h |
---|
| 3031 | 89. ftp://kermit.columbia.edu/kermit/c-kermit/ckuscr.c |
---|
| 3032 | 90. ftp://kermit.columbia.edu/kermit/c-kermit/ckudia.c |
---|
| 3033 | 91. ftp://kermit.columbia.edu/kermit/c-kermit/ckucon.c |
---|
| 3034 | 92. ftp://kermit.columbia.edu/kermit/c-kermit/ckucns.c |
---|
| 3035 | 93. http://www.columbia.edu/kermit/ckcplm.html#x4.E |
---|
| 3036 | 94. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c |
---|
| 3037 | 95. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3038 | 96. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3039 | 97. http://www.columbia.edu/kermit/index.html |
---|
| 3040 | 98. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c |
---|
| 3041 | 99. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
---|
| 3042 | 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c |
---|
| 3043 | 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckvfio.c |
---|
| 3044 | 102. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c |
---|
| 3045 | 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c |
---|
| 3046 | 104. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3047 | 105. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3048 | 106. http://www.columbia.edu/kermit/index.html |
---|
| 3049 | 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
---|
| 3050 | 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckvtio.c |
---|
| 3051 | 109. http://www.columbia.edu/kermit/ckcplm.html#x2 |
---|
| 3052 | 110. http://www.columbia.edu/kermit/ckcplm.html#xa1 |
---|
| 3053 | 111. http://www.columbia.edu/kermit/ckuins.html |
---|
| 3054 | 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h |
---|
| 3055 | 113. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
---|
| 3056 | 114. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3057 | 115. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3058 | 116. http://www.columbia.edu/kermit/index.html |
---|
| 3059 | 117. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c |
---|
| 3060 | 118. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h |
---|
| 3061 | 119. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c |
---|
| 3062 | 120. ftp://kermit.columbia.edu/kermit/c-kermit/cklnet.c |
---|
| 3063 | 121. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3064 | 122. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3065 | 123. http://www.columbia.edu/kermit/index.html |
---|
| 3066 | 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.h |
---|
| 3067 | 125. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c |
---|
| 3068 | 126. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3069 | 127. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3070 | 128. http://www.columbia.edu/kermit/index.html |
---|
| 3071 | 129. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3072 | 130. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3073 | 131. http://www.columbia.edu/kermit/index.html |
---|
| 3074 | 132. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c |
---|
| 3075 | 133. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3076 | 134. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3077 | 135. http://www.columbia.edu/kermit/index.html |
---|
| 3078 | 136. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3079 | 137. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3080 | 138. http://www.columbia.edu/kermit/index.html |
---|
| 3081 | 139. http://www.columbia.edu/kermit/ckcplm.html#top |
---|
| 3082 | 140. http://www.columbia.edu/kermit/ckcplm.html#contents |
---|
| 3083 | 141. http://www.columbia.edu/kermit/ckermit.html |
---|
| 3084 | 142. http://www.columbia.edu/kermit/index.html |
---|
| 3085 | 143. http://www.columbia.edu/kermit/index.html |
---|
| 3086 | 144. http://www.columbia.edu/ |
---|
| 3087 | 145. mailto:kermit@columbia.edu |
---|