Blame lib/lib.pl

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 = &param_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
}