patches/system-tools-backends-02-common.diff
changeset 7860 25fd327818d6
child 8027 db169c287197
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/system-tools-backends-02-common.diff	Fri Aug 04 09:54:14 2006 +0000
@@ -0,0 +1,915 @@
+diff -ru /var/tmp/clean/system-tools-backends-1.4.2/file.pl.in system-tools-backends-1.4.2/file.pl.in
+--- /var/tmp/clean/system-tools-backends-1.4.2/file.pl.in	2005-11-04 15:49:36.000000000 +0000
++++ system-tools-backends-1.4.2/file.pl.in	2006-03-13 10:14:56.141636000 +0000
+@@ -772,6 +772,14 @@
+   }
+ }
+ 
++sub gst_file_read_joined_lines
++{
++  my ($file) = @_;
++  my $buffer = &gst_file_buffer_load ($file);
++  &gst_file_buffer_join_lines ($buffer);
++  $$buffer[0] =~ s/\n//; $$buffer[0] =~ s/\\//;
++  return $$buffer[0];
++}
+ 
+ # --- Command-line utilities --- #
+ 
+diff -ru /var/tmp/clean/system-tools-backends-1.4.2/partition.pl.in system-tools-backends-1.4.2/partition.pl.in
+--- /var/tmp/clean/system-tools-backends-1.4.2/partition.pl.in	2004-11-05 17:03:26.000000000 +0000
++++ system-tools-backends-1.4.2/partition.pl.in	2006-03-13 10:14:56.152216000 +0000
+@@ -86,6 +86,17 @@
+     },
+ );
+ 
++sub gst_partition_scan_sunos_info
++{
++  my ($fd, $line);
++  my (%hash);
++  my (@table);
++
++  $hash{"partition"} = \@table;
++
++  return \%hash;
++}
++
+ sub gst_partition_scan_freebsd_info
+ {
+   my ($fd, $line);
+@@ -192,6 +203,7 @@
+ 
+   return &gst_partition_scan_linux_info   if ($plat eq "Linux");
+   return &gst_partition_scan_freebsd_info if ($plat eq "FreeBSD");
++  return &gst_partition_scan_sunos_info if ($plat eq "SunOS");
+ }
+ 
+ %GST_FILESYS_TYPES =
+diff -ru /var/tmp/clean/system-tools-backends-1.4.2/platform.pl.in system-tools-backends-1.4.2/platform.pl.in
+--- /var/tmp/clean/system-tools-backends-1.4.2/platform.pl.in	2006-01-02 15:32:34.000000000 +0000
++++ system-tools-backends-1.4.2/platform.pl.in	2006-03-13 10:14:56.152576000 +0000
+@@ -38,6 +38,8 @@
+ 
+ 
+ $PLATFORM_INFO = {
++  "solaris-2.11"    => "Solaris Nevada / Open Solaris",
++  "nexenta-1.0"     => "Nexenta GNU/Solaris 1.0 Ellate",
+   "debian-2.2"      => "Debian GNU/Linux 2.2 Potato",
+   "debian-3.0"      => "Debian GNU/Linux 3.0 Woody",
+   "debian-sarge"    => "Debian GNU/Linux Sarge",
+@@ -110,7 +112,8 @@
+       ("Debian" => "debian"),
+       ("Mandrake" => "mandrake"),
+       ("Conectiva" => "conectiva"),
+-      ("Blackpanther" => "blackpanther");
++      ("Blackpanther" => "blackpanther"),
++      ("gnu_solaris" => "nexenta");
+ 
+   # gst_prefix not required here: parse already does that for us.
+   $dist = lc (&gst_parse_sh ("/etc/lsb-release", "DISTRIB_ID"));
+@@ -528,9 +531,11 @@
+   chomp ($dist = <$fd>);
+   &gst_file_close ($fd);
+ 
+-  if ($dist =~ /^5\.(\d)/) { return "solaris-2.$1" }
+-  else { if ($dist =~ /^([78])\.\d/) { return "solaris-$1.0" } }
+-  return -1;
++  if (-f "$gst_prefix/etc/debian_version") { return check_lsb() }
++  else {
++    if ($dist =~ /^5\.(\d+)/) { return "solaris-2.$1" } 
++    else { return -1 }
++  }
+ }
+ 
+ sub gst_platform_get_system
+diff -ru /var/tmp/clean/system-tools-backends-1.4.2/service.pl.in system-tools-backends-1.4.2/service.pl.in
+--- /usr/tmp/clean/system-tools-backends-1.4.2/service.pl.in	2006-01-02 15:42:19.000000000 +0000
++++ system-tools-backends-1.4.2/service.pl.in	2006-04-18 10:49:44.023608000 +0100
+@@ -85,6 +85,9 @@
+        "ubuntu-5.10"  => ["$gst_prefix/etc", "$gst_prefix/etc/init.d", "../init.d"],
+        "ubuntu-6.04"  => ["$gst_prefix/etc", "$gst_prefix/etc/init.d", "../init.d"],
+        
++       "nexenta-1.0" => ["$gst_prefix/etc", "$gst_prefix/etc/init.d", "../init.d"],       
++       "solaris-2.11" => ["$gst_prefix/etc", "$gst_prefix/etc/init.d", "../init.d"],       
++
+        "suse-7.0"     => ["$gst_prefix/etc/rc.d", "$gst_prefix/etc/rc.d", "../"],
+        "suse-9.0"     => ["$gst_prefix/etc/init.d", "$gst_prefix/etc/init.d", "../"],
+        "suse-9.1"     => ["$gst_prefix/etc/init.d", "$gst_prefix/etc/init.d", "../"],
+@@ -154,6 +157,9 @@
+        "ubuntu-5.04"    => [2, 3],
+        "ubuntu-5.10"    => [2, 3],
+        "ubuntu-6.04"    => [2, 3],
++
++       "nexenta-1.0"   => [2, 3],       
++       "solaris-2.11"  => [2, 3],       
+        
+        "suse-7.0"       => [3, 5],
+        "suse-9.0"       => [3, 5],
+@@ -223,6 +229,10 @@
+      "ubuntu-5.04"    => "debian-2.2",
+      "ubuntu-5.10"    => "debian-2.2",
+      "ubuntu-6.04"    => "debian-2.2",
++
++     "nexenta-1.0"   => "nexenta",     
++
++     "solaris-2.11"   => "solaris",     
+           
+      "suse-7.0"       => "redhat-5.2",
+      "suse-9.0"       => "redhat-5.2",
+@@ -277,6 +287,14 @@
+                       "default"   => "GRAPHICAL",
+                       "nonetwork" => "RECOVER"
+                      },
++     "nexenta"    => {"single-user"  => "TEXT",
++                      "multi-user"   => "GRAPHICAL",
++                      "none"         => "RECOVER"
++                     },
++     "solaris"    => {"single-user"  => "TEXT",
++                      "multi-user"   => "GRAPHICAL",
++                      "none"         => "RECOVER"
++                     },
+      "freebsd-5"  => {"rc" => "GRAPHICAL" },
+      "slackware-9.1.0" => {"4" => "GRAPHICAL" }
+     );
+@@ -797,6 +815,154 @@
+   return \%ret;
+ }
+ 
++sub gst_service_smf_service_exist
++{
++  my($service) = @_;
++  my($services) = &gst_service_smf_get_services_list();
++
++  foreach $i (@$services)
++  {
++    return 1 if ($i =~ /$service/);
++  }
++
++  return 0;
++}
++
++sub gst_service_smf_run_svcadm
++{
++  my ($service, $arg) = @_;
++  my ($option);
++
++  my %map =
++    ("stop" => "stopped",
++     "start" => "started"
++    );
++
++  my %op =
++    ("stop" => "disable",
++     "start" => "enable"
++    );
++
++  &gst_report_enter ();
++
++  if (!exists $map{$arg})
++  {
++    &gst_report ("service_sysv_op_unk", $arg);
++    &gst_report_leave ();
++    return -1;
++  }
++
++  if (&gst_service_smf_service_exist ($service))
++  {
++    if (!&gst_file_run ("svcadm $op{$arg} $service"))
++    {
++      &gst_report ("service_sysv_op_success", $service, $str);
++      &gst_report_leave ();
++      return 0;
++    }
++  }
++
++  &gst_report ("service_sysv_op_failed", $service, $str);
++  &gst_report_leave ();
++  return -1;
++}
++
++sub gst_service_smf_runlevel_status_by_service
++{
++  my ($service, $status) = @_;
++  my (@arr, @ret);
++  my (@runlevels) = split(" ","single-user multi-user");
++
++  foreach $runlevel (@runlevels)
++  {
++    if ($status)
++    {
++      push @arr, { "name"   => $runlevel,
++                   "action" => "start" };
++    }
++    else
++    {
++      push @arr, { "name"   => $runlevel,
++                   "action" => "stop" };
++    }
++  }
++
++  push @ret, { "runlevel" => \@arr };
++  return @ret;
++}
++
++sub gst_service_smf_get_service_info
++{
++  my ($service) = @_;
++  my ($script, @actions, @runlevels);
++  my %hash;
++  my $role;
++  my $status = 0;
++  my $longname = "";
++
++  my $fd = &gst_file_run_pipe_read ("svcs -l $service");
++  while (<$fd>) {
++    $status = 1 if (/^state.*online/);
++    $longname = $1 if (/^name\s*(.*)/);
++  }
++  gst_file_close ($fd);
++
++  my($runlevels) = &gst_service_smf_runlevel_status_by_service ($service, $status);
++
++  $hash{"script"} = $service;
++  $hash{"longname"} = $longname if ($longname);
++  $hash{"runlevels"} = $runlevels unless ($runlevels eq undef);
++  $service =~ m/.*\/(.*)$/;
++  $role = &gst_service_get_role ($1);
++
++  if ($role eq "UNKNOWN") {
++    $role = "SYSTEM" if ($service =~ /^system\// || $service =~ /^platform\//);
++    $role = "NETWORK" if ($service =~ /^network\//);
++    $role = "NTP_SERVER" if ($service =~ /^network\/ntp/);
++    $role = "FILE_SERVER" if ($service =~ /^network\/nfs/);
++    $role = "DYNAMIC_DNS" if ($service =~ /^network\/dns/);
++    $role = "SYSTEM_LOGGER" if ($service =~ /^system\/system-log/);
++    $role = "MTA" if ($service =~ /^network\/smtp/);
++    $role = "PRINTER_SERVICE" if ($service =~ /^application\/print\/server/);
++  }
++
++  $hash{"role"} = $role;
++
++  return \%hash;
++}
++
++sub gst_service_smf_get_services_list
++{
++  my @list;
++  local *SVCS=gst_file_run_pipe_read("svcs -H -a");
++  while (<SVCS>) {
++    next if (/svc:\/milestone/);
++    if (/^.*\s*.*\s*svc:\/(.*):.*/) {
++      push(@list,$1);
++    }
++  }
++  close (SVCS);
++
++  return \@list;
++}
++
++sub gst_service_smf_get_services
++{
++  my ($service);
++  my (%ret);
++  my ($service_list) = &gst_service_smf_get_services_list ();
++
++  foreach $service (@$service_list)
++  {
++    my (%hash);
++    $hash = &gst_service_smf_get_service_info ($service);
++
++    $ret{$service} = $hash if ($hash ne undef);
++  }
++
++  return \%ret;
++}
++
+ # these functions get a list of the services that run on a gentoo init
+ sub gst_service_gentoo_get_service_status
+ {
+@@ -1163,6 +1329,10 @@
+   {
+     return "suse";
+   }
++  elsif ($gst_dist =~ /nexenta/ || $gst_dist =~ /solaris-2.11/)
++  {
++    return "smf";
++  }
+   else
+   {
+     return "sysv";
+@@ -1180,6 +1350,8 @@
+   return &gst_service_rcng_get_services ()   if ($type eq "rcng");
+   return &gst_service_suse_get_services ()   if ($type eq "suse");
+   return &gst_service_archlinux_get_services() if ($type eq "archlinux");
++  return &gst_service_smf_get_services ()   if ($type eq "smf");
++
+   return undef;
+ }
+ 
+@@ -1199,7 +1371,7 @@
+ {
+     my ($type) = &gst_get_init_type ();
+ 
+-    return "default" if ($type eq "gentoo");
++    return "default" if ($type eq "gentoo" || $type eq "smf");
+     return "rc"      if ($type eq "rcng");
+     return "rc"      if ($type eq "archlinux");
+     return &gst_service_sysv_get_default_runlevel ();
+@@ -1585,6 +1757,7 @@
+   &gst_service_rcng_set_services   ($services, $runlevel) if ($type eq "rcng");
+   &gst_service_suse_set_services   ($services, $runlevel) if ($type eq "suse");
+   &gst_service_archlinux_set_services ($services, $runlevel) if ($type eq "archlinux");
++  &gst_service_smf_set_services   ($services, $runlevel) if ($type eq "smf");
+ }
+ 
+ sub gst_service_set_conf
+@@ -1632,6 +1805,47 @@
+   return undef;
+ }
+ 
++sub gst_service_smf_set_services
++{
++  my ($services, $runlevel) = @_;
++  my ($action);
++
++  foreach $service (@$services)
++  {
++    $script = $$service{"script"};
++    $arr = $$service{"runlevels"}[0]{"runlevel"};
++
++    foreach $i (@$arr)
++    {
++      $action = $$i{"action"};
++      $rl = $$i{"name"};
++
++      if ( $action eq "start")
++      {
++        &gst_file_run ("rc-update add $script $rl");
++      }
++      elsif ($action eq "stop")
++      {
++        &gst_file_run ("rc-update del $script $rl");
++      }
++    }
++  }
++}
++
++sub gst_service_smf_get_status
++{
++  my ($service) = @_;
++  my $ret = 0;
++  my $fd = &gst_file_run_pipe_read ("svcs -H -ostate $service");
++
++  while (<$fd>) {
++    if (/^online/) { $ret = 1; last; }
++  }
++  gst_file_close ($fd);
++
++  return $ret;
++}
++
+ sub gst_service_redhat_get_status
+ {
+   my ($service) = @_;
+@@ -1697,6 +1911,9 @@
+        "ubuntu-5.04"  => \&gst_service_debian_get_status,
+        "ubuntu-5.10"  => \&gst_service_debian_get_status,
+        "ubuntu-6.04"  => \&gst_service_debian_get_status,
++
++       "nexenta-1.0" => \&gst_service_smf_get_status,
++       "solaris-2.11" => \&gst_service_smf_get_status,
+               
+        "redhat-5.2"   => \&gst_service_redhat_get_status,
+        "redhat-6.0"   => \&gst_service_redhat_get_status,
+@@ -1909,6 +2126,7 @@
+        "rcng"    => \&gst_service_rcng_run_script,
+        "suse"    => \&gst_service_sysv_run_initd_script,
+        "archlinux" => \&gst_service_archlinux_run_script,
++       "smf"    => \&gst_service_smf_run_svcadm,
+       );
+ 
+   $type = &gst_get_init_type ();
+@@ -1964,6 +2182,14 @@
+   return 0;
+ }
+ 
++sub gst_service_smf_installed
++{
++  my ($service) = @_;
++
++  return 1 if (! &gst_file_run("svcs -H -ostate $service"));
++  return 0;
++}
++
+ sub gst_service_installed
+ {
+   my ($service) = @_;
+@@ -1975,6 +2201,8 @@
+   return &gst_service_gentoo_installed ($service) if ($type eq "gentoo");
+   return &gst_service_rcng_installed ($service) if ($type eq "rcng");
+   return &gst_service_rcng_installed ($service) if ($type eq "archlinux");
++  return &gst_service_smf_installed ($service) if ($type eq "smf");
++
+   return 0;
+ }
+ 
+@@ -2013,6 +2241,21 @@
+   }
+ }
+ 
++sub gst_service_smf_set_status
++{
++  my ($service, $active) = @_;
++  my (@arr);
++
++  if ($active)
++  {
++    &gst_file_run ("svcadm enable $service");
++  }
++  else
++  {
++    &gst_file_run ("svcadm disable $service");
++  }
++}
++
+ sub gst_service_gentoo_set_status
+ {
+   my ($script, $force_now, $active) = @_;
+diff -ru /usr/tmp/clean/system-tools-backends-1.4.2/debug.pl.in system-tools-backends-1.4.2/debug.pl.in
+--- /usr/tmp/clean/system-tools-backends-1.4.2/debug.pl.in	Sun Sep 14 22:51:49 2003
++++ system-tools-backends-1.4.2/debug.pl.in	Mon Apr 10 16:04:52 2006
+@@ -83,7 +83,14 @@
+   @buff = split ("\n", $doc);
+   foreach $line (@buff)
+   {
+-    print $fd "$line\n";
++    if ($line =~ /<password>/)
++    {
++      print $fd "# suppress line containing password\n";
++    }
++    else
++    {
++      print $fd "$line\n";
++    }
+   }
+ }
+ 
+diff -ru /usr/tmp/clean/system-tools-backends-1.4.2/share.pl.in system-tools-backends-1.4.2/share.pl.in
+--- /usr/tmp/clean/system-tools-backends-1.4.2/share.pl.in	2005-02-25 14:15:34.000000000 +0000
++++ system-tools-backends-1.4.2/share.pl.in	2006-04-24 13:34:21.048581000 +0100
+@@ -202,6 +202,16 @@
+   }
+ }
+ 
++sub gst_share_nfs_info_get_name
++{
++  return $_[0]->{'name'};
++}
++
++sub gst_share_nfs_info_set_name
++{
++  &gst_share_nfs_info_set ($_[0], 'name', $_[1]);
++}
++
+ sub gst_share_nfs_info_get_point
+ {
+   return $_[0]->{'point'};
+@@ -397,6 +407,52 @@
+   return $table;
+ }
+ 
++sub gst_share_dfstab_list
++{
++  my ($file) = @_;
++  my $lnum = 0;
++  my @rv;
++
++  # dfstab example:
++  #
++  #       share [-F fstype] [-o fs_options ] [-d description] [pathname [resourcename]]
++  #       .e.g,
++  #       share  -F nfs  -o rw=engineering  -d "home dirs"  /export/home2
++  my $fd = &gst_file_open_read_from_names ($file);
++  return @rv if !$fd;
++
++  while (<$fd>) {
++    s/\r|\n//g; s/#.*$//;
++    if (/^\s*\S*share\s+(.*)/) {
++      # Found a share line
++      my $share = { 'line' => $lnum,
++                    'index' => scalar(@rv) };
++      my $line = $1;
++      while($line =~ /\\$/) {
++        $_ = <$fd>;
++        s/\r|\n//g; s/#.*$//;
++        $line =~ s/\\$//;
++        $line .= $_;
++        $lnum++;
++      }
++      $share->{'eline'} = $lnum;
++      if ($line =~ /\s+(\/\S+)/ || $line =~ /\s+(\/)/ || $line eq "/") { $share->{'dir'} = $1; }
++      if ($line =~ /-d\s+"([^"]+)"/) { $share->{'desc'} = $1; }
++      elsif ($line =~ /-d\s+(\S+)/) { $share->{'desc'} = $1; }
++      if ($line =~ /-o\s+"([^"]+)"/) { $share->{'opts'} = $1; }
++      elsif ($line =~ /-o\s+(\S+)/) { $share->{'opts'} = $1; }
++      if ($line =~ /\s-F\s+(\S+)/) { $share->{'type'} = $1; }
++      else { $share->{'type'} = "nfs"; }
++      $share->{'desc'} =~ s/"//g; $share->{'desc'} =~ s/'//g;
++      push(@rv, $share);
++    }
++    $lnum++;
++  }
++  &gst_file_close ($fd);
++
++  return @rv;
++}
++
+ sub gst_share_parse_nfs_exports
+ {
+   my ($nfs_exports_name) = @_;
+@@ -405,43 +461,87 @@
+ 
+   $table = &gst_share_nfs_table_new ();
+ 
+-  $entries = &gst_parse_split_hash_with_continuation ($nfs_exports_name, "[ \t]+", "[ \t]+");
++  if ($$tool{"system"} eq "SunOS") {
++    foreach $share (&gst_share_dfstab_list($nfs_exports_name)) {
++      if ($share->{'type'} eq "nfs") {
++        my $info = &gst_share_nfs_info_new ();
++        my $client_table = &gst_share_nfs_client_table_new ();
++
++        &gst_share_nfs_info_set_point ($info, $share->{'dir'});
++        &gst_share_nfs_info_set_name ($info, $share->{'desc'});
++
++        # Parse a mount options string like rw=foo,nosuid,...
++        # Parts with no value are given an empty string as the value
++        foreach my $opt (split(/,/, $share->{'opts'})) {
++          if ($opt =~ /^([^=]+)=(.*)$/) {
++            my $pattern;
++            my $access = $1;
++            my $client = $2;
++
++            $client =~ /^([a-zA-Z0-9.-_*?@\/]+)/;
++            $pattern = $1;
++            $pattern = "0.0.0.0/0" if $pattern eq "";
++            foreach my $host (split(/:/, $pattern)) {
++              my $cinfo = &gst_share_nfs_client_info_new ();
++              &gst_share_nfs_client_info_set_pattern ($cinfo, $host);
++
++              if ($access eq "rw") {
++                &gst_share_nfs_client_info_set_write ($cinfo, 1);
++              }
++
++              # ignore settings other than rw or ro, e.g. root
++              if ($access eq "rw" || $access eq "ro") {
++                &gst_share_nfs_client_table_add ($client_table, $cinfo);
++              }
++            }
++          } else {
++            $clients{$opt} = "";
++          }
++        }
+ 
+-  foreach $point (keys %$entries)
+-  {
+-    my $clients = $$entries{$point};
+-    my $info = &gst_share_nfs_info_new ();
+-    my $client_table = &gst_share_nfs_client_table_new ();
+-
+-    &gst_share_nfs_info_set_point ($info, $point);
+-
+-    foreach $client (@$clients)
++        &gst_share_nfs_info_set_client_table ($info, $client_table);
++        &gst_share_nfs_table_add ($table, $info);
++      }
++    }
++  } else {
++    $entries = &gst_parse_split_hash_with_continuation ($nfs_exports_name, "[ \t]+", "[ \t]+");
++  
++    foreach $point (keys %$entries)
+     {
+-      my $cinfo = &gst_share_nfs_client_info_new ();
+-      my $pattern;
+-
+-      $client =~ /^([a-zA-Z0-9.-_*?@\/]+)/;
+-      $pattern = $1;
+-      $pattern = "0.0.0.0/0" if $pattern eq "";
+-      &gst_share_nfs_client_info_set_pattern ($cinfo, $pattern);
+-
+-      my $option_str = "";
+-      my @options;
+-
+-      if ($client =~ /\((.+)\)/) { $option_str = $1; }
+-      @options = ($option_str =~ /([a-zA-Z0-9_=-]+),?/mg);
+-
+-      for $option (@options)
++      my $clients = $$entries{$point};
++      my $info = &gst_share_nfs_info_new ();
++      my $client_table = &gst_share_nfs_client_table_new ();
++  
++      &gst_share_nfs_info_set_point ($info, $point);
++  
++      foreach $client (@$clients)
+       {
+-        if ($option eq "rw") { &gst_share_nfs_client_info_set_write ($cinfo, 1); }
+-        # Add supported NFS export options here. Some might have to be split on '='.
++        my $cinfo = &gst_share_nfs_client_info_new ();
++        my $pattern;
++  
++        $client =~ /^([a-zA-Z0-9.-_*?@\/]+)/;
++        $pattern = $1;
++        $pattern = "0.0.0.0/0" if $pattern eq "";
++        &gst_share_nfs_client_info_set_pattern ($cinfo, $pattern);
++  
++        my $option_str = "";
++        my @options;
++  
++        if ($client =~ /\((.+)\)/) { $option_str = $1; }
++        @options = ($option_str =~ /([a-zA-Z0-9_=-]+),?/mg);
++  
++        for $option (@options)
++        {
++          if ($option eq "rw") { &gst_share_nfs_client_info_set_write ($cinfo, 1); }
++          # Add supported NFS export options here. Some might have to be split on '='.
++        }
++  
++        &gst_share_nfs_client_table_add ($client_table, $cinfo);
+       }
+-
+-      &gst_share_nfs_client_table_add ($client_table, $cinfo);
++  
++      &gst_share_nfs_info_set_client_table ($info, $client_table);
++      &gst_share_nfs_table_add ($table, $info);
+     }
+-
+-    &gst_share_nfs_info_set_client_table ($info, $client_table);
+-    &gst_share_nfs_table_add ($table, $info);
+   }
+ 
+   return $table;
+@@ -495,11 +595,27 @@
+   {
+     # Each line is in the following format:
+     # <point> <clients>
+-    my @line = split /[ \t]+/, $_;
+-    if ($line[0] eq "") { shift @line; }
+-    if (@line < 1 || &gst_ignore_line (@line)) { print $outfd $_; next; }
+-
+-    return $_;
++    if ($$tool{"system"} eq "SunOS") {
++      if (&gst_ignore_line($_)) { print $outfd $_; next; }
++      if (/^\s*\S*share\s+(.*)/) {
++	my $point, $type;
++        my $line = $1;
++        while($line =~ /\\$/) {
++          $_ = <$infd>;
++          s/\r|\n//g; s/#.*$//;
++          $line =~ s/\\$//;
++          $line .= $_;
++        }
++        if ($line =~ /\s-F\s+(\S+)/) { $type = $1; }
++        else { $type = "nfs"; }
++	return "share $line\n" if ($type eq "nfs");
++      }
++    } else {
++      my @line = split /[ \t]+/, $_;
++      if ($line[0] eq "") { shift @line; }
++      if (@line < 1 || &gst_ignore_line (@line)) { print $outfd $_; next; }
++      return $_;
++    }
+   }
+ 
+   return undef;
+@@ -526,11 +642,43 @@
+ 
+   $clients = &gst_share_nfs_info_get_client_table ($info);
+ 
+-  for $client (@$clients)
+-  {
+-    $line .= &gst_share_nfs_client_info_get_pattern ($client);
+-    $line .= "(rw)" if (&gst_share_nfs_client_info_get_write ($client));
+-    $line .= " ";
++  if ($$tool{"system"} eq "SunOS") {
++    my $nowrite = 1;
++    my $noread = 1;
++    for $client (@$clients)
++    {
++      if (&gst_share_nfs_client_info_get_write ($client)) { 
++        if ($nowrite eq 1) {
++          $line .= "rw="; 
++          $nowrite = 0;
++        } else {
++          $line .= ":"; 
++        }
++        $line .= &gst_share_nfs_client_info_get_pattern ($client);
++      }
++    }
++    for $client (@$clients)
++    {
++      if (!&gst_share_nfs_client_info_get_write ($client)) { 
++        if ($noread eq 1) {
++          if ($nowrite eq 0) {
++            $line .= ","; 
++          }
++          $line .= "ro="; 
++          $noread = 0;
++        } else {
++          $line .= ":"; 
++        }
++        $line .= &gst_share_nfs_client_info_get_pattern ($client);
++      }
++    }
++  } else {
++    for $client (@$clients)
++    {
++      $line .= &gst_share_nfs_client_info_get_pattern ($client);
++      $line .= "(rw)" if (&gst_share_nfs_client_info_get_write ($client));
++      $line .= " ";
++    }
+   }
+ 
+   return $line;
+@@ -541,13 +689,19 @@
+   my ($info) = @_;
+   my $line;
+ 
+-  # <point>
+-
+-  $line = sprintf ("%-15s ", &gst_share_nfs_info_get_point ($info));
+-
+-  # <clients>
+-
+-  $line .= &gst_share_nfs_info_print_clients ($info);
++  if ($$tool{"system"} eq "SunOS") {
++    $line = "share -F nfs ";
++    $line .= sprintf ("-o %s ", &gst_share_nfs_info_print_clients ($info))
++            if (&gst_share_nfs_info_print_clients ($info));
++    $line .= sprintf ("-d %s ", &gst_share_nfs_info_get_name ($info))
++	    if (&gst_share_nfs_info_get_name ($info));
++    $line .= sprintf ("%-15s ", &gst_share_nfs_info_get_point ($info));
++  } else {
++    # <point>
++    $line = sprintf ("%-15s ", &gst_share_nfs_info_get_point ($info));
++    # <clients>
++    $line .= &gst_share_nfs_info_print_clients ($info);
++  }
+ 
+   return $line;
+ }
+@@ -583,66 +737,75 @@
+   my $outline;
+   my $ctable = &gst_share_nfs_info_get_client_table ($info);
+ 
+-  # <point>
+-
+-  $outline = sprintf ("%-15s", &gst_share_nfs_info_get_point ($info));
+-
+-  # <clients>
+-
+-  chomp $line;
+-  my @clients = split /[ \t]+/, $line;
+-  shift @clients;
+-
+-  # Make client hash based on line.
+-
+-  my $chash = { };
+-
+-  for $client (@clients)
+-  {
+-    my $opthash = { };
+-
+-    $client =~ /^([a-zA-Z0-9.-_*?@\/]+)/;
+-    my $pattern = $1;
+-    $$chash{$pattern} = $opthash;
+-
+-    my $option_str = "";
+-    if ($client =~ /\((.+)\)/) { $option_str = $1; }
+-    @options = ($option_str =~ /([a-zA-Z0-9_=-]+),?/mg);
+-
+-    for $option (@options)
+-    {
+-      my ($key, $value) = split /[=]/, $option;
+-      next if ($key eq "");
+-
+-      if ($value eq "" && $option =~ /=/) { $value = " "; }
+-      $$opthash{$key} = $value;
+-    }
+-  }
+-
+-  # @clients contains client(options) entries.
+-
+-  for $cinfo (@$ctable)
+-  {
+-    my $pattern = &gst_share_nfs_client_info_get_pattern ($cinfo);
+-    my $opthash = $$chash{$pattern};
+-
+-    if (&gst_share_nfs_client_info_get_write ($cinfo))
+-    {
+-      $$opthash{'rw'} = "";
+-    }
+-    else
++  if ($$tool{"system"} eq "SunOS") {
++    my $desc = "unknown";
++    if ($line =~ /-d\s+"([^"]+)"/) { $desc = $1; }
++    elsif ($line =~ /-d\s+(\S+)/) { $desc = $1; }
++    $desc =~ s/"//g; $desc =~ s/'//g;
++    &gst_share_nfs_info_set_name ($info, $desc);
++    $outline = &gst_share_nfs_info_print_entry ($info);
++  } else {
++    # <point>
++  
++    $outline = sprintf ("%-15s", &gst_share_nfs_info_get_point ($info));
++  
++    # <clients>
++  
++    chomp $line;
++    my @clients = split /[ \t]+/, $line;
++    shift @clients;
++  
++    # Make client hash based on line.
++  
++    my $chash = { };
++  
++    for $client (@clients)
+     {
+-      delete $$opthash{'rw'};
++      my $opthash = { };
++  
++      $client =~ /^([a-zA-Z0-9.-_*?@\/]+)/;
++      my $pattern = $1;
++      $$chash{$pattern} = $opthash;
++  
++      my $option_str = "";
++      if ($client =~ /\((.+)\)/) { $option_str = $1; }
++      @options = ($option_str =~ /([a-zA-Z0-9_=-]+),?/mg);
++  
++      for $option (@options)
++      {
++        my ($key, $value) = split /[=]/, $option;
++        next if ($key eq "");
++  
++        if ($value eq "" && $option =~ /=/) { $value = " "; }
++        $$opthash{$key} = $value;
++      }
+     }
+-
+-    $outline .= " " . &gst_share_nfs_client_info_get_pattern ($cinfo);
+-    my $client_string = &gst_share_nfs_client_print_option_hash ($opthash);
+-    if ($client_string ne "")
++  
++    # @clients contains client(options) entries.
++  
++    for $cinfo (@$ctable)
+     {
+-      $outline .= "(" . $client_string . ")";
++      my $pattern = &gst_share_nfs_client_info_get_pattern ($cinfo);
++      my $opthash = $$chash{$pattern};
++  
++      if (&gst_share_nfs_client_info_get_write ($cinfo))
++      {
++        $$opthash{'rw'} = "";
++      }
++      else
++      {
++        delete $$opthash{'rw'};
++      }
++  
++      $outline .= " " . &gst_share_nfs_client_info_get_pattern ($cinfo);
++      my $client_string = &gst_share_nfs_client_print_option_hash ($opthash);
++      if ($client_string ne "")
++      {
++        $outline .= "(" . $client_string . ")";
++      }
+     }
+   }
+-
++  
+   return $outline;
+ }
+ 
+@@ -719,7 +882,11 @@
+   my ($line) = @_;
+   my $point;
+ 
+-  ($point) = split /[ \t]+/, $line;
++  if ($$tool{"system"} eq "SunOS") {
++    if ($line =~ /\s+(\/\S+)/ || $line =~ /\s+(\/)/ || $line eq "/") { $point = $1; }
++  } else {
++    ($point) = split /[ \t]+/, $line;
++  }
+   return $point;
+ }
+ 
+@@ -752,6 +919,12 @@
+       &gst_share_nfs_exports_remove_entry ($file, $old_info);
+     }
+   } 
++
++  if ($$tool{"system"} eq "SunOS") {
++    &gst_file_run ("svcadm enable nfs/server");
++    &gst_file_run ("unshareall");
++    &gst_file_run ("/bin/sh $file");
++  }
+ }
+ 
+