static void JimInterpCopyVariable(Jim_Interp *target, Jim_Interp *source, const char *var, const char *default_value) { Jim_Obj *value = Jim_GetGlobalVariableStr(source, var, JIM_NONE); const char *str; str = value ? Jim_String(value) : default_value; if (str) { Jim_SetGlobalVariableStr(target, var, Jim_NewStringObj(target, str, -1)); } }
static int JimAioAcceptHelper(Jim_Interp *interp, AioFile *serv_af ) { int sock; int addrlen = sizeof(struct sockaddr_in); AioFile *af; char buf[AIO_CMD_LEN]; Jim_Obj *objPtr; long fileId; fprintf(stderr,"accepting connection for %d \n",serv_af->fd); sock = accept(serv_af->fd,(struct sockaddr*)&serv_af->sa,&addrlen); fprintf(stderr,"done, got %d \n",sock); if (sock < 0) return JIM_ERR; /* Get the next file id */ fprintf(stderr,"getting fileid:"); if (Jim_EvalGlobal(interp, "if {[catch {incr aio.fileId}]} {set aio.fileId 0}") != JIM_OK) return JIM_ERR; objPtr = Jim_GetGlobalVariableStr(interp, "aio.fileId", JIM_ERRMSG); if (objPtr == NULL) return JIM_ERR; if (Jim_GetLong(interp, objPtr, &fileId) != JIM_OK) return JIM_ERR; fprintf(stderr," %ld\n", fileId); /* Create the file command */ af = Jim_Alloc(sizeof(*af)); af->fd = sock; af->fp = fdopen(sock,"r+"); af->OpenFlags = AIO_FDOPEN; af->flags = fcntl(af->fd,F_GETFL); // fprintf(stderr,"hallo\n"); af->rEvent = NULL; af->wEvent = NULL; af->eEvent = NULL; sprintf(buf, "aio.sockstream%ld", fileId); Jim_CreateCommand(interp, buf, JimAioHandlerCommand, af, JimAioDelProc); Jim_SetResultString(interp, buf, -1); fprintf(stderr,"returning\n"); return JIM_OK; }
static int JimAioSockCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { FILE *fp; AioFile *af; char buf[AIO_CMD_LEN]; char *hdlfmt; // const char *mode = "r"; Jim_Obj *objPtr; long fileId; const char *socktypes[] = { "file", "pipe", "tty", "domain", "dgram", "stream", "stream.server", NULL }; enum { FILE_FILE, FILE_PIPE, FILE_TTY, SOCK_DOMAIN, SOCK_DGRAM_CL, SOCK_STREAM_CL, SOCK_STREAM_SERV }; int socktype; int sock; const char *hostportarg; int hostportlen; char a[0x20]; char b[0x20]; char c[0x20]; char np[] = "0"; char nh[] = "0.0.0.0"; char* stsrcport; char* sthost; char* stport; unsigned int srcport; unsigned int port; struct sockaddr_in sa; struct hostent *he; int res; if (argc <= 2 ) { Jim_WrongNumArgs(interp, 1, argv, "sockspec ?script?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], socktypes, &socktype, "socket type", JIM_ERRMSG) != JIM_OK) return JIM_ERR; fprintf(stderr,"socktype: %s \n",socktypes[socktype]); hostportarg = Jim_GetString(argv[2], &hostportlen); fprintf(stderr,"hostportarg: %s %d \n",hostportarg,hostportlen); switch (sscanf(hostportarg,"%[^:]:%[^:]:%[^:]",a,b,c)) { case 3: stsrcport = a; sthost = b; stport = c; break; case 2: stsrcport = np; sthost = a; stport = b; break; case 1: stsrcport = np; sthost = nh; stport = a; break; default: return JIM_ERR; } fprintf(stderr,"socktype: %d srcport: %s host:%s port %s \n", socktype,stsrcport,sthost,stport); if (0 == strncmp(sthost,"ANY",3)) sthost = "0.0.0.0"; srcport = atol(stsrcport); port = atol(stport); he = gethostbyname(sthost); /* FIX!!!! this still results in null pointer exception here. /* FIXED!!!! debug output but no JIM_ERR done UK. if (!he) { Jim_SetResultString(interp,hstrerror(h_errno),-1); return JIM_ERR; } fprintf(stderr,"Official name is: %s\n", he->h_name); fprintf(stderr,"IP address: %s\n", inet_ntoa(*(struct in_addr*)he->h_addr)); */ sock = socket(PF_INET,SOCK_STREAM,0); fprintf(stderr,"srcp: %x port: %x IP: %x sock: %d type: %d\n",srcport,port,he->h_addr,sock,socktype); switch (socktype) { case SOCK_DGRAM_CL: hdlfmt = "aio.sockdgram%ld" ; break; case SOCK_STREAM_CL: fprintf(stderr,"setting up client socket\n"); sa.sin_family= he->h_addrtype; bcopy(he->h_addr,(char *)&sa.sin_addr,he->h_length); /* set address */ sa.sin_port = htons(port); res = connect(sock,(struct sockaddr*)&sa,sizeof(sa)); if (res) { close(sock); JimAioSetError(interp); return JIM_ERR; } hdlfmt = "aio.sockstrm%ld" ; break; case SOCK_STREAM_SERV: fprintf(stderr,"setting up listening socket\n"); sa.sin_family= he->h_addrtype; bcopy(he->h_addr,(char *)&sa.sin_addr,he->h_length); /* set address */ sa.sin_port = htons(port); res = bind(sock,(struct sockaddr*)&sa,sizeof(sa)); if (res) { close(sock); JimAioSetError(interp); return JIM_ERR; } res = listen(sock,5); if (res) { close(sock); JimAioSetError(interp); return JIM_ERR; } hdlfmt = "aio.socksrv%ld" ; break; } fp = fdopen(sock, "r+" ); fprintf(stderr,"fp: %p \n",fp); if (fp == NULL) { close(sock); JimAioSetError(interp); return JIM_ERR; } /* Get the next file id */ if (Jim_EvalGlobal(interp, "if {[catch {incr aio.fileId}]} {set aio.fileId 0}") != JIM_OK) return JIM_ERR; objPtr = Jim_GetGlobalVariableStr(interp, "aio.fileId", JIM_ERRMSG); if (objPtr == NULL) return JIM_ERR; if (Jim_GetLong(interp, objPtr, &fileId) != JIM_OK) return JIM_ERR; /* Create the file command */ af = Jim_Alloc(sizeof(*af)); af->fp = fp; af->fd = sock; af->OpenFlags = AIO_FDOPEN; af->flags = fcntl(af->fd,F_GETFL); fprintf(stderr,"hallo\n"); af->rEvent = NULL; af->wEvent = NULL; af->eEvent = NULL; sprintf(buf, hdlfmt, fileId); fprintf(stderr,"hallo:%s\n",buf); Jim_CreateCommand(interp, buf, JimAioHandlerCommand, af, JimAioDelProc); Jim_SetResultString(interp, buf, -1); return JIM_OK; }
static int JimAioOpenCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { FILE *fp; AioFile *af; char buf[AIO_CMD_LEN]; const char *mode = "r"; Jim_Obj *objPtr; long fileId; const char *options[] = {"input", "output", "error", NULL}; enum {OPT_INPUT, OPT_OUTPUT, OPT_ERROR}; int OpenFlags = 0; int modeLen; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "filename ?mode?"); return JIM_ERR; } if (argc == 3) mode = Jim_GetString(argv[2], &modeLen); if (argc == 3 && Jim_CompareStringImmediate(interp, argv[1], "standard") && modeLen >= 3) { int option; if (Jim_GetEnum(interp, argv[2], options, &option, "standard channel", JIM_ERRMSG) != JIM_OK) return JIM_ERR; OpenFlags |= AIO_KEEPOPEN; switch (option) { case OPT_INPUT: fp = stdin; break; case OPT_OUTPUT: fp = stdout; break; case OPT_ERROR: fp = stderr; break; default: fp = NULL; Jim_Panic(interp,"default reached in JimAioOpenCommand()"); break; } } else { fp = fopen(Jim_GetString(argv[1], NULL), mode); if (fp == NULL) { JimAioSetError(interp); return JIM_ERR; } } /* Get the next file id */ if (Jim_EvalGlobal(interp, "if {[catch {incr aio.fileId}]} {set aio.fileId 0}") != JIM_OK) return JIM_ERR; objPtr = Jim_GetGlobalVariableStr(interp, "aio.fileId", JIM_ERRMSG); if (objPtr == NULL) return JIM_ERR; if (Jim_GetLong(interp, objPtr, &fileId) != JIM_OK) return JIM_ERR; /* Create the file command */ af = Jim_Alloc(sizeof(*af)); af->fp = fp; af->fd = fileno(fp); af->flags = fcntl(af->fd,F_GETFL); af->OpenFlags = OpenFlags; // fprintf(stderr,"hallo\n"); af->rEvent = NULL; af->wEvent = NULL; af->eEvent = NULL; sprintf(buf, "aio.handle%ld", fileId); Jim_CreateCommand(interp, buf, JimAioHandlerCommand, af, JimAioDelProc); Jim_SetResultString(interp, buf, -1); return JIM_OK; }
/* Syslog_Log - * implements syslog tcl command. General format: syslog ?options? level text * options -facility -ident -options * * syslog ?-facility cron|daemon|...? ?-ident string? ?-options int? ?debug|info|...? text */ int Jim_SyslogCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int priority = LOG_INFO; int i = 1; SyslogInfo *info = Jim_CmdPrivData(interp); if (argc <= 1) { wrongargs: Jim_WrongNumArgs(interp, 1, argv, "?-facility cron|daemon|...? ?-ident string? ?-options int? ?debug|info|...? message"); return JIM_ERR; } while (i < argc - 1) { if (Jim_CompareStringImmediate(interp, argv[i], "-facility")) { int entry = Jim_FindByName(Jim_String(argv[i + 1]), facilities, sizeof(facilities) / sizeof(*facilities)); if (entry < 0) { Jim_SetResultString(interp, "Unknown facility", -1); return JIM_ERR; } if (info->facility != entry) { info->facility = entry; if (info->logOpened) { closelog(); info->logOpened = 0; } } } else if (Jim_CompareStringImmediate(interp, argv[i], "-options")) { long tmp; if (Jim_GetLong(interp, argv[i + 1], &tmp) == JIM_ERR) { return JIM_ERR; } info->options = tmp; if (info->logOpened) { closelog(); info->logOpened = 0; } } else if (Jim_CompareStringImmediate(interp, argv[i], "-ident")) { strncpy(info->ident, Jim_String(argv[i + 1]), sizeof(info->ident)); info->ident[sizeof(info->ident) - 1] = 0; if (info->logOpened) { closelog(); info->logOpened = 0; } } else { break; } i += 2; } /* There should be either 0, 1 or 2 args left */ if (i == argc) { /* No args, but they have set some options, so OK */ return JIM_OK; } if (i < argc - 1) { priority = Jim_FindByName(Jim_String(argv[i]), priorities, sizeof(priorities) / sizeof(*priorities)); if (priority < 0) { Jim_SetResultString(interp, "Unknown priority", -1); return JIM_ERR; } i++; } if (i != argc - 1) { goto wrongargs; } if (!info->logOpened) { if (!info->ident[0]) { Jim_Obj *argv0 = Jim_GetGlobalVariableStr(interp, "argv0", JIM_NONE); if (argv0) { strncpy(info->ident, Jim_String(argv0), sizeof(info->ident)); } else { strcpy(info->ident, "Tcl script"); } info->ident[sizeof(info->ident) - 1] = 0; } openlog(info->ident, info->options, info->facility); info->logOpened = 1; } syslog(priority, "%s", Jim_String(argv[i])); return JIM_OK; }