<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># solaris-driver.pl
# Functions for Solaris 10 printer drivers

$webmin_windows_driver = 1;
$cups_ppd_dir = "/etc/lp/ppd";
$lpoptions = &amp;has_command("lpoptions.cups") ? "lpoptions.cups" : "lpoptions";

# is_windows_driver(path, &amp;printer)
# Returns the server, share, username, password, workgroup, program
# if path is a webmin windows driver
sub is_windows_driver
{
return &amp;is_webmin_windows_driver(@_);
}

# is_driver(path, &amp;printer)
# Returns the driver name if some path is a Solaris driver, or undef
sub is_driver
{
local $ppd = $_[1]-&gt;{'ppd'} ? &amp;parse_cups_ppd($_[1]-&gt;{'ppd'}) : undef;
if ($ppd &amp;&amp; $ppd-&gt;{'NickName'}) {
	# Printer has a PPD file
	return { 'mode' =&gt; 1,
		 'manuf' =&gt; $ppd-&gt;{'Manufacturer'},
		 'model' =&gt; $ppd-&gt;{'ModelName'},
		 'nick' =&gt; $ppd-&gt;{'NickName'},
		 'desc' =&gt; $ppd-&gt;{'NickName'} };
	}
elsif ($_[1]-&gt;{'iface'}) {
	# Some other kind of interface file
	return { 'mode' =&gt; 2,
		 'file' =&gt; $_[1]-&gt;{'iface'},
		 'desc' =&gt; $_[1]-&gt;{'iface'} };
	}
else {
	# No driver
	return { 'mode' =&gt; 0,
		 'desc' =&gt; $text{'cups_none'} };
	}
}

# create_windows_driver(&amp;printer, &amp;driver)
sub create_windows_driver
{
return &amp;create_webmin_windows_driver(@_);
}

# create_driver(&amp;printer, &amp;driver)
sub create_driver
{
local $drv = "$cups_ppd_dir/$_[0]-&gt;{'name'}.ppd";
if ($_[1]-&gt;{'mode'} == 0) {
	# No driver
	&amp;system_logged("rm -f \"$drv\"");
	$_[0]-&gt;{'ppd'} = undef;
	return undef;
	}
elsif ($_[1]-&gt;{'mode'} == 2) {
	# A separate interface program
	&amp;system_logged("rm -f \"$drv\"");
	$_[0]-&gt;{'ppd'} = undef;
	return $_[1]-&gt;{'file'};
	}
else {
	# A PPD driver, which replaces any interface program
	$_[0]-&gt;{'ppd'} = $_[1]-&gt;{'ppd'};
	return undef;
	}
}

# delete_driver(name)
sub delete_driver
{
&amp;system_logged("rm -f \"$cups_ppd_dir/$_[0].ppd\"");
}

# driver_input(&amp;printer, &amp;driver)
sub driver_input
{
printf "&lt;tr&gt; &lt;td&gt;&lt;input type=radio name=mode value=0 %s&gt; %s&lt;/td&gt;\n",
	$_[1]-&gt;{'mode'} == 0 ? 'checked' : '', $text{'cups_none'};
print "&lt;td&gt;($text{'cups_nonemsg'})&lt;/td&gt; &lt;/tr&gt;\n";
printf "&lt;tr&gt; &lt;td&gt;&lt;input type=radio name=mode value=2 %s&gt; %s&lt;/td&gt;",
	$_[1]-&gt;{'mode'} == 2 ? 'checked' : '', $text{'cups_prog'};
printf "&lt;td&gt;&lt;input name=program size=40 value='%s'&gt;&lt;/td&gt; &lt;/tr&gt;\n",
	$_[1]-&gt;{'mode'} == 2 ? $_[0]-&gt;{'iface'} : '';

# Display all the CUPS drivers
printf "&lt;tr&gt; &lt;td valign=top&gt;&lt;input type=radio name=mode value=1 %s&gt; %s&lt;/td&gt;\n",
	$_[1]-&gt;{'mode'} == 1 ? 'checked' : '', $text{'cups_driver'};
print "&lt;td&gt;&lt;select name=ppd size=10&gt;\n";
local (@ppds, $d, $f, $ppd, %cache, $outofdate, @files, %donefile);
open(FIND, "find '$config{'model_path'}' -type f -print |");
while(&lt;FIND&gt;) {
	chop;
	/([^\/]+)$/;
	next if ($donefile{$1}++);
	push(@files, $_);
	}
close(FIND);
&amp;read_file("$module_config_directory/ppd-cache", \%cache);
foreach $f (@files) {
	if (!defined($cache{$f})) {
		$outofdate = $f;
		last;
		}
	}
if ($outofdate || scalar(keys %cache) != scalar(@files)) {
	# Cache is out of date
	undef(%cache);
	local %donecache;
	foreach $f (@files) {
		local $ppd = &amp;parse_cups_ppd($f);
		$cache{$f} = $ppd-&gt;{'NickName'}
			if (!$donecache{$ppd-&gt;{'NickName'}}++);
		}
	&amp;write_file("$module_config_directory/ppd-cache", \%cache);
	}
local %done;
foreach $f (sort { $cache{$a} cmp $cache{$b} } keys %cache) {
	if ($cache{$f} &amp;&amp; !$done{$cache{$f}}++) {
		printf "&lt;option value=%s %s&gt;%s\n",
			$f, $_[1]-&gt;{'nick'} eq $cache{$f} ? 'selected' : '',
			$cache{$f};
		$currppd = $f if ($_[1]-&gt;{'nick'} eq $cache{$f});
		}
	}
print "&lt;/select&gt;\n";
print "&lt;/td&gt; &lt;/tr&gt;\n";
return undef;
}

# parse_driver()
# Parse driver selection from %in and return a driver structure
sub parse_driver
{
if ($in{'mode'} == 0) {
	return { 'mode' =&gt; 0 };
	}
elsif ($in{'mode'} == 2) {
	$in{'program'} =~ /^(\S+)/ &amp;&amp; -x $1 ||
		&amp;error(&amp;text('cups_eprog', $in{'program'}));
	return { 'mode' =&gt; 2,
		 'file' =&gt; $in{'program'} };
	}
elsif ($in{'mode'} == 1) {
	# CUPS printer driver
	local $ppd = &amp;parse_cups_ppd($in{'ppd'});
	local $rv = { 'mode' =&gt; 1,
		      'ppd' =&gt; $in{'ppd'},
		      'nick' =&gt; $ppd-&gt;{'NickName'},
		      'manuf' =&gt; $ppd-&gt;{'Manufacturer'},
		      'model' =&gt; $ppd-&gt;{'ModelName'} };
	return $rv;
	}
}

1;

</pre></body></html>