aboutsummaryrefslogtreecommitdiff
path: root/jim-posix.c
diff options
context:
space:
mode:
authoroharboe <oharboe>2008-07-14 14:25:34 +0000
committeroharboe <oharboe>2008-07-14 14:25:34 +0000
commita1fabeeb06d51b385283e8c4c89bea5cd28d970f (patch)
tree175bf6429767a475502c2d8475f23176d3eb6481 /jim-posix.c
parentec16a897b19c1cebd1b6babdf107e59a14efdd45 (diff)
downloadjimtcl-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.c245
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;
}