3 This file is part of gldbg
4 Copyright © 2009 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
12 #include <sys/socket.h>
14 #include <msp/core/except.h>
15 #include <msp/fs/dir.h>
16 #include <msp/io/print.h>
17 #include <msp/strings/lexicalcast.h>
24 Application::RegApp<GlDbg> GlDbg::reg;
26 GlDbg::GlDbg(int argc, char **argv):
29 glprint(glprint_new(0, 16384))
31 libdir = FS::get_sys_lib_dir(argv[0], "gldbg");
32 args.assign(argv+1, argv+argc);
46 int ret = waitpid(pid, &status, WNOHANG);
49 if(WIFEXITED(status) || WIFSIGNALED(status))
51 IO::print("Target process exited\n");
56 pollfd pfd = { sock_fd, POLLIN, 0 };
57 ret = poll(&pfd, 1, -1);
61 ret = read(sock_fd, rbuf, 1024);
64 buffer.append(rbuf, ret);
65 while(buffer.size()>buf_offset)
67 int ret = gldecoder_decode(glprint, buffer.data()+buf_offset, buffer.size()-buf_offset);
71 IO::print("%s\n", glprint_get_buffer(glprint));
75 buffer.erase(0, buf_offset);
85 socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
91 string fd_str = lexical_cast(fds[1]);
92 setenv("LD_PRELOAD", (libdir/"glwrap.so").str().c_str(), true);
93 setenv("GLWRAP_FD", fd_str.c_str(), true);
95 std::vector<char *> argv(args.size()+1);
96 for(unsigned i=0; i<args.size(); ++i)
97 argv[i] = strdup(args[i].c_str());
98 argv[args.size()] = 0;
99 execvp(argv[0], &argv[0]);
108 throw SystemError("Could not launch process", errno);