+2005-10-19 Tom Zanussi <zanussi@us.ibm.com>
+
+ PR 1194.
+ * elaborate.h: Move output_file variable into systemtap_session.
+ * buildrun.cxx (run_pass): Pass output file to stpd if applicable.
+ * main.cxx (main): Set output_file if -o option specified.
+
2005-10-18 Frank Ch. Eigler <fche@redhat.com>
PR 1477.
string stpd_cmd = string("sudo ")
+ string(PKGLIBDIR) + "/stpd "
+ (s.bulk_mode ? "" : "-r ")
- + (s.verbose ? "" : "-q ");
+ + (s.verbose ? "" : "-q ")
+ + (s.output_file.empty() ? "" : "-o " + s.output_file + " ");
if (s.cmd != "")
stpd_cmd += "-c \"" + s.cmd + "\" ";
std::string kernel_release;
std::string runtime_path;
std::string module_name;
+ std::string output_file;
std::string cmd;
int target_pid;
int last_pass;
string cmdline_script; // -e PROGRAM
string script_file; // FILE
bool have_script = false;
- string output_file = "-"; // -o FILE
// Initialize defaults
systemtap_session s;
s.buffer_size = 0;
s.last_pass = 5;
s.module_name = "stap_" + stringify(getpid());
+ s.output_file = ""; // -o FILE
s.keep_tmpdir = false;
s.cmd = "";
s.target_pid = 0;
break;
case 'o':
- output_file = string (optarg);
+ s.output_file = string (optarg);
break;
case 't':
+2005-10-19 Tom Zanussi <zanussi@us.ibm.com>
+
+ * librelay.c: Move output_file var to stpd.c.
+ (stp_main_loop): If the output_file option was specified,
+ and streaming mode is being used, send output to the file
+ instead of stdout. If !streaming, send output to the file
+ instead of probe.out.
+ * stpd.c (usage): Add comment for -o option.
+ (main): Add -o option.
+
2005-10-19 Tom Zanussi <zanussi@us.ibm.com>
* librelay.c (merge_output): Switch to binary TIMESTAMP.
static char proc_filebase[128];
static int proc_file[NR_CPUS];
-/* probe output written here */
-static char *outfile_name = "probe.out";
+/* probe output written here, if non-NULL */
+extern char *outfile_name;
/* internal variables */
static int transport_mode;
struct transport_start ts;
void *data;
int type;
+ FILE *ofp = stdout;
pthread_mutex_init(&processing_mutex, NULL);
fprintf(stderr, "ERROR: couldn't init relayfs, exiting\n");
exit(1);
}
+ } else if (outfile_name) {
+ ofp = fopen (outfile_name, "w");
+ if (!ofp) {
+ fprintf (stderr, "ERROR: couldn't open output file %s: errcode = %s\n",
+ outfile_name, strerror(errno));
+ exit(1);
+ }
}
ts.pid = 0; // FIXME. not implemented yet
send_request(STP_START, &ts, sizeof(ts));
break;
}
case STP_REALTIME_DATA:
- fputs ((char *)data, stdout);
+ fputs ((char *)data, ofp);
break;
case STP_OOB_DATA:
fputs ((char *)data, stderr);
fprintf(stderr, "WARNING: ignored netlink message of type %d\n", (type));
}
}
+ fclose(ofp);
return 0;
}
char *modname = NULL;
char *modpath = NULL;
char *target_cmd = NULL;
+char *outfile_name = NULL;
/* relayfs base file name */
static char stpd_filebase[1024];
+/* if no output file name is specified, use this */
+#define DEFAULT_OUTFILE_NAME "probe.out"
+
/* stp_check script */
#ifdef PKGLIBDIR
char *stp_check=PKGLIBDIR "/stp_check";
static void usage(char *prog)
{
- fprintf(stderr, "\n%s [-m] [-p] [-q] [-r] [-c cmd ] [-t pid] [-b bufsize] kmod-name\n", prog);
+ fprintf(stderr, "\n%s [-m] [-p] [-q] [-r] [-c cmd ] [-t pid] [-b bufsize] [-o FILE] kmod-name\n", prog);
fprintf(stderr, "-m Don't merge per-cpu files.\n");
fprintf(stderr, "-p Print only. Don't log to files.\n");
fprintf(stderr, "-q Quiet. Don't display trace to stdout.\n");
fprintf(stderr, " _stp_target will contain the pid for the command.\n");
fprintf(stderr, "-t pid. Sets _stp_target to pid.\n");
fprintf(stderr, "-b buffer size. The systemtap module will specify a buffer size.\n");
+ fprintf(stderr, "-o FILE. Send output to FILE.\n");
fprintf(stderr, " Setting one here will override that value. The value should be\n");
fprintf(stderr, " an integer between 1 and 64 which be assumed to be the\n");
fprintf(stderr, " buffer size in MB. That value will be per-cpu if relayfs is used.\n");
int c, status;
pid_t pid;
- while ((c = getopt(argc, argv, "mpqrb:n:t:c:v")) != EOF)
+ while ((c = getopt(argc, argv, "mpqrb:n:t:c:vo:")) != EOF)
{
switch (c) {
case 'm':
case 'c':
target_cmd = optarg;
break;
+ case 'o':
+ outfile_name = optarg;
+ break;
default:
usage(argv[0]);
}
fprintf(stderr, "Could not execute %s\n", stp_check);
exit(1);
}
+ if (!outfile_name)
+ outfile_name = DEFAULT_OUTFILE_NAME;
}
sprintf(stpd_filebase, "/mnt/relay/%d/cpu", getpid());