This is dial.c in view mode; [Download] [Up]
/*********************************************************************/ /* */ /* Programmer: */ /* Olaf Mueller <olaf@orest.escape.de> */ /* */ /* Purpose: */ /* Answering Machine */ /* dialing with a ZyXEL modem */ /* */ /* History: */ /* 29-08-96 Initial Release Olaf Mueller */ /* */ /* Notes: */ /* */ /*********************************************************************/ #include <libc.h> #include "const.h" #include "misc.h" #include "device.h" #include "iodev.h" #define NoDEBUG static int line = 0 ; static char port ; static int hangupNeeded = 0 ; #ifdef DEBUG static int dialog (int line,long msec,char *until,char *question,...) { va_list ap ; char buffer [1000] ; long usedtime ; char sbuf [1000] , rbuf [1000] ; int len , rc = -1 ; va_start (ap,question) ; vsprintf (buffer,question,ap) ; va_end (ap) ; debugsputs (sbuf,buffer) ; debugsputs (rbuf,until) ; printf ("send \"%s\" wait for \"%s\"\n",sbuf,rbuf) ; len = strlen (buffer) ; if (write(line,buffer,len) == len) { if ((usedtime = readUntil(line,msec,until)) >= 0L) { printf ("got it after %ld msec\n",usedtime) ; rc = 0 ; } else printf ("reading failed (Timeout after %ld msec)\n",msec) ; } else printf ("writing failed\n") ; return rc ; } #else static int dialog (int line,long msec,char *until,char *question,...) { va_list ap ; char buffer [1000] ; long usedtime ; int len , rc = -1 ; va_start (ap,question) ; vsprintf (buffer,question,ap) ; va_end (ap) ; len = strlen (buffer) ; if (write(line,buffer,len) == len) if ((usedtime = readUntil(line,msec,until)) >= 0L) rc = 0 ; return rc ; } #endif static void signalhandler (int sig) { switch (sig) { case SIGINT: case SIGTERM: case SIGTSTP: if (line > 0) { if (hangupNeeded) dialog (line,2000L,"OK\r\n","ATH\r") ; printf ("\ndial: break\n") ; closeDevice (line) ; unlockDevice (DIALOUT,port) ; exit (1) ; } break ; } } int main (int argc,char *argv[]) { int rc , ringcount ; char buf [1000] ; if (argc != 3) { printf ("usage: dial <port> <number_to_dial>\n") ; return 1 ; } port = *argv[1] ; if (strlen(argv[1]) != 1 || (port != 'a' && port != 'b')) { printf ("dial: bad port description (use \'a\' or \'b\')\n") ; return 1 ; } signal (SIGALRM,signalhandler) ; siginterrupt (SIGALRM,1) ; signal (SIGINT,signalhandler) ; signal (SIGTERM,signalhandler) ; signal (SIGTSTP,signalhandler) ; if ((rc = lockDevice(DIALOUT,port)) == 0) { if ((line = openDevice(DIALOUT,port)) >= 0) { initDevice (line,B38400) ; printf ("dial: initializing modem\n") ; dialog (line,2000L,"OK\r\n","AT\r") ; dialog (line,2000L,"OK\r\n","ATZ\r") ; dialog (line,2000L,"OK\r\n","ATE1M2L5&D3S0=0\r") ; dialog (line,2000L,"OK\r\n","AT+FCLASS=8\r") ; printf ("dial: dialing...\n") ; dialog (line,2000L,"\r","ATDT%s\r",argv[2]) ; for ( ringcount = 0 ; ; ) { if (readUntil(line,40000L,"\r\n") != -1L && readAnswerUntil(line,500L,buf,sizeof(buf),"\r\n") != -1L) { if (!strcmp(buf,"BUSY")) { printf ("dial: Sorry: line busy\n") ; hangupNeeded = 0 ; break ; } else if (!strcmp(buf,"NO DIALTONE")) { printf ("dial: Sorry: no dial tone\n") ; hangupNeeded = 0 ; break ; } else if (!strcmp(buf,"NO CARRIER")) { printf ("dial: Sorry: no carrier\n") ; hangupNeeded = 0 ; break ; } else if (!strcmp(buf,"NO ANSWER")) { printf ("dial: Sorry: no answer\n") ; hangupNeeded = 0 ; break ; } else if (!strcmp(buf,"VCON")) { printf ("dial: voice connection\n") ; hangupNeeded = 1 ; break ; } else if (!strcmp(buf,"RINGING")) { printf ("dial: ringing %d\n",++ringcount) ; hangupNeeded = 1 ; } } else { hangupNeeded = 1 ; break ; } } if (hangupNeeded) while (1) sleep (1000) ; closeDevice (line) ; } else printf ("dial: cannot open dial out line\n") ; unlockDevice (DIALOUT,port) ; } else printf ("dial: cannot lock dial out line\n") ; return rc ; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.