2 # Common functions for editing the vgetty config files
3 # XXX options under ring_type
4 # XXX DTMF command shells http://vocp.sourceforge.net/
5 # XXX DTMF terminals http://telephonectld.sourceforge.net/
7 BEGIN { push(@INC, ".."); };
12 # Returns a list of inittab entries for mgetty, with options parsed
16 foreach $i (&inittab::parse_inittab()) {
17 if ($i->{'process'} =~ /^(\S*vgetty)\s*(.*)\s+((\/.*)?tty\S+)(\s+(\S+))?$/) {
24 elsif ($i->{'process'} =~ /^(\S*mgetty)\s*(.*)\s+((\/.*)?tty\S+)/) {
34 # Parse the vgetty config file into a series of directives
39 open(CONFIG, $config{'vgetty_config'});
44 while(/^\s*"([^"]*)"(.*)/ ||
45 /^\s*'([^']*)'(.*)/ ||
51 push(@rv, { 'line' => $lnum,
52 'index' => scalar(@rv),
63 # Finds one more more config entries with the given name
67 foreach $c (@{$_[1]}) {
68 push(@rv, $c) if (lc($c->{'name'}) eq lc($_[0]));
70 return wantarray ? @rv : $rv[0];
73 # find_value(name, &config)
76 local @v = &find($_[0], $_[1]);
77 return undef if (!@v);
78 return wantarray ? @{$v[0]->{'values'}} : $v[0]->{'values'}->[0];
81 # tty_opt_file(base, tty)
91 # answer_mode_input(value, name)
94 local @modes = ( '', 'voice', 'fax', 'data' );
95 local @am = split(/:/, $_[0]);
97 for($i=0; $i<3; $i++) {
98 $rv .= "<select name=$_[1]_$i>\n";
100 $rv .= sprintf "<option value='%s' %s>%s\n",
101 $m, $am[$i] eq $m ? "selected" : "", $text{"vgetty_ans_$m"};
103 $rv .= "</select> ";
108 # parse_answer_mode(name)
109 sub parse_answer_mode
112 for($i=0; defined($m = $in{"$_[0]_$i"}); $i++) {
113 push(@rv, $m) if ($m);
115 return join(":", @rv);
118 # receive_dir(&config)
121 local $vdir = &find_value("voice_dir", \@conf);
122 local $rdir = &find_value("receive_dir", \@conf);
123 return $rdir =~ /^\// ? $rdir : "$vdir/$rdir";
126 # messages_dir(&config)
129 local $vdir = &find_value("voice_dir", \@conf);
130 local $rdir = &find_value("message_dir", \@conf);
131 return $rdir =~ /^\// ? $rdir : "$vdir/$rdir";
134 # messages_index(&config)
137 local $dir = &messages_dir($_[0]);
138 local $ifile = &find_value("message_list", \@conf);
139 return "$dir/$ifile";
142 # rmd_file_info(file)
145 local $out = `rmdfile '$_[0]' 2>&1`;
146 return undef if ($?);
147 local @st = stat($_[0]);
148 $_[0] =~ /\/([^\/]+)$/;
149 local $rv = { 'file' => "$1",
153 'speed' => $out =~ /speed:\s+(\d+)/i ? "$1" : undef,
154 'type' => $out =~ /type\s+is:\s+"([^"]+)"/i ? "$1" : undef,
155 'bits' => $out =~ /sample:\s+(\d+)/i ? "$1" : undef
164 open(RMD, "pvftormd -L 2>&1 |");
166 if (/^\s+\-\s+(\S+)\s+([0-9, ]+)\s+(.*)/) {
171 foreach $b (split(/,/, $bits)) {
172 push(@rv, { 'code' => $code,
174 'desc' => &text('pvfdesc',
175 "$code ($desc)", $b),
176 'index' => scalar(@rv) });
184 # save_directive(&config, name, value)
187 local $lref = &read_file_lines($config{'vgetty_config'});
188 local $old = &find($_[1], $_[0]);
190 $lref->[$old->{'line'}] = "$_[1] $_[2]";
193 push(@$lref, "$_[1] $_[2]");
197 # apply_configuration()
198 # Apply the vgetty serial port configuration. Returns undef on success, or an
199 # error message on failure
200 sub apply_configuration
202 local $out = &backquote_logged("telinit q 2>&1 </dev/null");
203 return "<tt>$out</tt>" if ($?);
204 &system_logged("killall vgetty");