1e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata/*
2e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This file is part of ltrace.
38a730f3e5844b86386032e93f91aa3df814ad9c3Petr Machata * Copyright (C) 2012,2013 Petr Machata, Red Hat Inc.
4e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2009,2010 Joe Damato
5e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 1998,2002,2008 Juan Cespedes
6e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2006 Ian Wienand
7e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2006 Steve Fink
8e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
9e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is free software; you can redistribute it and/or
10e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * modify it under the terms of the GNU General Public License as
11e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * published by the Free Software Foundation; either version 2 of the
12e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * License, or (at your option) any later version.
13e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
14e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is distributed in the hope that it will be useful, but
15e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
16e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * General Public License for more details.
18e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
19e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * You should have received a copy of the GNU General Public License
20e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * along with this program; if not, write to the Free Software
21e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 02110-1301 USA
23e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata */
24395a4e3ad6b03949fbe0a2818bfdec738da1c281Petr Machata#ifndef _OPTIONS_H_
25395a4e3ad6b03949fbe0a2818bfdec738da1c281Petr Machata#define _OPTIONS_H_
26e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata
275e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <stdio.h>
28a4850831bf4b4548af517335081b58cf006fd168Juan Cespedes#include <sys/types.h>
298a9ad0863d8019360d96bbbd4460ffc7a8757933Petr Machata#include <sys/time.h>
305e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
318bd9c19fd8e9864aeeddfbc60b044ededa66f84dPetr Machata#include "forward.h"
32418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata#include "vect.h"
331e4fed2719443c9de3831b359ff516888114783fPetr Machata
34ce377d567ccc0b14693619b69ebe0ac6deb0ba90Juan Cespedesstruct options_t {
3559e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int align;      /* -a: default alignment column for results */
3659e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	char * user;    /* -u: username to run command as */
3759e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int syscalls;   /* -S: display system calls */
3859e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int demangle;   /* -C: demangle low-level names into user-level names */
3959e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int indent;     /* -n: indent trace output according to program flow */
4059e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	FILE *output;   /* output to a specific file */
4159e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int summary;    /* count time, calls, and report a summary on program exit */
4259e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int debug;      /* debug */
43ba6aca21bd9e0e66dac17b1828cf6b6e7377b983Zachary T Welch	size_t arraylen;   /* default maximum # of array elements printed */
44ba6aca21bd9e0e66dac17b1828cf6b6e7377b983Zachary T Welch	size_t strlen;     /* default maximum # of bytes printed in strings */
4559e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int follow;     /* trace child processes */
4659e3fb19c861f963270e81fc77fd497961ed5d49Joe Damato	int no_signals; /* don't print signals */
47dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#if defined(HAVE_UNWINDER)
48ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato	int bt_depth;	 /* how may levels of stack frames to show */
49dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#endif /* defined(HAVE_UNWINDER) */
50b5f80ac8982c40f79915ce1e1cb9bf8650ac5fe7Petr Machata	struct filter *plt_filter;
51da3edbf059fe6c6d010b47ac50876783b4ed49cePetr Machata	struct filter *static_filter;
5251e74aca71ff7e8be91c074afd4f2264f46294e9Petr Machata
5351e74aca71ff7e8be91c074afd4f2264f46294e9Petr Machata	/* A filter matching library names of libraries, whose
5451e74aca71ff7e8be91c074afd4f2264f46294e9Petr Machata	 * exported symbols we wish to trace.  */
5551e74aca71ff7e8be91c074afd4f2264f46294e9Petr Machata	struct filter *export_filter;
5651e74aca71ff7e8be91c074afd4f2264f46294e9Petr Machata
570367389718bc6e544b7ec42acb84f590c69d76adPetr Machata	int hide_caller; /* Whether caller library should be hidden.  */
58ce377d567ccc0b14693619b69ebe0ac6deb0ba90Juan Cespedes};
59ce377d567ccc0b14693619b69ebe0ac6deb0ba90Juan Cespedesextern struct options_t options;
60ce377d567ccc0b14693619b69ebe0ac6deb0ba90Juan Cespedes
612d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienandextern int opt_i;		/* instruction pointer */
622d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienandextern int opt_r;		/* print relative timestamp */
632d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienandextern int opt_t;		/* print absolute timestamp */
642d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienandextern int opt_T;		/* show the time spent inside each call */
655e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
665e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedesstruct opt_p_t {
675e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	pid_t pid;
682d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	struct opt_p_t *next;
695e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes};
705e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
71418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machataextern struct opt_p_t *opt_p;	/* attach to process with a given pid */
72418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata
73418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machataenum opt_F_kind {
74418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	OPT_F_UNKNOWN = 0,
75418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	OPT_F_BROKEN,
76418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	OPT_F_FILE,
77418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	OPT_F_DIR,
7858c73a7a905ddcb0521178c6fe8f693c6096612eSteve Fink};
7958c73a7a905ddcb0521178c6fe8f693c6096612eSteve Fink
80418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machatastruct opt_F_t {
81418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	char *pathname;
82418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	int own_pathname : 1;
83418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata	enum opt_F_kind kind : 2;
84418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata};
85418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata
86418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata/* If entry->kind is OPT_F_UNKNOWN, figure out whether it should be
87418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * OPT_F_FILE or OPT_F_DIR, cache the result, and return it.  Return
88418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * OPT_F_BROKEN on failure.  Error message will have been printed in
89418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * that case.  */
90418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machataenum opt_F_kind opt_F_get_kind(struct opt_F_t *entry);
91418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata
92418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata/* Destroy and release any memory associated with ENTRY (but don't
93418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * free ENTRY itself).  */
94418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machatavoid opt_F_destroy(struct opt_F_t *entry);
95418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata
96418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata/* PATHS contains colon-separated list of values, akin to enviroment
97418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * variables PATH, PYTHONPATH, and others.  No escaping is possible.
98418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * The list is split and added to VEC, which shall be a vector
99418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * initialized like VECT_INIT(VEC, struct opt_F_t); Returns 0 on
100418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata * success or a negative value on failure.  */
101418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machataint parse_colon_separated_list(const char *paths, struct vect *vec);
1025e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
103418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machata/* Vector of struct opt_F_t.  */
104418584d25da07c5a9f7a61b74cfe713c1f8d7085Petr Machataextern struct vect opt_F;
10558c73a7a905ddcb0521178c6fe8f693c6096612eSteve Fink
1062d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienandextern char **process_options(int argc, char **argv);
107395a4e3ad6b03949fbe0a2818bfdec738da1c281Petr Machata
108395a4e3ad6b03949fbe0a2818bfdec738da1c281Petr Machata#endif /* _OPTIONS_H_ */
109