void rebootcmd(int argc, char *argv[]) { Chan *c; Exec exec; ulong magic, text, rtext, entry, data, size; uchar *p; if(argc == 0) exit(0); c = namec(argv[0], Aopen, OEXEC, 0); if(waserror()){ cclose(c); nexterror(); } readn(c, &exec, sizeof(Exec)); magic = l2be(exec.magic); entry = l2be(exec.entry); text = l2be(exec.text); data = l2be(exec.data); if(magic != AOUT_MAGIC) error(Ebadexec); /* round text out to page boundary */ rtext = ROUNDUP(entry+text, PGSZ)-entry; size = rtext + data; p = malloc(size); if(p == nil) error(Enomem); if(waserror()){ free(p); nexterror(); } memset(p, 0, size); readn(c, p, text); readn(c, p + rtext, data); ksetenv("bootfile", argv[0], 1); setbootcmd(argc-1, argv+1); reboot((void*)entry, p, size); panic("return from reboot!"); }
void rebootcmd(int argc, char *argv[]) { Chan *c; Exec exec; Execvals ev; ulong magic, text, rtext, entry, data, size; uchar *p; if(argc == 0) exit(0); c = namec(argv[0], Aopen, OEXEC, 0); if(waserror()){ cclose(c); nexterror(); } readn(c, &exec, sizeof(Exec)); magic = l2be(exec.magic); /* * AOUT_MAGIC is sometimes defined like this: * #define AOUT_MAGIC V_MAGIC || magic==M_MAGIC * so we can only use it in a fairly stylized manner. */ if(magic == AOUT_MAGIC) { entry = l2be(exec.entry); text = l2be(exec.text); data = l2be(exec.data); } else if(parseboothdr && (*parseboothdr)(c, magic, &ev) >= 0 || readelfhdr(c, magic, &ev) >= 0 || readelf64hdr(c, magic, &ev) >= 0){ entry = ev.entry; text = ev.textsize; data = ev.datasize; } else { error(Ebadexec); return; /* for the compiler */ } /* round text out to page boundary */ rtext = ROUNDUP(entry+text, BY2PG) - entry; size = rtext + data; p = malloc(size); if(p == nil) error(Enomem); if(waserror()){ free(p); nexterror(); } memset(p, 0, size); readn(c, p, text); readn(c, p + rtext, data); ksetenv("bootfile", argv[0], 1); setbootcmd(argc-1, argv+1); reboot((void*)entry, p, size); panic("return from reboot!"); }