static void doival(void) { ucell r, *p = (ucell *)(*(ucell *) PC + sizeof(ucell)); ucell ibase = get_myself(); dbg_interp_printk("ivar, offset: %d size: %d\n", p[0], p[1] ); r = ibase ? ibase + p[0] : (ucell)&p[2]; PUSH( *(ucell *)r ); }
static void doival(void) { ucell r, *p = (ucell *)(*(ucell *) cell2pointer(PC) + sizeof(ucell)); ucell ibase = get_myself(); dbg_interp_printk("ivar, offset: %d size: %d\n", p[0], p[1] ); r = ibase ? ibase + p[0] : pointer2cell(&p[2]); PUSH( *(ucell *)cell2pointer(r) ); }
static void doidefer(void) { ucell *p = (ucell *)(*(ucell *) cell2pointer(PC) + sizeof(ucell)); ucell ibase = get_myself(); dbg_interp_printk("doidefer, offset: %d size: %d\n", p[0], p[1] ); PUSHR(PC); PC = ibase ? ibase + p[0] : pointer2cell(&p[2]); PC -= sizeof(ucell); }
int main(int argc, const char **argv) { const char *sysname, *speed; char sysfile[FILENAME_MAX]; char deblogname[FILENAME_MAX]; FILE *f; header_p sys, ich, p; int i; initlog("call"); if (0 == strcmp(argv[0], "-h")) usage(); if (argc < 4 || argc > 5) usage(); gmodem=-1; atexit(cleanup); sysname = strlwr( dstrdup( argv[1] )); if (!strchr(argv[2], '/')) snprintf(tty, sizeof(tty), "/dev/%s", argv[2]); else strcpy(tty, argv[2]); speed = argv[3]; maxtry = 1; if (argc > 4) maxtry = atoi(argv[4]); minireadstat(); sprintf(deblogname, "%s/" DEBUGLOG_FILE, logdir); if(debuglevel>0) { deblogfile = fopen(deblogname, "w"); if (!deblogfile) { printf("Ich kann das Logfile nicht oeffnen. " "Probiere /dev/null...\n"); deblogfile = fopen("/dev/null", "w"); if (!deblogfile) { printf("Hmm... - /dev/null " "nicht schreibbar??\n"); return 10; } } } else { deblogfile = fopen("/dev/null", "w"); if (!deblogfile) { printf("Arghl! - kann /dev/null " "nicht zum Schreiben oeffnen!\n\n"); return 10; } } sprintf(sysfile, "%s/%s", systemedir, sysname); f = fopen(sysfile, "r"); if (!f) { perror(sysfile); newlog(ERRLOG, "File <%s> not readable: %s", sysfile, strerror(errno)); return 1; } sys = rd_para(f); fclose(f); ich = get_myself(); for (i=maxtry; i; i--) { if (lock_device(1, tty)) break; fputs(" ... unser Modem ist belegt\n", stderr); sleep(60); } if (!i) { newlog(ERRLOG, "Cannot lock device: %s", tty); return 9; } #ifdef LEAVE_CTRL_TTY /* * Bisheriges Controlling-TTY verlassen, damit "modem" das neue * wird. */ #ifdef BSD setpgrp(0, getpid()); /* set process group id to process id */ #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif #else /* !BSD */ #if !defined(USE_SETSID) && !defined(USE_SETPGRP) #error Controlling TTY kann nicht verlassen werden: definieren Sie eine Methode dazu #endif /* !BSD und keine SysV-Methode definiert */ #ifdef USE_SETSID #error Dies funktioniert nicht! setsid(); #endif /* USE_SETSID */ #ifdef USE_SETPGRP setpgrp(); #endif /* USE_SETPGRP */ #endif /* !BSD */ #endif /* LEAVE_CTRL_TTY */ gmodem = open(tty, #if !defined(__NetBSD__) O_RDWR | O_NDELAY #else O_RDWR #endif ); DMLOG("open modem"); if (gmodem < 0) { newlog(ERRLOG, "Can not access device %s: %s", tty, strerror(errno)); return 10; } #if !defined(__NetBSD__) else { /* Nonblock abschalten */ int n; n=fcntl(gmodem, F_GETFL, 0); (void)fcntl(gmodem, F_SETFL, n & ~O_NDELAY); } #endif save_linesettings(gmodem); DMLOG("saving modem parameters"); set_rawmode(gmodem); DMLOG("set modem to rawmode"); set_local(gmodem, 1); set_speed(gmodem, speed); DMLOG("set modem speed"); #ifdef TIOCSCTTY ioctl(gmodem, TIOCSCTTY, NULL); #endif files = 0; online_start = 0; fprintf(stderr, "Netcall bei %s [%s]\n", sysname, tty); fclose(stdin); fclose(stdout); dup(gmodem); dup(gmodem); DMLOG("dup modem 2x to stdin and stdout"); if (setjmp(timeout)) { newlog(ERRLOG, "ABBRUCH: Timeout"); lock_device(0, tty); anrufdauer(); if (files) aufraeumen(); return 11; } if (setjmp(nocarrier)) { if (!auflegen) { newlog(ERRLOG, "ABBRUCH: Gegenstelle hat aufgelegt"); } lock_device(0, tty); anrufdauer(); if (files) aufraeumen(); return auflegen ? 0 : 12; } signal(SIGHUP, handle_nocarrier); signal(SIGALRM, handle_timeout); setup_dial_info(ortsnetz, g_int_prefix, g_ovst, NULL); p = find(HD_TEL, sys); if (!p) { newlog(ERRLOG, "Keine Telefonnummer fuer %s gefunden", sysname); return 2; } anruf(sys, ich, gmodem, maxtry); if (online_start) { anrufdauer(); } else { fprintf(stderr, "Keine Verbindung hergestellt.\n"); } lock_device(0, tty); /* Device ist freigegeben, aber wir warten noch auf das Ende der Importphase, bevor wir zurueckkehren. */ wait(NULL); return 0; }