#define FN(dcl,suffix) persist_fn_ephemeral("." #dcl "." #suffix)
#define FN1(dcl) persist_fn_ephemeral("." #dcl)
-#define PFES 20
+#define PFES 50
static const char *persist_fn_ephemeral(const char *suffix) {
static char *rr[PFES];
static int i;
if (!child) {
if (dup2(data_fd,0)) diee("persist child: failed to dup2 0");
- if (dup2(newrecord_fd,1)) diee("persist child: failed to dup2 1");
+ if (dup2(newrecord_fd,1)!=1) diee("persist child: failed to dup2 1");
execl(conv, conv, PERSIST_CONVERT_OPTION, (char*)0);
diee("persist child: failed to exec `%s'", conv);
}
void persist_entrails_interpret(void) {
/* creates persist_record_converted */
+ assert(!persist_record_converted);
persist_record_converted= mstrdup(FN1(record));
if (try(FN1(data), FN1(conv))) return;
if (try(FN(data,old), FN(conv,old))) return;
if (try(FN1(data), FN(conv,old))) return;
+
free(persist_record_converted);
persist_record_converted =0;
}
/*---------- installing of our data as the current one ----------*/
void persist_install(void) {
+ const char *devnull= "/dev/null";
FILE *src, *dst;
DIR *dir;
const char *dirname;
char *dirname_buf, *slash;
- int c;
+ int c, dst_fd;
if (fd==-1) return;
src= fopen("/proc/self/exe","rb"); if (!src) diee("open /proc/self/exe");
unlink_or_enoent(FN(conv,new));
- dst= fopen(FN(conv,new),"wb"); if (!dst) diee("create persist new conv");
+ dst_fd= open(FN(conv,new), O_WRONLY|O_CREAT|O_TRUNC, 0777);
+ if (dst_fd<0) diee("create persist new conv");
+ dst= fdopen(dst_fd,"wb"); if (!dst) diee("fdopen persist new conv");
while ((c= getc(src)) != EOF)
if (putc(c,dst) == EOF) diee("write persist new conv");
diee("sync persist new data");
/* Now we have the .new's, but let's just check ... */
+ persist_record_converted= (char*)devnull;
if (!persist_convert(FN(data,new),FN(conv,new)))
die("persist conversion claims .new's do not exist ?!");
+ assert(persist_record_converted == devnull);
+ persist_record_converted= 0;
dirname_buf= mstrdup(persist_fn);
slash= strrchr(dirname_buf, '/');
!seg->owner || !seg->owner->pname)
continue;
printf("seg %s has %s%s\n", segi->pname,
- (seg->tr_backwards & seg->owner->backwards) ? "-" : "",
+ (seg->tr_backwards ^ seg->owner->backwards) ? "-" : "",
seg->owner->pname);
if (segi->n_poscombs>1 &&
continue;
/* 3. we have a violation of D \subset U, namely d */
- oprintf(DUPO("resolving") " violation @%s\n", di->pname);
+ oprintf(DUPO("resolving") " violation %s\n", di->pname);
if (d->owner) { /* 3a perhaps */
+ t= d->owner;
oprintf(DUPO("resolving") " expected %s\n", t->pname);
if (t->addr < 0) {
if (d1->owner == t && d1->iselem_u) {
FOR_TRAIN(t2, NOOP, NOOP) {
if (t2->resolution == RR_H && d1->owner == t2) {
- oprintf(DUPO("resolving") " clash @%s %s\n",
+ oprintf(DUPO("resolving") " clash %s %s\n",
d1i->pname, t2->pname);
clashes++;
}