From a1fabeeb06d51b385283e8c4c89bea5cd28d970f Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 14 Jul 2008 14:25:34 +0000 Subject: * signals ( not complete , no eventscripts yet ) sleep and usleep [pit] point in time and [jpit] julian point in time. --- jim-posix.c | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) (limited to 'jim-posix.c') diff --git a/jim-posix.c b/jim-posix.c index 8fddeaf..ba4e156 100644 --- a/jim-posix.c +++ b/jim-posix.c @@ -18,8 +18,10 @@ */ #include +#include #include #include +#include #include #define JIM_EXTENSION @@ -118,7 +120,246 @@ static int Jim_PosixSethostnameCommand(Jim_Interp *interp, int argc, } return JIM_OK; } +// added Commands, some linux specific +// uses POSIX.1b +#define S_NS 1000000000 +#define S_US 1000000 +#define MSNS 1000000 +#define USNS 1000 +#define NSNS 1 + +static int Jim_LinuxUSleepCommand(Jim_Interp *interp, int argc, + Jim_Obj *const *argv) +{ + int mult = NSNS ; + double floatValue ; + const char *units ; + long long delay ; + int len ; + struct timespec tv; + + switch (argc) { + case 3: + units = Jim_GetString(argv[2], &len); + if (units == NULL) + return JIM_ERR; + switch (*units) { + case 's': mult = S_NS; break; + case 'm': mult = MSNS; break; + case 'u': mult = USNS; break; + case 'n': mult = NSNS; break; + default: + Jim_WrongNumArgs(interp, 1, argv, "arg3: ms us ns or empty"); + return JIM_ERR; + } + // fallthrough + case 2: if (Jim_GetDouble(interp, argv[1], &floatValue) != JIM_OK) + return JIM_ERR; + delay = (long long)(floatValue * mult); + break; + default: + Jim_WrongNumArgs(interp, 1, argv, "?useconds?"); + return JIM_ERR; + } + tv.tv_sec = delay / S_NS; + tv.tv_nsec = delay % S_NS; + fprintf(stderr,"delay: %lld mult: %d sec: %ld ns: %ld\n", delay, mult, tv.tv_sec,tv.tv_nsec ); + nanosleep(&tv,NULL); + return JIM_OK; +} + +static int Jim_PointInTimeCommand(Jim_Interp *interp, int argc, + Jim_Obj *const *argv) +{ + struct timezone tz = { 0, 0 }; + double pit ; + struct timeval tv; + + gettimeofday(&tv,&tz); + pit = (double)tv.tv_usec; + pit /= (double)S_US; + pit +=(double)tv.tv_sec; + + Jim_SetResult(interp, Jim_NewDoubleObj(interp, pit)); + return JIM_OK; +} + +static int Jim_PointInTimeJulianCommand(Jim_Interp *interp, int argc, + Jim_Obj *const *argv) +{ + struct timezone tz = { 0, 0 }; + double pit ; + struct timeval tv; + + gettimeofday(&tv,&tz); + pit = (double)tv.tv_usec; + pit /= (double)S_US; + pit += (double)tv.tv_sec; + pit /= (double)( 60 * 60 * 24 ); + pit += 2440587.5; + + Jim_SetResult(interp, Jim_NewDoubleObj(interp, pit)); + return JIM_OK; +} + +// signal stuff +// signal + + static const char *signames[] = { + "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", + "SIGABRT", "SIGFPE", "SIGKILL", "SIGSEGV", + "SIGPIPE", "SIGALRM", "SIGTERM", + "SIGUSR1", "SIGUSR2", + "SIGCHLD", "SIGCONT", "SIGSTOP", + "SIGTSTP", "SIGTTIN" "SIGTTOU", + "SIGBUS", "SIGPOLL", "SIGPROF", "SIGSYS", + "SIGTRAP", "SIGURG", "SIGVTALRM", "SIGXCPU", + "SIGXFSZ", + "SIGIOT", +#ifdef SIGEMT + "SIGEMT", +#endif + "SIGSTKFLT", "SIGIO", + "SIGCLD", "SIGPWR", +#ifdef SIGINFO + "SIGINFO", +#endif +#ifdef SIGLOST + "SIGLOST", +#endif + "SIGWINCH", "SIGUNUSED", + "SIGRT32", "SIGRT33", "SIGRT34", "SIGRT35", + "SIGRT36", "SIGRT37", "SIGRT38", "SIGRT39", + NULL + } ; +static int signums[] = { + SIGHUP, SIGINT, SIGQUIT, SIGILL, + SIGABRT, SIGFPE, SIGKILL, SIGSEGV, + SIGPIPE, SIGALRM, SIGTERM, + SIGUSR1, SIGUSR2, + SIGCHLD, SIGCONT, SIGSTOP, + SIGTSTP, SIGTTIN, SIGTTOU, + SIGBUS, SIGPOLL, SIGPROF, SIGSYS, + SIGTRAP, SIGURG, SIGVTALRM, SIGXCPU, + SIGXFSZ, + SIGIOT, +#ifdef SIGEMT + SIGEMT, +#endif + SIGSTKFLT, SIGIO, + SIGCLD, SIGPWR, +#ifdef SIGINFO + SIGINFO, +#endif +#ifdef SIGLOST + SIGLOST, +#endif + SIGWINCH, SIGUNUSED, +#ifdef SIGRT + SIGRT32, SIGRT33, SIGRT34, SIGRT35, + SIGRT36, SIGRT37, SIGRT38, SIGRT39, +#endif + 0 + } ; +enum { + HUP, INT, QUIT, ILL, + ABRT, FPE, KILL, SEGV, + PIPE, ALRM, TERM, + USR1, USR2, + CHLD, CONT, STOP, + TSTP, TTIN, TTOU, + BUS, POLL, PROF, SYS, + TRAP, URG, VTALRM, XCPU, + XFSZ, + IOT, +#ifdef SIGEMT + EMT, +#endif + STKFLT, IO, + CLD, PWR, +#ifdef SIGINFO + INFO, +#endif +#ifdef SIGLOST + LOST, +#endif + WINCH, UNUSED, +#ifdef SIGRT + RT32, RT33, RT34, RT35, + RT36, RT37, RT38, RT39, +#endif + ISEND + } ; +static void Jim_Posix_SigHandler(int signal) +{ + int i; + for (i=0; ((i