#include <sys/mman.h>
#endif
+/* For PATH_EXEC */
+#include <sxe-paths.h>
+
#ifndef SEPCHAR
#define SEPCHAR ':'
#endif
}
pdump_struct_table.list[pdump_struct_table.count].list.first = 0;
pdump_struct_table.list[pdump_struct_table.count].list.align =
- ALIGNOF(max_align_t);
+ ALIGNOF(sxe_max_align_t);
pdump_struct_table.list[pdump_struct_table.count].list.count = 0;
pdump_struct_table.list[pdump_struct_table.count].sdesc = sdesc;
{
int align;
- for (align = ALIGNOF(max_align_t); align; align >>= 1) {
+ for (align = ALIGNOF(sxe_max_align_t); align; align >>= 1) {
size_t i;
pdump_entry_list_elt *elt;
pdump_object_table = xnew_array(pdump_entry_list, lrecord_type_count);
pdump_alert_undump_object = xnew_array(int, lrecord_type_count);
- assert(ALIGNOF(max_align_t) <= pdump_align_table[0]);
+ assert(ALIGNOF(sxe_max_align_t) <= pdump_align_table[0]);
for (i = 0; i < countof(pdump_align_table); i++)
- if (pdump_align_table[i] > ALIGNOF(max_align_t))
- pdump_align_table[i] = ALIGNOF(max_align_t);
+ if (pdump_align_table[i] > ALIGNOF(sxe_max_align_t))
+ pdump_align_table[i] = ALIGNOF(sxe_max_align_t);
flush_all_buffer_local_cache();
for (i = 0; i < lrecord_type_count; i++) {
pdump_object_table[i].first = 0;
- pdump_object_table[i].align = ALIGNOF(max_align_t);
+ pdump_object_table[i].align = ALIGNOF(sxe_max_align_t);
pdump_object_table[i].count = 0;
pdump_alert_undump_object[i] = 0;
}
pdump_struct_table.size = -1;
pdump_opaque_data_list.first = 0;
- pdump_opaque_data_list.align = ALIGNOF(max_align_t);
+ pdump_opaque_data_list.align = ALIGNOF(sxe_max_align_t);
pdump_opaque_data_list.count = 0;
depth = 0;
header.nb_root_struct_ptrs = Dynarr_length(pdump_root_struct_ptrs);
header.nb_opaques = Dynarr_length(pdump_opaques);
- cur_offset = ALIGN_SIZE(sizeof(header), ALIGNOF(max_align_t));
+ cur_offset = ALIGN_SIZE(sizeof(header), ALIGNOF(sxe_max_align_t));
max_size = 0;
pdump_scan_by_alignment(pdump_allocate_offset);
- cur_offset = ALIGN_SIZE(cur_offset, ALIGNOF(max_align_t));
+ cur_offset = ALIGN_SIZE(cur_offset, ALIGNOF(sxe_max_align_t));
header.stab_offset = cur_offset;
pdump_buf = xmalloc_atomic(max_size);
} else {
fwrite(&header, sizeof(header), 1, pdump_out);
- PDUMP_ALIGN_OUTPUT(max_align_t);
+ PDUMP_ALIGN_OUTPUT(sxe_max_align_t);
pdump_scan_by_alignment(pdump_dump_data);
return 1;
}
-static int pdump_file_try(char *exe_path, size_t size)
+static int
+pdump_file_try(char *exe_path, size_t size)
{
- char *w = exe_path + strlen(exe_path);
- int sz;
- size -= strlen(exe_path);
-
- do {
-
-#ifdef EMACS_PATCH_LEVEL
- sz = snprintf(w, size, "-%d.%d.%d-%08x.dmp",
- EMACS_MAJOR_VERSION, EMACS_MINOR_VERSION,
- EMACS_PATCH_LEVEL, dump_id);
- if (sz >=0 && sz < size && pdump_file_get(exe_path)) {
- if (pdump_load_check()) {
- return 1;
- }
- pdump_free();
- }
-#endif /* EMACS_PATCH_LEVEL */
-#ifdef EMACS_BETA_VERSION
- sz = snprintf(w, size, "-%d.%d.%d-%08x.dmp",
- EMACS_MAJOR_VERSION, EMACS_MINOR_VERSION,
- EMACS_BETA_VERSION, dump_id);
- if (sz >=0 && (size_t)sz < size && pdump_file_get(exe_path)) {
+ static const char pdump_ext[] = ".dmp";
+ size_t exe_path_len = strlen(exe_path);
+ char *w = exe_path + exe_path_len;
+
+ if (exe_path_len + sizeof(pdump_ext) <= size) {
+ /* just hammer the pdump extension onto w */
+ memcpy(w, pdump_ext, sizeof(pdump_ext));
+ /* exists? */
+ if (pdump_file_get(exe_path)) {
+ /* works? */
if (pdump_load_check()) {
return 1;
}
+ /* bugger */
pdump_free();
}
-#endif /* EMACS_BETA_VERSION */
-
- sz = snprintf(w, size, "-%08x.dmp", dump_id);
- if (sz >=0 && (size_t)sz < size && pdump_file_get(exe_path)) {
- if (pdump_load_check()) {
- return 1;
- }
- pdump_free();
- }
-
- sz = snprintf(w, size, ".dmp");
- if (sz >=0 && (size_t)sz < size && pdump_file_get(exe_path)) {
- if (pdump_load_check()) {
- return 1;
- }
- pdump_free();
- }
-
- do {
- w--;
- } while (w > exe_path && !IS_DIRECTORY_SEP(*w) && (*w != '-')
- && (*w != '.'));
- } while (w > exe_path && !IS_DIRECTORY_SEP(*w));
+ }
return 0;
}
int pdump_load(const char *argv0)
{
char exe_path[PATH_MAX], real_exe_path[PATH_MAX];
+ char libarchdir_path[PATH_MAX] = PATH_EXEC "/sxemacs";
char *w;
const char *dir, *p;
}
if (remain > 0) {
xstrncpy(w, name, remain);
- w[remain]='\0';
}
/* Check that exe_path is executable and not a
xstrncpy(real_exe_path, exe_path, sizeof(real_exe_path));
if (pdump_file_try(exe_path,sizeof(exe_path))
|| (xrealpath(real_exe_path, real_exe_path)
- && pdump_file_try(real_exe_path,sizeof(real_exe_path)))) {
+ && pdump_file_try(real_exe_path,sizeof(real_exe_path)))
+ || pdump_file_try(libarchdir_path,sizeof(libarchdir_path)) ) {
pdump_load_finish();
return 1;
}