aboutsummaryrefslogtreecommitdiffstats
path: root/comms/mgetty+sendfax/pkg-install
blob: c442404b9652520e8aae1405342506b70ebdb6e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
#!/usr/bin/perl

exit 0 if $ARGV[1] ne "POST-INSTALL";

print STDERR "\n\n\n =========== mgetty+sendfax configuration ================\n\n";
$prefix = $ENV{'PKG_PREFIX'};
$sep = "~";

&read_config ("$prefix/etc/mgetty+sendfax/mgetty.config");
foreach (keys(%var)) {
    $var_m{$_} = $var{$_};
    delete $var{$_};
}
&read_config ("$prefix/etc/mgetty+sendfax/sendfax.config");
foreach (keys(%var)) {
    $var_f{$_} = $var{$_};
}

$a = 1;
$devices = $var{'ports'} ? $var{'ports'} : "cuaa1";
while ($a) {
    $devices = &ask ("list of devices", $devices);

    $_ = $devices;
    $w = 0;
    foreach (split) {
    if (! -c "/dev/$_" ) {
        print STDERR "warning: device file /dev/$_ does not exist!\n";
        $w++;
    }
    }   
    if ($w) {
    $a = 0 if (&yesno ("are you sure?" , "n") eq "y");
    } else {
    $a = 0;
    }
}

open (TMP1, ">/tmp/mgetty.config.$$") || die "$!\n";
open (TMP2, ">/tmp/sendfax.config.$$") || die "$!\n";
$_ = join (":", $devices);
print TMP2 "fax-devices $_\n\n";

$_ = $devices;

foreach $port (split) {
    print STDERR "\n\n   *** Configuring for port $port ***\n\n";
    print TMP1 "\nport $port\n";
    print TMP2 "\nport $port\n";
    &setdef ($port);
again:
    &inq_m;
    $settings_m = $settings;
    &inq_f;
    $settings_f = "fax-id modem-type switchbd $settings";
    goto again if (&confirm ($port) ne "y");
    &write_tmp;
}

close (TMP1);
close (TMP2);
if ( -e "$prefix/etc/mgetty+sendfax/mgetty.config") {
    system ("mv -f $prefix/etc/mgetty+sendfax/mgetty.config $prefix/etc/mgetty+sendfax/mgetty.config.old");
    system ("rm -f $prefix/etc/mgetty+sendfax/mgetty.config");
}
if ( -e "$prefix/etc/mgetty+sendfax/sendfax.config") {
    system ("mv -f $prefix/etc/mgetty+sendfax/sendfax.config $prefix/etc/mgetty+sendfax/sendfax.config.old");
    system ("rm -f $prefix/etc/mgetty+sendfax/sendfax.config");
}
system ("mv -f /tmp/mgetty.config.$$ $prefix/etc/mgetty+sendfax/mgetty.config");
system ("mv -f /tmp/sendfax.config.$$ $prefix/etc/mgetty+sendfax/sendfax.config");

open (F, ">$prefix/etc/mgetty+sendfax/faxheader");
print F "\n      FAX  FROM:  **not configured** $def{fax-id}     TO: \@T\@    PAGE: \@P\@ OF \@M\@ \n";
close (F);


print STDERR "\n\nediting /etc/ttys...\n";

open (F, "/etc/ttys");
@ttys = <F>;
close (F);

foreach $tty (@ttys) {
    $_ = $devices;
    foreach $port (split) {
    if ($tty =~ /^\s*$port/) {
        print STDERR "replacing line $tty";
        $tty = "$port\t\"$prefix/sbin/mgetty\"\tunknown on insecure\n";
        $replaced{$port} = 1;
    }
    }
}
$_ = $devices;
foreach $port (split) {
    if (!$replaced{$port}) {
    print STDERR "adding port $port\n";
    push (@ttys, "$port\t\"$prefix/sbin/mgetty\"\tunknown on insecure\n");
    }
}
system ("mv -f /etc/ttys /etc/ttys.old");
open (F, ">/etc/ttys");
print F @ttys;
close (F);


