diff options
author | guanglei <guanglei> | 2006-10-10 09:53:54 +0000 |
---|---|---|
committer | guanglei <guanglei> | 2006-10-10 09:53:54 +0000 |
commit | 69e4bcd9d42e828b1d77584947156606289f1e38 (patch) | |
tree | 3602df652d7b518b63bf0ac2c661c7631b213be9 | |
parent | b1f3e1bd060020f36c35d449914955c3f9cd2aba (diff) | |
download | systemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.tar.gz systemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.tar.xz systemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.zip |
* runtime/lket/b2a/lket_b2a.c, runtime/lket/b2a/lket_b2a.h:
Adding the support of automatically database creation and
dumping lket trace into mysql database
* configure.ac:
add the checking of mysql client library
* Makefile.in, configure:
regenerated
* runtime/lket/b2a/Makefile.am:
add the checking and optional compiling for mysql client library
* runtime/lket/b2a/Makefile.in:
regenerated
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Makefile.in | 2 | ||||
-rwxr-xr-x | configure | 29 | ||||
-rw-r--r-- | configure.ac | 7 | ||||
-rw-r--r-- | runtime/ChangeLog | 9 | ||||
-rw-r--r-- | runtime/lket/b2a/Makefile.am | 7 | ||||
-rw-r--r-- | runtime/lket/b2a/Makefile.in | 10 | ||||
-rw-r--r-- | runtime/lket/b2a/lket_b2a.c | 539 | ||||
-rw-r--r-- | runtime/lket/b2a/lket_b2a.h | 144 | ||||
-rw-r--r-- | testsuite/Makefile.in | 2 |
10 files changed, 546 insertions, 207 deletions
@@ -1,3 +1,7 @@ +2006-10-10 Li Guanglei <guanglei@cn.ibm.com> + + * configure.ac: add the checking of mysql client library + * Makefile.in, configure: regenerated 2006-09-29 Li Guanglei <guanglei@cn.ibm.com> * man: newly created dir for stapprobes diff --git a/Makefile.in b/Makefile.in index 2b0f73f2..c1bb6fef 100644 --- a/Makefile.in +++ b/Makefile.in @@ -167,6 +167,8 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@ +HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -310,7 +310,7 @@ ac_includes_default="\ # include <unistd.h> #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CPP EGREP U ANSI2KNR RANLIB ac_ct_RANLIB BUILD_ELFUTILS_TRUE BUILD_ELFUTILS_FALSE BUILD_LKET_B2A_TRUE BUILD_LKET_B2A_FALSE stap_LIBS DATE LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CPP EGREP U ANSI2KNR RANLIB ac_ct_RANLIB BUILD_ELFUTILS_TRUE BUILD_ELFUTILS_FALSE BUILD_LKET_B2A_TRUE BUILD_LKET_B2A_FALSE HAS_MYSQL_TRUE HAS_MYSQL_FALSE stap_LIBS DATE LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -5225,6 +5225,16 @@ else fi + +if which mysql_config > /dev/null 2>&1; then + HAS_MYSQL_TRUE= + HAS_MYSQL_FALSE='#' +else + HAS_MYSQL_TRUE='#' + HAS_MYSQL_FALSE= +fi + + if ! pkg-config --atleast-version 2.0.0 glib-2.0; then { echo "$as_me:$LINENO: WARNING: glib2-devel is required to build lket-b2a. no glib2-devel found, skip building lket-b2a..." >&5 @@ -5232,6 +5242,14 @@ echo "$as_me: WARNING: glib2-devel is required to build lket-b2a. no glib2-devel found, skip building lket-b2a..." >&2;} fi +if ! which mysql_config > /dev/null 2>&1; then + { echo "$as_me:$LINENO: WARNING: mysqlclient lib is required to build lket-b2a with database support. + no mysqlclient lib is found, skip building lket-b2a with database support..." >&5 +echo "$as_me: WARNING: mysqlclient lib is required to build lket-b2a with database support. + no mysqlclient lib is found, skip building lket-b2a with database support..." >&2;} +fi + + if test $build_elfutils = no; then # Need libdwfl-capable recent elfutils from Fedora save_LIBS="$LIBS" @@ -5475,6 +5493,13 @@ echo "$as_me: error: conditional \"BUILD_LKET_B2A\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${HAS_MYSQL_TRUE}" && test -z "${HAS_MYSQL_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAS_MYSQL\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAS_MYSQL\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -6085,6 +6110,8 @@ s,@BUILD_ELFUTILS_TRUE@,$BUILD_ELFUTILS_TRUE,;t t s,@BUILD_ELFUTILS_FALSE@,$BUILD_ELFUTILS_FALSE,;t t s,@BUILD_LKET_B2A_TRUE@,$BUILD_LKET_B2A_TRUE,;t t s,@BUILD_LKET_B2A_FALSE@,$BUILD_LKET_B2A_FALSE,;t t +s,@HAS_MYSQL_TRUE@,$HAS_MYSQL_TRUE,;t t +s,@HAS_MYSQL_FALSE@,$HAS_MYSQL_FALSE,;t t s,@stap_LIBS@,$stap_LIBS,;t t s,@DATE@,$DATE,;t t s,@LIBOBJS@,$LIBOBJS,;t t diff --git a/configure.ac b/configure.ac index 08a43e77..65b493cd 100644 --- a/configure.ac +++ b/configure.ac @@ -60,12 +60,19 @@ yes) AC_MSG_ERROR([--with-elfutils requires an argument]) ;; esac]) AM_CONDITIONAL(BUILD_ELFUTILS, test $build_elfutils = yes) AM_CONDITIONAL(BUILD_LKET_B2A, pkg-config --atleast-version 2.0.0 glib-2.0) +AM_CONDITIONAL(HAS_MYSQL, which mysql_config > /dev/null 2>&1) if ! pkg-config --atleast-version 2.0.0 glib-2.0; then AC_MSG_WARN([glib2-devel is required to build lket-b2a. no glib2-devel found, skip building lket-b2a...]) fi +if ! which mysql_config > /dev/null 2>&1; then + AC_MSG_WARN([mysqlclient lib is required to build lket-b2a with database support. + no mysqlclient lib is found, skip building lket-b2a with database support...]) +fi + + if test $build_elfutils = no; then # Need libdwfl-capable recent elfutils from Fedora save_LIBS="$LIBS" diff --git a/runtime/ChangeLog b/runtime/ChangeLog index 7341ae33..4cc33aa0 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,3 +1,12 @@ +2006-10-10 Li Guanglei <guanglei@cn.ibm.com> + + * runtime/lket/b2a/Makefile.am: add the checking and optional + compiling for mysql client library + * runtime/lket/b2a/Makefile.in: regenerated + * runtime/lket/b2a/lket_b2a.c, runtime/lket/b2a/lket_b2a.h: + Adding the support of automatically database creation and + dumping lket trace into mysql database + 2006-10-09 Josh Stone <joshua.i.stone@intel.com> From David Wilder <dwilder@us.ibm.com> diff --git a/runtime/lket/b2a/Makefile.am b/runtime/lket/b2a/Makefile.am index dc8dbd92..1225ba95 100644 --- a/runtime/lket/b2a/Makefile.am +++ b/runtime/lket/b2a/Makefile.am @@ -1,6 +1,11 @@ bin_PROGRAMS = lket-b2a lket_b2a_SOURCES = lket_b2a.c lket_b2a_DEPENDENCIES = lket_b2a.h -#b2a_LDADD = `pkg-config --libs glib-2.0` lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0` lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags glib-2.0` + +if HAS_MYSQL +lket_b2a_LDFLAGS += `mysql_config --libs` +lket_b2a_CFLAGS += `mysql_config --cflags` +lket_b2a_CFLAGS += -DHAS_MYSQL +endif diff --git a/runtime/lket/b2a/Makefile.in b/runtime/lket/b2a/Makefile.in index 6ed05c18..81765acd 100644 --- a/runtime/lket/b2a/Makefile.in +++ b/runtime/lket/b2a/Makefile.in @@ -35,6 +35,8 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = lket-b2a$(EXEEXT) +@HAS_MYSQL_TRUE@am__append_1 = `mysql_config --libs` +@HAS_MYSQL_TRUE@am__append_2 = `mysql_config --cflags` -DHAS_MYSQL subdir = runtime/lket/b2a DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -91,6 +93,8 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@ +HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -154,9 +158,9 @@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ lket_b2a_SOURCES = lket_b2a.c lket_b2a_DEPENDENCIES = lket_b2a.h -#b2a_LDADD = `pkg-config --libs glib-2.0` -lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0` -lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags glib-2.0` +lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0` $(am__append_1) +lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags \ + glib-2.0` $(am__append_2) all: all-am .SUFFIXES: diff --git a/runtime/lket/b2a/lket_b2a.c b/runtime/lket/b2a/lket_b2a.c index f924dcfe..aedb7502 100644 --- a/runtime/lket/b2a/lket_b2a.c +++ b/runtime/lket/b2a/lket_b2a.c @@ -16,11 +16,26 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include "lket_b2a.h" /* A flag indicate whether to store the trace data into local file/MySQL database */ int into_file, into_db; + +#ifdef HAS_MYSQL + +#define SQLSIZE 1024*1024 +int sql_count; +#define INSERT_THRESHOLD 100 +char sql[4096]; +char sqlStatement[SQLSIZE]; +char sql_col[1024]; +char sql_val[2048]; + +MYSQL mysql; +#endif + /* A FILE handle points to a local file used to store the trace data */ FILE *outfp; @@ -42,14 +57,9 @@ static long timing_method = TIMING_GETTIMEOFDAY; static long long start_timestamp; -/* Balanced binary search tree to store the - mapping of <pid, process name> */ GTree *appNameTree; -/* - * default hook format table, - * based on tapsets/hookid_defs.stp and other hook specific files - */ +/* event table */ event_desc *events_des[MAX_EVT_TYPES][MAX_GRPID][MAX_HOOKID]; void usage() @@ -69,25 +79,26 @@ int main(int argc, char *argv[]) int i, j, total_infiles = 0; long long min; - into_file = 1; into_db = 0; + char database[18]; + time_t timer; + struct tm *tm; + + time(&timer); + tm = localtime(&timer); + strftime(database, 18, "DB%Y%m%d%H%M%S", tm); +// strcpy(database, "lgl"); - if(argc < 2) { - printf("Usage: %s inputfile1 [inputfile2...]\n", argv[0]); - return 1; - } -/* while (1) { int c = getopt(argc, argv, "mf"); if (c < 0) // no more options break; switch (c) { case 'm': - into_file = 0; into_db = 1; break; case 'f': into_file = 1; - into_db = 0; + break; default: printf("Error in options\n"); usage(); @@ -95,10 +106,25 @@ int main(int argc, char *argv[]) break; } } -*/ - total_infiles = argc - 1; - +#ifndef HAS_MYSQL + if(into_db) { + fprintf(stderr, "-m option is not supported since lket-b2a is not compiled with mysql support, \n"); + exit(-1); + } +#endif + if(into_file==0 && into_db==0) { +#ifdef HAS_MYSQL + fprintf(stderr, "At least one of -m/-f option should be specified\n"); +#else + fprintf(stderr, "-f option must be specified\n"); +#endif + usage(); + exit(-1); + } + + total_infiles = argc - optind; + // open the input files and the output file infps = (FILE **)malloc(total_infiles * sizeof(FILE *)); if(!infps) { @@ -108,26 +134,52 @@ int main(int argc, char *argv[]) memset(infps, 0, total_infiles * sizeof(FILE *)); for(i=0; i < total_infiles; i++) { - infps[i] = fopen(argv[i+1], "r"); + infps[i] = fopen(argv[optind++], "r"); if(infps[i] == NULL) { - printf("Unable to open %s\n", argv[i+1]); + printf("Unable to open %s\n", argv[optind-1]); goto failed; } } - + if(into_file) { if(strnlen(outfilename, MAX_STRINGLEN) == 0) strncpy(outfilename, DEFAULT_OUTFILE_NAME, MAX_STRINGLEN); outfp = fopen(outfilename, "w"); if(outfp == NULL) { - printf("Unable to create %s\n", outfilename); + fprintf(stderr,"Unable to create %s\n", outfilename); goto failed; } } - /* create the search tree */ - appNameTree = g_tree_new_full(compareFunc, NULL, NULL, destroyAppName); + appNameTree = g_tree_new_full(compareFunc, NULL, NULL, destroyTreeData); + +#ifdef HAS_MYSQL + if(into_db) { + if(!mysql_init(&mysql)) { + fprintf(stderr, "Failed to Init MySQL: Error: %s\n", + mysql_error(&mysql)); + } + if(!mysql_real_connect(&mysql, NULL, NULL, NULL, NULL, 0, NULL, + CLIENT_MULTI_STATEMENTS)) { + fprintf(stderr, "Failed to connect to database: Error: %s\n", + mysql_error(&mysql)); + } + + snprintf(sql, 64,"create database %s", database); + + if(mysql_query(&mysql, sql)) { + fprintf(stderr, "Failed create database %s, Error: %s\n", + database, mysql_error(&mysql)); + } + if(!mysql_real_connect(&mysql, NULL, NULL, NULL, database, 0, NULL, + CLIENT_MULTI_STATEMENTS)) { + fprintf(stderr, "Failed to connect to database %s: Error: %s\n", + database, mysql_error(&mysql)); + } + } +#endif + // find the lket header find_init_header(infps, total_infiles); @@ -165,8 +217,11 @@ int main(int argc, char *argv[]) // j is the next if(min) { if(HDR_GroupID(&hdrs[j])==_GROUP_REGEVT) { - register_events(HDR_HookID(&hdrs[j]), infps[j], - hdrs[j].sys_size); + if(HDR_HookID(&hdrs[j]) == _HOOKID_REGEVTDESC) + register_evt_desc(infps[j],hdrs[j].sys_size); + else + register_events(HDR_HookID(&hdrs[j]), infps[j], + hdrs[j].sys_size); } else { if(HDR_GroupID(&hdrs[j])==_GROUP_PROCESS && @@ -197,7 +252,7 @@ int main(int argc, char *argv[]) } // update hdr[j] #ifdef DEBUG_OUTPUT - fprintf(outfp, "File %d, Offset: %ld\n", j, ftell(infps[j])); + fprintf(stderr, "File %d, Offset: %ld\n", j, ftell(infps[j])); #endif get_pkt_header(infps[j], &hdrs[j]); } @@ -227,19 +282,23 @@ failed: if(hdrs) free(hdrs); +#ifdef HAS_MYSQL + if(into_db) { + mysql_close(&mysql); + } +#endif if (appNameTree) g_tree_destroy(appNameTree); - + //TODO: free entrytime tree return 0; } /* register newly found process name for addevent.process.snapshot and addevent.process.execve */ -///FIXME: MySQL?? void register_appname(int i, FILE *fp, lket_pkt_header *phdr) { int pid; - char *appname; + char *appname=NULL; int count; int len; int c; @@ -247,8 +306,22 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr) len=0; count=0; - appname = (char *)malloc(1024); +#ifdef HAS_MYSQL + static int flag = 0; + if(into_db) { + if(flag==0) { + if(mysql_query(&mysql, "create table appNameMap ( \ + pid INT, pname varchar(20))")) { + fprintf(stderr, "Failed to create appNameMap table, Error: %s\n", + mysql_error(&mysql)); + exit(-1); + } + } + flag=1; + } +#endif + appname = (char *)malloc(512); location = ftell(fp); if(HDR_HookID(phdr) ==1 ) { /* process_snapshot */ @@ -263,6 +336,17 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr) ++len; } appname[count]='\0'; +#ifdef HAS_MYSQL + if(into_db) { + snprintf(sql, 256, "insert into appNameMap values \ + ( %d, \"%s\")", pid, appname); + if(mysql_query(&mysql,sql)) { + fprintf(stderr, "Failed to exec sql: %s, Error: %s\n", + sql, mysql_error(&mysql)); + exit(-1); + } + } +#endif //fseek(fp, 0-len, SEEK_CUR); } else if (HDR_HookID(phdr) == 2) { /* process.execve */ fread(&pid, 1, 4, fp); /* read pid */ @@ -275,6 +359,17 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr) ++len; } appname[count]='\0'; +#ifdef HAS_MYSQL + if(into_db) { + snprintf(sql, 256,"insert into appNameMap values \ + ( %d, \"%s\")", pid, appname); + if(mysql_query(&mysql,sql)) { + fprintf(stderr, "Failed to exec SQL: %s, Error: %s\n", + sql, mysql_error(&mysql)); + exit(-1); + } + } +#endif //fseek(fp, 0-len, SEEK_CUR); } else { free(appname); @@ -287,21 +382,20 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr) gint compareFunc(gconstpointer a, gconstpointer b, gpointer user_data) { - if((long)(a) > (long)(b)) return 1; - else if ((long)(a) < (long)(b)) return -1; - else return 0; + if((long)(a) > (long)(b)) return 1; + else if ((long)(a) < (long)(b)) return -1; + else return 0; } -void destroyAppName(gpointer data) +void destroyTreeData(gpointer data) { - free(data); + free(data); } /* * search the LKET init header in a set of input files, * and the header structure is defined in tapsets/lket_trace.stp */ -//FIXME: need MySQL support void find_init_header(FILE **infps, const int total_infiles) { int i, j, k; @@ -315,6 +409,7 @@ void find_init_header(FILE **infps, const int total_infiles) int8_t timing_field; int8_t bits_width; int32_t init_timebase; + char timing_methods_str[128]; if(total_infiles <= 0 ) return; @@ -325,40 +420,64 @@ void find_init_header(FILE **infps, const int total_infiles) if(magic == (int32_t)LKET_MAGIC) { //found j = i; - fprintf(outfp, "LKET Magic:\t0x%X\n", magic); + if(into_file) + fprintf(outfp, "LKET Magic:\t0x%X\n", magic); //read other content of lket_int_header - if(fread(&inithdr_len, 1, sizeof(inithdr_len), infps[i]) < sizeof(inithdr_len)) + if(fread(&inithdr_len, 1, sizeof(inithdr_len), infps[i]) + < sizeof(inithdr_len)) break; - fprintf(outfp, "InitHdrLen:\t%d\n", inithdr_len); + if(into_file) + fprintf(outfp, "InitHdrLen:\t%d\n", inithdr_len); if(fread(&ver_major, 1, sizeof(ver_major), infps[i]) < sizeof(ver_major)) break; - fprintf(outfp, "Version Major:\t%d\n", ver_major); + if(into_file) + fprintf(outfp, "Version Major:\t%d\n", ver_major); if(fread(&ver_minor, 1, sizeof(ver_minor), infps[i]) < sizeof(ver_minor)) break; - fprintf(outfp, "Version Minor:\t%d\n", ver_minor); + if(into_file) + fprintf(outfp, "Version Minor:\t%d\n", ver_minor); if(fread(&big_endian, 1, sizeof(big_endian), infps[i]) < sizeof(big_endian)) break; - fprintf(outfp, "Big endian:\t%s\n", big_endian ? "YES":"NO"); - if(fread(&timing_field, 1, sizeof(timing_field), infps[i]) < sizeof(timing_field)) + if(into_file) + fprintf(outfp, "Big endian:\t%s\n", big_endian ? "YES":"NO"); + if(fread(&timing_field, 1, sizeof(timing_field), infps[i]) + < sizeof(timing_field)) break; timing_method = timing_field; - fprintf(outfp, "Timing method:\t"); + if(into_file) + fprintf(outfp, "Timing method:\t"); switch(timing_method) { case TIMING_GETCYCLES: - fprintf(outfp, "get_cycles()\n"); break; + snprintf(timing_methods_str, 128, "get_cycles"); + if(into_file) + fprintf(outfp, "get_cycles()\n"); + break; case TIMING_GETTIMEOFDAY: - fprintf(outfp, "do_gettimeofday()\n"); break; + snprintf(timing_methods_str, 128,"do_gettimeofday"); + if(into_file) + fprintf(outfp, "do_gettimeofday()\n"); + break; case TIMING_SCHEDCLOCK: - fprintf(outfp, "sched_clock()\n"); break; + snprintf(timing_methods_str, 128, "sched_clock"); + if(into_file) + fprintf(outfp, "sched_clock()\n"); + break; default: - fprintf(outfp, "Unsupported timging method\n"); + snprintf(timing_methods_str,128, + "Unsupported timing method"); + if(into_file) + fprintf(outfp, "Unsupported timging method\n"); } if(fread(&bits_width, 1, sizeof(bits_width), infps[i]) < sizeof(bits_width)) break; - fprintf(outfp, "Bits width:\t%d\n", bits_width); - if(fread(&init_timebase, 1, sizeof(init_timebase), infps[i]) < sizeof(init_timebase)) + if(into_file) + fprintf(outfp, "Bits width:\t%d\n", bits_width); + if(fread(&init_timebase, 1, sizeof(init_timebase), infps[i]) + < sizeof(init_timebase)) break; - fprintf(outfp, "Initial CPU timebase:\t%d (cycles per microsecond)\n", + if(into_file) + fprintf(outfp, + "Initial CPU timebase:\t%d (cycles per microsecond)\n", init_timebase); if(timing_method == TIMING_GETCYCLES) { for(k = 0; k < MAX_CPUS; k++) @@ -367,6 +486,27 @@ void find_init_header(FILE **infps, const int total_infiles) break; } } + +#ifdef HAS_MYSQL + if(into_db) { + if(mysql_query(&mysql, "create table trace_header \ + ( Major_Ver TINYINT, Minor_Ver TINYINT, \ + Big_Endian TINYINT, Timing_Method varchar(20), \ + Bits_Width TINYINT)" )) { + fprintf(stderr, "Failed to create trace_header table, Error: %s\n", + mysql_error(&mysql)); + exit(-1); + } + snprintf(sql, 256, "insert into trace_header value ( %d, %d, %d, \"%s\", %d )", + ver_major, ver_minor, big_endian, timing_methods_str, bits_width); + + if(mysql_query(&mysql, sql)) { + fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n", + sql, mysql_error(&mysql)); + exit(-1); + } + } +#endif for(i=0; i<total_infiles && i!=j; i++) fseek(infps[i], 0LL, SEEK_SET); return; @@ -375,7 +515,6 @@ void find_init_header(FILE **infps, const int total_infiles) /* * read the lket_pkt_header structure at the begining of the input file */ -///FIXME: MySQL int get_pkt_header(FILE *fp, lket_pkt_header *phdr) { if(fread(phdr, 1, sizeof(lket_pkt_header), fp) < sizeof(lket_pkt_header)) @@ -391,15 +530,13 @@ bad: return -1; } -/* - * print the lket_pkt_header structure into the output file - */ -void print_pkt_header(FILE *fp, lket_pkt_header *phdr) +void print_pkt_header(lket_pkt_header *phdr) { long long usecs; int sec, usec; + int grpid, hookid, pid; - if(!fp || !phdr) + if(!phdr) return; if(timing_method == TIMING_GETCYCLES) @@ -412,17 +549,102 @@ void print_pkt_header(FILE *fp, lket_pkt_header *phdr) sec = usecs/1000000; usec = usecs%1000000; - - fprintf(fp, "\n%d.%d APPNAME: %s PID:%d CPU:%d HOOKGRP:%d HOOKID:%d -- ", - sec, usec, - (char *)(g_tree_lookup(appNameTree, (gconstpointer)((long)HDR_PID(phdr)))), - HDR_PID(phdr), - HDR_CpuID(phdr), - HDR_GroupID(phdr), - HDR_HookID(phdr)); + + grpid = HDR_GroupID(phdr); + hookid = HDR_HookID(phdr); + pid = HDR_PID(phdr); + + if(into_file) + fprintf(outfp, "\n%d.%d APPNAME: %s PID:%d CPU:%d HOOKGRP:%d HOOKID:%d ", + sec, usec, + (char *)(g_tree_lookup(appNameTree, (gconstpointer)((long)pid))), + pid, HDR_CpuID(phdr), grpid, hookid); + +#ifdef HAS_MYSQL + if(into_db) { + if(!(hookid%2)) { // return type event + long long *entrytime; + long long entryusecs; + entrytime = g_tree_lookup(events_des[1][grpid][hookid-1]->entrytime, + (gconstpointer)((long)pid)); + if(entrytime==NULL) // key not found + entryusecs = 0; + else + entryusecs = *entrytime; + snprintf(sql_col, 64, "groupid, hookid, usec, process_id, \ + cpu_id, entry_usec,"); + snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, %lld,", grpid, + hookid, usecs, pid, HDR_CpuID(phdr), + entryusecs); + } else { + snprintf(sql_col, 64, "groupid, hookid, usec, process_id, cpu_id,"); + snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, ", grpid, + hookid, usecs, pid, HDR_CpuID(phdr)); + } + if(hookid%2) { + //(events_des[1][grpid][hookid]->entrytime)[pid] = usecs; + char *entrytime = malloc(sizeof(long long)); + *((long long *)entrytime) = usecs; + g_tree_insert(events_des[1][grpid][hookid]->entrytime, + (gpointer)((long)pid), (gpointer)entrytime); + } + } +#endif + +} + +#ifdef HAS_MYSQL +char *get_sqltype(char *fmt) +{ + if(strncmp(fmt, "INT8", 4) == 0) + return "TINYINT"; + if(strncmp(fmt, "INT16", 5) == 0) + return "SMALLINT"; + if(strncmp(fmt, "INT32", 5) == 0) + return "INT"; + if(strncmp(fmt, "INT64", 5) == 0) + return "BIGINT"; + if(strncmp(fmt, "STRING", 6) == 0) + return "VARCHAR(20)"; + return ""; +} +#endif + +void register_evt_desc(FILE *infp, size_t size) +{ + static int has_table = 0; + int grpid, hookid; + char *evt_body; + evt_body = malloc(size); + fread(evt_body, size, 1, infp); + grpid = *(int8_t *)evt_body; + hookid = *(int8_t *)(evt_body+1); + + if(!events_des[1][grpid][hookid]) + events_des[1][grpid][hookid] = malloc(sizeof(event_desc)); + events_des[1][grpid][hookid]->entrytime = g_tree_new_full( + compareFunc, NULL, NULL, destroyTreeData); +#ifdef HAS_MYSQL + if(into_db) { + if(!has_table) { + snprintf(sql, 1024, "create table table_desc ( table_name \ + varchar(6), table_desc varchar(32))"); + has_table = 1; + } else { + snprintf(sql, 1024, "insert into table_desc ( table_name,\ + table_desc) values ( \"%d_%d\", \"%s\")", grpid, hookid, + evt_body+2); + } + if(mysql_query(&mysql, sql)) { + fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n", + sql, mysql_error(&mysql)); + exit(-1); + } + } +#endif + free(evt_body); } -///FIXME: MySQL void register_events(int evt_type, FILE *infp, size_t size) { int cnt=0, len=0; @@ -436,7 +658,39 @@ void register_events(int evt_type, FILE *infp, size_t size) grpid = *(int8_t *)evt_body; hookid = *(int8_t *)(evt_body+1); - + + if(!events_des[evt_type][grpid][hookid]) + events_des[evt_type][grpid][hookid] = malloc(sizeof(event_desc)); + if(!events_des[evt_type][grpid][hookid]) { + fprintf(stderr, "error when malloc for event_des[%d][%d][%d]\n", + evt_type, grpid, hookid); + } + +#ifdef HAS_MYSQL + if(into_db) { + if(evt_type==1) { /* if sys event, create a table */ + if(!(hookid%2)) {/* if this is a return type event, should record + the entry time of this event */ + snprintf(sql, 1024, "create table %d_%d \ + ( groupid TINYINT, hookid TINYINT, usec BIGINT,\ + process_id INT, cpu_id TINYINT, \ + entry_usec BIGINT,", grpid, hookid); + } else { + snprintf(sql, 1024, "create table %d_%d \ + ( groupid TINYINT, hookid TINYINT, \ + usec BIGINT, process_id INT, \ + cpu_id TINYINT,", grpid, hookid); + } + } + if(evt_type==2) { /* if user event, alter an existing table */ + snprintf(sql, 1024, "alter table %d_%d ", grpid, hookid); + } + } +#endif + + if(size == 2) // skip if no event format is provided + goto gen_sql; + evt_fmt = evt_body+2; for(tmp=evt_fmt; *tmp!=0; tmp++); @@ -451,11 +705,29 @@ void register_events(int evt_type, FILE *infp, size_t size) exit(-1); } - events_des[evt_type][grpid][hookid] = malloc(sizeof(event_desc)); - while(fmt!=NULL && name!=NULL) { +#ifdef HAS_MYSQL + if(into_db) { + if(evt_type==1) { + strcat(sql, "`"); + strcat(sql, name); + strcat(sql, "` "); + strcat(sql, get_sqltype(fmt)); + strcat(sql, ","); + } + if(evt_type==2) { + strcat(sql, "add "); + strcat(sql, "`"); + strcat(sql, name); + strcat(sql, "` "); + strcat(sql, get_sqltype(fmt)); + strcat(sql, ","); + } + } +#endif strncpy(events_des[evt_type][grpid][hookid]->evt_fmt[cnt], fmt, 7); - strncpy(events_des[evt_type][grpid][hookid]->evt_names[cnt], name, 64); + strncpy(events_des[evt_type][grpid][hookid]->evt_names[cnt], + name, MAX_FIELDNAME_LEN); strncpy(events_des[evt_type][grpid][hookid]->fmt+len, get_fmtstr(fmt), 8); len+=strlen(get_fmtstr(fmt)); fmt = strsep(&evt_fmt, ":"); @@ -464,6 +736,22 @@ void register_events(int evt_type, FILE *infp, size_t size) } events_des[evt_type][grpid][hookid]->count = cnt; *(events_des[evt_type][grpid][hookid]->fmt+len)='\0'; + +#ifdef HAS_MYSQL +gen_sql: + if(into_db) { + if(evt_type==1) + sql[strlen(sql)-1]=')'; + if(evt_type==2) + sql[strlen(sql)-1]='\0'; + + if(mysql_query(&mysql, sql)) { + fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n", + sql, mysql_error(&mysql)); + exit(-1); + } + } +#endif free(evt_body); } @@ -482,7 +770,6 @@ char *get_fmtstr(char *fmt) return ""; } -///FIXME: MySQL int dump_data(lket_pkt_header header, FILE *infp) { int i, c, j; @@ -494,11 +781,13 @@ int dump_data(lket_pkt_header header, FILE *infp) int size = 0; int evt_num = 1; + char tmp_int[32]; + char *fmt, *name, *buffer; int grpid = HDR_GroupID(&header); int hookid = HDR_HookID(&header); - print_pkt_header(outfp, &header); + print_pkt_header(&header); /* if the data contains user appended extra data */ if(header.total_size != header.sys_size) @@ -514,13 +803,13 @@ int dump_data(lket_pkt_header header, FILE *infp) if(j == 2) /* if current one is a user event */ size = header.total_size - header.sys_size; - if((events_des[j][grpid][hookid] == NULL) || - (events_des[j][grpid][hookid]->count <= 0 || !outfp) || - (events_des[j][grpid][hookid]->evt_fmt[0][0] == '\0')) { + if(into_file && (events_des[j][grpid][hookid] == NULL || + events_des[j][grpid][hookid]->count <= 0)) { //no format is provided, dump in hex buffer = malloc(size); fread(buffer, size, 1, infp); fwrite(buffer, size, 1, outfp); + free(buffer); total_bytes += size; continue; } @@ -528,41 +817,123 @@ int dump_data(lket_pkt_header header, FILE *infp) for(i=0; i<events_des[j][grpid][hookid]->count; i++) { fmt = events_des[j][grpid][hookid]->evt_fmt[i]; name = events_des[j][grpid][hookid]->evt_names[i]; - fwrite(name, strlen(name), 1, outfp); - fwrite(":", 1, 1, outfp); +#ifdef HAS_MYSQL + if(into_db) { + strcat(sql_col, "`"); + strcat(sql_col, name); + strcat(sql_col, "`,"); + } +#endif + + if(into_file) { + fwrite(name, strlen(name), 1, outfp); + fwrite(":", 1, 1, outfp); + } if(strncmp(fmt, "INT8", 4)==0) { c = fgetc_unlocked(infp); - fprintf(outfp, "%d,", (int8_t)c); + if(into_file) + fprintf(outfp, "%d,", (int8_t)c); + sprintf(tmp_int, "%d,", (int8_t)c); +#ifdef HAS_MYSQL + if(into_db) + strcat(sql_val, tmp_int); +#endif readbytes+=1; } else if(strncmp(fmt, "INT16", 5)==0) { fread(&stemp, 2, 1, infp); - fprintf(outfp, "%d,", (int16_t)stemp); + if(into_file) + fprintf(outfp, "%d,", (int16_t)stemp); + sprintf(tmp_int, "%d,", (int16_t)stemp); +#ifdef HAS_MYSQL + if(into_db) + strcat(sql_val, tmp_int); +#endif readbytes+=2; } else if(strncmp(fmt, "INT32", 5)==0) { fread(&ntemp, 4, 1, infp); - fprintf(outfp, "%d,", (int32_t)ntemp); + if(into_file) + fprintf(outfp, "%d,", (int32_t)ntemp); + snprintf(tmp_int, 20, "%d,", (int32_t)ntemp); +#ifdef HAS_MYSQL + if(into_db) + strcat(sql_val, tmp_int); +#endif readbytes+=4; } else if(strncmp(fmt, "INT64", 5)==0) { fread(&lltemp, 8, 1, infp); - fprintf(outfp, "%lld,",lltemp); + if(into_file) + fprintf(outfp, "%lld,",lltemp); + snprintf(tmp_int, 30, "%lld,", lltemp); +#ifdef HAS_MYSQL + if(into_db) + strcat(sql_val, tmp_int); +#endif readbytes+=8; } else if(strncmp(fmt, "STRING", 6)==0) { + +#ifdef HAS_MYSQL + int tmplen=0; + if(into_db) { + tmplen=strlen(sql_val); + sql_val[tmplen++]='"'; + } +#endif c = fgetc_unlocked(infp); ++readbytes; while (c && readbytes < size) { - fputc_unlocked(c, outfp); + if(into_file) + fputc_unlocked(c, outfp); +#ifdef HAS_MYSQL + if(into_db) + sql_val[tmplen++]=c; +#endif c = fgetc_unlocked(infp); ++readbytes; } if(!c) { - fputc_unlocked(',', outfp); + if(into_file) + fputc_unlocked(',', outfp); +#ifdef HAS_MYSQL + if(into_db) { + sql_val[tmplen++]='"'; + sql_val[tmplen++]=','; + sql_val[tmplen]='\0'; + } +#endif continue; } - else + else { return -1; + } } } total_bytes += readbytes; } + +#ifdef HAS_MYSQL + if(into_db) { + sql_col[strlen(sql_col)-1] = '\0'; + sql_val[strlen(sql_val)-1] = '\0'; + snprintf(sql, 1024, "insert into %d_%d (%s) values (%s)", + grpid, hookid, sql_col, sql_val); + + if(sql_count >= INSERT_THRESHOLD) { + if(mysql_query(&mysql, sqlStatement)) { + fprintf(stderr, "Failed exec SQL:\n%s\n, Error:\n%s\n", + sqlStatement, mysql_error(&mysql)); + exit(-1); + } + while(!mysql_next_result(&mysql)); + sql_count=0; + sqlStatement[0]='\0'; + } else { + //strncpy(sqlStatement, sql, 2048); + strcat(sqlStatement, sql); + strcat(sqlStatement, ";"); + sql_count++; + } + } +#endif + return total_bytes; } diff --git a/runtime/lket/b2a/lket_b2a.h b/runtime/lket/b2a/lket_b2a.h index abb9eb53..8212ef62 100644 --- a/runtime/lket/b2a/lket_b2a.h +++ b/runtime/lket/b2a/lket_b2a.h @@ -1,138 +1,47 @@ #ifndef _LKET_B2A_H #define _LKET_B2A_H + #include <glib.h> +#ifdef HAS_MYSQL +#include "/usr/include/mysql/mysql.h" +#endif + #define LKET_MAGIC 0xAEFCDB6B #define MAX_STRINGLEN 256 -#define APPNAMELIST_LEN 256 - -#define SEQID_SIZE 4 - -#define EVT_SYS 1 -#define EVT_USER 2 - #define MAX_GRPID 255 #define MAX_HOOKID 255 #define MAX_EVT_TYPES 2 #define DEFAULT_OUTFILE_NAME "lket.out" - /* Group ID Definitions */ int _GROUP_REGEVT = 1; -int _GROUP_SYSCALL = 2; int _GROUP_PROCESS = 3; -int _GROUP_IOSCHED = 4; -int _GROUP_TASK = 5; -int _GROUP_SCSI = 6; -int _GROUP_PAGEFAULT = 7; -int _GROUP_NETDEV = 8; -int _GROUP_IOSYSCALL = 9; -int _GROUP_AIO = 10; int _GROUP_CPUFREQ = 15; /* hookIDs defined inside each group */ int _HOOKID_REGSYSEVT = 1; -int _HOOKID_REGUSREVT = 2; - -int _HOOKID_SYSCALL_ENTRY = 1; -int _HOOKID_SYSCALL_RETURN = 2; +int _HOOKID_REGUSREVT = 3; +int _HOOKID_REGEVTDESC = 5; int _HOOKID_PROCESS_SNAPSHOT = 1; -int _HOOKID_PROCESS_EXECVE = 2; -int _HOOKID_PROCESS_FORK = 3; - -int _HOOKID_IOSCHED_NEXT_REQ = 1; -int _HOOKID_IOSCHED_ADD_REQ = 2; -int _HOOKID_IOSCHED_REMOVE_REQ = 3; - -int _HOOKID_TASK_CTXSWITCH = 1; -int _HOOKID_TASK_CPUIDLE = 2; - -int _HOOKID_SCSI_IOENTRY = 1; -int _HOOKID_SCSI_IO_TO_LLD = 2; -int _HOOKID_SCSI_IODONE_BY_LLD = 3; -int _HOOKID_SCSI_IOCOMP_BY_MIDLEVEL = 4; - -int _HOOKID_PAGEFAULT = 1; - -int _HOOKID_NETDEV_RECEIVE = 1; -int _HOOKID_NETDEV_TRANSMIT = 2; - -int _HOOKID_IOSYSCALL_OPEN_ENTRY = 1; -int _HOOKID_IOSYSCALL_OPEN_RETURN = 2; - -int _HOOKID_IOSYSCALL_CLOSE_ENTRY = 3; -int _HOOKID_IOSYSCALL_CLOSE_RETURN = 4; - -int _HOOKID_IOSYSCALL_READ_ENTRY = 5; -int _HOOKID_IOSYSCALL_READ_RETURN = 6; - -int _HOOKID_IOSYSCALL_WRITE_ENTRY = 7; -int _HOOKID_IOSYSCALL_WRITE_RETURN = 8; +int _HOOKID_PROCESS_EXECVE = 3; +int _HOOKID_PROCESS_FORK = 5; -int _HOOKID_IOSYSCALL_READV_ENTRY = 9; -int _HOOKID_IOSYSCALL_READV_RETURN = 10; - -int _HOOKID_IOSYSCALL_WRITEV_ENTRY = 11; -int _HOOKID_IOSYSCALL_WRITEV_RETURN = 12; - -int _HOOKID_IOSYSCALL_PREAD64_ENTRY = 13; -int _HOOKID_IOSYSCALL_PREAD64_RETURN = 14; - -int _HOOKID_IOSYSCALL_PWRITE64_ENTRY = 15; -int _HOOKID_IOSYSCALL_PWRITE64_RETURN = 16; - -int _HOOKID_IOSYSCALL_READAHEAD_ENTRY = 17; -int _HOOKID_IOSYSCALL_READAHEAD_RETURN = 18; - -int _HOOKID_IOSYSCALL_SENDFILE_ENTRY = 19; -int _HOOKID_IOSYSCALL_SENDFILE_RETURN = 20; - -int _HOOKID_IOSYSCALL_LSEEK_ENTRY = 21; -int _HOOKID_IOSYSCALL_LSEEK_RETURN = 22; - -int _HOOKID_IOSYSCALL_LLSEEK_ENTRY = 23; -int _HOOKID_IOSYSCALL_LLSEEK_RETURN = 24; - -int _HOOKID_IOSYSCALL_SYNC_ENTRY = 25; -int _HOOKID_IOSYSCALL_SYNC_RETURN = 26; - -int _HOOKID_IOSYSCALL_FSYNC_ENTRY = 27; -int _HOOKID_IOSYSCALL_FSYNC_RETURN = 28; - -int _HOOKID_IOSYSCALL_FDATASYNC_ENTRY = 29; -int _HOOKID_IOSYSCALL_FDATASYNC_RETURN = 30; - -int _HOOKID_IOSYSCALL_FLOCK_ENTRY = 31; -int _HOOKID_IOSYSCALL_FLOCK_RETURN = 32; - -int _HOOKID_AIO_IO_SETUP_ENTRY = 1; -int _HOOKID_AIO_IO_SETUP_RETURN = 2; -int _HOOKID_AIO_IO_SUBMIT_ENTRY = 3; -int _HOOKID_AIO_IO_SUBMIT_RETURN = 4; -int _HOOKID_AIO_IO_SUBMIT_ONE_ENTRY = 5; -int _HOOKID_AIO_IO_SUBMIT_ONE_RETURN = 6; -int _HOOKID_AIO_IO_GETEVENTS_ENTRY = 7; -int _HOOKID_AIO_IO_GETEVENTS_RETURN = 8; -int _HOOKID_AIO_IO_DESTROY_ENTRY = 9; -int _HOOKID_AIO_IO_DESTROY_RETURN = 10; -int _HOOKID_AIO_IO_CANCEL_ENTRY = 11; -int _HOOKID_AIO_IO_CANCEL_RETURN = 12; - -int _HOOKID_INIT_CPUFREQ = 1; -int _HOOKID_SWITCH_CPUFREQ = 2; +//int _HOOKID_INIT_CPUFREQ = 1; +int _HOOKID_SWITCH_CPUFREQ = 1; typedef struct _lket_pkt_header { int16_t total_size; int16_t sys_size; int64_t microsecond; /* aggr is the bit-OP of: - (int64_t)current->pid << 32 | - (int32_t)GroupID << 24 | (int32_t)hookID << 16 | - (int16_t)current->thread_info->cpu << 8 + (int64_t)current->pid << 32 | + (int32_t)GroupID << 24 | (int32_t)hookID << 16 | + (int16_t)current->thread_info->cpu << 8 */ int64_t aggr; } __attribute__((packed)) lket_pkt_header; @@ -142,19 +51,17 @@ typedef struct _lket_pkt_header { #define HDR_HookID(ptr) (int8_t)(((ptr)->aggr)>>16) #define HDR_CpuID(ptr) (int8_t)(((ptr)->aggr)>>8) -typedef struct _appname_info { - int pid; - int ppid; - int tid; - long index; - struct _appname_info *next; -} appname_info; +#define MAX_FIELDS 32 /* max fields in a record */ +#define MAX_FIELDNAME_LEN 16 /* max len of a field */ typedef struct { - char evt_fmt[256][7]; /* e.g. INT8,STRING,INT16,... */ - char evt_names[256][64]; /* e.g. protocal,dev_name,buff_len,... */ +#ifdef HAS_MYSQL + GTree *entrytime; +#endif + char evt_fmt[MAX_FIELDS][7]; /* e.g. INT8,STRING,INT16,... */ + char evt_names[MAX_FIELDS][MAX_FIELDNAME_LEN]; /* e.g. protocal,dev_name,buff_len,... */ char fmt[256]; /* e.g. %1b,%0s,%2b,... */ - int count; + int count; /* # of fields */ } event_desc; /* @@ -170,13 +77,14 @@ static int get_pkt_header(FILE *fp, lket_pkt_header *phdr); /* * print the lket_pkt_header structure into the output file */ -static void print_pkt_header(FILE *fp, lket_pkt_header *phdr); +static void print_pkt_header(lket_pkt_header *phdr); void register_appname(int i, FILE *fp, lket_pkt_header *phdr); gint compareFunc(gconstpointer a, gconstpointer b, gpointer user_data); -void destroyAppName(gpointer data); - +void destroyTreeData(gpointer data); +void register_evt_desc(FILE *infp, size_t size); void register_events(int evt_type, FILE *infp, size_t size); int dump_data(lket_pkt_header header, FILE *infp); char *get_fmtstr(char *fmt); + #endif diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in index 9d69cf3b..88f4054a 100644 --- a/testsuite/Makefile.in +++ b/testsuite/Makefile.in @@ -80,6 +80,8 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@ +HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ |