/* Kill old shadow tree. */ static int callback_unshadow(void * cookie) { struct write_cookie * WC = cookie; struct btree * T = WC->T; struct node * root_shadow; /* * Grab the root of the shadow tree, and use the (now clean) dirty * tree as the shadow tree henceforth. */ root_shadow = T->root_shadow; T->root_shadow = T->root_dirty; btree_node_lock(T, T->root_shadow); /* Kill the old shadow tree, if there was one. */ if (root_shadow != NULL) { /* This isn't a root any more, so release the root lock. */ btree_node_unlock(T, root_shadow); /* * Traverse the tree, re-pointing clean children at their * dirty parents and freeing shadow nodes. */ unshadow(T, root_shadow); } /* Update number-of-pages-used value. */ T->npages = T->nextblk - T->root_dirty->oldestleaf; /* * We could issue a FREE call here, but since FREE is only advisory * we need to call it elsewhere as well in order to avoid having data * permanently stored even when it could all be freed. Since we're * calling FREE elsewhere anyway, don't bother calling it here. */ /* Register post-sync callback to be performed. */ if (!events_immediate_register(WC->callback, WC->cookie, 0)) goto err1; /* Free cookie. */ free(WC); /* Success! */ return (0); err1: free(WC); /* Failure! */ return (-1); }
int main(int argc, char **argv) { char *name; #ifdef __DJGPP__ if (--argc <= 0) return 1; if ((name = strrchr(argv[0], '/'))) strcpy(name + 1, argv[1]); name = argv[1]; argv[1] = argv[0]; argv++; #else if (!argv[0]) name = "john"; else if ((name = strrchr(argv[0], '/'))) name++; #if defined(__CYGWIN32__) || defined (__MINGW32__) || defined (_MSC_VER) else if ((name = strrchr(argv[0], '\\'))) name++; #endif else name = argv[0]; #endif #if defined(__CYGWIN32__) || defined (__MINGW32__) || defined (_MSC_VER) strlwr(name); if (strlen(name) > 4 && !strcmp(name + strlen(name) - 4, ".exe")) name[strlen(name) - 4] = 0; #endif if (!strcmp(name, "unshadow")) return unshadow(argc, argv); if (!strcmp(name, "unafs")) return unafs(argc, argv); if (!strcmp(name, "unique")) return unique(argc, argv); if (!strcmp(name, "undrop")) return undrop(argc, argv); john_init(name, argc, argv); john_run(); john_done(); return exit_status; }
/* Free shadow nodes and reparent clean children. */ static void unshadow(struct btree * T, struct node * N) { size_t i; #ifdef SANITY_CHECKS /* Sanity check the B+Tree. */ btree_sanity(T); #endif /* Sanity-check: We should not have reached a dirty node. */ assert(N->state != NODE_STATE_DIRTY); /* If this node is clean, reparent it and return. */ if (N->state == NODE_STATE_CLEAN) { /* Do we need to release a lock on our shadow parent? */ if (node_hasplock(N)) btree_node_unlock(T, N->p_shadow); /* Our dirty parent is our only parent. */ N->p_shadow = N->p_dirty; /* Acquire a lock on our new shadow parent. */ if (node_hasplock(N)) btree_node_lock(T, N->p_shadow); /* We're done. */ return; } /* If this node has children, recurse down. */ if (N->type == NODE_TYPE_PARENT) { for (i = 0; i <= N->nkeys; i++) { /* Recurse down. */ unshadow(T, N->v.children[i]); /* Clear the child pointer. */ N->v.children[i] = NULL; } } #ifdef SANITY_CHECKS /* Sanity check the B+Tree. */ btree_sanity(T); #endif /* Destroy this node. */ btree_node_destroy(T, N); }
/*===========================================================================* * do_clocktick * *===========================================================================*/ PRIVATE void do_clocktick() { /* Despite its name, this routine is not called on every clock tick. It * is called on those clock ticks when a lot of work needs to be done. */ register struct proc *rp; register int proc_nr; if (next_alarm <= realtime) { /* An alarm may have gone off, but proc may have exited, so check. */ next_alarm = LONG_MAX; /* start computing next alarm */ for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) { if (rp->p_alarm != 0) { /* See if this alarm time has been reached. */ if (rp->p_alarm <= realtime) { /* A timer has gone off. If it is a user proc, * send it a signal. If it is a task, call the * function previously specified by the task. */ proc_nr = proc_number(rp); if (watch_dog[proc_nr+NR_TASKS]) { watchdog_proc= proc_nr; (*watch_dog[proc_nr+NR_TASKS])(); } else cause_sig(proc_nr, SIGALRM); rp->p_alarm = 0; } /* Work on determining which alarm is next. */ if (rp->p_alarm != 0 && rp->p_alarm < next_alarm) next_alarm = rp->p_alarm; } } } /* If a user process has been running too long, pick another one. */ if (--sched_ticks == 0) { if (bill_ptr == prev_ptr) lock_sched(); /* process has run too long */ sched_ticks = SCHED_RATE; /* reset quantum */ prev_ptr = bill_ptr; /* new previous process */ } #if (SHADOWING == 1) if (rdy_head[SHADOW_Q]) unshadow(rdy_head[SHADOW_Q]); #endif }
kill_florentine() { unshadow(); destruct( THISO ); }
int main(int argc, char **argv) { char *name; #ifdef _MSC_VER // Send all reports to STDOUT _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT ); _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT ); _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT ); #endif #ifdef __DJGPP__ if (--argc <= 0) return 1; if ((name = strrchr(argv[0], '/'))) strcpy(name + 1, argv[1]); name = argv[1]; argv[1] = argv[0]; argv++; #else if (!argv[0]) name = "john"; else if ((name = strrchr(argv[0], '/'))) name++; #if defined(__CYGWIN32__) || defined (__MINGW32__) || defined (_MSC_VER) else if ((name = strrchr(argv[0], '\\'))) name++; #endif else name = argv[0]; #endif #if defined(__CYGWIN32__) || defined (__MINGW32__) || defined (_MSC_VER) strlwr(name); if (strlen(name) > 4 && !strcmp(name + strlen(name) - 4, ".exe")) name[strlen(name) - 4] = 0; #endif if (!strcmp(name, "unshadow")) { CPU_detect_or_fallback(argv, 0); return unshadow(argc, argv); } if (!strcmp(name, "unafs")) { CPU_detect_or_fallback(argv, 0); return unafs(argc, argv); } if (!strcmp(name, "undrop")) { CPU_detect_or_fallback(argv, 0); return undrop(argc, argv); } if (!strcmp(name, "unique")) { CPU_detect_or_fallback(argv, 0); return unique(argc, argv); } #ifndef _MSC_VER if (!strcmp(name, "ssh2john")) { CPU_detect_or_fallback(argv, 0); return ssh2john(argc, argv); } if (!strcmp(name, "pdf2john")) { CPU_detect_or_fallback(argv, 0); return pdf2john(argc, argv); } if (!strcmp(name, "rar2john")) { CPU_detect_or_fallback(argv, 0); return rar2john(argc, argv); } if (!strcmp(name, "racf2john")) { CPU_detect_or_fallback(argv, 0); return racf2john(argc, argv); } if (!strcmp(name, "pwsafe2john")) { CPU_detect_or_fallback(argv, 0); return pwsafe2john(argc, argv); } #endif #ifdef HAVE_NSS if (!strcmp(name, "mozilla2john")) { CPU_detect_or_fallback(argv, 0); return mozilla2john(argc, argv); } #endif if (!strcmp(name, "zip2john")) { CPU_detect_or_fallback(argv, 0); return zip2john(argc, argv); } #ifdef HAVE_MPI mpi_setup(argc, argv); #endif john_init(name, argc, argv); john_run(); john_done(); #ifdef _MSC_VER _CrtDumpMemoryLeaks(); #endif return exit_status; }