lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | .\" -*- nroff -*- |
| 2 | .\" manual page [] for chat 1.8 |
| 3 | .\" $Id: chat.8,v 1.2 2007-06-08 04:02:37 gerg Exp $ |
| 4 | .\" SH section heading |
| 5 | .\" SS subsection heading |
| 6 | .\" LP paragraph |
| 7 | .\" IP indented paragraph |
| 8 | .\" TP hanging label |
| 9 | .TH CHAT 8 "22 May 1999" "Chat Version 1.22" |
| 10 | .SH NAME |
| 11 | chat \- Automated conversational script with a modem |
| 12 | .SH SYNOPSIS |
| 13 | .B chat |
| 14 | [ |
| 15 | .I options |
| 16 | ] |
| 17 | .I script |
| 18 | .SH DESCRIPTION |
| 19 | .LP |
| 20 | The \fIchat\fR program defines a conversational exchange between the |
| 21 | computer and the modem. Its primary purpose is to establish the |
| 22 | connection between the Point-to-Point Protocol Daemon (\fIpppd\fR) and |
| 23 | the remote's \fIpppd\fR process. |
| 24 | .SH OPTIONS |
| 25 | .TP |
| 26 | .B \-f \fI<chat file> |
| 27 | Read the chat script from the chat \fIfile\fR. The use of this option |
| 28 | is mutually exclusive with the chat script parameters. The user must |
| 29 | have read access to the file. Multiple lines are permitted in the |
| 30 | file. Space or horizontal tab characters should be used to separate |
| 31 | the strings. |
| 32 | .TP |
| 33 | .B \-t \fI<timeout> |
| 34 | Set the timeout for the expected string to be received. If the string |
| 35 | is not received within the time limit then the reply string is not |
| 36 | sent. An alternate reply may be sent or the script will fail if there |
| 37 | is no alternate reply string. A failed script will cause the |
| 38 | \fIchat\fR program to terminate with a non-zero error code. |
| 39 | .TP |
| 40 | .B \-r \fI<report file> |
| 41 | Set the file for output of the report strings. If you use the keyword |
| 42 | \fIREPORT\fR, the resulting strings are written to this file. If this |
| 43 | option is not used and you still use \fIREPORT\fR keywords, the |
| 44 | \fIstderr\fR file is used for the report strings. |
| 45 | .TP |
| 46 | .B \-e |
| 47 | Start with the echo option turned on. Echoing may also be turned on |
| 48 | or off at specific points in the chat script by using the \fIECHO\fR |
| 49 | keyword. When echoing is enabled, all output from the modem is echoed |
| 50 | to \fIstderr\fR. |
| 51 | .TP |
| 52 | .B \-E |
| 53 | Enables environment variable substituion within chat scripts using the |
| 54 | standard \fI$xxx\fR syntax. |
| 55 | .TP |
| 56 | .B \-v |
| 57 | Request that the \fIchat\fR script be executed in a verbose mode. The |
| 58 | \fIchat\fR program will then log the execution state of the chat |
| 59 | script as well as all text received from the modem and the output |
| 60 | strings sent to the modem. The default is to log through the SYSLOG; |
| 61 | the logging method may be altered with the \-S and \-s flags. |
| 62 | .TP |
| 63 | .B \-V |
| 64 | Request that the \fIchat\fR script be executed in a stderr verbose |
| 65 | mode. The \fIchat\fR program will then log all text received from the |
| 66 | modem and the output strings sent to the modem to the stderr device. This |
| 67 | device is usually the local console at the station running the chat or |
| 68 | pppd program. |
| 69 | .TP |
| 70 | .B \-s |
| 71 | Use stderr. All log messages from '\-v' and all error messages will be |
| 72 | sent to stderr. |
| 73 | .TP |
| 74 | .B \-S |
| 75 | Do not use the SYSLOG. By default, error messages are sent to the |
| 76 | SYSLOG. The use of \-S will prevent both log messages from '\-v' and |
| 77 | error messages from being sent to the SYSLOG. |
| 78 | .TP |
| 79 | .B \-T \fI<phone number> |
| 80 | Pass in an arbitary string, usually a phone number, that will be |
| 81 | substituted for the \\T substitution metacharacter in a send string. |
| 82 | .TP |
| 83 | .B \-U \fI<phone number 2> |
| 84 | Pass in a second string, usually a phone number, that will be |
| 85 | substituted for the \\U substitution metacharacter in a send string. |
| 86 | This is useful when dialing an ISDN terminal adapter that requires two |
| 87 | numbers. |
| 88 | .TP |
| 89 | .B script |
| 90 | If the script is not specified in a file with the \fI\-f\fR option then |
| 91 | the script is included as parameters to the \fIchat\fR program. |
| 92 | .SH CHAT SCRIPT |
| 93 | .LP |
| 94 | The \fIchat\fR script defines the communications. |
| 95 | .LP |
| 96 | A script consists of one or more "expect\-send" pairs of strings, |
| 97 | separated by spaces, with an optional "subexpect\-subsend" string pair, |
| 98 | separated by a dash as in the following example: |
| 99 | .IP |
| 100 | ogin:\-BREAK\-ogin: ppp ssword: hello2u2 |
| 101 | .LP |
| 102 | This line indicates that the \fIchat\fR program should expect the string |
| 103 | "ogin:". If it fails to receive a login prompt within the time interval |
| 104 | allotted, it is to send a break sequence to the remote and then expect the |
| 105 | string "ogin:". If the first "ogin:" is received then the break sequence is |
| 106 | not generated. |
| 107 | .LP |
| 108 | Once it received the login prompt the \fIchat\fR program will send the |
| 109 | string ppp and then expect the prompt "ssword:". When it receives the |
| 110 | prompt for the password, it will send the password hello2u2. |
| 111 | .LP |
| 112 | A carriage return is normally sent following the reply string. It is not |
| 113 | expected in the "expect" string unless it is specifically requested by using |
| 114 | the \\r character sequence. |
| 115 | .LP |
| 116 | The expect sequence should contain only what is needed to identify the |
| 117 | string. Since it is normally stored on a disk file, it should not contain |
| 118 | variable information. It is generally not acceptable to look for time |
| 119 | strings, network identification strings, or other variable pieces of data as |
| 120 | an expect string. |
| 121 | .LP |
| 122 | To help correct for characters which may be corrupted during the initial |
| 123 | sequence, look for the string "ogin:" rather than "login:". It is possible |
| 124 | that the leading "l" character may be received in error and you may never |
| 125 | find the string even though it was sent by the system. For this reason, |
| 126 | scripts look for "ogin:" rather than "login:" and "ssword:" rather than |
| 127 | "password:". |
| 128 | .LP |
| 129 | A very simple script might look like this: |
| 130 | .IP |
| 131 | ogin: ppp ssword: hello2u2 |
| 132 | .LP |
| 133 | In other words, expect ....ogin:, send ppp, expect ...ssword:, send hello2u2. |
| 134 | .LP |
| 135 | In actual practice, simple scripts are rare. At the vary least, you |
| 136 | should include sub-expect sequences should the original string not be |
| 137 | received. For example, consider the following script: |
| 138 | .IP |
| 139 | ogin:\-\-ogin: ppp ssword: hello2u2 |
| 140 | .LP |
| 141 | This would be a better script than the simple one used earlier. This would look |
| 142 | for the same login: prompt, however, if one was not received, a single |
| 143 | return sequence is sent and then it will look for login: again. Should line |
| 144 | noise obscure the first login prompt then sending the empty line will |
| 145 | usually generate a login prompt again. |
| 146 | .SH COMMENTS |
| 147 | Comments can be embedded in the chat script. A comment is a line which |
| 148 | starts with the \fB#\fR (hash) character in column 1. Such comment |
| 149 | lines are just ignored by the chat program. If a '#' character is to |
| 150 | be expected as the first character of the expect sequence, you should |
| 151 | quote the expect string. |
| 152 | If you want to wait for a prompt that starts with a # (hash) |
| 153 | character, you would have to write something like this: |
| 154 | .IP |
| 155 | # Now wait for the prompt and send logout string |
| 156 | .br |
| 157 | \&'# ' logout |
| 158 | .LP |
| 159 | |
| 160 | .SH SENDING DATA FROM A FILE |
| 161 | If the string to send starts with an at sign (@), the rest of the |
| 162 | string is taken to be the name of a file to read to get the string to |
| 163 | send. If the last character of the data read is a newline, it is |
| 164 | removed. The file can be a named pipe (or fifo) instead of a regular |
| 165 | file. This provides a way for \fBchat\fR to communicate with another |
| 166 | program, for example, a program to prompt the user and receive a |
| 167 | password typed in. |
| 168 | .LP |
| 169 | |
| 170 | .SH ABORT STRINGS |
| 171 | Many modems will report the status of the call as a string. These |
| 172 | strings may be \fBCONNECTED\fR or \fBNO CARRIER\fR or \fBBUSY\fR. It |
| 173 | is often desirable to terminate the script should the modem fail to |
| 174 | connect to the remote. The difficulty is that a script would not know |
| 175 | exactly which modem string it may receive. On one attempt, it may |
| 176 | receive \fBBUSY\fR while the next time it may receive \fBNO CARRIER\fR. |
| 177 | .LP |
| 178 | These "abort" strings may be specified in the script using the \fIABORT\fR |
| 179 | sequence. It is written in the script as in the following example: |
| 180 | .IP |
| 181 | ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT |
| 182 | .LP |
| 183 | This sequence will expect nothing; and then send the string ATZ. The |
| 184 | expected response to this is the string \fIOK\fR. When it receives \fIOK\fR, |
| 185 | the string ATDT5551212 to dial the telephone. The expected string is |
| 186 | \fICONNECT\fR. If the string \fICONNECT\fR is received the remainder of the |
| 187 | script is executed. However, should the modem find a busy telephone, it will |
| 188 | send the string \fIBUSY\fR. This will cause the string to match the abort |
| 189 | character sequence. The script will then fail because it found a match to |
| 190 | the abort string. If it received the string \fINO CARRIER\fR, it will abort |
| 191 | for the same reason. Either string may be received. Either string will |
| 192 | terminate the \fIchat\fR script. |
| 193 | .SH CLR_ABORT STRINGS |
| 194 | This sequence allows for clearing previously set \fBABORT\fR strings. |
| 195 | \fBABORT\fR strings are kept in an array of a pre-determined size (at |
| 196 | compilation time); \fBCLR_ABORT\fR will reclaim the space for cleared |
| 197 | entries so that new strings can use that space. |
| 198 | .SH SAY STRINGS |
| 199 | The \fBSAY\fR directive allows the script to send strings to the user |
| 200 | at the terminal via standard error. If \fBchat\fR is being run by |
| 201 | pppd, and pppd is running as a daemon (detached from its controlling |
| 202 | terminal), standard error will normally be redirected to the file |
| 203 | /etc/ppp/connect\-errors. |
| 204 | .LP |
| 205 | \fBSAY\fR strings must be enclosed in single or double quotes. If |
| 206 | carriage return and line feed are needed in the string to be output, |
| 207 | you must explicitely add them to your string. |
| 208 | .LP |
| 209 | The SAY strings could be used to give progress messages in sections of |
| 210 | the script where you want to have 'ECHO OFF' but still let the user |
| 211 | know what is happening. An example is: |
| 212 | .IP |
| 213 | ABORT BUSY |
| 214 | .br |
| 215 | ECHO OFF |
| 216 | .br |
| 217 | SAY "Dialling your ISP...\\n" |
| 218 | .br |
| 219 | \&'' ATDT5551212 |
| 220 | .br |
| 221 | TIMEOUT 120 |
| 222 | .br |
| 223 | SAY "Waiting up to 2 minutes for connection ... " |
| 224 | .br |
| 225 | CONNECT '' |
| 226 | .br |
| 227 | SAY "Connected, now logging in ...\n" |
| 228 | .br |
| 229 | ogin: account |
| 230 | .br |
| 231 | ssword: pass |
| 232 | .br |
| 233 | $ \c |
| 234 | SAY "Logged in OK ...\n" |
| 235 | \fIetc ...\fR |
| 236 | .LP |
| 237 | This sequence will only present the SAY strings to the user and all |
| 238 | the details of the script will remain hidden. For example, if the |
| 239 | above script works, the user will see: |
| 240 | .IP |
| 241 | Dialling your ISP... |
| 242 | .br |
| 243 | Waiting up to 2 minutes for connection ... Connected, now logging in ... |
| 244 | .br |
| 245 | Logged in OK ... |
| 246 | .LP |
| 247 | |
| 248 | .SH REPORT STRINGS |
| 249 | A \fBreport\fR string is similar to the ABORT string. The difference |
| 250 | is that the strings, and all characters to the next control character |
| 251 | such as a carriage return, are written to the report file. |
| 252 | .LP |
| 253 | The report strings may be used to isolate the transmission rate of the |
| 254 | modem's connect string and return the value to the chat user. The |
| 255 | analysis of the report string logic occurs in conjunction with the |
| 256 | other string processing such as looking for the expect string. The use |
| 257 | of the same string for a report and abort sequence is probably not |
| 258 | very useful, however, it is possible. |
| 259 | .LP |
| 260 | The report strings to no change the completion code of the program. |
| 261 | .LP |
| 262 | These "report" strings may be specified in the script using the \fIREPORT\fR |
| 263 | sequence. It is written in the script as in the following example: |
| 264 | .IP |
| 265 | REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account |
| 266 | .LP |
| 267 | This sequence will expect nothing; and then send the string |
| 268 | ATDT5551212 to dial the telephone. The expected string is |
| 269 | \fICONNECT\fR. If the string \fICONNECT\fR is received the remainder |
| 270 | of the script is executed. In addition the program will write to the |
| 271 | expect\-file the string "CONNECT" plus any characters which follow it |
| 272 | such as the connection rate. |
| 273 | .SH CLR_REPORT STRINGS |
| 274 | This sequence allows for clearing previously set \fBREPORT\fR strings. |
| 275 | \fBREPORT\fR strings are kept in an array of a pre-determined size (at |
| 276 | compilation time); \fBCLR_REPORT\fR will reclaim the space for cleared |
| 277 | entries so that new strings can use that space. |
| 278 | .SH ECHO |
| 279 | The echo options controls whether the output from the modem is echoed |
| 280 | to \fIstderr\fR. This option may be set with the \fI\-e\fR option, but |
| 281 | it can also be controlled by the \fIECHO\fR keyword. The "expect\-send" |
| 282 | pair \fIECHO\fR \fION\fR enables echoing, and \fIECHO\fR \fIOFF\fR |
| 283 | disables it. With this keyword you can select which parts of the |
| 284 | conversation should be visible. For instance, with the following |
| 285 | script: |
| 286 | .IP |
| 287 | ABORT 'BUSY' |
| 288 | .br |
| 289 | ABORT 'NO CARRIER' |
| 290 | .br |
| 291 | '' ATZ |
| 292 | .br |
| 293 | OK\\r\\n ATD1234567 |
| 294 | .br |
| 295 | \\r\\n \\c |
| 296 | .br |
| 297 | ECHO ON |
| 298 | .br |
| 299 | CONNECT \\c |
| 300 | .br |
| 301 | ogin: account |
| 302 | .LP |
| 303 | all output resulting from modem configuration and dialing is not visible, |
| 304 | but starting with the \fICONNECT\fR (or \fIBUSY\fR) message, everything |
| 305 | will be echoed. |
| 306 | .SH HANGUP |
| 307 | The HANGUP options control whether a modem hangup should be considered |
| 308 | as an error or not. This option is useful in scripts for dialling |
| 309 | systems which will hang up and call your system back. The HANGUP |
| 310 | options can be \fBON\fR or \fBOFF\fR. |
| 311 | .br |
| 312 | When HANGUP is set OFF and the modem hangs up (e.g., after the first |
| 313 | stage of logging in to a callback system), \fBchat\fR will continue |
| 314 | running the script (e.g., waiting for the incoming call and second |
| 315 | stage login prompt). As soon as the incoming call is connected, you |
| 316 | should use the \fBHANGUP ON\fR directive to reinstall normal hang up |
| 317 | signal behavior. Here is an (simple) example script: |
| 318 | .IP |
| 319 | ABORT 'BUSY' |
| 320 | .br |
| 321 | '' ATZ |
| 322 | .br |
| 323 | OK\\r\\n ATD1234567 |
| 324 | .br |
| 325 | \\r\\n \\c |
| 326 | .br |
| 327 | CONNECT \\c |
| 328 | .br |
| 329 | \&'Callback login:' call_back_ID |
| 330 | .br |
| 331 | HANGUP OFF |
| 332 | .br |
| 333 | ABORT "Bad Login" |
| 334 | .br |
| 335 | \&'Callback Password:' Call_back_password |
| 336 | .br |
| 337 | TIMEOUT 120 |
| 338 | .br |
| 339 | CONNECT \\c |
| 340 | .br |
| 341 | HANGUP ON |
| 342 | .br |
| 343 | ABORT "NO CARRIER" |
| 344 | .br |
| 345 | ogin:\-\-BREAK\-\-ogin: real_account |
| 346 | .br |
| 347 | \fIetc ...\fR |
| 348 | .LP |
| 349 | .SH TIMEOUT |
| 350 | The initial timeout value is 45 seconds. This may be changed using the \fB\-t\fR |
| 351 | parameter. |
| 352 | .LP |
| 353 | To change the timeout value for the next expect string, the following |
| 354 | example may be used: |
| 355 | .IP |
| 356 | ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:\-\-ogin: TIMEOUT 5 assword: hello2u2 |
| 357 | .LP |
| 358 | This will change the timeout to 10 seconds when it expects the login: |
| 359 | prompt. The timeout is then changed to 5 seconds when it looks for the |
| 360 | password prompt. |
| 361 | .LP |
| 362 | The timeout, once changed, remains in effect until it is changed again. |
| 363 | .SH SENDING EOT |
| 364 | The special reply string of \fIEOT\fR indicates that the chat program |
| 365 | should send an EOT character to the remote. This is normally the |
| 366 | End-of-file character sequence. A return character is not sent |
| 367 | following the EOT. |
| 368 | .PR |
| 369 | The EOT sequence may be embedded into the send string using the |
| 370 | sequence \fI^D\fR. |
| 371 | .SH GENERATING BREAK |
| 372 | The special reply string of \fIBREAK\fR will cause a break condition |
| 373 | to be sent. The break is a special signal on the transmitter. The |
| 374 | normal processing on the receiver is to change the transmission rate. |
| 375 | It may be used to cycle through the available transmission rates on |
| 376 | the remote until you are able to receive a valid login prompt. |
| 377 | .PR |
| 378 | The break sequence may be embedded into the send string using the |
| 379 | \fI\\K\fR sequence. |
| 380 | .SH ESCAPE SEQUENCES |
| 381 | The expect and reply strings may contain escape sequences. All of the |
| 382 | sequences are legal in the reply string. Many are legal in the expect. |
| 383 | Those which are not valid in the expect sequence are so indicated. |
| 384 | .TP |
| 385 | .B '' |
| 386 | Expects or sends a null string. If you send a null string then it will still |
| 387 | send the return character. This sequence may either be a pair of apostrophe |
| 388 | or quote characters. |
| 389 | .TP |
| 390 | .B \\\\b |
| 391 | represents a backspace character. |
| 392 | .TP |
| 393 | .B \\\\c |
| 394 | Suppresses the newline at the end of the reply string. This is the only |
| 395 | method to send a string without a trailing return character. It must |
| 396 | be at the end of the send string. For example, |
| 397 | the sequence hello\\c will simply send the characters h, e, l, l, o. |
| 398 | .I (not valid in expect.) |
| 399 | .TP |
| 400 | .B \\\\d |
| 401 | Delay for one second. The program uses sleep(1) which will delay to a |
| 402 | maximum of one second. |
| 403 | .I (not valid in expect.) |
| 404 | .TP |
| 405 | .B \\\\K |
| 406 | Insert a BREAK |
| 407 | .I (not valid in expect.) |
| 408 | .TP |
| 409 | .B \\\\n |
| 410 | Send a newline or linefeed character. |
| 411 | .TP |
| 412 | .B \\\\N |
| 413 | Send a null character. The same sequence may be represented by \\0. |
| 414 | .I (not valid in expect.) |
| 415 | .TP |
| 416 | .B \\\\p |
| 417 | Pause for a fraction of a second. The delay is 1/10th of a second. |
| 418 | .I (not valid in expect.) |
| 419 | .TP |
| 420 | .B \\\\q |
| 421 | Suppress writing the string to the SYSLOG file. The string ?????? is |
| 422 | written to the log in its place. |
| 423 | .I (not valid in expect.) |
| 424 | .TP |
| 425 | .B \\\\r |
| 426 | Send or expect a carriage return. |
| 427 | .TP |
| 428 | .B \\\\s |
| 429 | Represents a space character in the string. This may be used when it |
| 430 | is not desirable to quote the strings which contains spaces. The |
| 431 | sequence 'HI TIM' and HI\\sTIM are the same. |
| 432 | .TP |
| 433 | .B \\\\t |
| 434 | Send or expect a tab character. |
| 435 | .TP |
| 436 | .B \\\\T |
| 437 | Send the phone number string as specified with the \fI\-T\fR option |
| 438 | .I (not valid in expect.) |
| 439 | .TP |
| 440 | .B \\\\U |
| 441 | Send the phone number 2 string as specified with the \fI\-U\fR option |
| 442 | .I (not valid in expect.) |
| 443 | .TP |
| 444 | .B \\\\\\\\ |
| 445 | Send or expect a backslash character. |
| 446 | .TP |
| 447 | .B \\\\ddd |
| 448 | Collapse the octal digits (ddd) into a single ASCII character and send that |
| 449 | character. |
| 450 | .I (some characters are not valid in expect.) |
| 451 | .TP |
| 452 | .B \^^C |
| 453 | Substitute the sequence with the control character represented by C. |
| 454 | For example, the character DC1 (17) is shown as \^^Q. |
| 455 | .I (some characters are not valid in expect.) |
| 456 | .SH ENVIRONMENT VARIABLES |
| 457 | Environment variables are available within chat scripts, if the \fI\-E\fR |
| 458 | option was specified in the command line. The metacharacter \fI$\fR is used |
| 459 | to introduce the name of the environment variable to substitute. If the |
| 460 | substition fails, because the requested environment variable is not set, |
| 461 | \fInothing\fR is replaced for the variable. |
| 462 | .SH TERMINATION CODES |
| 463 | The \fIchat\fR program will terminate with the following completion |
| 464 | codes. |
| 465 | .TP |
| 466 | .B 0 |
| 467 | The normal termination of the program. This indicates that the script |
| 468 | was executed without error to the normal conclusion. |
| 469 | .TP |
| 470 | .B 1 |
| 471 | One or more of the parameters are invalid or an expect string was too |
| 472 | large for the internal buffers. This indicates that the program as not |
| 473 | properly executed. |
| 474 | .TP |
| 475 | .B 2 |
| 476 | An error occurred during the execution of the program. This may be due |
| 477 | to a read or write operation failing for some reason or chat receiving |
| 478 | a signal such as SIGINT. |
| 479 | .TP |
| 480 | .B 3 |
| 481 | A timeout event occurred when there was an \fIexpect\fR string without |
| 482 | having a "\-subsend" string. This may mean that you did not program the |
| 483 | script correctly for the condition or that some unexpected event has |
| 484 | occurred and the expected string could not be found. |
| 485 | .TP |
| 486 | .B 4 |
| 487 | The first string marked as an \fIABORT\fR condition occurred. |
| 488 | .TP |
| 489 | .B 5 |
| 490 | The second string marked as an \fIABORT\fR condition occurred. |
| 491 | .TP |
| 492 | .B 6 |
| 493 | The third string marked as an \fIABORT\fR condition occurred. |
| 494 | .TP |
| 495 | .B 7 |
| 496 | The fourth string marked as an \fIABORT\fR condition occurred. |
| 497 | .TP |
| 498 | .B ... |
| 499 | The other termination codes are also strings marked as an \fIABORT\fR |
| 500 | condition. |
| 501 | .LP |
| 502 | Using the termination code, it is possible to determine which event |
| 503 | terminated the script. It is possible to decide if the string "BUSY" |
| 504 | was received from the modem as opposed to "NO DIAL TONE". While the |
| 505 | first event may be retried, the second will probably have little |
| 506 | chance of succeeding during a retry. |
| 507 | .SH SEE ALSO |
| 508 | Additional information about \fIchat\fR scripts may be found with UUCP |
| 509 | documentation. The \fIchat\fR script was taken from the ideas proposed |
| 510 | by the scripts used by the \fIuucico\fR program. |
| 511 | .LP |
| 512 | uucico(1), uucp(1) |
| 513 | .SH COPYRIGHT |
| 514 | The \fIchat\fR program is in public domain. This is not the GNU public |
| 515 | license. If it breaks then you get to keep both pieces. |