mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
pidl: Introduce new dirrective: relative_short
relative_short is like relative but instead of having the offset coded on 4 bytes it's coded on 2 bytes. Such things happen in GET_DFS_REFERAL messages. Signed-off-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
parent
f0054da041
commit
678f2ca14b
@ -125,6 +125,10 @@ sub CheckElement($)
|
||||
warning($e, "relative() pointer property not supported");
|
||||
}
|
||||
|
||||
if (has_property($e, "relative_short")) {
|
||||
warning($e, "relative_short() pointer property not supported");
|
||||
}
|
||||
|
||||
if (has_property($e, "flag")) {
|
||||
warning($e, "ignoring flag() property");
|
||||
}
|
||||
|
@ -351,6 +351,7 @@ sub pointer_type($)
|
||||
return "sptr" if (has_property($e, "sptr"));
|
||||
return "unique" if (has_property($e, "unique"));
|
||||
return "relative" if (has_property($e, "relative"));
|
||||
return "relative_short" if (has_property($e, "relative_short"));
|
||||
return "ignore" if (has_property($e, "ignore"));
|
||||
|
||||
return undef;
|
||||
@ -902,6 +903,7 @@ my %property_list = (
|
||||
"unique" => ["ELEMENT"],
|
||||
"ignore" => ["ELEMENT"],
|
||||
"relative" => ["ELEMENT"],
|
||||
"relative_short" => ["ELEMENT"],
|
||||
"null_is_ffffffff" => ["ELEMENT"],
|
||||
"relative_base" => ["TYPEDEF", "STRUCT", "UNION"],
|
||||
|
||||
@ -1059,6 +1061,7 @@ sub ValidElement($)
|
||||
has_property($e, "ptr") or
|
||||
has_property($e, "unique") or
|
||||
has_property($e, "relative") or
|
||||
has_property($e, "relative_short") or
|
||||
has_property($e, "ref"))) {
|
||||
fatal($e, el_name($e) . " : pointer properties on non-pointer element\n");
|
||||
}
|
||||
|
@ -573,6 +573,9 @@ sub ParseElementPushLevel
|
||||
if ($l->{POINTER_TYPE} eq "relative") {
|
||||
$self->pidl("NDR_CHECK(ndr_push_relative_ptr2($ndr, $var_name));");
|
||||
}
|
||||
if ($l->{POINTER_TYPE} eq "relative_short") {
|
||||
$self->pidl("NDR_CHECK(ndr_push_short_relative_ptr2($ndr, $var_name));");
|
||||
}
|
||||
}
|
||||
$var_name = get_value_of($var_name);
|
||||
$self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 1);
|
||||
@ -670,6 +673,8 @@ sub ParsePtrPush($$$$$)
|
||||
}
|
||||
} elsif ($l->{POINTER_TYPE} eq "relative") {
|
||||
$self->pidl("NDR_CHECK(ndr_push_relative_ptr1($ndr, $var_name));");
|
||||
} elsif ($l->{POINTER_TYPE} eq "relative_short") {
|
||||
$self->pidl("NDR_CHECK(ndr_push_short_relative_ptr1($ndr, $var_name));");
|
||||
} elsif ($l->{POINTER_TYPE} eq "unique") {
|
||||
$self->pidl("NDR_CHECK(ndr_push_unique_ptr($ndr, $var_name));");
|
||||
} elsif ($l->{POINTER_TYPE} eq "full") {
|
||||
@ -1038,7 +1043,7 @@ sub ParseElementPullLevel
|
||||
$self->pidl("if ($var_name) {");
|
||||
$self->indent;
|
||||
|
||||
if ($l->{POINTER_TYPE} eq "relative") {
|
||||
if ($l->{POINTER_TYPE} eq "relative" or $l->{POINTER_TYPE} eq "relative_short") {
|
||||
$self->pidl("uint32_t _relative_save_offset;");
|
||||
$self->pidl("_relative_save_offset = $ndr->offset;");
|
||||
$self->pidl("NDR_CHECK(ndr_pull_relative_ptr2($ndr, $var_name));");
|
||||
@ -1170,6 +1175,8 @@ sub ParsePtrPull($$$$$)
|
||||
($l->{POINTER_TYPE} eq "relative") or
|
||||
($l->{POINTER_TYPE} eq "full")) {
|
||||
$self->pidl("NDR_CHECK(ndr_pull_generic_ptr($ndr, &_ptr_$e->{NAME}));");
|
||||
} elsif ($l->{POINTER_TYPE} eq "relative_short") {
|
||||
$self->pidl("NDR_CHECK(ndr_pull_relative_ptr_short($ndr, &_ptr_$e->{NAME}));");
|
||||
} else {
|
||||
die("Unhandled pointer type $l->{POINTER_TYPE}");
|
||||
}
|
||||
@ -1190,7 +1197,7 @@ sub ParsePtrPull($$$$$)
|
||||
}
|
||||
|
||||
#$self->pidl("memset($var_name, 0, sizeof($var_name));");
|
||||
if ($l->{POINTER_TYPE} eq "relative") {
|
||||
if ($l->{POINTER_TYPE} eq "relative" or $l->{POINTER_TYPE} eq "relative_short") {
|
||||
$self->pidl("NDR_CHECK(ndr_pull_relative_ptr1($ndr, $var_name, _ptr_$e->{NAME}));");
|
||||
}
|
||||
$self->deindent;
|
||||
@ -1471,9 +1478,13 @@ sub DeclarePtrVariables($$)
|
||||
{
|
||||
my ($self,$e) = @_;
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
my $size = 32;
|
||||
if ($l->{TYPE} eq "POINTER" and
|
||||
not ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP")) {
|
||||
$self->pidl("uint32_t _ptr_$e->{NAME};");
|
||||
if ($l->{POINTER_TYPE} eq "relative_short") {
|
||||
$size = 16;
|
||||
}
|
||||
$self->pidl("uint${size}_t _ptr_$e->{NAME};");
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user