This is modem.c in view mode; [Download] [Up]
/* TEXT WAS MADE WITH 4*SPACE = 1*TAB program : modem.c date : 05.April. 1993 purpose : author : by jolly ( who else ) */ /*************************************************************************************modem */ #import <libc.h> #import <sys/dir.h> #import "precomp.h" extern int modem; void reset_modem(void) { #if DEBUG log("resetting modem"); #endif ioctl(modem,TIOCCDTR,NULL); /*say("\x10\x03\n\x10\x03\nYYY");wait_for("XXX",500);*/ ioctl(modem,TIOCSDTR,NULL); usleep(100000); ask("ATZ","OK"); ask("AT+FCLASS=0","OK"); ask("at&D3&N0&S1E1S0=0","OK"); } int tst_lock(void) { DIR *dirp; struct direct *dp; int lckfeil,pid=0; char lck[MAXPATHLEN]; #if ASCII_PIDS char pid_str[12]; #endif dirp = opendir(LCKDIR); if(dirp==NULL) fatal("Lock-Directory not found."); for(dp = readdir(dirp); dp != NULL; dp =readdir(dirp)) if(!strncmp (dp->d_name, "LCK..", sizeof ("LCK..")-1) && !strcmp(LCKTST,dp->d_name+dp->d_namlen-strlen(LCKTST) )) { sprintf(lck,"%s%s",LCKDIR,dp->d_name); lckfeil=open(lck,O_RDONLY,NULL); if(lckfeil==-1) break; #if ASCII_PIDS read (lckfeil, pid_str, sizeof (pid_str)); pid = atoi (pid_str); #else read(lckfeil,&pid,sizeof(int)); #endif close(lckfeil); if(kill(pid,0)==0 && pid!=getpid()) { closedir(dirp); return pid; } } closedir(dirp); return 0; } void open_line(char *device) { int lckfeil,pid; struct sgttyb tdis; char lockfeil[MAXPATHLEN]; /* rewritten to wait _at least_ 2 seconds after the release of the line by another process until open is issued. I hope this will prevent the system panic which occured when leaving kermit to disappear. kiwi@belly */ do { while ((pid=tst_lock()) && pid && (kill (pid, 0) == 0)) sleep (2); sleep(2); } while((pid=tst_lock()) && pid && (kill (pid, 0) == 0)); modem=open(device,O_RDWR); if(modem==-1) fatal("in open_line failed to open device %s",device); if( ioctl(modem,TIOCGETP,&tdis) == -1 ) log("Can't execute ioctl TIOCGETP"); tdis.sg_ispeed=SPD; tdis.sg_ospeed=SPD; tdis.sg_flags=RAW|TANDEM; /* how comes that in TANDEM mode we receive XON/XOFF characters? */ if( ioctl(modem,TIOCSETP,&tdis) == -1 ) log("Can't execute ioctl TIOCSETP"); //if( ioctl(modem,TIOCEXCL,NULL) == -1 ) log("Can't execute ioctl TIOCNXCL"); if( ioctl(modem,TIOCCDTR,NULL) == -1 ) log("Can't execute ioctl TIOCSDTR"); //say("\x10\x03"); //say("YYY");wait_for("XXX",500); // clear queue if( ioctl(modem,TIOCSDTR,NULL) == -1 ) log("Can't execute ioctl TIOCSDTR"); /* set blocking read/write */ /*fcntl(modem, F_SETFL, fcntl(modem, F_GETFL, 0)&~O_NDELAY);*/ /* why no dup STD_IN? */ dup2(modem,STD_OUT); dup2(modem,STD_ERR); sprintf(lockfeil,"%s%s",LOCKFILE,device+5); lckfeil=open(lockfeil,O_WRONLY | O_CREAT); pid=getpid(); if(lckfeil!=-1) { #if ASCII_PIDS char pid_str[12]; sprintf (pid_str, "%10d\n", pid); write (lckfeil, pid_str, strlen (pid_str)); #else write(lckfeil,&pid,sizeof(int)); #endif close(lckfeil); } else fatal("can't lock %s",lockfeil); } void unlock_line(char *device) { char lockfeil[MAXPATHLEN]; sprintf(lockfeil,"%s%s",LOCKFILE,device+5); if(!tst_lock()) remove(lockfeil); #if DEBUG else log("lockfile changed by someone else !"); #endif } int close_line(char *device) { int tty; unlock_line(device); #if NORMALMODE tty=open("/dev/tty",O_RDWR); ioctl(tty, TIOCNOTTY, 0); #endif close(STD_IN); close(STD_OUT); close(STD_ERR); return 1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.