Home | History | Annotate | Download | only in Exacct
      1 # CDDL HEADER START
      2 #
      3 # The contents of this file are subject to the terms of the
      4 # Common Development and Distribution License (the "License").
      5 # You may not use this file except in compliance with the License.
      6 #
      7 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      8 # or http://www.opensolaris.org/os/licensing.
      9 # See the License for the specific language governing permissions
     10 # and limitations under the License.
     11 #
     12 # When distributing Covered Code, include this CDDL HEADER in each
     13 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     14 # If applicable, add the following below this CDDL HEADER, with the
     15 # fields enclosed by brackets "[]" replaced with your own identifying
     16 # information: Portions Copyright [yyyy] [name of copyright owner]
     17 #
     18 # CDDL HEADER END
     19 #
     20 
     21 #
     22 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23 # Use is subject to license terms.
     24 #
     25 
     26 #
     27 # Exacct.pm contains wrappers for the exacct error functions and syscalls,
     28 # and some 'shorthand' convenience functions.
     29 # 
     30 
     31 require 5.8.4;
     32 use strict;
     33 use warnings;
     34 
     35 package Sun::Solaris::Exacct;
     36 
     37 our $VERSION = '1.5';
     38 use XSLoader;
     39 XSLoader::load(__PACKAGE__, $VERSION);
     40 
     41 # @_Constants is set up by the XSUB bootstrap() function.
     42 our (@EXPORT_OK, %EXPORT_TAGS, @_Constants);
     43 my @syscalls = qw(getacct putacct wracct);
     44 my @libcalls = qw(ea_error ea_error_str);
     45 my @shorthand = qw(ea_register_catalog ea_new_catalog ea_new_file ea_new_item
     46     ea_new_group ea_dump_object);
     47 @EXPORT_OK = (@_Constants, @syscalls, @libcalls, @shorthand);
     48 %EXPORT_TAGS = (CONSTANTS => \@_Constants, SYSCALLS => \@syscalls,
     49     LIBCALLS => \@libcalls, SHORTHAND => \@shorthand, ALL => \@EXPORT_OK);
     50 
     51 use base qw(Exporter);
     52 
     53 #
     54 # Extend the default Exporter::import to do optional inclusion of all the
     55 # lower-level Exacct modules.  Any export tag prefixed with 'EXACCT_' is
     56 # interpreted as a request to import that tag from all the Exacct modules.
     57 #
     58 sub import
     59 {
     60 	my (@my_tags, %sub_tags);
     61 	shift(@_);
     62 	foreach my $tag (@_) {
     63 		# Note: Modifies @_
     64 		if ($tag =~ /^:EXACCT_(.*)$/) {
     65 			my $new_tag = ":$1";
     66 			push(@my_tags, $new_tag);
     67 			$sub_tags{$new_tag} = 1;
     68 		} else {
     69 			push(@my_tags, $tag);
     70 		}
     71 	}
     72 
     73 	# Export the taglist with all "EXACCT_" prefixes removed.
     74 	__PACKAGE__->export_to_level(1, undef, @my_tags);
     75 
     76 	# Do sub-module imports if required.
     77 	if (@my_tags = grep(exists($sub_tags{$_}), qw(:ALL :CONSTANTS))) {
     78 
     79 		# ::Catalog
     80 		require Sun::Solaris::Exacct::Catalog;
     81 		Sun::Solaris::Exacct::Catalog->export_to_level(1, undef,
     82 		    @my_tags);
     83 
     84 		# ::File and Fcntl
     85 		require Sun::Solaris::Exacct::File;
     86 		Sun::Solaris::Exacct::File->export_to_level(1, undef,
     87 		    @my_tags);
     88 		require Fcntl;
     89 		Fcntl->export_to_level(1, undef, ':DEFAULT');
     90 
     91 		# ::Object
     92 		require Sun::Solaris::Exacct::Object;
     93 		Sun::Solaris::Exacct::Object->export_to_level(1, undef,
     94 		    @my_tags);
     95 	}
     96 }
     97 
     98 #
     99 # Convenience functions - shorthand for fully qualified method names.  Note that
    100 # goto() is used to call the methods so that any errors will appear to come
    101 # from the correct place.  Because goto() does not understand method call syntax
    102 # it is necessary to fake up the class a parameter by unshifting the appropriate
    103 # class name onto the argument lists.
    104 #
    105 
    106 sub ea_register_catalog
    107 {
    108 	unshift(@_, 'Sun::Solaris::Exacct::Catalog');
    109 	goto(&Sun::Solaris::Exacct::Catalog::register);
    110 }
    111 
    112 sub ea_new_catalog
    113 {
    114 	unshift(@_, 'Sun::Solaris::Exacct::Catalog');
    115 	goto(&Sun::Solaris::Exacct::Catalog::new);
    116 }
    117 
    118 sub ea_new_file
    119 {
    120 	unshift(@_, 'Sun::Solaris::Exacct::File');
    121 	goto(&Sun::Solaris::Exacct::File::new);
    122 }
    123 
    124 sub ea_new_item
    125 {
    126 	unshift(@_, 'Sun::Solaris::Exacct::Item');
    127 	goto(&Sun::Solaris::Exacct::Object::Item::new);
    128 }
    129 
    130 sub ea_new_group
    131 {
    132 	unshift(@_, 'Sun::Solaris::Exacct::Group');
    133 	goto(&Sun::Solaris::Exacct::Object::Group::new);
    134 }
    135 
    136 sub ea_dump_object
    137 {
    138 	unshift(@_, 'Sun::Solaris::Exacct::Object');
    139 	goto(&Sun::Solaris::Exacct::Object::dump);
    140 }
    141 
    142 1;
    143