All functions in the `glibtop_call_vector' now take an additional
2000-01-02 Martin Baulig <martin@home-of-linux.org> * include/glibtop/call-vector.pl: All functions in the `glibtop_call_vector' now take an additional `glibtop_backend *' argument.
This commit is contained in:
committed by
Martin Baulig
parent
68a40b5cba
commit
57d102425f
@@ -1,3 +1,9 @@
|
|||||||
|
2000-01-02 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
* include/glibtop/call-vector.pl: All functions in the
|
||||||
|
`glibtop_call_vector' now take an additional `glibtop_backend *'
|
||||||
|
argument.
|
||||||
|
|
||||||
2000-01-01 Martin Baulig <martin@home-of-linux.org>
|
2000-01-01 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
* backends/: New directory.
|
* backends/: New directory.
|
||||||
|
@@ -23,17 +23,19 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop/read.h>
|
|
||||||
#include <glibtop/write.h>
|
|
||||||
#include <glibtop/read_data.h>
|
|
||||||
|
|
||||||
#include <glibtop/command.h>
|
#include <glibtop/command.h>
|
||||||
#include <glibtop/xmalloc.h>
|
#include <glibtop/xmalloc.h>
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/error.h>
|
||||||
|
#include <glibtop/backend.h>
|
||||||
|
|
||||||
|
#include <glibtop-backend-private.h>
|
||||||
|
|
||||||
void *
|
void *
|
||||||
glibtop_call_l (glibtop *server, unsigned command, size_t send_size,
|
glibtop_call_i (glibtop *server, glibtop_backend *backend, unsigned command,
|
||||||
const void *send_buf, size_t recv_size, void *recv_buf,
|
size_t send_size, const void *send_buf, size_t recv_size,
|
||||||
int *retval_ptr)
|
void *recv_buf, int *retval_ptr)
|
||||||
{
|
{
|
||||||
glibtop_command cmnd;
|
glibtop_command cmnd;
|
||||||
glibtop_response response;
|
glibtop_response response;
|
||||||
@@ -56,16 +58,16 @@ glibtop_call_l (glibtop *server, unsigned command, size_t send_size,
|
|||||||
cmnd.data_size = send_size;
|
cmnd.data_size = send_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
glibtop_write_l (server, sizeof (glibtop_command), &cmnd);
|
glibtop_write_i (server, backend, sizeof (glibtop_command), &cmnd);
|
||||||
|
|
||||||
glibtop_read_l (server, sizeof (glibtop_response), &response);
|
glibtop_read_i (server, backend, sizeof (glibtop_response), &response);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf (stderr, "RESPONSE: %lu - %d\n",
|
fprintf (stderr, "RESPONSE: %lu - %d\n",
|
||||||
response.offset, response.data_size);
|
response.offset, response.data_size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glibtop_read_l (server, sizeof (int), &retval);
|
glibtop_read_i (server, backend, sizeof (int), &retval);
|
||||||
if (retval_ptr)
|
if (retval_ptr)
|
||||||
*retval_ptr = retval;
|
*retval_ptr = retval;
|
||||||
|
|
||||||
@@ -76,7 +78,7 @@ glibtop_call_l (glibtop *server, unsigned command, size_t send_size,
|
|||||||
if (response.data_size) {
|
if (response.data_size) {
|
||||||
void *ptr = glibtop_malloc_r (server, response.data_size);
|
void *ptr = glibtop_malloc_r (server, response.data_size);
|
||||||
|
|
||||||
glibtop_read_l (server, response.data_size, ptr);
|
glibtop_read_i (server, backend, response.data_size, ptr);
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,11 @@ struct _glibtop_backend_private
|
|||||||
pid_t pid; /* PID of the server */
|
pid_t pid; /* PID of the server */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void *
|
||||||
|
glibtop_call_i (glibtop *server, glibtop_backend *backend, unsigned command,
|
||||||
|
size_t send_size, const void *send_buf, size_t recv_size,
|
||||||
|
void *recv_buf, int *retval_ptr);
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_read_i (glibtop *server, glibtop_backend *backend,
|
glibtop_read_i (glibtop *server, glibtop_backend *backend,
|
||||||
size_t size, void *buf);
|
size_t size, void *buf);
|
||||||
|
@@ -34,6 +34,8 @@ print '';
|
|||||||
print '#include <glibtop/command.h>';
|
print '#include <glibtop/command.h>';
|
||||||
print '#include <glibtop/backend.h>';
|
print '#include <glibtop/backend.h>';
|
||||||
print '';
|
print '';
|
||||||
|
print '#include <glibtop-backend-private.h>';
|
||||||
|
print '';
|
||||||
|
|
||||||
$feature_count = 0;
|
$feature_count = 0;
|
||||||
|
|
||||||
@@ -174,7 +176,7 @@ sub output {
|
|||||||
$send_buf_code .= ";\n";
|
$send_buf_code .= ";\n";
|
||||||
|
|
||||||
$call_code = '';
|
$call_code = '';
|
||||||
$call_code .= sprintf ("\t%sglibtop_call_l (server, GLIBTOP_CMND_%s,\n",
|
$call_code .= sprintf ("\t%sglibtop_call_i (server, backend, GLIBTOP_CMND_%s,\n",
|
||||||
$call_prefix, &toupper($feature));
|
$call_prefix, &toupper($feature));
|
||||||
$call_code .= sprintf ("\t\t\t%s%s, %s,\n", $call_prefix_space,
|
$call_code .= sprintf ("\t\t\t%s%s, %s,\n", $call_prefix_space,
|
||||||
"_LIBGTOP_SEND_len", "_LIBGTOP_SEND_ptr");
|
"_LIBGTOP_SEND_len", "_LIBGTOP_SEND_ptr");
|
||||||
@@ -210,16 +212,16 @@ sub output {
|
|||||||
|
|
||||||
$func_decl = 'static '.$retval."\n";
|
$func_decl = 'static '.$retval."\n";
|
||||||
if ($line_fields[3] eq '') {
|
if ($line_fields[3] eq '') {
|
||||||
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server%s)\n",
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend%s)\n",
|
||||||
$feature, $param_decl);
|
$feature, $param_decl);
|
||||||
} elsif ($line_fields[3] eq 'array') {
|
} elsif ($line_fields[3] eq 'array') {
|
||||||
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_array *array%s)\n",
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, glibtop_array *array%s)\n",
|
||||||
$feature, $param_decl);
|
$feature, $param_decl);
|
||||||
} elsif ($line_fields[3] =~ /^array/) {
|
} elsif ($line_fields[3] =~ /^array/) {
|
||||||
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_array *array, %s *buf%s)\n",
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, glibtop_array *array, %s *buf%s)\n",
|
||||||
$feature, 'glibtop_'.$feature, $param_decl);
|
$feature, 'glibtop_'.$feature, $param_decl);
|
||||||
} else {
|
} else {
|
||||||
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, %s *buf%s)\n",
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, %s *buf%s)\n",
|
||||||
$feature, 'glibtop_'.$feature, $param_decl);
|
$feature, 'glibtop_'.$feature, $param_decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,8 @@
|
|||||||
|
2000-01-02 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
* marshal.pl: New file. Automatically creates `marshal.c'.
|
||||||
|
* call-vector.c: Removed.
|
||||||
|
|
||||||
2000-01-01 Martin Baulig <martin@home-of-linux.org>
|
2000-01-01 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
Initial version of the "glibtop-backend-sysdeps" backend.
|
Initial version of the "glibtop-backend-sysdeps" backend.
|
||||||
|
@@ -9,9 +9,18 @@ lib_LTLIBRARIES = \
|
|||||||
libgtop_backend_sysdeps.la
|
libgtop_backend_sysdeps.la
|
||||||
|
|
||||||
libgtop_backend_sysdeps_la_SOURCES = \
|
libgtop_backend_sysdeps_la_SOURCES = \
|
||||||
backend-sysdeps.c \
|
backend-sysdeps.c \
|
||||||
call-vector.c
|
marshal.c
|
||||||
|
|
||||||
libgtop_backend_sysdeps_la_LDFLAGS = \
|
libgtop_backend_sysdeps_la_LDFLAGS = \
|
||||||
$(LT_VERSION_INFO)
|
$(LT_VERSION_INFO)
|
||||||
|
|
||||||
|
BUILT_SOURCES = \
|
||||||
|
marshal.c
|
||||||
|
|
||||||
|
CLEANFILES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
|
marshal.c: marshal.pl $(top_builddir)/config.h $(top_srcdir)/features.def $(top_srcdir)/scripts/c_types.pl
|
||||||
|
$(PERL) -I $(top_srcdir)/scripts $(srcdir)/marshal.pl < $(top_srcdir)/features.def > tmp-t
|
||||||
|
mv tmp-t marshal.c
|
||||||
|
|
||||||
|
178
backends/sysdeps/marshal.pl
Normal file
178
backends/sysdeps/marshal.pl
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
require 'c_types.pl';
|
||||||
|
|
||||||
|
$[ = 1; # set array base to 1
|
||||||
|
$, = ' '; # set output field separator
|
||||||
|
$\ = "\n"; # set output record separator
|
||||||
|
|
||||||
|
$always_use_temp_storage = 1;
|
||||||
|
|
||||||
|
sub toupper {
|
||||||
|
local($_) = @_;
|
||||||
|
tr/a-z/A-Z/;
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub tolower {
|
||||||
|
local($_) = @_;
|
||||||
|
tr/A-Z/a-z/;
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
print '/* marshal.c */';
|
||||||
|
print "/* This is a generated file. Please modify `marshal.pl' */";
|
||||||
|
print '';
|
||||||
|
|
||||||
|
print '#include <glibtop.h>';
|
||||||
|
print '#include <glibtop/open.h>';
|
||||||
|
print '#include <glibtop/xmalloc.h>';
|
||||||
|
print '';
|
||||||
|
print '#include <glibtop/sysdeps.h>';
|
||||||
|
print '#include <glibtop/union.h>';
|
||||||
|
print '';
|
||||||
|
print '#include <glibtop/command.h>';
|
||||||
|
print '#include <glibtop/backend.h>';
|
||||||
|
print '';
|
||||||
|
print '#include <glibtop-backend-private.h>';
|
||||||
|
print '';
|
||||||
|
|
||||||
|
$feature_count = 0;
|
||||||
|
|
||||||
|
while (<>) {
|
||||||
|
chop; # strip record separator
|
||||||
|
|
||||||
|
if (/^[^#]/) {
|
||||||
|
&output($_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output {
|
||||||
|
local($line) = @_;
|
||||||
|
@line_fields = split(/\|/, $line, 9999);
|
||||||
|
$retval = $line_fields[1];
|
||||||
|
$feature = $line_fields[2];
|
||||||
|
$param_def = $line_fields[4];
|
||||||
|
|
||||||
|
$orig = $feature;
|
||||||
|
$feature =~ s/^@//;
|
||||||
|
$space = $feature;
|
||||||
|
$space =~ s/./ /g;
|
||||||
|
|
||||||
|
$features{++$feature_count} = $feature;
|
||||||
|
|
||||||
|
if ($retval eq 'retval') {
|
||||||
|
$retval_param = '&retval';
|
||||||
|
$call_prefix = '';
|
||||||
|
$call_prefix_space = '';
|
||||||
|
$prefix = 'retval = ';
|
||||||
|
$prefix_space = ' ';
|
||||||
|
$retval = 'int';
|
||||||
|
}
|
||||||
|
elsif ($retval !~ /^void$/) {
|
||||||
|
$retval_param = 'NULL';
|
||||||
|
$prefix = 'retval = ';
|
||||||
|
$prefix_space = ' ';
|
||||||
|
$call_prefix = 'retval = ';
|
||||||
|
$call_prefix_space = ' ';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$retval_param = 'NULL';
|
||||||
|
$call_prefix = '';
|
||||||
|
$call_prefix_space = '';
|
||||||
|
$prefix = '';
|
||||||
|
$prefix_space = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($retval =~ /^(array|pointer)\((.*)\)$/) {
|
||||||
|
$retval = ($2 eq 'string') ? 'char **' : "$2 *";
|
||||||
|
}
|
||||||
|
|
||||||
|
$need_temp_storage = $always_use_temp_storage;
|
||||||
|
$first_param_name = '';
|
||||||
|
|
||||||
|
$call_param = '';
|
||||||
|
$param_decl = '';
|
||||||
|
$need_temp_len = 0;
|
||||||
|
$nr_params = (@params = split(/:/, $param_def, 9999));
|
||||||
|
for ($param = 1; $param <= $nr_params; $param++) {
|
||||||
|
$list = $params[$param];
|
||||||
|
$type = $params[$param];
|
||||||
|
$type =~ s/\(.*//;
|
||||||
|
$list =~ s/^.*\(//;
|
||||||
|
$list =~ s/\)$//;
|
||||||
|
$count = (@fields = split(/,/, $list, 9999));
|
||||||
|
for ($field = 1; $field <= $count; $field++) {
|
||||||
|
my $c_type = $typeinfo->{$type}->[1];
|
||||||
|
|
||||||
|
if ($first_param_name eq '') {
|
||||||
|
$first_param_name = $fields[$field];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($typeinfo->{$type}->[2]) {
|
||||||
|
$need_temp_storage = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($param_decl eq '') {
|
||||||
|
$param_decl = ",\n " . $space . ' ';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$param_decl = $param_decl . ', ';
|
||||||
|
}
|
||||||
|
$param_decl = $param_decl . $c_type . ' ' . $fields[$field];
|
||||||
|
$call_param = $call_param . ', ' . $fields[$field];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line_fields[3] eq '') {
|
||||||
|
$total_code = sprintf
|
||||||
|
("\treturn glibtop_get_%s_s (server%s);\n", $feature, $call_param);
|
||||||
|
} elsif ($line_fields[3] eq 'array') {
|
||||||
|
$total_code = sprintf
|
||||||
|
("\treturn glibtop_get_%s_s (server, array%s);\n", $feature, $call_param);
|
||||||
|
} elsif ($line_fields[3] =~ /^array/) {
|
||||||
|
$total_code = sprintf
|
||||||
|
("\treturn glibtop_get_%s_s (server, array, buf%s);\n", $feature, $call_param);
|
||||||
|
} else {
|
||||||
|
$total_code = sprintf
|
||||||
|
("\treturn glibtop_get_%s_s (server, buf%s);\n", $feature, $call_param);
|
||||||
|
}
|
||||||
|
|
||||||
|
$func_decl = 'static '.$retval."\n";
|
||||||
|
if ($line_fields[3] eq '') {
|
||||||
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend%s)\n",
|
||||||
|
$feature, $param_decl);
|
||||||
|
} elsif ($line_fields[3] eq 'array') {
|
||||||
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, glibtop_array *array%s)\n",
|
||||||
|
$feature, $param_decl);
|
||||||
|
} elsif ($line_fields[3] =~ /^array/) {
|
||||||
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, glibtop_array *array, %s *buf%s)\n",
|
||||||
|
$feature, 'glibtop_'.$feature, $param_decl);
|
||||||
|
} else {
|
||||||
|
$func_decl .= sprintf ("_glibtop_get_%s_c (glibtop *server, glibtop_backend *backend, %s *buf%s)\n",
|
||||||
|
$feature, 'glibtop_'.$feature, $param_decl);
|
||||||
|
}
|
||||||
|
|
||||||
|
$total_code = sprintf ("%s{\n%s\n%s}\n", $func_decl, $total_code);
|
||||||
|
|
||||||
|
$total_code = sprintf ("#if (!GLIBTOP_SUID_%s)\n\n%s\n#endif /* not GLIBTOP_SUID_%s */\n\n",
|
||||||
|
&toupper($feature), $total_code,
|
||||||
|
&toupper($feature));
|
||||||
|
|
||||||
|
print $total_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
$call_vector_code = '';
|
||||||
|
for ($nr = 1; $nr <= $feature_count; $nr++) {
|
||||||
|
$feature = $features{$nr};
|
||||||
|
|
||||||
|
$call_vector_code .= sprintf
|
||||||
|
(qq[\#if GLIBTOP_SUID_%s\n\tNULL,\n\#else\n\t_glibtop_get_%s_c,\n\#endif\n],
|
||||||
|
&toupper($feature), $feature);
|
||||||
|
}
|
||||||
|
|
||||||
|
print 'glibtop_call_vector glibtop_backend_sysdeps_call_vector = {';
|
||||||
|
print $call_vector_code;
|
||||||
|
print '};';
|
||||||
|
print '';
|
||||||
|
|
@@ -29,8 +29,6 @@
|
|||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/global.h>
|
#include <glibtop/global.h>
|
||||||
|
|
||||||
#include <glibtop/call-vector.h>
|
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
BEGIN_LIBGTOP_DECLS
|
BEGIN_LIBGTOP_DECLS
|
||||||
@@ -40,6 +38,8 @@ typedef struct _glibtop_backend_private glibtop_backend_private;
|
|||||||
|
|
||||||
typedef struct _glibtop_backend glibtop_backend;
|
typedef struct _glibtop_backend glibtop_backend;
|
||||||
|
|
||||||
|
#include <glibtop/call-vector.h>
|
||||||
|
|
||||||
typedef int (*glibtop_backend_open_func_t) (glibtop *, glibtop_backend *,
|
typedef int (*glibtop_backend_open_func_t) (glibtop *, glibtop_backend *,
|
||||||
u_int64_t, const char **);
|
u_int64_t, const char **);
|
||||||
typedef int (*glibtop_backend_close_func_t) (glibtop *, glibtop_backend *);
|
typedef int (*glibtop_backend_close_func_t) (glibtop *, glibtop_backend *);
|
||||||
|
@@ -82,16 +82,16 @@ sub parse_features_def {
|
|||||||
|
|
||||||
if ($line_fields[3] eq '') {
|
if ($line_fields[3] eq '') {
|
||||||
$func_decl_code .= sprintf
|
$func_decl_code .= sprintf
|
||||||
(qq[\t%s (*%s) (glibtop *%s);\n], $retval, $feature, $param_decl);
|
(qq[\t%s (*%s) (glibtop *, glibtop_backend *%s);\n], $retval, $feature, $param_decl);
|
||||||
} elsif ($line_fields[3] eq 'array') {
|
} elsif ($line_fields[3] eq 'array') {
|
||||||
$func_decl_code .= sprintf
|
$func_decl_code .= sprintf
|
||||||
(qq[\t%s (*%s) (glibtop *, glibtop_array *%s);\n], $retval, $feature, $param_decl);
|
(qq[\t%s (*%s) (glibtop *, glibtop_backend *, glibtop_array *%s);\n], $retval, $feature, $param_decl);
|
||||||
} elsif ($line_fields[3] =~ /^array/) {
|
} elsif ($line_fields[3] =~ /^array/) {
|
||||||
$func_decl_code .= sprintf
|
$func_decl_code .= sprintf
|
||||||
(qq[\t%s (*%s) (glibtop *, glibtop_array *, %s *%s);\n], $retval, $feature, 'glibtop_'.$feature, $param_decl);
|
(qq[\t%s (*%s) (glibtop *, glibtop_backend *, glibtop_array *, %s *%s);\n], $retval, $feature, 'glibtop_'.$feature, $param_decl);
|
||||||
} else {
|
} else {
|
||||||
$func_decl_code .= sprintf
|
$func_decl_code .= sprintf
|
||||||
(qq[\t%s (*%s) (glibtop *, %s *%s);\n], $retval, $feature, 'glibtop_'.$feature, $param_decl);
|
(qq[\t%s (*%s) (glibtop *, glibtop_backend *, %s *%s);\n], $retval, $feature, 'glibtop_'.$feature, $param_decl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -166,19 +166,19 @@ sub output {
|
|||||||
|
|
||||||
if ($line_fields[3] eq '') {
|
if ($line_fields[3] eq '') {
|
||||||
$sysdeps_code .= sprintf
|
$sysdeps_code .= sprintf
|
||||||
("\t\t\tretval = backend->info->call_vector->%s (server%s);\n",
|
("\t\t\tretval = backend->info->call_vector->%s (server, backend%s);\n",
|
||||||
$feature, $call_param);
|
$feature, $call_param);
|
||||||
} elsif ($line_fields[3] eq 'array') {
|
} elsif ($line_fields[3] eq 'array') {
|
||||||
$sysdeps_code .= sprintf
|
$sysdeps_code .= sprintf
|
||||||
("\t\t\tretval = backend->info->call_vector->%s (server, array%s);\n",
|
("\t\t\tretval = backend->info->call_vector->%s (server, backend, array%s);\n",
|
||||||
$feature, $call_param);
|
$feature, $call_param);
|
||||||
} elsif ($line_fields[3] =~ /^array/) {
|
} elsif ($line_fields[3] =~ /^array/) {
|
||||||
$sysdeps_code .= sprintf
|
$sysdeps_code .= sprintf
|
||||||
("\t\t\tretval = backend->info->call_vector->%s (server, array, buf%s);\n",
|
("\t\t\tretval = backend->info->call_vector->%s (server, backend, array, buf%s);\n",
|
||||||
$feature, $call_param);
|
$feature, $call_param);
|
||||||
} else {
|
} else {
|
||||||
$sysdeps_code .= sprintf
|
$sysdeps_code .= sprintf
|
||||||
("\t\t\tretval = backend->info->call_vector->%s (server, buf%s);\n",
|
("\t\t\tretval = backend->info->call_vector->%s (server, backend, buf%s);\n",
|
||||||
$feature, $call_param);
|
$feature, $call_param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user