Hi

On Sun, Jul 08, 2007 at 11:18:32AM -0300, Ben Armstrong wrote:
> There are three things that should be fixed:
> 
> 1. CheckGeometryAndDepth is commented out because it does not handle
> validating each geometry in the array.  This needs to be fixed.
> 
> 2. The default vnc.conf should show an example of setting multiple geometries:
> 
> $geometry = ["800x600", "1024x768", "640x480"];
> 
> 3. The man page needs to document that an array or scalar can be specified 
> for geometry.
> 
> I'll take a look at item #1 later today if you would please address #2 and #3.

Ok, sounds good. I'll take care of 2 and 3 before I upload.

Regards,

// Ola

> Ben
> 
> On Sun, 8 Jul 2007 11:16:32 +0200
> Ola Lundqvist <[EMAIL PROTECTED]> wrote:
> 
> > tags 366493 + patch
> > thanks
> > 
> > Hi
> > 
> > Really nice! I'll add it on next upload.
> > 
> > Regards,
> > 
> > // Ola
> > 
> > On Mon, Jul 02, 2007 at 09:41:54AM -0300, Ben Armstrong wrote:
> > > Package: vnc4server
> > > Version: 4.1.1+X4.3.0-21
> > > Followup-For: Bug #366493
> > > 
> > > I tried Nikita's patch and it works well.  All it needs to be released is
> > > the attached new vncserver wrapper that allows multiple -geometry options
> > > to be specified.
> > > 
> > > Ben
> > 
> > > #!/usr/bin/env perl
> > > #
> > > #  Copyright (C) 2004-2006 Ola Lundqvist <[EMAIL PROTECTED]>
> > > #  Copyright (C) 2002-2005 RealVNC Ltd.
> > > #  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
> > > #
> > > #  This is free software; you can redistribute it and/or modify
> > > #  it under the terms of the GNU General Public License as published by
> > > #  the Free Software Foundation; either version 2 of the License, or
> > > #  (at your option) any later version.
> > > #
> > > #  This software is distributed in the hope that it will be useful,
> > > #  but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > > #  GNU General Public License for more details.
> > > #
> > > #  You should have received a copy of the GNU General Public License
> > > #  along with this software; if not, write to the Free Software
> > > #  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
> > > #  USA.
> > > #
> > > 
> > > #
> > > # vncserver - wrapper script to start an X VNC server.
> > > #
> > > 
> > > # This file was heavily edited by Ola Lundqvist <[EMAIL PROTECTED]> using
> > > # options from vnc package.
> > > # Most modifications are written by [EMAIL PROTECTED] and
> > > # now incorporated by Ola.
> > > 
> > > # Please report all errors to Debian and not to ORL.
> > > 
> > > #
> > > # First make sure we're operating in a sane environment.
> > > #
> > > 
> > > &SanityCheck();
> > > 
> > > #
> > > # Global variables.  You may want to configure some of these for your 
> > > site.
> > > #
> > > 
> > > $geometry = "1024x768";
> > > $depth = 16;
> > > $vncJavaFiles = (((-d "/usr/share/vnc-java") && "/usr/share/vnc-java") ||
> > >            ((-d "/usr/share/vnc/classes") && "/usr/share/vnc/classes") ||
> > >                  ((-d "/usr/local/vnc/classes") && 
> > > "/usr/local/vnc/classes"));
> > > 
> > > $vncUserDir = "$ENV{HOME}/.vnc";
> > > $xauthorityFile = "$ENV{XAUTHORITY}" || "$ENV{HOME}/.Xauthority";
> > > 
> > > $defaultXStartup
> > >     = ("#!/bin/sh\n\n".
> > >        "# Uncomment the following two lines for normal desktop:\n".
> > >        "# unset SESSION_MANAGER\n".
> > >        "# exec /etc/X11/xinit/xinitrc\n\n".
> > >        "[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup\n".
> > >        "[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources\n".
> > >        "xsetroot -solid grey\n".
> > >        "vncconfig -iconic &\n".
> > >        "x-terminal-emulator -geometry 80x24+10+10 -ls -title 
> > > \"\$VNCDESKTOP Desktop\" &\n".
> > >        "x-window-manager &\n");
> > > 
> > > ######## Adding configuration possibility ################
> > > $Config_file = "/etc/vnc.conf";
> > > &ReadConfigFile();
> > > $Config_file = "$ENV{HOME}/.vncrc";
> > > &ReadConfigFile();
> > > 
> > > if (!$XFConfigPath) {
> > >   foreach ("/etc/X11/xorg.conf", "/etc/X11/XF86Config-4", 
> > > "/etc/X11/XF86Config" ){
> > >     $XFConfigPath = $_;
> > >     last if ( -e $XFConfigPath );
> > >   }
> > > }
> > > if (!$fontPath) {
> > >   &ReadXFConfigFont;
> > > }
> > > if (!$fontPath) {
> > >   $fontPath = "/usr/X11R6/lib/X11/fonts/Type1/,".
> > >               "/usr/X11R6/lib/X11/fonts/Speedo/,".
> > >               "/usr/X11R6/lib/X11/fonts/misc/,".
> > >               "/usr/X11R6/lib/X11/fonts/75dpi/,".
> > >               "/usr/X11R6/lib/X11/fonts/100dpi/,".
> > >               "/usr/share/fonts/X11/misc/,".
> > >                 "/usr/share/fonts/X11/Type1/,".
> > >               "/usr/share/fonts/X11/75dpi/,".
> > >               "/usr/share/fonts/X11/100dpi/"
> > > }
> > > if (!$colorPath) {
> > >   &ReadXFConfigColor;
> > > }
> > > if (!$colorPath) {
> > >   foreach ("/etc/X11/rgb", "/usr/share/X11/rgb", 
> > > "/usr/X11R6/lib/X11/rgb"){
> > >       $colorPath = $_;
> > >       last if ( -e "${colorPath}.txt" );
> > >   }
> > > }
> > > 
> > > ##########################################################
> > > 
> > > $vncUserDirUnderTmp = ($vncUserDir =~ m|^/tmp/.+|) ? 1 : 0;
> > > $xstartup = ($vncUserDirUnderTmp) ?
> > >   "$ENV{HOME}/.vncstartup" : "$vncUserDir/xstartup";
> > > $xstartup = $vncStartup if ($vncStartup);
> > > 
> > > unless ($xauthorityFile) {
> > >     if ($vncUserDirUnderTmp) {
> > >         $xauthorityFile = "$vncUserDir/.Xauthority";
> > >     } else {
> > >         $xauthorityFile = "$ENV{HOME}/.Xauthority";
> > >     }
> > > }
> > > 
> > > chop($host = `uname -n`);
> > > 
> > > 
> > > # Check command line options
> > > 
> > > &ParseOptions("-geometry",1,"-depth",1,"-pixelformat",1,"-name",1,"-kill",1,
> > >         "-help",0,"-h",0,"--help",0,
> > >         "-clean",0, "-fp",1,
> > >         "-alwaysshared",0, "-nevershared",0,
> > >         "-httpport",1,"-basehttpport",1);
> > > 
> > > &Usage() if ($opt{'-help'} || $opt{'-h'} || $opt{'--help'});
> > > 
> > > &Kill() if ($opt{'-kill'});
> > > 
> > > $useClasses = 0;
> > > if (defined $vncJavaFiles) {
> > >   if(-d $vncJavaFiles) {
> > >       $useClasses = 1;
> > >   }
> > > }
> > > 
> > > # Uncomment this line if you want default geometry, depth and pixelformat
> > > # to match the current X display:
> > > # &GetXDisplayDefaults();
> > > 
> > > if ($opt{'-geometry'}) {
> > >     $geometry = $opt{'-geometry'};
> > > }
> > > if ($opt{'-depth'}) {
> > >     $depth = $opt{'-depth'};
> > >     $pixelformat = "";
> > > }
> > > if ($opt{'-pixelformat'}) {
> > >     $pixelformat = $opt{'-pixelformat'};
> > > }
> > > 
> > > if ($opt{'-fp'}) {
> > >     @fontPathElements = split(/\s*,\s*/, "$opt{'-fp'}");
> > > 
> > >     $fontPath = '';
> > > 
> > >     foreach $i (0.."$#fontPathElements") {
> > >        $tempFontPath = $fontPathElements[$i];
> > >        if ($tempFontPath !~ m!^[^/]*/[^/]*:\d+$!) {
> > >            $tempFontPath =~ s/:unscaled$//;
> > >            if (-r "$tempFontPath/fonts.dir") {
> > >                $fontPath .= "$fontPathElements[$i],";
> > >            }
> > >        } else {
> > >            $fontPath .= "$fontPathElements[$i],";
> > >        }
> > >     }
> > >     chop $fontPath;
> > > }
> > > 
> > > #&CheckGeometryAndDepth();
> > > 
> > > # Create the user's vnc directory if necessary.
> > > 
> > > if (!(-e $vncUserDir)) {
> > >     if (!mkdir($vncUserDir,0755)) {
> > >   die "$prog: Could not create $vncUserDir.\n";
> > >     }
> > > }
> > > 
> > > ($z,$z,$mode) = lstat("$vncUserDir");
> > > if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) {
> > >     die "$prog: Wrong type or access mode of $vncUserDir.\n";
> > > }
> > > 
> > > # Make sure the user has a password.
> > > 
> > > ($z,$z,$mode) = stat("$vncUserDir/passwd");
> > > if (!(-e "$vncUserDir/passwd") || ($mode & 077)) {
> > >     warn "\nYou will require a password to access your desktops.\n\n";
> > >     system("vncpasswd $vncUserDir/passwd"); 
> > >     if (($? >> 8) != 0) {
> > >   exit 1;
> > >     }
> > > }
> > > 
> > > # Find display number.
> > > 
> > > if ((@ARGV > 0) && ($ARGV[0] =~ /^:(\d+)$/)) {
> > >     $displayNumber = $1;
> > >     shift(@ARGV);
> > >     if (!&CheckDisplayNumber($displayNumber)) {
> > >   die "A VNC server is already running as :$displayNumber\n";
> > >     }
> > > } elsif ((@ARGV > 0) && ($ARGV[0] !~ /^-/)) {
> > >     &Usage();
> > > } else {
> > >     $displayNumber = &GetDisplayNumber();
> > > }
> > > 
> > > $vncPort = 5900 + $displayNumber;
> > > 
> > > $desktopLog = "$vncUserDir/$host:$displayNumber.log";
> > > unlink($desktopLog);
> > > 
> > > # Make an X server cookie - use mcookie
> > > $cookie = `/usr/bin/mcookie`;
> > > open (XAUTH, "|xauth -f $xauthorityFile source -");
> > > print XAUTH "add $host:$displayNumber . $cookie\n";
> > > print XAUTH "add $host/unix:$displayNumber . $cookie\n";
> > > close XAUTH;
> > > 
> > > if ($opt{'-name'}) {
> > >     $desktopName = $opt{'-name'};
> > > } else {
> > >     $desktopName = "$host:$displayNumber ($ENV{USER})";
> > > }
> > > 
> > > # Now start the X VNC Server
> > > 
> > > $cmd = "Xvnc4 :$displayNumber";
> > > $cmd .= " -desktop " . &quotedString($desktopName);
> > > if ($useClasses) {
> > >   $cmd .= " -httpd $vncJavaFiles";
> > >   print ("Found $vncJavaFiles for http connections.\n");
> > >   if ($opt{'-httpport'}) {
> > >     $cmd .= " -httpport $opt{'-httpport'}";
> > >     print ("Listening to $opt{'-httpport'} for http connections.\n");
> > >   }
> > >   elsif ($opt{'-basehttpport'}) {
> > >     my $v = $opt{'-basehttpport'} + $displayNumber;
> > >     print ("Listening to $v for http connections.\n");
> > >     $cmd .= " -httpport $v";
> > >   }
> > > }
> > > $cmd .= " -auth $xauthorityFile";
> > > if ($geometry) {
> > >   if ($#$geometry==-1) {
> > >     $cmd .= " -geometry $geometry";
> > >   } else {
> > >     foreach $i (0..$#$geometry) {
> > >       $cmd .= " -geometry $geometry->[$i]";
> > >     }
> > >   }
> > > }
> > > $cmd .= " -depth $depth" if ($depth);
> > > $cmd .= " -pixelformat $pixelformat" if ($pixelformat);
> > > $cmd .= " -rfbwait 30000";
> > > $cmd .= " -rfbauth $vncUserDir/passwd";
> > > $cmd .= " -rfbport $vncPort";
> > > $cmd .= " -pn";
> > > 
> > > # Add font path and color database stuff here, e.g.:
> > > #
> > > # $cmd .= " -fp /usr/lib/X11/fonts/misc/,/usr/lib/X11/fonts/75dpi/";
> > > # $cmd .= " -co /usr/lib/X11/rgb";
> > > #
> > > $cmd .= " -fp $fontPath" if ($fontPath);
> > > $cmd .= " -co $colorPath" if ($colorPath);
> > > $cmd .= " -alwaysshared" if ($opt{'-alwaysshared'});
> > > $cmd .= " -nevershared" if ($opt{'-nevershared'});
> > > 
> > > foreach $arg (@ARGV) {
> > >     $cmd .= " " . &quotedString($arg);
> > > }
> > > $cmd .= " >> " . &quotedString($desktopLog) . " 2>&1";
> > > 
> > > # Run $cmd and record the process ID.
> > > 
> > > $pidFile = "$vncUserDir/$host:$displayNumber.pid";
> > > system("$cmd & echo \$! >$pidFile");
> > > 
> > > # Give Xvnc4 a chance to start up
> > > 
> > > sleep(3); 
> > > 
> > > warn "\nNew '$desktopName' desktop is $host:$displayNumber\n\n";
> > > 
> > > # Create the user's xstartup script if necessary.
> > > 
> > > if (!(-e "$xstartup")) {
> > >     warn "Creating default startup script $xstartup\n";
> > >     open(XSTARTUP, ">$xstartup");
> > >     print XSTARTUP $defaultXStartup;
> > >     close(XSTARTUP);
> > >     chmod 0755, "$xstartup";
> > > }
> > > 
> > > # Run the X startup script.
> > > 
> > > warn "Starting applications specified in $xstartup\n";
> > > warn "Log file is $desktopLog\n\n";
> > > 
> > > # If the unix domain socket exists then use that (DISPLAY=:n) otherwise 
> > > use
> > > # TCP (DISPLAY=host:n)
> > > 
> > > if (-e "/tmp/.X11-unix/X$displayNumber" ||
> > >     -e "/usr/spool/sockets/X11/$displayNumber")
> > > {
> > >     $ENV{DISPLAY}= ":$displayNumber";
> > > } else {
> > >     $ENV{DISPLAY}= "$host:$displayNumber";
> > > }
> > > $ENV{VNCDESKTOP}= $desktopName;
> > > 
> > > system("$xstartup >> " . &quotedString($desktopLog) . " 2>&1 &");
> > > 
> > > exit;
> > > 
> > > ############################ Debian functions 
> > > #################################
> > > # I thank Manoj for the code below.
> > > #
> > > # ReadConfigFile reads in a config file and sets variables according to 
> > > it.
> > > #
> > > 
> > > sub ReadConfigFile
> > > {
> > >   open(CONFIG, "$Config_file") || return;
> > >   my $lineno = 0;
> > >   while (<CONFIG>) {
> > >       chomp;
> > >       $lineno++;
> > >       s/\#.*//og;
> > >       next if /^\s*$/og;
> > >       $_ .= ";" unless /;\s*$/;
> > >       if (/^\s*([^=]+)\s*=\s*(\S.*)$/o) {
> > >           my $ret = eval "$1=$2";
> > >           if ($@) {
> > >               print STDERR "Error parsing config file $Config_file!\n";
> > >               print STDERR "$lineno:$_\n";
> > >           }
> > >       }
> > >   }
> > > }
> > > 
> > > sub ReadXFConfigFont
> > > {
> > >   open(CONFIG, "$XFConfigPath") || return;
> > >   my $lineno = 0;
> > >   while (<CONFIG>) {
> > >       chomp;
> > >       $lineno++;
> > >       s/\#.*//og;
> > >       next if /^\s*$/og;
> > >       if (/^\s*FontPath\s*"(\S.*)"\s*$/o) {
> > >           $fontPath .= "," if $fontPath;
> > >           $fontPath .= $1;
> > >       }
> > >   }
> > > }
> > > 
> > > sub ReadXFConfigColor
> > > {
> > >   open(CONFIG, "$XFConfigPath") || return;
> > >   my $lineno = 0;
> > >   while (<CONFIG> && !$colorPath) {
> > >       chomp;
> > >       $lineno++;
> > >       s/\#.*//og;
> > >       next if /^\s*$/og;
> > >       if (/^\s*RgbPath\s*"(\S.*)"\s*$/o) {
> > >           $colorPath = $1;
> > >       }
> > >   }
> > > }
> > > 
> > > 
> > > ########## End of debian functions ###########
> > > 
> > > 
> > > ###############################################################################
> > > #
> > > # CheckGeometryAndDepth simply makes sure that the geometry and depth 
> > > values
> > > # are sensible.
> > > #
> > > 
> > > sub CheckGeometryAndDepth
> > > {
> > >     if ($geometry =~ /^(\d+)x(\d+)$/) {
> > >   $width = $1; $height = $2;
> > > 
> > >   if (($width<1) || ($height<1)) {
> > >       die "$prog: geometry $geometry is invalid\n";
> > >   }
> > > 
> > >   while (($width % 4)!=0) {
> > >       $width = $width + 1;
> > >   }
> > > 
> > >   while (($height % 2)!=0) {
> > >       $height = $height + 1;
> > >   }
> > > 
> > >   $geometry = "${width}x$height";
> > >     } else {
> > >   die "$prog: geometry $geometry is invalid\n";
> > >     }
> > > 
> > >     if (($depth < 8) || ($depth > 32)) {
> > >   die "Depth must be between 8 and 32\n";
> > >     }
> > > }
> > > 
> > > 
> > > #
> > > # GetDisplayNumber gets the lowest available display number.  A display 
> > > number
> > > # n is taken if something is listening on the VNC server port (5900+n) or 
> > > the
> > > # X server port (6000+n).
> > > #
> > > 
> > > sub GetDisplayNumber
> > > {
> > >     foreach $n (1..99) {
> > >   if (&CheckDisplayNumber($n)) {
> > >       return $n+0; # Bruce Mah's workaround for bug in perl 5.005_02
> > >   }
> > >     }
> > >     
> > >     die "$prog: no free display number on $host.\n";
> > > }
> > > 
> > > 
> > > #
> > > # CheckDisplayNumber checks if the given display number is available.  A
> > > # display number n is taken if something is listening on the VNC server 
> > > port
> > > # (5900+n) or the X server port (6000+n).
> > > #
> > > 
> > > sub CheckDisplayNumber
> > > {
> > >     local ($n) = @_;
> > > 
> > >     socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: 
> > > $!\n";
> > >     eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
> > >     if (!bind(S, pack('S n x12', $AF_INET, 6000 + $n))) {
> > >   close(S);
> > >   return 0;
> > >     }
> > >     close(S);
> > > 
> > >     socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: 
> > > $!\n";
> > >     eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
> > >     if (!bind(S, pack('S n x12', $AF_INET, 5900 + $n))) {
> > >   close(S);
> > >   return 0;
> > >     }
> > >     close(S);
> > > 
> > >     if (-e "/tmp/.X$n-lock") {
> > >   warn "\nWarning: $host:$n is taken because of /tmp/.X$n-lock\n";
> > >   warn "Remove this file if there is no X server $host:$n\n";
> > >   return 0;
> > >     }
> > > 
> > >     if (-e "/tmp/.X11-unix/X$n") {
> > >   warn "\nWarning: $host:$n is taken because of /tmp/.X11-unix/X$n\n";
> > >   warn "Remove this file if there is no X server $host:$n\n";
> > >   return 0;
> > >     }
> > > 
> > >     if (-e "/usr/spool/sockets/X11/$n") {
> > >   warn("\nWarning: $host:$n is taken because of ".
> > >              "/usr/spool/sockets/X11/$n\n");
> > >   warn "Remove this file if there is no X server $host:$n\n";
> > >   return 0;
> > >     }
> > > 
> > >     return 1;
> > > }
> > > 
> > > 
> > > #
> > > # GetXDisplayDefaults uses xdpyinfo to find out the geometry, depth and 
> > > pixel
> > > # format of the current X display being used.  If successful, it sets the
> > > # options as appropriate so that the X VNC server will use the same 
> > > settings
> > > # (minus an allowance for window manager decorations on the geometry).  
> > > Using
> > > # the same depth and pixel format means that the VNC server won't have to
> > > # translate pixels when the desktop is being viewed on this X display (for
> > > # TrueColor displays anyway).
> > > #
> > > 
> > > sub GetXDisplayDefaults
> > > {
> > >     local (@lines, @matchlines, $width, $height, $defaultVisualId, $i,
> > >      $red, $green, $blue);
> > > 
> > >     $wmDecorationWidth = 4;       # a guess at typical size for window 
> > > manager
> > >     $wmDecorationHeight = 24;     # decoration size
> > > 
> > >     return if (!defined($ENV{DISPLAY}));
> > > 
> > >     @lines = `xdpyinfo 2>/dev/null`;
> > > 
> > >     return if ($? != 0);
> > > 
> > >     @matchlines = grep(/dimensions/, @lines);
> > >     if (@matchlines) {
> > >   ($width, $height) = ($matchlines[0] =~ /(\d+)x(\d+) pixels/);
> > > 
> > >   $width -= $wmDecorationWidth;
> > >   $height -= $wmDecorationHeight;
> > > 
> > >   $geometry = "${width}x$height";
> > >     }
> > > 
> > >     @matchlines = grep(/default visual id/, @lines);
> > >     if (@matchlines) {
> > >   ($defaultVisualId) = ($matchlines[0] =~ /id:\s+(\S+)/);
> > > 
> > >   for ($i = 0; $i < @lines; $i++) {
> > >       if ($lines[$i] =~ /^\s*visual id:\s+$defaultVisualId$/) {
> > >           if (($lines[$i+1] !~ /TrueColor/) ||
> > >               ($lines[$i+2] !~ /depth/) ||
> > >               ($lines[$i+4] !~ /red, green, blue masks/))
> > >           {
> > >               return;
> > >           }
> > >           last;
> > >       }
> > >   }
> > > 
> > >   return if ($i >= @lines);
> > > 
> > >   ($depth) = ($lines[$i+2] =~ /depth:\s+(\d+)/);
> > >   ($red,$green,$blue)
> > >       = ($lines[$i+4]
> > >          =~ /masks:\s+0x([0-9a-f]+), 0x([0-9a-f]+), 0x([0-9a-f]+)/);
> > > 
> > >   $red = hex($red);
> > >   $green = hex($green);
> > >   $blue = hex($blue);
> > > 
> > >   if ($red > $blue) {
> > >       $red = int(log($red) / log(2)) - int(log($green) / log(2));
> > >       $green = int(log($green) / log(2)) - int(log($blue) / log(2));
> > >       $blue = int(log($blue) / log(2)) + 1;
> > >       $pixelformat = "rgb$red$green$blue";
> > >   } else {
> > >       $blue = int(log($blue) / log(2)) - int(log($green) / log(2));
> > >       $green = int(log($green) / log(2)) - int(log($red) / log(2));
> > >       $red = int(log($red) / log(2)) + 1;
> > >       $pixelformat = "bgr$blue$green$red";
> > >   }
> > >     }
> > > }
> > > 
> > > 
> > > #
> > > # quotedString returns a string which yields the original string when 
> > > parsed
> > > # by a shell.
> > > #
> > > 
> > > sub quotedString
> > > {
> > >     local ($in) = @_;
> > > 
> > >     $in =~ s/\'/\'\"\'\"\'/g;
> > > 
> > >     return "'$in'";
> > > }
> > > 
> > > 
> > > #
> > > # removeSlashes turns slashes into underscores for use as a file name.
> > > #
> > > 
> > > sub removeSlashes
> > > {
> > >     local ($in) = @_;
> > > 
> > >     $in =~ s|/|_|g;
> > > 
> > >     return "$in";
> > > }
> > > 
> > > 
> > > #
> > > # Usage
> > > #
> > > 
> > > sub Usage
> > > {
> > >     die("VNC4 server\n".
> > >        "\n".
> > >        "Usage: $prog [<OPTIONS>] [:<DISPLAY#>]\n".
> > >        "       $prog -kill :<DISPLAY#>\n".
> > >        "\n".
> > >        "<OPTIONS> are Xvnc4 options, or:\n".
> > >        "\n".
> > >        "        -name <DESKTOP-NAME>\n".
> > >        "        -depth <DEPTH>\n".
> > >        "        -geometry <WIDTH>x<HEIGHT>\n".
> > >        "        -httpport number\n".
> > >        "        -basehttpport number\n".
> > >        "        -alwaysshared\n".
> > >        "        -nevershared\n".
> > >        "        -pixelformat rgb<NNN>\n".
> > >        "        -pixelformat bgr<NNN>\n".
> > >        "        <Xvnc4-options>...\n".
> > >        "\n".
> > >        "See vnc4server and Xvnc4 manual pages for more information.\n");
> > > }
> > > 
> > > 
> > > #
> > > # Kill
> > > #
> > > 
> > > sub Kill
> > > {
> > >     $opt{'-kill'} =~ s/(:\d+)\.\d+$/$1/; # e.g. turn :1.0 into :1
> > > 
> > >     if ($opt{'-kill'} =~ /^:\d+$/) {
> > >   $pidFile = "$vncUserDir/$host$opt{'-kill'}.pid";
> > >     } else {
> > >   if ($opt{'-kill'} !~ /^$host:/) {
> > >       die "\nCan't tell if $opt{'-kill'} is on $host\n".
> > >           "Use -kill :<number> instead\n\n";
> > >   }
> > >   $pidFile = "$vncUserDir/$opt{'-kill'}.pid";
> > >     }
> > > 
> > >     if (! -r $pidFile) {
> > >   die "\nCan't find file $pidFile\n".
> > >       "You'll have to kill the Xvnc4 process manually\n\n";
> > >     }
> > > 
> > >     $SIG{'HUP'} = 'IGNORE';
> > >     chop($pid = `cat $pidFile`);
> > >     warn "Killing Xvnc4 process ID $pid\n";
> > >     system("kill $pid");
> > >     unlink $pidFile;
> > >     exit;
> > > }
> > > 
> > > 
> > > #
> > > # ParseOptions takes a list of possible options and a boolean indicating
> > > # whether the option has a value following, and sets up an associative 
> > > array
> > > # %opt of the values of the options given on the command line. It removes 
> > > all
> > > # the arguments it uses from @ARGV and returns them in @optArgs.
> > > #
> > > 
> > > sub ParseOptions
> > > {
> > >     local (@optval) = @_;
> > >     local ($opt, @opts, %valFollows, @newargs);
> > > 
> > >     while (@optval) {
> > >   $opt = shift(@optval);
> > >   push(@opts,$opt);
> > >   $valFollows{$opt} = shift(@optval);
> > >     }
> > > 
> > >     @optArgs = ();
> > >     %opt = ();
> > > 
> > >     arg: while (defined($arg = shift(@ARGV))) {
> > >   foreach $opt (@opts) {
> > >       if ($arg eq $opt) {
> > >           push(@optArgs, $arg);
> > >           if ($valFollows{$opt}) {
> > >               if (@ARGV == 0) {
> > >                   &Usage();
> > >               }
> > >               if ($opt{$opt}) {
> > >                  # Convert scalar to array if necessary
> > >                  $opt{$opt} = [$opt{$opt}] if $#{$opt{$opt}}==-1;
> > >                  push(@{$opt{$opt}},shift(@ARGV));
> > >               } else {
> > >                  $opt{$opt} = shift(@ARGV);
> > >               }
> > >               push(@optArgs, $opt{$opt});
> > >           } else {
> > >               $opt{$opt} = 1;
> > >           }
> > >           next arg;
> > >       }
> > >   }
> > >   push(@newargs,$arg);
> > >     }
> > > 
> > >     @ARGV = @newargs;
> > > }
> > > 
> > > 
> > > #
> > > # Routine to make sure we're operating in a sane environment.
> > > #
> > > 
> > > sub SanityCheck
> > > {
> > >     local ($cmd);
> > > 
> > >     #
> > >     # Get the program name
> > >     #
> > > 
> > >     ($prog) = ($0 =~ m|([^/]+)$|);
> > > 
> > >     #
> > >     # Check we have all the commands we'll need on the path.
> > >     #
> > > 
> > >  cmd:
> > >     foreach $cmd ("uname","xauth","Xvnc4","vncpasswd") {
> > >   for (split(/:/,$ENV{PATH})) {
> > >       if (-x "$_/$cmd") {
> > >           next cmd;
> > >       }
> > >   }
> > >   die "$prog: couldn't find \"$cmd\" on your PATH.\n";
> > >     }
> > > 
> > >     #
> > >     # Check the HOME environment variable is set
> > >     #
> > > 
> > >     if (!defined($ENV{HOME})) {
> > >   die "$prog: The HOME environment variable is not set.\n";
> > >     }
> > >     chdir($ENV{HOME});
> > > 
> > >     #
> > >     # Find socket constants. 'use Socket' is a perl5-ism, so we wrap it 
> > > in an
> > >     # eval, and if it fails we try 'require "sys/socket.ph"'.  If this 
> > > fails,
> > >     # we just guess at the values.  If you find perl moaning here, just
> > >     # hard-code the values of AF_INET and SOCK_STREAM.  You can find 
> > > these out
> > >     # for your platform by looking in /usr/include/sys/socket.h and 
> > > related
> > >     # files.
> > >     #
> > > 
> > >     chop($os = `uname`);
> > >     chop($osrev = `uname -r`);
> > > 
> > >     eval 'use Socket';
> > >     if ($@) {
> > >   eval 'require "sys/socket.ph"';
> > >   if ($@) {
> > >       if (($os eq "SunOS") && ($osrev !~ /^4/)) {
> > >           $AF_INET = 2;
> > >           $SOCK_STREAM = 2;
> > >       } else {
> > >           $AF_INET = 2;
> > >           $SOCK_STREAM = 1;
> > >       }
> > >   } else {
> > >       $AF_INET = &AF_INET;
> > >       $SOCK_STREAM = &SOCK_STREAM;
> > >   }
> > >     } else {
> > >   $AF_INET = &AF_INET;
> > >   $SOCK_STREAM = &SOCK_STREAM;
> > >     }
> > > }
> > 
> > 
> 
> 
> -- 
> --
>  ,-.  nSLUG    http://www.nslug.ns.ca   [EMAIL PROTECTED]
>  \`'  Debian   http://www.debian.org    [EMAIL PROTECTED]
>   `          [ gpg 395C F3A4 35D3 D247 1387 2D9E 5A94 F3CA 0B27 13C8 ]
>              [ pgp 7F DA 09 4B BA 2C 0D E0 1B B1 31 ED C6 A9 39 4F ]
> 

-- 
 --- Ola Lundqvist systemkonsult --- M Sc in IT Engineering ----
/  [EMAIL PROTECTED]                   Annebergsslingan 37        \
|  [EMAIL PROTECTED]                   654 65 KARLSTAD            |
|  http://opalsys.net/               Mobile: +46 (0)70-332 1551 |
\  gpg/f.p.: 7090 A92B 18FE 7994 0C36 4FE4 18A1 B1CF 0FE5 3DD9  /
 ---------------------------------------------------------------


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to