On Tue, 31 Oct 2000, Carel Fellinger wrote: >down /etc/init.d/eam tcp nowait carel /usr/bin/ssh /usr/bin/ssh iae bin/nc mail.iae.nl eam tcp nowait carel /usr/bin/ssh /usr/bin/ssh ire bin/nc uucp.iae.nl uucp-pipes stop
Come again? > > SSHARGS="${SSHFLAGS} -l ${USER} -L ${LOCALPORT}:${DEST}:${REMOTEPORT} > > ${HOST} ${PIPE}l" > > what is this ${PIPE}l? some program you run on the other side? > I would have expected something like "sleep forever". Oh yeah. It's basically "sleep forever" except replace "sleep" with "wait" and add this feature: if an instance of the program already exists, replace it with this one. Code follows below. > So I did it differently using tcp-wrappers/inetd, like this: Cool, let me try it.. -chris /* program that hangs forever */ /* only one instance of it (by a given name) may run at a time */ /* ln(1) the executable to whatever names you need */ #include <stdio.h> #include <unistd.h> #include <strings.h> #include <sys/types.h> #include <signal.h> #include <stdlib.h> #include <malloc.h> #include <libgen.h> int main(int arc, const char** argv) { const char* home = getenv("HOME"); char* fullName = (char *)malloc(1000*sizeof(char)); char* name = NULL; pid_t pid = getpid(); pid_t previousPid = 0; char* fileName = (char*)malloc(1000*sizeof(char)); FILE* file = NULL; int _signal = 9; strcpy(fullName, argv[0]); name = basename(fullName); fileName[0] = (char)0; strcat(fileName, home); strcat(fileName, "/var/run/"); strcat(fileName, name); strcat(fileName, ".pid"); file = fopen(fileName, "r"); if (file == NULL) { fprintf(stderr, "Failed to open file '%s' for reading\n", fileName); exit(1); } fscanf(file, "%d", &previousPid); if (previousPid != pid) { if (previousPid > 0) { /* There is a race condition here. If we kill the old instance before overwriting its PID, a third instance could try to kill a nonexistent process. If on the other hand we overwrite the PID first, a third instance could kill us before we have a chance to kill the old instance. */ int result = kill(previousPid, _signal); if (result != 0) { fprintf(stderr, "Failed to kill PID '%d' with signal '%d'\n" "Continuing anyway...\n", previousPid, _signal); } } } else { fprintf(stderr, "Suicide attempt thwarted\n"); exit(1); } { int result; fclose(file); file = fopen(fileName, "w"); if (file == NULL) { fprintf(stderr, "Failed to open file '%s' for writing\n", fileName); exit(1); } fprintf(file, "%d", pid); fflush(file); fclose(file); result = pause(); fprintf(stderr, "pause() returned value '%d'\n", result); return 0; } }