exit 0;

sub confirm {
    $_ = shift;
    print STDERR "\n\n\tSettings for port $_\n\t------------------------\n";
    $_ = $settings_m;
    foreach (split) {
    print STDERR "\t$_ $def{$_}\n" if ($def{$_});
    }
    $_ = $settings_f;
    foreach (split) {
    print STDERR "\t$_ $def_f{$_}\n" if ($def_f{$_});
    }
    return &yesno ("OK?", "y");
}
    
sub write_tmp {
    $_ = $settings_m;
    foreach (split) {
    print TMP1 "$_ $def{$_}\n" if ($def{$_});
    }
    $_ = $settings_f;
    foreach (split) {
    print TMP2 "$_ $def_f{$_}\n" if ($def_f{$_});
    }
}

sub inq_m {
    $settings = "debug";
    $def{'debug'} = 4 if !$def{'debug'};
    $def{'debug'} = &ask ("   - `debug (mgetty)' 
     This sets the amount of logging `mgetty' will do. A good value is
     4, more details are seen with `5', and `9' is really noisy.  Try
     it! The log data is written to the file `/tmp/log_mg.cuaxx'.", 
              $def{'debug'});

    $settings .= " fax-id";
    $def{'fax-id'} = "00 00 000000" if ! $def{'fax-id'};
    $def{'fax-id'} = &ask ("   - `fax-id'
     This sets the fax station ID used in fax mode to identify your
     site to the caller (usually this is simply your fax phone number).
     ", $def{'fax-id'}) ;
    $def_f{'fax-id'} = $def{'fax-id'} ;

    $settings .= " speed";
    $def{'speed'} = 38400 if !$def{'speed'};
    $def{'speed'} = &ask ("   - `speed'
     Specify, as integer value, the port speed to use. Default is
     38400. If the given speed is not valid, `mgetty' complains loudly 
     and exits.", $def{'speed'});

    $settings .= " switchbd";
    $def{'switchbd'} = 0 if !$def{'switchbd'};
    $def{'switchbd'} = &ask ("   - `switchbd'
     Some modems, mainly Rockwell chipsets, switch to 19200 bps when
     entering fax mode. Others may need other speed switches (but I
     know none).  If your modem is Rockwell based, try `switchbd 19200'
     if fax reception doesn't work. (*Warning:* if this is set wrongly,
     fax reception will definitely fail. For most sane modems, you do
     *not need* this.). Set speed or `0'", $def{'switchbd'});
    $def_f{'switchbd'} = $def{'switchbd'};

    $settings .= " direct";
    $def{'direct'} = "NO" if !$def{'direct'};
    $def{'direct'} = &ask ("   - `direct' 
     Tells mgetty that it is running on a direct line. Mgetty won't try
     to initialize any modem, nor will it wait for `RING'. It will just
     wait for any character, and then output the issue file and login
     prompt. This option is used if you want to connect to machines via
     nullmodem cable.",  $def{'direct'});

    $settings .= " blocking";
    $def{'blocking'} = "NO" if !$def{'blocking'};
    $def{'blocking'} = &ask ("   - `blocking' 
     Tells mgetty to open the device in `blocking' mode, that is, the
     `open()' system call won't succeed until carrier detect is set.
     This is set if `mgetty' is called as `getty'. I'm not sure whether
     it's very useful, but I include it for completeness", $def{'blocking'});

    $settings .= " port-owner";
    $def{'port-owner'} = "uucp" if !$def{'port-owner'};
    $def{'port-owner'} =  &ask ("   - `port-owner'
     If set, mgetty will `chown' the tty line to the given username (you
     can specify a string or an integer uid, but the integer must be
     valid).  This is highly recommended for security purposes: only
     give port access to those users you trust not to misuse your modem
     lines!",   $def{'port-owner'});

    $settings .= " port-group";
    $def{'port-group'} = "uucp" if !$def{'port-group'};
    $def{'port-group'} = &ask ("   - `port-group' 
     If set, mgetty will `chgrp' the tty line to this group id (which
     can be given as group name, or as integer gid). If it's not given,
     or not valid, the primary group id of `port-owner' 
     will be used.", $def{'port-group'});

    $settings .= " port-mode";
    $def{'port-mode'} = "0660" if !$def{'port-mode'};
    $def{'port-mode'} = &ask ("   - `port-mode'
     Specifies the permissions to `chmod' the device to. 
     *Never* make a modem device world-accessible, better use `0660'
     or even `0600'.", $def{'port-mode'} );
   
    $settings .= " toggle-dtr";
    $def{'toggle-dtr'} = "YES" if !$def{'toggle-dtr'};
    $def{'toggle-dtr'} = &ask ("   - `toggle-dtr'
     Tells mgetty whether it should lower the DTR line upon startup to
     reset modem. Default is `yes', but some (few) modems react
     allergic to that and crash.", $def{'toggle-dtr'});

    $settings .= " toggle-dtr-waittime";
    $def{'toggle-dtr-waittime'} = 500 if !$def{'toggle-dtr-waittime'};
    $def{'toggle-dtr-waittime'} = &ask ("   - `toggle-dtr-waittime'
     Specifies the time (in ms) to hold the DTR line low.", $def{'toggle-dtr-waittime'} );

    $settings .= " data-only";
    $def{'data-only'} = "NO" if !$def{'data-only'};
    $def{'data-only'} =&ask ("   - `data-only'
     Tells `mgetty' to forget about faxing and only use the data part of
     the modem. Default is `false'. You need this if your modem can't
     distinguish incoming fax and data calls.", $def{'data-only'} );

    $settings .= " fax-only";
    $def{'fax-only'} = "NO" if !$def{'fax-only'};
    $def{'fax-only'} = &ask ("   - `fax-only'
     Tells `mgetty' to put the modem in fax-only mode. You need this if
     your modem can't distinguish incoming fax and data calls, but you
     need fax more important than data; and you need it if you want to
     disable data calls for security reasons (this could be achieved
     via `login.config' as well)", $def{'fax-only'});

    $settings .= " modem-type";
    $def{'modem-type'} = "auto" if ! $def{'modem-type'};
    $def{'modem-type'} = &ask ("   - `modem-type'
     Specifies the kind of modem connected to the port. Valid options are:
        * auto
          Mgetty will detect the modem type itself (which may occasionally
           be not desirable, or it may fail on old modem equipment).
        * c2.0
          Modem is a CLASS 2.0 fax mode. Works better than class 2, if
          both are available, because its better standardized. Known to
          work with USR and ZyXEL.
        * cls2
          Modem is a CLASS 2 fax modem, mgetty will not try class 2.0.
        * data
          Do not try fax initialization
     There is no way (yet) to tell mgetty to use *only* fax mode and
     refuse data calls with this option, use the `fax-only true'
     statement for that.", $def{'modem-type'});
    $def_f{'modem-type'} = $def{'modem-type'};

    $settings .= " init-chat";
    $def{'init-chat'} = '"" ATS0=0Q0&D3&C1 OK' if ! $def{'init-chat'};
    $def{'init-chat'} = &ask ("   - `init-chat' 
     Tells mgetty the chat sequence to use for initializing the modem.
     *Warning*: the sequence starts with *expect*, which will in most
     cases be `\"\"' (nothing). This ordering was chosen because UUCP
     does it this way, and I wanted to avoid confusion here.

     Example:

         \"\" \\d\\d\\d+++\\d\\d\\dATQ0E1V1H0 OK ATL0M0S0=0 OK AT&K3 OK
    init sequence", $def{'init-chat'});     

    $settings .= " force-init-chat";
    $def{'force-init-chat'} = "" if !$def{'force-init-chat'};
    $def{'force-init-chat'} = &ask ("   - `force-init-chat'
     In some cases, the modem can get stuck in a mode where it won't
     react to a simple `AT' command. Usually this happens because the
     modem is set to ignore a DTR drop and still has a data connection
     to the other side. If you use a voice modem, it could be stuck in
     voice mode.

     In these situations, the normal `init-chat' will time out, because
     the modem won't send the proper responses back.

     To get the modem back into a sane state, you can use the
     `force-init-chat' chat sequence. The default setup will send the
     DLE ETX characters, to get voice modems back to life, and then the
     `(pause)+++(pause)ATH0' sequence to get the modem back from data
     mode to command mode.

     You could prepend this sequence to `init-chat' (it wouldn't harm),
     but especially the pauses around the +++ sequence makes this
     undesirable slow.", $def{'force-init-chat'});

    $settings .= " modem-check-time";
    $def{'modem-check-time'} = 3600 if ! $def{'modem-check-time'};
    $def{'modem-check-time'} = &ask ("   - `modem-check-time'
     Some modems have the nasty tendency to crash silently. With this
     option, you tell `mgetty' to check every SECONDS seconds with a
     simple `AT...OK' sequence whether the modem still reacts. If not,
     `mgetty' will restart itself and do a full modem reset.", $def{'modem-check-time'});

    $settings .= " rings";
    $def{'rings'} = 1 if !$def{'rings'};
    $def{'rings'} = &ask ("   - `rings' 
     Sets the number of `RING' messages to wait for, before mgetty
     picks up the phone. *Warning:* if your modem  auto-answers, for 
     whatever reason, set this to something  *different* than the 
     value set with `ATS0=mmm', otherwise the  modems autoanswer and 
     mgettys manual answer will collide (most  modems hang up if a 
     command is received during auto-answer)", $def{'rings'});

  
    $settings .= " answer-chat";
    $def{'answer-chat'} = '"" ATA CONNECT \c \r' if !$def{'answer-chat'};
    $def{'answer-chat'} =&ask ("   - `answer-chat'
     This is the command sequence that is used to answer a phone call.
     Usually you can leave it at the default ` \"\" ATA CONNECT \\c \\r ',
     but for some modems you need `ATS0=1' in place of `ATA' (ATA not
     allowed). The extra `\\r' expect string is needed that the code can
     grab the full CONNECT XYZ\\R string. It will work without the \\r,
     but then the logging information will be less detailed. *Right now,
     \\r won't work at all, it's not implemented yet. Don't use it.*
     ", $def{'answer-chat'} );

    $settings .= " answer-chat-timeout";
    $def{'answer-chat-timeout'} = 80 if !$def{'answer-chat-timeout'};
    $def{'answer-chat-timeout'} = &ask ("   - `answer-chat-timeout' 
     During the ANSWER-CHAT, each \"expect\" string must be seen in the
     time specified here. Default is 80 seconds. This time should be at
     least some 5 seconds longer than the time set with the `ATS7=...'
     modem setup command.", $def{'answer-chat-timeout'});

    $settings .= " autobauding";
    $def{'autobauding'} = "NO" if !$def{'autobauding'};
    $def{'autobauding'} = &ask ("  - `autobauding'
     Some modems switch their DTE line speed to the communication line
     speed after connecting, e.g., after sending `CONNECT 2400', the
     modem switches to 2400 bps. Newer modems usually have a switch to
     \"lock\" a DTE baud rate, which is strongly recommended. If your
     modem insists on doing this speed switch, setting `autobauding' to
     YES will make mgetty behave accordingly.", $def{'autobauding'});

    $settings .= " ringback";
    $def{'ringback'} = "NO" if !$def{'ringback'} ;
    $def{'ringback'} = &ask ("   - `ringback'
     If you have to put your modem and your telephone on the same phone
     line, you can switch on \"ringback\" or \"ring-twice\". This means,
     mgetty won't answer the phone on the first call, but remember the
     call, and pick up on the second call (if it comes in the time
     specified by `ringback-time').", $def{'ringback'} );

    $settings .= " ringback-time";
    $def{'ringback-time'} = "30" if !$def{'ringback-time'} ;
    $def{'ringback-time'} = &ask ("  - `ringback-time'
     This setting specifies how much time may pass between the first
     and the second call if \"ringback\" is active.", $def{'ringback-time'});

    $settings .= " ignore-carrier";
    $def{'ignore-carrier'} = "false" if !$def{'ignore-carrier'} ;
    $def{'ignore-carrier'} = &ask ("   - `ignore-carrier'

     If your Modem does not assert the DCD (carrier detect) line, or the
     serial port or cable or serial driver is broken, it is possible
     that `mgetty' or `login' will block after a successful CONNECT
     (that means: everything seems to work, but suddenly nothing is sent
     to the port anymore. Depending on the operating system used, this
     can be before printing the `/etc/issue' file or not before printing
     the `password:' prompt.

     To work around this, you can switch off the carrier detection in
     software: set `ignore-carrier true'. Default is `false'.

     *WARNING:* If you use this, your system won't be able to detect
     when a caller just hangs up instead of cleanly logging out. This
     may result in hanging modems, etc.", $def{'ignore-carrier'});

    $settings .= " issue-file";
    $def{'issue-file'} = "/etc/issue" if !$def{'issue-file'} ;
    $def{'issue-file'} = &ask ("   - `issue-file'
     This is the file printed before the login prompt.", $def{'issue-file'});

    $settings .= " prompt-waittime";
    $def{'prompt-waittime'} = "500" if !$def{'prompt-waittime'} ;
    $def{'prompt-waittime'} = &ask ("   - `prompt-waittime'
     This specifies how long `mgetty' will wait for modem and line to
     settle down (in ms) before printing issue file and login prompt",
                    $def{'prompt-waittime'});

    $settings .= " login-prompt";
    $def{'login-prompt'} = "@!login: " if !$def{'login-prompt'} ;
    $def{'login-prompt'} =  &ask("   - `login-prompt'
     This specifies the login prompt that mgetty will output. Some
     special characters in this string (and in the issue file, btw) are
     recognized and replaced by something else:
        * @ system name
        * \\n newline
        * \\r carriage return
        * \\g bell
        * \\b backspace (ascii 010)
        * \\f form feed (ascii 013)
        * \\t TAB
        * \\P (and \\L) port name (e.g. ttyS0)
        * \\C date and time, in \"ctime()\" format
        * \\I Connection string (e.g. 2400/REL)
        * \\N (and \\U) number of users currently logged in
        * \\S Port speed (e.g. 38400)
        * \\D current date in dd/mm/yy format
        * \\T current time in hh:mm:ss format
        * \\DIGIT character with the specified octal code

     The maximum lenght of the login prompt is limited to 140
     characters (after expansion).", $def{'login-prompt'});

    $settings .= " login-time";
    $def{'login-time'} = 240 if !$def{'login-time'};
    $def{'login-time'} = &ask ("   - `login-time'
     This specifies the maximum time the user can take to log in. If no
     login has occured after that time, `mgetty' will hang up.", 
                   $def{'login-time'});

    $settings .= " fax-server-file";
    $def{'fax-server-file'} = &ask ("   - `fax-server-file'
     Specifies the fax file(s) that is to be sent if someone else calls
     your modem in *fax polling mode*, that is, the caller *receives* a
     document.

     Normally, the file given is a text file, containing the list of G3
     files to send to the calling machine, one file per line. Comment
     lines (starting with \"#\") are ignored. For backward compatibility,
     `mgetty' does check whether the named file is a G3 file itself, in
     which case this file is sent directly (but then, you can only send
     one page).

     Not all modems support fax poll *server* mode, I know that the
     ZyXEL and MultiTech do.", $def{'fax-server-file'});

    $settings .= " diskspace";
    $def{'diskspace'} = 1024 if !$def{'diskspace'};
    $def{'diskspace'} = &ask ("   - `diskspace'
     This setting tells mgetty the minimum amount of disk space (in KB) that
     has to be available in the fax spool directory for fax reception
     to be allowed.",  $def{'diskspace'});

    $settings .= " notify";
    $def{'notify'} = "faxadmin" if !$def{'notify'};
    $def{'notify'} = &ask ("   - `notify'
     This is the address that will get mails if a fax is received. Not
     fully tested.", $def{'notify'});

    $settings .= " fax-owner";
    $def{'fax-owner'} = "uucp" if !$def{'fax-owner'};
    $def{'fax-owner'} =  &ask ("   - `fax-owner'
     If set, mgetty will `chown' the received files to the given username 
     (you can specify a string or an integer uid, but the integer must be
     valid).",  $def{'fax-owner'});

    $settings .= " fax-group";
    $def{'fax-group'} = "modem" if !$def{'fax-group'};
    $def{'fax-group'} = &ask ("   - `fax-group' 
     If set, mgetty will `chgrp' the received files to this group id
     (which  can be given as group name, or as integer gid).", $def{'fax-group'});

    $settings .= " fax-mode";
    $def{'fax-mode'} = "0660" if !$def{'fax-mode'};
    $def{'fax-mode'} = &ask ("   - `fax-mode'
     Specifies the permissions to `chmod' the received files.", $def{'fax-mode'});
}
sub inq_f {
    $settings = "debug";
    $def_f{'debug'} = 4 if !$def_f{'debug'};
    $def_f{'debug'} = &ask ("   - `debug (sendfax)' 
     controls the amount of information written into the fax log file.
     `0' means \"totally silent\" (not even  errors are written), `9' 
     is really noisy. I usually use `3' or `4' in normal use, and `6' 
     for debugging.", $def_f{'debug'});

    $settings .= " modem-init";
    $def{'modem-init'} = &ask ("   - `modem-init' 
     Specifies an `AT...' command that is to be sent to the modem right
     at the *beginning* of all modem talk (even before setting the modem
     into fax mode, so this could be an `ATZ' if you want to reset the
     modem).", "");

    $settings .= " modem-handshake";
    $def_f{'modem-handshake'} = "AT&H3" if !$def_f{'modem-handshake'};
    $def_f{'modem-handshake'} = &ask ("   - `modem-handshake'
     Specifies an `AT...' command that will be sent to the modem at the
     *end* of the modem initialization, right before dialing. *Do not
     use ATZ or such here*, since resetting the modem will switch off
     fax mode.", $def_f{'modem-handshake'});

    $settings .= " max-tries";
    $def_f{'max-tries'} = 3 if !$def_f{'max-tries'};
    $def_f{'max-tries'} = &ask ("   - `max-tries'
     Specify the maximum number of tries per page if the receiving end
     reports reception errors. If NNN tries do not suffice to
     successfully transmit a page, `sendfax' will give up or simply go
     on, depending on the setting of `max-tries-continue' (see below).
     If this is set to `0', `sendfax' will ignore retransmission
     requests and simply go on.",  $def_f{'max-tries'});

    $settings .= " max-tries-continue";
    $def_f{'max-tries-continue'} = "YES" if !$def_f{'max-tries-continue'};
    $def_f{'max-tries-continue'} = &ask ("   - `max-tries-continue' 
     After the maximum number of tries for one page are reached,
     `sendfax' can report an error and abort (`max-tries-continue NO'),
     or go on with the next page (YES).

     For \"mission critical\" faxes, I'd set it to NO, but since the page
     quality is most often quite good even if reported as \"page bad\",
     the default is YES.", $def_f{'max-tries-continue'});

    $settings .= " speed (fax)";
    $def_f{'speed'} = 38400 if ! $def_f{'speed'};
    $def_f{'speed'} = &ask ("   - `speed'
     Set the port speed to use for fax send operations. Usually,
     `38400' is a good choice, but a few dumb modems (for example, some
     based on rockwell chipsets) need `19200' or even `9600'. A few
     modems can go higher, but `sendfax' may not support it, and it may
     not always work.",  $def_f{'speed'});

    $settings .= " dial-prefix";
    $def_f{'dial-prefix'} = "ATD" if !$def_f{'dial-prefix'};
    $def_f{'dial-prefix'} = &ask ("   - `dial-prefix'
     This is the command used for dialing out. Usually this will be
     something simple, as `ATD' or `ATDP', but if you have an unusual
     setup, it could also be something like `ATX0DP0;X4DT' (meaning:
     switch off dial-tone detection, pulse-dial `0', back to command
     mode, switch on dial-tone detection, and go ahead dialing with
     touch tones). The phone number will be sent right after the
     `dial-prefix'.", $def_f{'dial-prefix'});

    $settings .= " poll-dir";
    $def_f{'poll-dir'} = "./" if !$def_f{'poll-dir'};
    $def_f{'poll-dir'} = &ask ("   - `poll-dir'
     This is used to specify a directory where polled faxes (wheather
     maps and such) are to be saved into. Default is the current
     directory.", $def_f{'poll-dir'});

    $settings .= " normal-res";
    $def_f{'normal-res'} = "NO" if !$def_f{'normal-res'};
    $def_f{'normal-res'} = &ask ("   - `normal-res'
     If set to `yes' or `true' (boolean), `sendfax' won't attempt to
     make a fax connection in \"fine resolution\" mode. Normally you
     won't need to use that option, since `faxrunq' will set the `-n'
     switch if needed.", $def_f{'normal-res'});

    $settings .= " verbose";
    $def_f{'verbose'} = "NO" if !$def_f{'verbose'};
    $def_f{'verbose'} = &ask ("   - `verbose' 
     If set to `yes' or `true', `sendfax' will output progress reports
     on stdout, if set to `no', `sendfax' will only print error and
     warning messages.", $def_f{'verbose'});
}
sub setdef {
    local ($p, $l);
    $p = shift;
    $l = length ($p) + 1;
    foreach (keys(%var_m)) {
    $def{$_} = substr ($var_m{$_}, $l) if ($var_m{$_} =~ /^$p/);
    }
    foreach (keys(%var_m)) {
    $def{$_} = substr ($var_m{$_}, 1) if (!$def{$_} && $var_m{$_} =~ /^$sep/);
    }
    foreach (keys(%var_f)) {
    $def_f{$_} = substr ($var_f{$_}, $l) if ($var_f{$_} =~ /^$p/);
    }
    foreach (keys(%var_m)) {
    $def_f{$_} = substr ($var_f{$_}, 1) if (!$def_f{$_} && $var_f{$_} =~ /^$sep/);
    }
}
sub ask {
    ($info, $default, $x) = @_;
    print STDERR "\n$info: ";
    print STDERR "[$default] " if ($default);
    $_ = <STDIN>;
    s/^\s*//;
    chop;
    if ($_ eq "") {
    return $default;
    }
    return $_;
}
sub read_config {
    local ($conf, $port, $a, $b);

    $conf = shift;
    $port = $sep;
    if ( -f $conf) {
    open (F, $conf) || die "$!\n";
    while (<F>) {
        chop;
        s/^\s*//;
        next if /^#/;
        next if /^$/;
        ($a, $b) = split (/[ \t\n]+/, $_, 2);
        if ($a eq "port") {
        $port = $b;
        $var{'ports'} .= "$port ";
        } else {
        $var{$a} = "$port $b";
        }
    }
    close F;
    }
}

sub yesno {
    print STDERR "$_[0]: ";
    print STDERR "[$_[1]] " if ($_[1]);
    $_ = <STDIN>;
    chop;
    $_ = $_[1] if ! $_;
    return "y" if /^[Yy].*/;
    return "n";
}