#include #include #include #include #include #include #include "systime.h" #include #include #include "misc/misc.h" #include "msg/msg.h" #include "relay-ctrl.h" const char program[] = "relay-ctrl-allow"; const int msg_show_pid = 1; static const char* ip; static const char* dir; static int write_env(int fd, const char* var) { const char* env; int len; if ((env = getenv(var)) != 0) { len = strlen(var); if (write(fd, var, len) != len) return 0; if (write(fd, "=", 1) != 1) return 0; len = strlen(env) + 1; if (write(fd, env, len) != len) return 0; } return 1; } static void make_file(const char* filename) { int fd; int error; int saved_umask; int mode; char tmpfile[256]; char* ptr; struct timeval t; switch (do_chdir()) { case 0: return; case 2: mode = 0666; break; default: mode = 0600; break; } saved_umask = umask(0); gettimeofday(&t, 0); ptr = tmpfile; *ptr++ = '.'; ptr = utoa2(t.tv_sec, ptr); *ptr++ = '.'; ptr = utoa2(t.tv_usec, ptr); *ptr++ = ':'; ptr = utoa2(getpid(), ptr); if ((fd = open(tmpfile, O_WRONLY|O_CREAT|O_EXCL, mode)) == -1) warn3sys("Could not open '", tmpfile, "' for writing"); else { error = 0; if (!write_env(fd, "USER") || !write_env(fd, "DOMAIN") || close(fd) == -1) { warn3sys("Could not write to '", filename, "'"); close(fd); } else if (rename(tmpfile, filename) == -1) warn5sys("Could not rename '", tmpfile, "' to '", filename, "'"); unlink(tmpfile); } umask(saved_umask); do_chdir_back(); } int main(int argc, char* argv[]) { if ((ip = getenv("TCPREMOTEIP")) == 0 || (ip = validate_ip(ip)) == 0) die1(111, "Must be run from tcp-env or tcpserver."); if ((dir = getenv("RELAY_CTRL_DIR")) == 0) warn1("$RELAY_CTRL_DIR is not set."); else if (is_authenticated()) make_file(ip); if (argc > 1) { execvp(argv[1], argv+1); return 111; } return 0; }