aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2010-04-25 14:25:43 +0000
committerstuconnolly <stuart02@gmail.com>2010-04-25 14:25:43 +0000
commitfe6d4051cd47ee24c33775eec8624ebd7bb42160 (patch)
treebbaba4b7bbd27af3576c73be94fc7a64f16db7df /Source
parentd04a1612e5c26e2752d6c30c5aaf5289d01e90a9 (diff)
downloadsequelpro-fe6d4051cd47ee24c33775eec8624ebd7bb42160.tar.gz
sequelpro-fe6d4051cd47ee24c33775eec8624ebd7bb42160.tar.bz2
sequelpro-fe6d4051cd47ee24c33775eec8624ebd7bb42160.zip
Dump leaks logs to the user's desktop, falling back to /tmp if not possible.
Diffstat (limited to 'Source')
-rw-r--r--Source/SPLogger.m52
1 files changed, 40 insertions, 12 deletions
diff --git a/Source/SPLogger.m b/Source/SPLogger.m
index 5b0e4a05..8870ed49 100644
--- a/Source/SPLogger.m
+++ b/Source/SPLogger.m
@@ -25,6 +25,7 @@
#import "SPLogger.h"
+#include <pwd.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/dir.h>
@@ -128,36 +129,63 @@ static SPLogger *logger = nil;
if (dumpLeaksOnTermination) {
// Remove old leaks logs
- int count, i;
+ int cnt, cnt2, i;
int isSPLeaksLog();
struct direct **files;
- count = scandir("/tmp", &files, isSPLeaksLog, NULL);
-
- char fpath[32];
+ char *lgn;
+ struct passwd *pw;
+ boolean_t hdir = FALSE;
+
+ // Determine where to write the log to
+ if ((lgn = getlogin()) == NULL || (pw = getpwnam(lgn)) == NULL) {
+ fprintf(stderr, "Unable to get user info, falling back to /tmp\n");
+ }
+ else {
+ hdir = TRUE;
+ }
+
+ cnt = scandir("/tmp", &files, isSPLeaksLog, NULL);
- for (i = 0; i < count; i++)
+ char fpath[32], fpath2[32], fpath3[64];
+
+ for (i = 0; i < cnt; i++)
{
snprintf(fpath, sizeof(fpath), "/tmp/%s", files[i]->d_name);
if (remove(fpath) != 0) {
- printf("Unable to remove Sequel Pro leaks log '%s'", files[i]->d_name);
+ printf("Unable to remove Sequel Pro leaks log '%s'\n", files[i]->d_name);
}
}
- FILE *fp;
- FILE *fp2;
- size_t len;
+ free(&files);
- char cmd[32], file[32], buf[512];
+ if (hdir) {
+ snprintf(fpath2, sizeof(fpath2), "%s/Desktop", pw->pw_dir);
+
+ cnt2 = scandir(fpath2, &files, isSPLeaksLog, NULL);
+
+ for (i = 0; i < cnt2; i++)
+ {
+ snprintf(fpath3, sizeof(fpath3), "%s/%s", fpath2, files[i]->d_name);
+
+ if (remove(fpath3) != 0) {
+ printf("Unable to remove Sequel Pro leaks log '%s'\n", files[i]->d_name);
+ }
+ }
+ }
+
+ size_t len;
+ FILE *fp, *fp2;
+ char cmd[32], file[64], buf[512];
snprintf(cmd, sizeof(cmd), "/usr/bin/leaks %d", getpid());
- snprintf(file, sizeof(file), "/tmp/sp.leaks.%d.tmp", getpid());
+ snprintf(file, sizeof(file), (hdir) ? "%s/Desktop/sp.leaks.%d.log" : "%s/sp.leaks.%d.log", (hdir) ? pw->pw_dir : "/tmp", getpid());
// Write new leaks log
if ((fp = popen(cmd, "r")) && (fp2 = fopen(file, "w"))) {
- while(len = fread(buf, 1, sizeof(buf), fp))
+ while (len = fread(buf, 1, sizeof(buf), fp))
{
fwrite(buf, 1, len, fp2);
}