#!/usr/pkg/bin/perl
# Update the list of TCP ports Sendmail uses

require './sendmail-lib.pl';
require './features-lib.pl';

&ReadParse();
&error_setup($text{'ports_err'});
$access{'ports'} || &error($text{'ports_ecannot'});

# Parse and validate inputs
@ports = ( );
if (!$in{'ports_def'}) {
	for($i=0; defined($name=$in{"name_$i"}); $i++) {
		# Port name
		next if (!$name);
		$name =~ /^[a-z0-9\_]+$/i || &error(&text('ports_ename', $i+1));
		$done{$name}++ && &error(&text('ports_eclash', $i+1));
		@opts = ( "Name=$name" );

		# IP address
		if (!$in{"addr_${i}_def"}) {
			&check_ipaddress($in{"addr_$i"}) ||
			   &check_ip6address($in{"addr_$i"}) ||
				&error(&text('ports_eaddr', $i+1));
			push(@opts, "Address=".$in{"addr_$i"});
			}

		# Family
		if ($in{"family_${i}"}) {
			push(@opts, "Family=".$in{"family_${i}"});
			}

		# TCP port
		if (!$in{"port_${i}_def"}) {
			$in{"port_$i"} =~ /^\d+$/ && $in{"port_$i"} > 0 &&
			    $in{"port_$i"} < 65536 ||
			    getservbyname($in{"port_$i"}, "tcp") ||
				&error(&text('ports_eport', $i+1));
			push(@opts, "Port=".$in{"port_$i"});
			}

		# Modifiers
		@mods = split(/\0/, $in{"mod_$i"});
		if (@mods) {
			push(@opts, "Modifiers=".join("", @mods));
			}

		# Other options
		push(@opts, split(/,/, $in{"other_$i"}));
		push(@ports, join(",", @opts));
		}
	}

# Update sendmail.cf
&lock_file($config{'sendmail_cf'});
$conf = &get_sendmailcf();
@oldlist = map { $_->[0] } &find_options("DaemonPortOptions", $conf);
@newlist = map { { 'type' => 'O',
		   'values' => [ " DaemonPortOptions=$_" ] } } @ports;
&save_directives($conf, \@oldlist, \@newlist);
&flush_file_lines($config{'sendmail_cf'});
&unlock_file($config{'sendmail_cf'});

# Update .mc file too, if we have one
if ($features_access) {
	@features = &list_features();
	if (@features) {
		&lock_file($config{'sendmail_mc'});
		@dpa = grep { $_->{'type'} == 0 &&
			$_->{'text'} =~ /^DAEMON_OPTIONS/ } @features;
		for($i=0; $i<@dpa || $i<@ports; $i++) {
			if ($dpa[$i] && $ports[$i]) {
				# Modify
				$dpa[$i]->{'text'} =
					"DAEMON_OPTIONS(`$ports[$i]')";
				&modify_feature($dpa[$i]);
				}
			elsif ($dpa[$i] && !$ports[$i]) {
				# No longer needed .. delete
				&delete_feature($dpa[$i]);
				}
			elsif (!$dpa[$i] && $ports[$i]) {
				# Add new feature
				$f = { 'type' => 0,
			           'text' => "DAEMON_OPTIONS(`$ports[$i]')" };
				&create_feature($f);
				}
			}
		&unlock_file($config{'sendmail_mc'});
		}
	}

# Restart Sendmail
&restart_sendmail();
&webmin_log("ports");
&redirect("");

