File Coverage

lib/SMB/Command.pm
Criterion Covered Total %
statement 9 51 17.6
branch 0 4 0.0
condition 0 13 0.0
subroutine 3 19 15.7
pod 2 16 12.5
total 14 103 13.5


line stmt bran cond sub pod time code
1             # SMB-Perl library, Copyright (C) 2014 Mikhael Goikhman, migo@cpan.org
2             #
3             # This program is free software: you can redistribute it and/or modify
4             # it under the terms of the GNU General Public License as published by
5             # the Free Software Foundation, either version 3 of the License, or
6             # (at your option) any later version.
7             #
8             # This program is distributed in the hope that it will be useful,
9             # but WITHOUT ANY WARRANTY; without even the implied warranty of
10             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11             # GNU General Public License for more details.
12             #
13             # You should have received a copy of the GNU General Public License
14             # along with this program. If not, see .
15              
16             package SMB::Command;
17              
18 1     1   426 use strict;
  1         2  
  1         24  
19 1     1   4 use warnings;
  1         2  
  1         21  
20              
21 1     1   4 use parent 'SMB';
  1         1  
  1         12  
22              
23             sub new ($$$$%) {
24 0     0 1   my $class = shift;
25 0   0       my $smb = shift || die "No smb parameter in $class constructor\n";
26 0   0       my $name = shift || die "No name parameter in $class constructor\n";
27 0   0       my $header = shift || die "No header parameter in $class constructor\n";
28 0           my %options = @_;
29              
30 0           my $self = $class->SUPER::new(
31             %options,
32             smb => $smb,
33             name => $name,
34             header => $header,
35             );
36              
37 0           $self->init;
38              
39 0           return $self;
40             }
41              
42             sub is ($$) {
43 0     0 0   my $self = shift;
44 0   0       my $name = shift || '';
45              
46 0           return $self->name eq $name;
47             }
48              
49             sub is_response ($) {
50 0     0 0   my $self = shift;
51              
52 0           return $self->header->is_response;
53             }
54              
55             sub is_response_to ($$) {
56 0     0 0   my $self = shift;
57 0   0       my $request = shift || die;
58              
59 0           my $header1 = $request->header;
60 0           my $header2 = $self->header;
61              
62             return
63 0   0       !$header1->is_response &&
64             $header2->is_response &&
65             $header1->code == $header2->code &&
66             $header1->mid == $header2->mid;
67             }
68              
69 0     0 0   sub is_smb1 ($) { $_[0]->smb <= 1 }
70 0     0 0   sub is_smb2 ($) { $_[0]->smb >= 2 }
71              
72 0     0 0   sub status ($) { $_[0]->header->status }
73 0     0 0   sub set_status ($$) { $_[0]->header->status($_[1]); }
74 0     0 0   sub is_success ($) { $_[0]->status == 0 }
75 0     0 0   sub is_error ($) { $_[0]->status != 0 }
76              
77             # stub methods to be overloaded
78              
79             sub parse ($$%) {
80 0     0 0   my $self = shift;
81 0           my $parser = shift;
82              
83 0           return $self;
84             }
85              
86             sub pack ($$%) {
87 0     0 0   my $self = shift;
88 0           my $packer = shift;
89              
90 0           return $self;
91             }
92              
93 0     0 0   sub init ($) {
94             }
95              
96             # end of stub methods
97              
98             sub set ($%) {
99 0     0 0   my $self = shift;
100 0           my %values = @_;
101              
102 0           $self->{$_} = $values{$_} for keys %values;
103             }
104              
105             sub abort_pack ($$) {
106 0     0 0   my $self = shift;
107 0           my $packer = shift;
108 0           my $status = shift;
109              
110 0           $self->set_status($status);
111 0           $packer->jump('status')->uint32($status)->jump('command-start');
112              
113 0           return $self;
114             }
115              
116             sub dump ($) {
117 0     0 1   my $self = shift;
118              
119 0 0         return sprintf "SMB%d [%s %s] mid=%u uid=%x tid=%02x%s",
    0          
120             $self->smb, $self->name,
121             $self->is_response ? "Response" : "Request ",
122             $self->header->mid,
123             $self->header->uid,
124             $self->header->tid,
125             $self->status ? sprintf " status=%x", $self->status : '',
126             }
127              
128             1;