/* tty;exec disowntty */ //#include //#include //#include //#include //#include //#include //import std.stdio; import std.string; import std.c.stdlib; import core.thread; import core.sys.posix.signal; import core.sys.posix.sys.ioctl; import core.sys.posix.unistd; import core.sys.posix.stdio; //extern(C) void signal(int sig, void function(int) ); //extern(C) void setbuf(FILE * stream, char * buf); //extern(C) void ioctl(int fd, uint request, int param); void end(string msg) { perror(msg.toStringz); for (;;) Thread.sleep(dur!"seconds"(1)); } alias extern(C) void function(int) sigfn_t; void main(string args[]) { FILE *tty_name_file; if (args.length < 2) exit(1); string tty_filename = args[1]; sigfn_t orig; setbuf (stdout, null); orig = signal (SIGHUP, SIG_IGN); if (orig !is SIG_DFL) end ("signal (SIGHUP)"); printf("%s %s\n", tty_filename.toStringz, ttyname(STDIN_FILENO)); tty_name_file = fopen(tty_filename.toStringz, "w"); fprintf(tty_name_file, "%s\n", ttyname(STDIN_FILENO)); fclose(tty_name_file); /* Verify we are the sole owner of the tty. */ if (ioctl(STDIN_FILENO, TIOCSCTTY, 0) != 0) end ("TIOCSCTTY"); printf("%s %s\n", tty_filename.toStringz, ttyname(STDIN_FILENO)); tty_name_file = fopen(tty_filename.toStringz, "w"); fprintf(tty_name_file, "%s\n", ttyname(STDIN_FILENO)); fclose(tty_name_file); /* Disown the tty. */ if (ioctl (STDIN_FILENO, TIOCNOTTY) != 0) end ("TIOCNOTTY"); end ("OK, disowned"); exit(1); }