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