|
Packit |
d37888 |
#!/usr/bin/perl
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$, = ' '; # set output field separator
|
|
Packit |
d37888 |
$\ = "\n"; # set output record separator
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '/* lib.c */';
|
|
Packit |
d37888 |
print "/* This is a generated file. Please modify `lib.pl' */";
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '#include <config.h>';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print '#include <glibtop.h>';
|
|
Packit |
d37888 |
print '#include <glibtop/error.h>';
|
|
Packit |
d37888 |
print '#include <glibtop/open.h>';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print '#include <glibtop/sysdeps.h>';
|
|
Packit |
d37888 |
print '#include <glibtop/union.h>';
|
|
Packit |
d37888 |
print '#include <glib/gi18n-lib.h>';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print '#include <glibtop/command.h>';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print '/* Some required fields are missing. */';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print 'static void';
|
|
Packit |
d37888 |
print '_glibtop_missing_feature (glibtop *server, const char *feature,';
|
|
Packit |
d37888 |
print "\t\t\t const guint64 present, guint64 *required)";
|
|
Packit |
d37888 |
print '{';
|
|
Packit |
d37888 |
print "\tguint64 old_required = *required;\n";
|
|
Packit |
d37888 |
print "\t/* Return if we have all required fields. */";
|
|
Packit |
d37888 |
print "\tif ((~present & old_required) == 0)";
|
|
Packit |
d37888 |
print "\t\treturn;\n";
|
|
Packit |
d37888 |
print "\tswitch (server->error_method) {";
|
|
Packit |
d37888 |
print "\tcase GLIBTOP_ERROR_METHOD_WARN_ONCE:";
|
|
Packit |
d37888 |
print "\t\t*required &= present;";
|
|
Packit |
d37888 |
print "\tcase GLIBTOP_ERROR_METHOD_WARN:";
|
|
Packit |
d37888 |
print "\t\tglibtop_warn_r (server,";
|
|
Packit |
d37888 |
print "\t\t\t\t_(\"glibtop_get_%s (): Client requested \"";
|
|
Packit |
d37888 |
print "\t\t\t\t \"field mask %05lx, but only have %05lx.\"),";
|
|
Packit |
d37888 |
print "\t\t\t\t feature, (unsigned long) old_required,";
|
|
Packit |
d37888 |
print "\t\t\t\t (unsigned long) present);";
|
|
Packit |
d37888 |
print "\t\tbreak;";
|
|
Packit |
d37888 |
print "\tcase GLIBTOP_ERROR_METHOD_ABORT:";
|
|
Packit |
d37888 |
print "\t\tglibtop_error_r (server,";
|
|
Packit |
d37888 |
print "\t\t\t\t _(\"glibtop_get_%s (): Client requested \"";
|
|
Packit |
d37888 |
print "\t\t\t\t \"field mask %05lx, but only have %05lx.\"),";
|
|
Packit |
d37888 |
print "\t\t\t\t feature, (unsigned long) old_required,";
|
|
Packit |
d37888 |
print "\t\t\t\t (unsigned long) present);";
|
|
Packit |
d37888 |
print "\t\tbreak;";
|
|
Packit |
d37888 |
print "\t}";
|
|
Packit |
d37888 |
print '}';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print '/* Library functions. */';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$convert{'long'} = 'gint64';
|
|
Packit |
d37888 |
$convert{'ulong'} = 'guint64';
|
|
Packit |
d37888 |
$convert{'pid_t'} = 'pid_t';
|
|
Packit |
d37888 |
$convert{'int'} = 'int';
|
|
Packit |
d37888 |
$convert{'ushort'} = 'unsigned short';
|
|
Packit |
d37888 |
$convert{'unsigned'} = 'unsigned';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
while (<>) {
|
|
Packit |
d37888 |
chop; # strip record separator
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if (/^[^#]/) {
|
|
Packit |
d37888 |
&output($_);
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
sub output {
|
|
Packit |
d37888 |
local($line) = @_;
|
|
Packit |
d37888 |
@line_fields = split(/\|/, $line, 9999);
|
|
Packit |
d37888 |
$retval = $line_fields[0];
|
|
Packit |
d37888 |
$feature = $line_fields[1];
|
|
Packit |
d37888 |
$param_def = $line_fields[2];
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$orig = $feature;
|
|
Packit |
d37888 |
$feature =~ s/^@//;
|
|
Packit |
d37888 |
$space = $feature;
|
|
Packit |
d37888 |
$space =~ s/./ /g;
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print $retval;
|
|
Packit |
d37888 |
if ($retval !~ /^void$/) {
|
|
Packit |
d37888 |
$prefix = 'retval = ';
|
|
Packit |
d37888 |
$prefix_space = ' ';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
else {
|
|
Packit |
d37888 |
$prefix = '';
|
|
Packit |
d37888 |
$prefix_space = '';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($param_def eq 'string') {
|
|
Packit |
d37888 |
$call_param = ', ' . $line_fields[3];
|
|
Packit |
d37888 |
$param_buf = '';
|
|
Packit |
d37888 |
$buf_set = '';
|
|
Packit |
d37888 |
$param_decl = ",\n " . $space . ' const char *' .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$line_fields[3];
|
|
Packit |
d37888 |
$send_ptr = "\n\tconst void *send_ptr = " . $line_fields[3] . ';';
|
|
Packit |
d37888 |
$send_size = "\n\tconst size_t send_size =\n\t\tstrlen (" .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$line_fields[3] . ') + 1;';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
else {
|
|
Packit |
d37888 |
$call_param = '';
|
|
Packit |
d37888 |
$param_decl = '';
|
|
Packit |
d37888 |
$send_size = '';
|
|
Packit |
d37888 |
$send_ptr = '';
|
|
Packit |
d37888 |
$param_buf = '';
|
|
Packit |
d37888 |
$buf_set = '';
|
|
Packit |
d37888 |
$nr_params = (@params = split(/:/, $param_def, 9999));
|
|
Packit |
d37888 |
if ($nr_params) {
|
|
Packit |
d37888 |
$param_buf = "\t\tstruct {\n";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
for ($param = 0; $param < $nr_params; $param++) {
|
|
Packit |
d37888 |
$list = $params[$param];
|
|
Packit |
d37888 |
$type = $params[$param];
|
|
Packit |
d37888 |
$type =~ s/\(.*//;
|
|
Packit |
d37888 |
$list =~ s/^.*\(//;
|
|
Packit |
d37888 |
$list =~ s/\)$//;
|
|
Packit |
d37888 |
$count = (@fields = split(/,/, $list, 9999));
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($count > 0) {
|
|
Packit |
d37888 |
for ($field = 0; $field < $count; $field++) {
|
|
Packit |
d37888 |
$param_buf .= "\t\t\t$convert{$type} buf_$fields[$field];\n";
|
|
Packit |
d37888 |
$buf_set .= "\t\tparam_buf.buf_$fields[$field] = $fields[$field];\n";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
for ($field = 0; $field < $count; $field++) {
|
|
Packit |
d37888 |
if ($param_decl eq '') {
|
|
Packit |
d37888 |
$param_decl = ",\n " . $space . ' ';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
else {
|
|
Packit |
d37888 |
$param_decl = $param_decl . ', ';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
$param_decl = $param_decl . '' . $convert{$type} . ' ' .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$fields[$field];
|
|
Packit |
d37888 |
$call_param = $call_param . ', ' . $fields[$field];
|
|
Packit |
d37888 |
if ($send_ptr eq '') {
|
|
Packit |
d37888 |
$send_ptr = "\t\tconst void *send_ptr = ¶m_buf;";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
if ($nr_params) {
|
|
Packit |
d37888 |
$param_buf .= "\t\t} param_buf;\n";
|
|
Packit |
d37888 |
$send_size = "\t\tconst size_t send_size = sizeof param_buf;";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
else {
|
|
Packit |
d37888 |
$send_size = "\t\tconst size_t send_size = 0;";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
if ($send_ptr eq '') {
|
|
Packit |
d37888 |
$send_ptr = "\t\tconst void *send_ptr = NULL;";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print 'glibtop_get_' . $feature . '_l (glibtop *server, glibtop_' .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$feature . ' *buf' . $param_decl . ')';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "{";
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($retval !~ /^void$/) {
|
|
Packit |
d37888 |
print "\t" . $retval . ' retval = (' . $retval . ') 0;';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\tglibtop_init_r (&server, (1 << GLIBTOP_SYSDEPS_" .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
uc($feature) . '), 0);';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print "\t/* If neccessary, we ask the server for the requested";
|
|
Packit |
d37888 |
print "\t * feature. If not, we call the sysdeps function. */";
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\tif ((server->flags & _GLIBTOP_INIT_STATE_SERVER) &&";
|
|
Packit |
d37888 |
print "\t (server->features & (1 << GLIBTOP_SYSDEPS_" .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
uc($feature) . ')))';
|
|
Packit |
d37888 |
print "\t{";
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($param_buf) {
|
|
Packit |
d37888 |
print $param_buf;
|
|
Packit |
d37888 |
print $buf_set;
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print $send_ptr;
|
|
Packit |
d37888 |
print $send_size;
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\t\t" . $prefix . 'glibtop_call_l (server, GLIBTOP_CMND_' .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
uc($feature) . ',';
|
|
Packit |
d37888 |
print "\t\t\t\t" . $prefix_space . 'send_size, send_ptr,';
|
|
Packit |
d37888 |
print "\t\t\t\t" . $prefix_space . 'sizeof (glibtop_' . $feature .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
'), buf);';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\t} else {";
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($orig !~ /^@/) {
|
|
Packit |
d37888 |
print '#if (!GLIBTOP_SUID_' . uc($feature) . ')';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
print "\t\t" . $prefix . 'glibtop_get_' . $feature . '_s (server, buf' .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
$call_param . ');';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($orig !~ /^@/) {
|
|
Packit |
d37888 |
print '#else';
|
|
Packit |
d37888 |
print "\t\terrno = ENOSYS;";
|
|
Packit |
d37888 |
print "\t\tglibtop_error_io_r (server, \"glibtop_get_" . $feature .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
"\");";
|
|
Packit |
d37888 |
print '#endif';
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\t}";
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
print "\t/* Make sure that all required fields are present. */";
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print "\tif (buf->flags & server->required." . $feature . ')';
|
|
Packit |
d37888 |
print "\t\t_glibtop_missing_feature (server, \"" . $feature .
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
"\", buf->flags,";
|
|
Packit |
d37888 |
print "\t\t\t\t\t &server->required." . $feature . ');';
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
if ($retval !~ /^void$/) {
|
|
Packit |
d37888 |
print "\n\t/* Now we can return. */";
|
|
Packit |
d37888 |
print "\n\treturn retval;";
|
|
Packit |
d37888 |
}
|
|
Packit |
d37888 |
|
|
Packit |
d37888 |
print '}';
|
|
Packit |
d37888 |
print '';
|
|
Packit |
d37888 |
}
|