mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Implementing temporary file handling via TempFile.
Made ede-about and ede-bug-report resizeable
This commit is contained in:
@ -10,21 +10,15 @@
|
||||
* See COPYING for details.
|
||||
*/
|
||||
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <edelib/Missing.h>
|
||||
#include <edelib/File.h>
|
||||
#include <edelib/Debug.h>
|
||||
#include <edelib/File.h>
|
||||
#include <edelib/FileTest.h>
|
||||
#include <edelib/TempFile.h>
|
||||
|
||||
#include "GdbOutput.h"
|
||||
|
||||
@ -32,79 +26,53 @@
|
||||
#define CORE_FILE "core"
|
||||
|
||||
EDELIB_NS_USING(String)
|
||||
EDELIB_NS_USING(TempFile)
|
||||
EDELIB_NS_USING(file_path)
|
||||
EDELIB_NS_USING(file_test)
|
||||
EDELIB_NS_USING(file_remove)
|
||||
EDELIB_NS_USING(FILE_TEST_IS_REGULAR)
|
||||
|
||||
static void close_and_invalidate(int &fd) {
|
||||
if(fd != -1) {
|
||||
::close(fd);
|
||||
fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int write_str(int fd, const char *str) {
|
||||
int len = strlen(str);
|
||||
return ::write(fd, str, len);
|
||||
}
|
||||
|
||||
GdbOutput::~GdbOutput() {
|
||||
close_and_invalidate(sfd);
|
||||
close_and_invalidate(ofd);
|
||||
bool gdb_output_generate(const char *path, TempFile &t) {
|
||||
E_RETURN_VAL_IF_FAIL(path != NULL, false);
|
||||
|
||||
if(!gdb_script_path.empty())
|
||||
file_remove(gdb_script_path.c_str());
|
||||
if(!gdb_output_path.empty())
|
||||
file_remove(gdb_output_path.c_str());
|
||||
int tfd = -1;
|
||||
TempFile scr;
|
||||
|
||||
file_remove(CORE_FILE);
|
||||
}
|
||||
|
||||
bool GdbOutput::fds_open(void) {
|
||||
errno = 0;
|
||||
|
||||
char sp[] = "/tmp/.ecrash-script.XXXXXX";
|
||||
char op[] = "/tmp/.ecrash-output.XXXXXX";
|
||||
|
||||
sfd = mkstemp(sp);
|
||||
if(sfd == -1) {
|
||||
E_WARNING(E_STRLOC ": Unable to open script file: (%i), %s\n", errno, strerror(errno));
|
||||
if(!scr.create("/tmp/.ecrash-script")) {
|
||||
E_WARNING(E_STRLOC ": Unable to create temporary file for debugger script: (%i) %s",
|
||||
scr.status(), strerror(scr.status()));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* copy it as fast as possible */
|
||||
gdb_script_path = sp;
|
||||
|
||||
ofd = mkstemp(op);
|
||||
if(ofd == -1) {
|
||||
E_WARNING(E_STRLOC ": Unable to open output file: (%i), %s\n", errno, strerror(errno));
|
||||
if(!t.create("/tmp/.ecrash-output")) {
|
||||
E_WARNING(E_STRLOC ": Unable to create temporary file for debugger output: (%i) %s",
|
||||
t.status(), strerror(t.status()));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* copy it as fast as possible */
|
||||
gdb_output_path = op;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GdbOutput::run(void) {
|
||||
E_RETURN_VAL_IF_FAIL(fds_opened(), false);
|
||||
tfd = t.handle();
|
||||
|
||||
/* write script */
|
||||
::write(sfd, "bt\nquit\n", 8);
|
||||
close_and_invalidate(sfd);
|
||||
::write(scr.handle(), "bt\nquit\n", 8);
|
||||
scr.set_auto_delete(true);
|
||||
scr.close();
|
||||
|
||||
String gdb_path = file_path("gdb");
|
||||
if(gdb_path.empty()) {
|
||||
/* write straight to the file, so dialog could show it */
|
||||
write_str(ofd, "Unable to find gdb. Please install it first");
|
||||
write_str(tfd, "Unable to find gdb. Please install it first");
|
||||
|
||||
/* see it as valid, so dialog could be shown */
|
||||
return true;
|
||||
}
|
||||
|
||||
if(!file_test(CORE_FILE, FILE_TEST_IS_REGULAR)) {
|
||||
write_str(ofd, "Unable to find '"CORE_FILE"'. Backtrace will not be done.");
|
||||
write_str(tfd, "Unable to find '"CORE_FILE"'. Backtrace will not be done.");
|
||||
/* see it as valid, so dialog could be shown */
|
||||
return true;
|
||||
}
|
||||
@ -112,20 +80,22 @@ bool GdbOutput::run(void) {
|
||||
pid_t pid = fork();
|
||||
|
||||
if(pid == -1) {
|
||||
close_and_invalidate(ofd);
|
||||
E_WARNING(E_STRLOC ": Unable to fork the process\n");
|
||||
return false;
|
||||
} else if(pid == 0) {
|
||||
dup2(ofd, 1);
|
||||
close_and_invalidate(ofd);
|
||||
/* child; redirect to the file */
|
||||
dup2(tfd, 1);
|
||||
t.close();
|
||||
|
||||
::write(1, " ", 1);
|
||||
|
||||
char* argv[8];
|
||||
argv[0] = (char*)gdb_path.c_str();
|
||||
argv[1] = "--quiet";
|
||||
argv[2] = "--batch";
|
||||
argv[3] = "-x";
|
||||
argv[4] = (char*)gdb_script_path.c_str();
|
||||
argv[5] = (char*)program_path;
|
||||
argv[4] = (char*)scr.name();
|
||||
argv[5] = (char*)path;
|
||||
argv[6] = (char*)CORE_FILE;
|
||||
argv[7] = 0;
|
||||
|
||||
@ -140,5 +110,6 @@ bool GdbOutput::run(void) {
|
||||
}
|
||||
}
|
||||
|
||||
file_remove(CORE_FILE);
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user