diff options
author | oharboe <oharboe> | 2008-07-14 14:25:34 +0000 |
---|---|---|
committer | oharboe <oharboe> | 2008-07-14 14:25:34 +0000 |
commit | a1fabeeb06d51b385283e8c4c89bea5cd28d970f (patch) | |
tree | 175bf6429767a475502c2d8475f23176d3eb6481 /jim-posix.c | |
parent | ec16a897b19c1cebd1b6babdf107e59a14efdd45 (diff) | |
download | jimtcl-a1fabeeb06d51b385283e8c4c89bea5cd28d970f.zip jimtcl-a1fabeeb06d51b385283e8c4c89bea5cd28d970f.tar.gz jimtcl-a1fabeeb06d51b385283e8c4c89bea5cd28d970f.tar.bz2 |
* signals ( not complete , no eventscripts yet ) sleep and usleep
[pit] point in time and [jpit] julian point in time.
Diffstat (limited to 'jim-posix.c')
-rw-r--r-- | jim-posix.c | 245 |
1 files changed, 245 insertions, 0 deletions
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 <sys/types.h> +#include <sys/time.h> #include <unistd.h> #include <string.h> +#include <signal.h> #include <errno.h> #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 <signame> + + 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<ISEND) && (signums[i] != signal));i++) ; + fprintf(stderr,"signal %d %s\n", signal,signames[i]); +} + +typedef void (*sighandler_t)(int); + +static int Jim_PosixSignalCommand(Jim_Interp *interp, int argc, + Jim_Obj *const *argv) +{ + int sig; + int signum; + sighandler_t lastaction; + sighandler_t nextaction = SIG_DFL; + const char *op; + int strlen = 0; + + if (argc < 2) { + Jim_WrongNumArgs(interp, 1, argv, "signame ?action ...?"); + return JIM_ERR; + } + if (Jim_GetEnum(interp, argv[1], signames, &sig, "Signal Names", + JIM_ERRMSG) != JIM_OK) + return JIM_ERR; + + signum = signums[sig]; + + switch (argc) { + case 3: + if (op = Jim_GetString(argv[2], &strlen),strlen == 0) { + return JIM_ERR; + } + if (strcmp("default",op) == 0) { + nextaction = SIG_DFL; + } else if (strcmp("ignore",op) == 0) { + nextaction = SIG_IGN; + } else if (strcmp("debug",op) == 0) { + nextaction = Jim_Posix_SigHandler; + } else { + // this is the place to insert a script! UK + } + // fall through to query case: + case 2: + lastaction = signal(signum, nextaction); + if (argc==2) + signal(signum, lastaction); + if (lastaction == SIG_ERR) { + return JIM_ERR; + } + if (lastaction == SIG_DFL) { + Jim_SetResultString(interp, "default", -1); + return JIM_OK; + } + if (lastaction == SIG_IGN) { + Jim_SetResultString(interp, "ignore", -1); + return JIM_OK; + } + Jim_SetResultString(interp, "function", -1); + return JIM_OK; + } + + return JIM_OK; +} + + + +// end added int Jim_OnLoad(Jim_Interp *interp) { Jim_InitExtension(interp); @@ -129,5 +370,9 @@ int Jim_OnLoad(Jim_Interp *interp) Jim_CreateCommand(interp, "os.getids", Jim_PosixGetidsCommand, NULL, NULL); Jim_CreateCommand(interp, "os.gethostname", Jim_PosixGethostnameCommand, NULL, NULL); Jim_CreateCommand(interp, "os.sethostname", Jim_PosixSethostnameCommand, NULL, NULL); + Jim_CreateCommand(interp, "os.usleep", Jim_LinuxUSleepCommand, NULL, NULL); + Jim_CreateCommand(interp, "os.signal", Jim_PosixSignalCommand, NULL, NULL); + Jim_CreateCommand(interp, "pit", Jim_PointInTimeCommand, NULL, NULL); + Jim_CreateCommand(interp, "Jpit", Jim_PointInTimeJulianCommand, NULL, NULL); return JIM_OK; } |