/* Do not run this as root, heh */ #include #include #include #include #include #include #include #include #include #define SYSCALLS_FILE "/usr/include/sys/syscall.h" #define SYSDEF_PREFIX "#define\tSYS_" #define SYSCALL_LEN 32 int main(int ac, char *av[]) { FILE *sfp; char lnbuf[BUFSIZ + 1]; char sclist[SYS_MAXSYSCALL][SYSCALL_LEN]; register int si = 0; int li, sl, sn, ret = -1; char *ae; union { int u_int; char *u_str; } *ap; if (ac < 2) fprintf(stderr, "Usage %s \n", basename(av[0])); if (!(sfp = fopen(SYSCALLS_FILE, "rt"))) err(1, "%s", SYSCALLS_FILE); while (fgets(lnbuf, BUFSIZ + 1, sfp) != 0) { if (!strncmp(lnbuf, SYSDEF_PREFIX, sizeof(SYSDEF_PREFIX) -1)) { li = sizeof(SYSDEF_PREFIX) - 1; while (!isspace(lnbuf[li])) ++li; sl = li - (sizeof(SYSDEF_PREFIX) - 1); sn = (int)strtol(lnbuf + li, NULL, 10); while (si < sn) sclist[si++][0] = '\0'; bcopy(lnbuf + (sizeof(SYSDEF_PREFIX) - 1), sclist[si++], sl); } } if (!feof(sfp)) err(1, "read error"); if (fclose(sfp) == EOF) err(1, "close"); for (;si > 0; --si) if (!strcmp(av[1], sclist[si])) { strtol(*av, &ae, 10); if ((ae - *av) == strlen(*av)) /* XXX */ ret = syscall(si); printf("%s returns %d\n", sclist[si], ret); } if (ret == -1) warnx("no such syscall %s\n", av[1]); return ret; }