Move process-related functions and structures to proc.h
diff --git a/proc.h b/proc.h
new file mode 100644
index 0000000..75062ad
--- /dev/null
+++ b/proc.h
@@ -0,0 +1,121 @@
+#ifndef _PROC_H_
+#define _PROC_H_
+
+#if defined(HAVE_LIBUNWIND)
+# include <libunwind.h>
+#endif /* defined(HAVE_LIBUNWIND) */
+
+#include "ltrace.h"
+#include "dict.h"
+
+struct event_handler {
+	/* Event handler that overrides the default one.  Should
+	 * return NULL if the event was handled, otherwise the
+	 * returned event is passed to the default handler.  */
+	Event *(*on_event)(struct event_handler *self, Event *event);
+
+	/* Called when the event handler removal is requested.  */
+	void (*destroy)(struct event_handler *self);
+};
+
+enum process_state {
+	STATE_ATTACHED = 0,
+	STATE_BEING_CREATED,
+	STATE_IGNORED  /* ignore this process (it's a fork and no -f was used) */
+};
+
+enum pcb_status {
+	pcb_stop, /* The iteration should stop.  */
+	pcb_cont, /* The iteration should continue.  */
+};
+
+struct callstack_element {
+	union {
+		int syscall;
+		struct library_symbol * libfunc;
+	} c_un;
+	int is_syscall;
+	void * return_addr;
+	struct timeval time_spent;
+	void * arch_ptr;
+};
+
+/* XXX We should get rid of this.  */
+#define MAX_CALLDEPTH 64
+
+/* XXX We would rather have this all organized a little differently,
+ * have Process for the whole group and Task for what's there for
+ * per-thread stuff.  But for now this is the less invasive way of
+ * structuring it.  */
+struct Process {
+	enum process_state state;
+	Process * parent;         /* needed by STATE_BEING_CREATED */
+	char * filename;
+	pid_t pid;
+
+	/* Dictionary of breakpoints (which is a mapping
+	 * address->breakpoint).  This is NULL for non-leader
+	 * processes.  */
+	Dict * breakpoints;
+
+	int mask_32bit;           /* 1 if 64-bit ltrace is tracing 32-bit process */
+	unsigned int personality;
+	int tracesysgood;         /* signal indicating a PTRACE_SYSCALL trap */
+
+	int callstack_depth;
+	struct callstack_element callstack[MAX_CALLDEPTH];
+	struct library_symbol * list_of_symbols;
+
+	int libdl_hooked;
+	/* Arch-dependent: */
+	void * debug;	/* arch-dep process debug struct */
+	long debug_state; /* arch-dep debug state */
+	void * instruction_pointer;
+	void * stack_pointer;      /* To get return addr, args... */
+	void * return_addr;
+	void * arch_ptr;
+	short e_machine;
+	short need_to_reinitialize_breakpoints;
+#ifdef __arm__
+	int thumb_mode;           /* ARM execution mode: 0: ARM, 1: Thumb */
+#endif
+
+#if defined(HAVE_LIBUNWIND)
+	/* libunwind address space */
+	unw_addr_space_t unwind_as;
+	void *unwind_priv;
+#endif /* defined(HAVE_LIBUNWIND) */
+
+	/* Set in leader.  */
+	struct event_handler *event_handler;
+
+	/**
+	 * Process chaining.
+	 **/
+	Process * next;
+
+	/* LEADER points to the leader thread of the POSIX.1 process.
+	   If X->LEADER == X, then X is the leader thread and the
+	   Process structures chained by NEXT represent other threads,
+	   up until, but not including, the next leader thread.
+	   LEADER may be NULL after the leader has already exited.  In
+	   that case this process is waiting to be collected.  */
+	Process * leader;
+};
+
+Process * open_program(char *filename, pid_t pid, int init_breakpoints);
+void open_pid(pid_t pid);
+Process * pid2proc(pid_t pid);
+Process *each_process(Process *start,
+		      enum pcb_status (* cb)(Process *proc, void *data),
+		      void *data);
+Process *each_task(Process *start,
+		   enum pcb_status (* cb)(Process *proc, void *data),
+		   void *data);
+void add_process(Process *proc);
+void change_process_leader(Process *proc, Process *leader);
+void remove_process(Process *proc);
+void install_event_handler(Process *proc, struct event_handler *handler);
+void destroy_event_handler(Process *proc);
+
+#endif /* _PROC_H_ */