# caldera-driver.pl # Functions for printer drivers as generated by COAS %paper_sizes = ( 'a4', 'A4', 'a3', 'A3', 'a5', 'A5', 'letter', 'US Letter', 'legal', 'Legal', 'ledger', 'Ledger' ); $driver_dir = "/etc/sysconfig/printers"; $base_driver = "$module_root_directory/base_coas_driver"; $webmin_windows_driver = 1; # is_windows_driver(path) # Returns the server, share, username, password, workgroup, program # if path is a webmin windows driver sub is_windows_driver { return &is_webmin_windows_driver(@_); } # is_driver(path) # Returns the driver name and dpi if some path is a webmin driver, or undef sub is_driver { if (!$_[0]) { return { 'mode' => 0, 'desc' => 'None' }; } open(DRV, "<".$_[0]); local @lines = <DRV>; close(DRV); if ($lines[1] =~ /^source ($driver_dir\/\S+)/) { # Looks like a caldera driver! Read the sysconfig file local %conf; &read_env_file($1, \%conf); if ($conf{'GSDEVICE'} eq 'NET' || $conf{'GSDEVICE'} eq 'RAW') { # Driver isn't even used return { 'mode' => 0, 'desc' => 'None' }; } elsif ($conf{'GSDEVICE'} eq 'uniprint') { # Uniprint driver foreach $u (&list_uniprint()) { $desc = $u->[1] if ($u->[0] eq $conf{'UPP'}); } $desc =~ s/,.*$//g; return { 'mode' => 3, 'upp' => $conf{'UPP'}, 'paper' => $conf{'PAPERSIZE'}, 'double' => lc($conf{'DOUBLEPAGE'}), 'eof' => lc($conf{'SENDEOF'}), 'desc' => $desc ? $desc : $conf{'UPP'} }; } else { # A caldera printer driver open(COAS, "<".$config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); local ($desc, $p); foreach $p (values %$plist) { $desc = $p->{'description'} if ($p->{'type'}->{'0'} eq $conf{'GSDEVICE'} && !$desc); } return { 'mode' => 1, 'gsdevice' => $conf{'GSDEVICE'}, 'gsname' => $conf{'GSNAME'}, 'res' => $conf{'RESOLUTION'}, 'paper' => $conf{'PAPERSIZE'}, 'eof' => lc($conf{'SENDEOF'}), 'double' => lc($conf{'DOUBLEPAGE'}), 'gsopts' => $conf{'GSOPTS'}, 'desc' => $conf{'GSNAME'} ? $conf{'GSNAME'} : $desc }; } } else { # A driver of some kind, but not caldera's return { 'mode' => 2, 'file' => $_[0], 'desc' => $_[0] }; } } # create_windows_driver(&printer, &driver) sub create_windows_driver { return &create_webmin_windows_driver(@_); } # create_driver(&printer, &driver) sub create_driver { if ($_[1]->{'mode'} == 0) { return undef; } elsif ($_[1]->{'mode'} == 2) { return $_[1]->{'file'}; } else { # Create or update the parameters file local %conf; &read_env_file("$driver_dir/$_[0]->{'name'}", \%conf); $conf{'GSDEVICE'} = $_[1]->{'gsdevice'}; $conf{'GSNAME'} = $_[1]->{'gsname'}; $conf{'NAME'} = $_[0]->{'name'}; $conf{'RESOLUTION'} = $_[1]->{'res'}; $conf{'PAPERSIZE'} = $_[1]->{'paper'}; $conf{'DESC'} = $_[0]->{'desc'}; $conf{'SENDEOF'} = $_[1]->{'eof'}; $conf{'DOUBLEPAGE'} = $_[1]->{'double'}; $conf{'GSOPTS'} = $_[1]->{'gsopts'}; $conf{'UPP'} = $_[1]->{'upp'}; &write_env_file("$driver_dir/$_[0]->{'name'}", \%conf); # Create the standard driver program open(DRIVER, "<".$base_driver); local @lines = <DRIVER>; close(DRIVER); $lines[1] = "source $driver_dir/$_[0]->{'name'}\n"; mkdir("$config{'spool_dir'}/$_[0]->{'name'}", 0755); local $drv = "$config{'spool_dir'}/$_[0]->{'name'}/printfilter"; open(DRV, ">$drv"); print DRV @lines; close(DRV); return $drv; } } # delete_driver(name) sub delete_driver { &delete_webmin_driver($_[0]); unlink("$driver_dir/$_[0]"); } # driver_input(&printer, &driver) sub driver_input { local $mode = $_[0]->{'rhost'} ? 0 : $_[1]->{'mode'}; printf "<tr> <td><input type=radio name=mode value=0 %s> %s</td>\n", $mode == 0 ? 'checked' : '', $text{'caldera_none'}; print "<td>($text{'caldera_nonemsg'})</td> </tr>\n"; printf "<tr> <td><input type=radio name=mode value=2 %s> %s</td>", $mode == 2 ? 'checked' : '', $text{'caldera_prog'}; printf "<td><input name=program size=40 value='%s'></td> </tr>\n", $mode == 2 ? $_[0]->{'iface'} : ''; # Normal driver options printf "<tr> <td valign=top><input type=radio name=mode value=1 %s> %s</td>\n", $mode == 1 ? 'checked' : '', $text{'caldera_coas'}; print "<td><table width=100%>\n"; print "<tr> <td valign=top><b>$text{'caldera_printer'}</b></td>\n"; print "<td colspan=3><select size=5 name=gsdevice onChange='setres(0)'>\n"; open(COAS, "<".$config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); local ($i, $j, $p, $k, $found, $select_res); foreach $p (values %$plist) { if ($p->{'description'} eq $_[1]->{'gsname'} && $p->{'type'}->{'0'} ne $_[1]->{'gsdevice'}) { # COAS has changed the device $_[1]->{'gsname'} = undef; } } foreach $k (sort { $a <=> $b } keys %$plist) { $p = $plist->{$k}; next if ($p->{'type'}->{'0'} =~ /NET|RAW/); local @thisres = values %{$p->{'resolution'}}; local $got = ($_[1]->{'gsname'} eq $p->{'description'} && $_[1]->{'gsdevice'} eq $p->{'type'}->{'0'}) || (!$_[1]->{'gsname'} && !$found && $_[1]->{'gsdevice'} eq $p->{'type'}->{'0'}); printf "<option %s value='%s'>%s</option>\n", $got ? 'selected' : '', $p->{'description'}.";".join(";", @thisres), $p->{'description'}; $found++ if ($got); $select_res = &indexof($_[1]->{'res'}, @thisres) if ($got); map { $gotres{$_}++ } @thisres; } print "</select><select name=res size=5>\n"; foreach $r (sort { $a <=> $b} keys %gotres) { printf "<option %s>%s</option>\n", $_[1]->{'res'} eq $r ? 'selected' : '', $r; } print "</select></td> </tr>\n"; print "<tr> <td><b>$text{'caldera_eof'}</b></td>\n"; printf "<td><input type=radio name=eof value=true %s> $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : ''; printf "<input type=radio name=eof value=false %s> $text{'no'}</td>\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked'; print "<td><b>$text{'caldera_paper'}</b></td> <td><select name=paper>\n"; foreach $p (sort { $a cmp $b } keys %paper_sizes) { printf "<option value='%s' %s>%s</option>\n", $p, $_[1]->{'paper'} eq $p ? 'selected' : '', $paper_sizes{$p}; } print "</select></td> </tr>\n"; print "<tr> <td><b>$text{'caldera_double'}</b></td>\n"; printf "<td><input type=radio name=double value=true %s> $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : ''; printf "<input type=radio name=double value=false %s> $text{'no'}</td>\n", $_[1]->{'double'} eq 'true' ? '' : 'checked'; print "<td><b>$text{'caldera_gsopts'}</b></td>\n"; printf "<td><input name=gsopts size=30 value='%s'></td> </tr>\n", $_[1]->{'gsopts'}; print "</table></td></tr>\n"; # Uniprint driver options printf "<tr> <td valign=top><input type=radio name=mode value=3 %s> %s</td>\n", $mode == 3 ? 'checked' : '', $text{'caldera_uniprint'}; print "<td><table width=100%>\n"; print "<tr> <td valign=top><b>$text{'caldera_printer'}</b></td>\n"; print "<td colspan=3><select name=uniprint size=5>\n"; foreach $u (&list_uniprint()) { printf "<option value=%s %s>%s</option>\n", $u->[0], $u->[0] eq $_[1]->{'upp'} ? 'selected' : '', $u->[1]; } closedir(DIR); print "</select></td> </tr>\n"; print "<tr> <td><b>$text{'caldera_eof'}</b></td>\n"; printf "<td><input type=radio name=ueof value=true %s> $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : ''; printf "<input type=radio name=ueof value=false %s> $text{'no'}</td>\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked'; print "<td><b>$text{'caldera_paper'}</b></td> <td><select name=upaper>\n"; foreach $p (sort { $a cmp $b } keys %paper_sizes) { printf "<option value='%s' %s>%s</option>\n", $p, $_[1]->{'paper'} eq $p ? 'selected' : '', $paper_sizes{$p}; } print "</select></td> </tr>\n"; print "<tr> <td><b>$text{'caldera_double'}</b></td>\n"; printf "<td><input type=radio name=udouble value=true %s> $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : ''; printf "<input type=radio name=udouble value=false %s> $text{'no'}</td>\n", $_[1]->{'double'} eq 'true' ? '' : 'checked'; print "</table></td></tr>\n"; return <<EOF; <script> function setres(sel) { var idx = document.forms[0].gsdevice.selectedIndex; var v = new String(document.forms[0].gsdevice.options[idx].value); var vv = v.split(";"); var res = document.forms[0].res; res.length = 0; for(var i=1; i<vv.length; i++) { res.options[i-1] = new Option(vv[i], vv[i]); } if (res.length > 0) { res.options[sel].selected = true; } } setres($select_res); </script> EOF } # parse_driver() # Parse driver selection from %in and return a driver structure sub parse_driver { if ($in{'mode'} == 0) { return { 'mode' => 0 }; } elsif ($in{'mode'} == 2) { $in{'program'} =~ /^(\S+)/ && -x $1 || &error(&text('caldera_eprog', $in{'program'})); return { 'mode' => 2, 'file' => $in{'program'} }; } elsif ($in{'mode'} == 1) { # Normal ghostscript driver open(COAS, "<".$config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); $in{'gsdevice'} || &error($text{'caldera_edriver'}); $in{'gsdevice'} =~ s/;(.*)$//; local ($p, $gsdevice); foreach $p (values %$plist) { $gsdevice = $p->{'type'}->{'0'} if ($p->{'description'} eq $in{'gsdevice'}); } $gsdevice eq 'PostScript' || $in{'res'} || &error($text{'caldera_eres'}); return { 'mode' => 1, 'gsdevice' => $gsdevice, 'gsname' => $in{'gsdevice'}, 'res' => $in{'res'}, 'paper' => $in{'paper'}, 'eof' => $in{'eof'}, 'double' => $in{'double'}, 'gsopts' => $in{'gsopts'} }; } else { # Uniprint ghostscript driver $in{'uniprint'} || &error($text{'caldera_edriver'}); return { 'mode' => 3, 'gsdevice' => 'uniprint', 'upp' => $in{'uniprint'}, 'paper' => $in{'upaper'}, 'eof' => $in{'ueof'}, 'double' => $in{'udouble'} }; } } # parse_coas(handle) sub parse_coas { local $h = $_[0]; local (%rv, $_); while(<$h>) { s/#.*$//g; s/\r|\n//g; if (/^\s*(\S+)\s+{/) { # start of a section local $k = $1; $rv{$k} = &parse_coas($h); } elsif (/^\s*}/) { # end of a section last; } elsif (/^\s*(\S+)\s+(.*)/) { # a value in a section $rv{$1} = $2; } } return \%rv; } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
CHANGELOG | File | 1.16 KB | 0644 |
|
acl_security.pl | File | 4.4 KB | 0755 |
|
aix-lib.pl | File | 9.45 KB | 0755 |
|
ascii.txt | File | 4.19 KB | 0644 |
|
base_coas_driver | File | 560 B | 0755 |
|
bw.fig | File | 2.75 KB | 0644 |
|
bw.ps | File | 6.46 KB | 0644 |
|
caldera-driver.pl | File | 12.31 KB | 0755 |
|
cancel_all.cgi | File | 535 B | 0755 |
|
catalog.devices | File | 12.34 KB | 0644 |
|
cgi_args.pl | File | 284 B | 0755 |
|
cluster.cgi | File | 2.06 KB | 0755 |
|
cluster_add.cgi | File | 2.13 KB | 0755 |
|
cluster_delete.cgi | File | 529 B | 0755 |
|
colour.fig | File | 2.91 KB | 0644 |
|
colour.ps | File | 6.63 KB | 0644 |
|
config-AlmaLinux-7.0-ALL | File | 323 B | 0644 |
|
config-Amazon-Linux-2-ALL | File | 323 B | 0644 |
|
config-CentOS-Linux-7.0-ALL | File | 323 B | 0644 |
|
config-CentOS-Stream-Linux-8.0-ALL | File | 323 B | 0644 |
|
config-CloudLinux-8.0-ALL | File | 323 B | 0644 |
|
config-Oracle-Linux-8.0-ALL | File | 323 B | 0644 |
|
config-Redhat-Enterprise-Linux-7.0-ALL | File | 323 B | 0644 |
|
config-Rocky-Linux-7.0-ALL | File | 323 B | 0644 |
|
config-Scientific-Linux-7.0-ALL | File | 323 B | 0644 |
|
config-aix | File | 281 B | 0644 |
|
config-coherent-linux | File | 323 B | 0644 |
|
config-corel-linux | File | 228 B | 0644 |
|
config-debian-linux | File | 228 B | 0644 |
|
config-debian-linux-3.1-3.9 | File | 327 B | 0644 |
|
config-debian-linux-4.0-ALL | File | 333 B | 0644 |
|
config-freebsd | File | 230 B | 0644 |
|
config-generic-linux | File | 228 B | 0644 |
|
config-gentoo-linux | File | 248 B | 0644 |
|
config-hpux | File | 323 B | 0644 |
|
config-irix | File | 213 B | 0644 |
|
config-macos | File | 230 B | 0644 |
|
config-mandrake-linux | File | 245 B | 0644 |
|
config-mandrake-linux-8.0-ALL | File | 276 B | 0644 |
|
config-msc-linux | File | 228 B | 0644 |
|
config-netbsd | File | 230 B | 0644 |
|
config-open-linux | File | 309 B | 0644 |
|
config-open-linux-3.1e | File | 239 B | 0644 |
|
config-openSUSE-Linux-15.0-ALL | File | 318 B | 0644 |
|
config-openbsd | File | 230 B | 0644 |
|
config-openmamba-linux | File | 229 B | 0644 |
|
config-pardus-linux | File | 228 B | 0644 |
|
config-redhat-linux | File | 228 B | 0644 |
|
config-redhat-linux-24.0-ALL | File | 339 B | 0644 |
|
config-redhat-linux-7.0 | File | 283 B | 0644 |
|
config-redhat-linux-7.1 | File | 286 B | 0644 |
|
config-redhat-linux-7.2-8.1 | File | 394 B | 0644 |
|
config-redhat-linux-9.0-23.0 | File | 337 B | 0644 |
|
config-slackware-linux | File | 228 B | 0644 |
|
config-slackware-linux-8.1-ALL | File | 246 B | 0644 |
|
config-solaris | File | 304 B | 0644 |
|
config-solaris-10-ALL | File | 330 B | 0644 |
|
config-solaris-9 | File | 296 B | 0644 |
|
config-suse-linux | File | 226 B | 0644 |
|
config-suse-linux-8.2-ALL | File | 322 B | 0644 |
|
config-trustix-linux | File | 313 B | 0644 |
|
config-turbo-linux | File | 228 B | 0644 |
|
config-united-linux | File | 322 B | 0644 |
|
config-unixware | File | 302 B | 0644 |
|
config.info | File | 1.31 KB | 0644 |
|
config.info.ca | File | 1.53 KB | 0644 |
|
config.info.cs | File | 1.25 KB | 0644 |
|
config.info.de | File | 1.43 KB | 0644 |
|
config.info.es | File | 1.17 KB | 0644 |
|
config.info.fr | File | 1.63 KB | 0644 |
|
config.info.hu | File | 707 B | 0644 |
|
config.info.ja | File | 823 B | 0644 |
|
config.info.nl | File | 1.41 KB | 0644 |
|
config.info.no | File | 1.37 KB | 0644 |
|
config.info.pl | File | 1.45 KB | 0644 |
|
config.info.pt_BR | File | 1.58 KB | 0644 |
|
config.info.ru | File | 1.74 KB | 0644 |
|
config.info.sv | File | 651 B | 0644 |
|
config.info.tr | File | 1.39 KB | 0644 |
|
config.info.uk | File | 1.81 KB | 0644 |
|
config.info.zh | File | 573 B | 0644 |
|
config.info.zh_TW | File | 539 B | 0644 |
|
cups-driver.pl | File | 6.37 KB | 0755 |
|
cups-lib.pl | File | 8.67 KB | 0755 |
|
defaultacl | File | 73 B | 0644 |
|
delete_printer.cgi | File | 690 B | 0755 |
|
delete_printers.cgi | File | 839 B | 0755 |
|
drivers | File | 18.34 KB | 0644 |
|
edit_printer.cgi | File | 10.08 KB | 0755 |
|
freebsd-lib.pl | File | 7.26 KB | 0755 |
|
hpux-driver.pl | File | 3.13 KB | 0755 |
|
hpux-lib.pl | File | 9.83 KB | 0755 |
|
index.cgi | File | 5.83 KB | 0755 |
|
irix-driver.pl | File | 3.13 KB | 0755 |
|
irix-lib.pl | File | 10.68 KB | 0755 |
|
linux-lib.pl | File | 8.97 KB | 0755 |
|
list_jobs.cgi | File | 2.25 KB | 0755 |
|
log_parser.pl | File | 1021 B | 0755 |
|
lpadmin-lib.pl | File | 19.89 KB | 0755 |
|
lprng-lib.pl | File | 10.26 KB | 0755 |
|
module.info | File | 494 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 159 B | 0644 |
|
module.info.ar | File | 0 B | 0644 |
|
module.info.ar.auto | File | 223 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 290 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 306 B | 0644 |
|
module.info.ca | File | 167 B | 0644 |
|
module.info.ca.auto | File | 16 B | 0644 |
|
module.info.cs | File | 31 B | 0644 |
|
module.info.cs.auto | File | 155 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 168 B | 0644 |
|
module.info.de | File | 148 B | 0644 |
|
module.info.de.auto | File | 16 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 362 B | 0644 |
|
module.info.es | File | 38 B | 0644 |
|
module.info.es.auto | File | 157 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 217 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 246 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 168 B | 0644 |
|
module.info.fr | File | 39 B | 0644 |
|
module.info.fr.auto | File | 176 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 205 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 188 B | 0644 |
|
module.info.hu | File | 19 B | 0644 |
|
module.info.hu.auto | File | 173 B | 0644 |
|
module.info.it | File | 0 B | 0644 |
|
module.info.it.auto | File | 177 B | 0644 |
|
module.info.ja | File | 27 B | 0644 |
|
module.info.ja.auto | File | 213 B | 0644 |
|
module.info.ko | File | 25 B | 0644 |
|
module.info.ko.auto | File | 176 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 219 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 189 B | 0644 |
|
module.info.ms | File | 152 B | 0644 |
|
module.info.ms.auto | File | 16 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 196 B | 0644 |
|
module.info.nl | File | 33 B | 0644 |
|
module.info.nl.auto | File | 133 B | 0644 |
|
module.info.no | File | 31 B | 0644 |
|
module.info.no.auto | File | 137 B | 0644 |
|
module.info.pl | File | 160 B | 0644 |
|
module.info.pl.auto | File | 16 B | 0644 |
|
module.info.pt | File | 39 B | 0644 |
|
module.info.pt.auto | File | 149 B | 0644 |
|
module.info.pt_BR | File | 42 B | 0644 |
|
module.info.pt_BR.auto | File | 155 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 199 B | 0644 |
|
module.info.ru | File | 25 B | 0644 |
|
module.info.ru.auto | File | 245 B | 0644 |
|
module.info.sk | File | 0 B | 0644 |
|
module.info.sk.auto | File | 184 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 192 B | 0644 |
|
module.info.sv | File | 30 B | 0644 |
|
module.info.sv.auto | File | 141 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 393 B | 0644 |
|
module.info.tr | File | 27 B | 0644 |
|
module.info.tr.auto | File | 166 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 281 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 304 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 189 B | 0644 |
|
module.info.zh | File | 24 B | 0644 |
|
module.info.zh.auto | File | 136 B | 0644 |
|
module.info.zh_TW | File | 30 B | 0644 |
|
module.info.zh_TW.auto | File | 142 B | 0644 |
|
old-caldera-driver.pl | File | 9.74 KB | 0755 |
|
openbsd-lib.pl | File | 7.26 KB | 0755 |
|
prefs.info | File | 40 B | 0644 |
|
printconf-driver.pl | File | 9.52 KB | 0755 |
|
rbac-mapping | File | 248 B | 0644 |
|
redhat-driver.pl | File | 12.42 KB | 0755 |
|
restart.cgi | File | 301 B | 0755 |
|
save_printer.cgi | File | 5.85 KB | 0755 |
|
solaris-driver.pl | File | 4.03 KB | 0755 |
|
solaris-lib.pl | File | 12.17 KB | 0755 |
|
sortdrivers-by-drv.pl | File | 222 B | 0755 |
|
sortdrivers.pl | File | 242 B | 0755 |
|
start.cgi | File | 377 B | 0755 |
|
stop.cgi | File | 374 B | 0755 |
|
stp | File | 2.45 KB | 0644 |
|
suse-driver.pl | File | 10.62 KB | 0755 |
|
test_form.cgi | File | 887 B | 0755 |
|
test_print.cgi | File | 1.19 KB | 0755 |
|
unixware-lib.pl | File | 7.81 KB | 0755 |
|
view_job.cgi | File | 909 B | 0755 |
|
webmin-driver.pl | File | 1.04 KB | 0755 |
|