summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl/lib/Win32/NetResource.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Win32/NetResource.pm')
-rw-r--r--Master/tlpkg/tlperl/lib/Win32/NetResource.pm456
1 files changed, 456 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/Win32/NetResource.pm b/Master/tlpkg/tlperl/lib/Win32/NetResource.pm
new file mode 100644
index 00000000000..04ac87acabd
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Win32/NetResource.pm
@@ -0,0 +1,456 @@
+package Win32::NetResource;
+
+require Exporter;
+require DynaLoader;
+require AutoLoader;
+
+$VERSION = '0.053';
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ RESOURCEDISPLAYTYPE_DOMAIN
+ RESOURCEDISPLAYTYPE_FILE
+ RESOURCEDISPLAYTYPE_GENERIC
+ RESOURCEDISPLAYTYPE_GROUP
+ RESOURCEDISPLAYTYPE_SERVER
+ RESOURCEDISPLAYTYPE_SHARE
+ RESOURCEDISPLAYTYPE_TREE
+ RESOURCETYPE_ANY
+ RESOURCETYPE_DISK
+ RESOURCETYPE_PRINT
+ RESOURCETYPE_UNKNOWN
+ RESOURCEUSAGE_CONNECTABLE
+ RESOURCEUSAGE_CONTAINER
+ RESOURCEUSAGE_RESERVED
+ RESOURCE_CONNECTED
+ RESOURCE_GLOBALNET
+ RESOURCE_REMEMBERED
+ STYPE_DISKTREE
+ STYPE_PRINTQ
+ STYPE_DEVICE
+ STYPE_IPC
+ STYPE_SPECIAL
+ SHARE_NETNAME_PARMNUM
+ SHARE_TYPE_PARMNUM
+ SHARE_REMARK_PARMNUM
+ SHARE_PERMISSIONS_PARMNUM
+ SHARE_MAX_USES_PARMNUM
+ SHARE_CURRENT_USES_PARMNUM
+ SHARE_PATH_PARMNUM
+ SHARE_PASSWD_PARMNUM
+ SHARE_FILE_SD_PARMNUM
+);
+
+@EXPORT_OK = qw(
+ GetSharedResources
+ AddConnection
+ CancelConnection
+ WNetGetLastError
+ GetError
+ GetUNCName
+ NetShareAdd
+ NetShareCheck
+ NetShareDel
+ NetShareGetInfo
+ NetShareSetInfo
+);
+
+=head1 NAME
+
+Win32::NetResource - manage network resources in perl
+
+=head1 SYNOPSIS
+
+ use Win32::NetResource;
+
+ $ShareInfo = {
+ 'path' => "C:\\MyShareDir",
+ 'netname' => "MyShare",
+ 'remark' => "It is good to share",
+ 'passwd' => "",
+ 'current-users' =>0,
+ 'permissions' => 0,
+ 'maxusers' => -1,
+ 'type' => 0,
+ };
+
+ Win32::NetResource::NetShareAdd( $ShareInfo,$parm )
+ or die "unable to add share";
+
+
+=head1 DESCRIPTION
+
+This module offers control over the network resources of Win32.Disks,
+printers etc can be shared over a network.
+
+=head1 DATA TYPES
+
+There are two main data types required to control network resources.
+In Perl these are represented by hash types.
+
+=over 4
+
+=item %NETRESOURCE
+
+ KEY VALUE
+
+ 'Scope' => Scope of an Enumeration
+ RESOURCE_CONNECTED,
+ RESOURCE_GLOBALNET,
+ RESOURCE_REMEMBERED.
+
+ 'Type' => The type of resource to Enum
+ RESOURCETYPE_ANY All resources
+ RESOURCETYPE_DISK Disk resources
+ RESOURCETYPE_PRINT Print resources
+
+ 'DisplayType' => The way the resource should be displayed.
+ RESOURCEDISPLAYTYPE_DOMAIN
+ The object should be displayed as a domain.
+ RESOURCEDISPLAYTYPE_GENERIC
+ The method used to display the object does not matter.
+ RESOURCEDISPLAYTYPE_SERVER
+ The object should be displayed as a server.
+ RESOURCEDISPLAYTYPE_SHARE
+ The object should be displayed as a sharepoint.
+
+ 'Usage' => Specifies the Resources usage:
+ RESOURCEUSAGE_CONNECTABLE
+ RESOURCEUSAGE_CONTAINER.
+
+ 'LocalName' => Name of the local device the resource is
+ connected to.
+
+ 'RemoteName' => The network name of the resource.
+
+ 'Comment' => A string comment.
+
+ 'Provider' => Name of the provider of the resource.
+
+=back
+
+=item %SHARE_INFO
+
+This hash represents the SHARE_INFO_502 struct.
+
+=over 4
+
+ KEY VALUE
+ 'netname' => Name of the share.
+ 'type' => type of share.
+ 'remark' => A string comment.
+ 'permissions' => Permissions value
+ 'maxusers' => the max # of users.
+ 'current-users' => the current # of users.
+ 'path' => The path of the share.
+ 'passwd' => A password if one is req'd
+
+=back
+
+=head1 FUNCTIONS
+
+=head2 NOTE
+
+All of the functions return false if they fail.
+
+=over 4
+
+=item GetSharedResources(\@Resources,dwType,\%NetResource = NULL)
+
+Creates a list in @Resources of %NETRESOURCE hash references.
+
+The return value indicates whether there was an error in accessing
+any of the shared resources. All the shared resources that were
+encountered (until the point of an error, if any) are pushed into
+@Resources as references to %NETRESOURCE hashes. See example
+below. The \%NetResource argument is optional. If it is not supplied,
+the root (that is, the topmost container) of the network is assumed,
+and all network resources available from the toplevel container will
+be enumerated.
+
+=item AddConnection(\%NETRESOURCE,$Password,$UserName,$Connection)
+
+Makes a connection to a network resource specified by %NETRESOURCE
+
+=item CancelConnection($Name,$Connection,$Force)
+
+Cancels a connection to a network resource connected to local device
+$name.$Connection is either 1 - persistent connection or 0, non-persistent.
+
+=item WNetGetLastError($ErrorCode,$Description,$Name)
+
+Gets the Extended Network Error.
+
+=item GetError( $ErrorCode )
+
+Gets the last Error for a Win32::NetResource call.
+
+=item GetUNCName( $UNCName, $LocalPath );
+
+Returns the UNC name of the disk share connected to $LocalPath in $UNCName.
+$LocalPath should be a drive based path. e.g. "C:\\share\\subdir"
+
+=back
+
+=head2 NOTE
+
+$servername is optional for all the calls below. (if not given the
+local machine is assumed.)
+
+=over 4
+
+=item NetShareAdd(\%SHARE,$parm_err,$servername = NULL )
+
+Add a share for sharing.
+
+=item NetShareCheck($device,$type,$servername = NULL )
+
+Check if a directory or a device is available for connection from the
+network through a share. This includes all directories that are
+reachable through a shared directory or device, meaning that if C:\foo
+is shared, C:\foo\bar is also available for sharing. This means that
+this function is pretty useless, given that by default every disk
+volume has an administrative share such as "C$" associated with its
+root directory.
+
+$device must be a drive name, directory, or a device. For example,
+"C:", "C:\dir", "LPT1", "D$", "IPC$" are all valid as the $device
+argument. $type is an output argument that will be set to one of
+the following constants that describe the type of share:
+
+ STYPE_DISKTREE Disk drive
+ STYPE_PRINTQ Print queue
+ STYPE_DEVICE Communication device
+ STYPE_IPC Interprocess communication (IPC)
+ STYPE_SPECIAL Special share reserved for interprocess
+ communication (IPC$) or remote administration
+ of the server (ADMIN$). Can also refer to
+ administrative shares such as C$, D$, etc.
+
+=item NetShareDel( $netname, $servername = NULL )
+
+Remove a share from a machines list of shares.
+
+=item NetShareGetInfo( $netname, \%SHARE,$servername=NULL )
+
+Get the %SHARE_INFO information about the share $netname on the
+server $servername.
+
+=item NetShareSetInfo( $netname,\%SHARE,$parm_err,$servername=NULL)
+
+Set the information for share $netname.
+
+=back
+
+=head1 EXAMPLE
+
+=over 4
+
+=item Enumerating all resources on the network
+
+ #
+ # This example displays all the share points in the entire
+ # visible part of the network.
+ #
+
+ use strict;
+ use Win32::NetResource qw(:DEFAULT GetSharedResources GetError);
+ my $resources = [];
+ unless(GetSharedResources($resources, RESOURCETYPE_ANY)) {
+ my $err;
+ GetError($err);
+ warn Win32::FormatMessage($err);
+ }
+
+ foreach my $href (@$resources) {
+ next if ($$href{DisplayType} != RESOURCEDISPLAYTYPE_SHARE);
+ print "-----\n";
+ foreach( keys %$href){
+ print "$_: $href->{$_}\n";
+ }
+ }
+
+=item Enumerating all resources on a particular host
+
+ #
+ # This example displays all the share points exported by the local
+ # host.
+ #
+
+ use strict;
+ use Win32::NetResource qw(:DEFAULT GetSharedResources GetError);
+ if (GetSharedResources(my $resources, RESOURCETYPE_ANY,
+ { RemoteName => "\\\\" . Win32::NodeName() }))
+ {
+ foreach my $href (@$resources) {
+ print "-----\n";
+ foreach(keys %$href) { print "$_: $href->{$_}\n"; }
+ }
+ }
+
+=back
+
+=head1 AUTHOR
+
+Jesse Dougherty for Hip Communications.
+
+Additional general cleanups and bug fixes by Gurusamy Sarathy <gsar@activestate.com>.
+
+=cut
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ #reset $! to zero to reset any current errors.
+ local $! = 0;
+ my $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($! =~ /Invalid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ ($pack,$file,$line) = caller;
+ die "Your vendor has not defined Win32::NetResource macro $constname, used at $file line $line.
+";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+sub AddConnection
+{
+ my $h = $_[0];
+ die "AddConnection: HASH reference required" unless ref($h) eq "HASH";
+
+ #
+ # The last four items *must* not be deallocated until the
+ # _AddConnection() completes (since the packed structure is
+ # pointing into these values.
+ #
+ my $netres = pack( 'i4 p4', $h->{Scope},
+ $h->{Type},
+ $h->{DisplayType},
+ $h->{Usage},
+ $h->{LocalName},
+ $h->{RemoteName},
+ $h->{Comment},
+ $h->{Provider});
+ _AddConnection($netres,$_[1],$_[2],$_[3]);
+}
+
+#use Data::Dumper;
+
+sub GetSharedResources
+{
+ die "GetSharedResources: ARRAY reference required"
+ if defined $_[0] and ref($_[0]) ne "ARRAY";
+
+ my $aref = [];
+
+ # Get the shared resources.
+
+ my $ret;
+
+ if (@_ > 2 and $_[2]) {
+ my $netres = pack('i4 p4', @{$_[2]}{qw(Scope
+ Type
+ DisplayType
+ Usage
+ LocalName
+ RemoteName
+ Comment
+ Provider)});
+ $ret = _GetSharedResources( $aref , $_[1], $netres );
+ }
+ else {
+ $ret = _GetSharedResources( $aref , $_[1] );
+ }
+
+ # build the array of hashes in $_[0]
+# print Dumper($aref);
+ foreach ( @$aref ) {
+ my %hash;
+ @hash{'Scope',
+ 'Type',
+ 'DisplayType',
+ 'Usage',
+ 'LocalName',
+ 'RemoteName',
+ 'Comment',
+ 'Provider'} = split /\001/, $_;
+ push @{$_[0]}, \%hash;
+ }
+
+ $ret;
+}
+
+sub NetShareAdd
+{
+ my $shareinfo = _hash2SHARE( $_[0] );
+ _NetShareAdd($shareinfo,$_[1], $_[2] || "");
+}
+
+sub NetShareGetInfo
+{
+ my ($netinfo,$val);
+ $val = _NetShareGetInfo( $_[0],$netinfo,$_[2] || "");
+ %{$_[1]} = %{_SHARE2hash( $netinfo )};
+ $val;
+}
+
+sub NetShareSetInfo
+{
+ my $shareinfo = _hash2SHARE( $_[1] );
+ _NetShareSetInfo( $_[0],$shareinfo,$_[2],$_[3] || "");
+}
+
+
+# These are private functions to work with the ShareInfo structure.
+# please note that the implementation of these calls requires the
+# SHARE_INFO_502 level of information.
+
+sub _SHARE2hash
+{
+ my %hash = ();
+ @hash{'type',
+ 'permissions',
+ 'maxusers',
+ 'current-users',
+ 'remark',
+ 'netname',
+ 'path',
+ 'passwd'} = unpack('i4 A257 A81 A257 A257',$_[0]);
+
+ return \%hash;
+}
+
+sub _hash2SHARE
+{
+ my $h = $_[0];
+ die "Argument must be a HASH reference" unless ref($h) eq "HASH";
+
+ return pack 'i4 a257 a81 a257 a257',
+ @$h{'type',
+ 'permissions',
+ 'maxusers',
+ 'current-users',
+ 'remark',
+ 'netname',
+ 'path',
+ 'passwd'};
+}
+
+
+bootstrap Win32::NetResource;
+
+1;
+__END__