static void checksched(void) { time_t t; struct schedcmd *sch; if(!schedcmds) return; t = time(NULL); /* * List is ordered, so we only need to consider the * head element. */ while (schedcmds && schedcmds->time <= t) { /* * Remove the entry to be executed from the list * before execution: this makes quite sure that * the entry hasn't been monkeyed with when we * free it. */ sch = schedcmds; schedcmds = sch->next; /* * Delete from the timed function list now in case * the called code reschedules. */ scheddeltimed(); if ((sch->flags & SCHEDFLAG_TRASH_ZLE) && zleactive) zleentry(ZLE_CMD_TRASH); execstring(sch->cmd, 0, 0, "sched"); zsfree(sch->cmd); zfree(sch, sizeof(struct schedcmd)); /* * Fix time for future events. * I had this outside the loop, for a little extra efficiency. * However, it then occurred to me that having the list of * forthcoming entries up to date could be regarded as * a feature, and the inefficiency is negligible. * * Careful in case the code we called has already set * up a timed event; if it has, that'll be up to date since * we haven't changed the list here. */ if (schedcmds && !schedcmdtimed) { /* * We've already delete the function from the list. */ DPUTS(timedfns && firstnode(timedfns), "BUG: already timed fn (1)"); schedaddtimed(schedcmds->time); } } }
void init_misc(void) { if (cmd) { if (SHIN >= 10) fclose(bshin); SHIN = movefd(open("/dev/null", O_RDONLY)); bshin = fdopen(SHIN, "r"); execstring(cmd, 0, 1); stopmsg = 1; zexit(lastval, 0); } if (interact && isset(RCS)) readhistfile(getsparam("HISTFILE"), 0); adjustwinsize(); /* check window size and adjust if necessary */ }