Lines Matching +full:sub +full:- +full:node
46 sub new {
49 $self->{FILE} = undef;
50 $self->{MAJOR} = undef;
51 $self->{MINOR} = undef;
52 $self->{NODE_SEC_SZ} = undef;
53 $self->{NAME_SEC_SZ} = undef;
54 $self->{DATA_SEC_SZ} = undef;
55 $self->{NODES} = undef;
56 $self->{NAMES} = undef;
57 $self->{DATA} = undef;
62 sub open {
67 $self->{NAME} = shift;
69 $self->{NAME} = '/dev/mdesc';
71 return unless open(MD, "$self->{NAME}");
79 ($self->{MAJOR}, $self->{MINOR},
80 $self->{NODE_SEC_SZ},
81 $self->{NAME_SEC_SZ},
82 $self->{DATA_SEC_SZ}) = unpack("nnNNN", $mdhdr);
84 $size = read(MD, $self->{NODES}, $self->{NODE_SEC_SZ});
85 $size = read(MD, $self->{NAMES}, $self->{NAME_SEC_SZ});
86 $size = read(MD, $self->{DATA}, $self->{DATA_SEC_SZ});
92 # return hash of given node's information
94 sub getnode {
96 my ($tag, $name, $namelen, $nameoff, $datalen, $dataoff, %node);
99 unpack("CCx2NNN", substr($self->{NODES}, $nodeid * 16, 16));
100 $name = substr($self->{NAMES}, $nameoff, $namelen);
101 %node = (tag => $tag, name => $name, nameid => $nameoff);
104 $node{'datalen'} = $datalen;
105 $node{'dataoff'} = $dataoff;
107 $node{'val'} = ($datalen << 32) | $dataoff;
109 $node{'idx'} = ($datalen << 32) | $dataoff;
112 return %node;
119 sub getprop {
121 my (%node, $tag, %prop);
123 %node = $self->getnode($propid);
124 $tag = $node{'tag'};
125 %prop = (name => $node{'name'}, tag => $tag);
129 substr($self->{DATA}, $node{'dataoff'}, $node{'datalen'} - 1);
131 $prop{'arc'} = $node{'idx'};
133 $prop{'val'} = $node{'val'};
135 $prop{'length'} = $node{'datalen'};
136 $prop{'offset'} = $node{'dataoff'};
148 sub findname {
152 for ($idx = 0; $idx < $self->{NAME_SEC_SZ}; $idx = $next + 1) {
153 $next = index($self->{NAMES}, "\0", $idx);
154 $p = substr($self->{NAMES}, $idx, $next - $idx);
158 return -1;
163 # find given property in node
165 sub findprop {
167 my (%node, $nameid);
169 %node = $self->getnode($nodeid);
170 return -1 if ($node{'tag'} != MDNODE);
172 $nameid = $self->findname($propname);
173 return -1 if ($nameid == -1);
177 %node = $self->getnode($nodeid);
178 if ($node{'tag'} == $type && $node{'nameid'} == $nameid) {
181 } while ($node{'tag'} != MDEND);
183 return -1;
188 # lookup property in node and return its hash
190 sub lookup {
194 $propid = $self->findprop($nodeid, $propname, $type);
195 return undef if ($propid == -1);
197 return $self->getprop($propid);
201 sub scan_node {
203 my (%node);
205 return if ($seen->[$nodeid] == 1);
206 $seen->[$nodeid] = 1;
208 %node = $self->getnode($nodeid);
209 return if ($node{'tag'} != MDNODE);
210 push(@$ret, $nodeid) if ($node{'nameid'} == $nameid);
214 %node = $self->getnode($nodeid);
215 if ($node{'tag'} == MDARC && $node{'nameid'} == $arcid) {
216 $self->scan_node($node{'idx'}, $nameid, $arcid, $ret, $seen);
218 } while ($node{'tag'} != MDEND);
226 sub scan {
230 $nameid = $self->findname($nodename);
231 $arcid = $self->findname($arcname);
232 $self->scan_node($start, $nameid, $arcid, \@ret, \@seen);
253 sub fixinst {
270 # see if there are any old paths that need to be re-written
318 sub wanted {
321 -l or return;
334 sub fixdev {
346 sub fixup {
359 sub rmcache {
394 $md = MDesc->new;
395 $md->open;
397 @nodes = $md->scan(0, "ioaliases", "fwd");
398 $#nodes == 0 or die "missing ioaliases node\n";
401 # foreach ioalias node, replace any 'alias' paths
411 @nodes = $md->scan(@nodes[0], "ioalias", "fwd");
415 %prop = $md->lookup($nodeid, "aliases", $md->MDSTR);
418 %prop = $md->lookup($nodeid, "current", $md->MDSTR);
427 if ($slash == -1) {