This is fax.c in view mode; [Download] [Up]
/* TEXT WAS MADE WITH 4*SPACE = 1*TAB program : fax.c version : see the version.h file date : 05 February 1994 author : by jolly ( who else ) */ #import <stdio.h> #import <libc.h> #import "precomp.h" extern modem; extern realtime; extern timerstatus; int try_fax_connection(char *rec_name) { ask("at+flid=%s","OK",FAXNUMBER); ask("at#v1#t1#r0#l0#c7","OK"); ask("ate0","OK"); ask("at#f#b1","OK"); ask("at+fclass=6","OK"); say("ata"); if(wait_for("CONNECT FAX",MAX_FD*2000) ) { #if DEBUG log("Got Fax Connection"); #endif if(rec_name!=NULL) remove(rec_name); recv_fax(); } exit(0); return 0; } int recv_fax() { static FILE *tmpfeil; static char tmpname[MAXPATHLEN]; static char pstring[MAXPATHLEN]; int page=0; static char momstr[100]; static char brk=DC2; static char header[3]; char vres,coding,width; if(!wait_for("ZyXEL\r\n:",5000)) exit(1); write(modem,&brk,1); wait_for("/S",500); read_string("\r\n",tmpname,1500); sscanf(tmpname,"%*4sV%cT%cR%c",&vres,&coding,&width); #if DEBUG log("Connected with Fax ID:#%s#",tmpname+15); log("VRes:%c Coding:%c Width:%c",vres,coding,width); #endif header[0]=vres; header[1]='0'; header[2]=coding; while(read_page(++page,header)); tmpfeil=fopen("tmpfax.fax","w"); fclose(tmpfeil); sprintf(pstring,"%d",page-1); switch(vfork()) { case 0 : execle("/usr/lib/NextPrinter/faxcleanup","faxcleanup",pstring,"tmpfax",NULL,NULL);exit(1);break; case -1 : fatal("Can't fork \n");break; default : wait( (union wait*)0); } sprintf(tmpname,"%s/%s.fax",FAX_DIR,get_time(momstr)); #if DEBUG log("tmpname now :%s",tmpname); #endif rename("tmpfax.fax",tmpname); #if DEBUG < 2 remove("tmpfax.ctl"); while(page--) { sprintf(pstring,"tmpfax.%1d%1d%1d",page/100,(page%100)/10,page%10); remove(pstring); } #endif wait_for("XXX",200); say("ATZ4"); wait_for("OK",900); exit(0); } int read_page(int page,char *header) { static FILE *faxfeil; static char faxname[MAXPATHLEN]; int flag; sprintf(faxname,"tmpfax.%1d%1d%1d",page/100,(page%100)/10,page%10); faxfeil=fopen(faxname,"w"); fwrite(header,3,sizeof(char),faxfeil); if(flag=read_page_data(faxfeil)) { if(ftell(faxfeil)<200) flag=0; // bad bad boy } fclose(faxfeil); if(!flag) remove(faxname); return flag; } int read_page_data(FILE *feil) { static char buf[BSIZE]; struct itimerval alrm,oalrm; int bend; static char brk=DC2; int flag; #if DEBUG log("readin page"); #endif siginterrupt(SIGALRM,1); alrm.it_interval.tv_sec=0; alrm.it_interval.tv_usec=1000000/RPS; alrm.it_value.tv_sec=0; alrm.it_value.tv_usec=1000000/RPS; if(setitimer(ITIMER_REAL,&alrm,&oalrm)==-1) fatal("error creating timer\n"); timerstatus =T_FAX; realtime=RPS*5; // 5 seconds maxtime flag=0; write(modem,&brk,1); do { sigpause(SIGALRM); if( (bend=read(modem,buf,BSIZE))>0) { fwrite(buf,1,bend,feil); realtime=RPS*2; flag=1; } else { #if DEBUG > 1 log("realtime=%d",realtime); #endif if(realtime<=0) { #if DEBUG log("presume end of page"); #endif alrm.it_interval.tv_sec=0; alrm.it_interval.tv_usec=0; alrm.it_value.tv_sec=0; alrm.it_value.tv_usec=0; if(setitimer(ITIMER_REAL,&alrm,&oalrm)==-1) fatal("error removing timer"); return flag; } else if(!flag) { write(modem,&brk,1); } } } while(1); return 0; //n.r. } int read_string(const char *till,char *str,long t) { static struct itimerval alrm,oalrm; static char tst[256]; int ok=0,a; bzero(tst,256); while( *till ) tst[(u_char)*(till++)]=1; siginterrupt(SIGALRM,1); alrm.it_interval.tv_sec=0; alrm.it_interval.tv_usec=0; alrm.it_value.tv_sec=t/1000; alrm.it_value.tv_usec=(t%1000)*1000; if(setitimer(ITIMER_REAL,&alrm,&oalrm)==-1) fatal("error creating timer"); do { if(a=read(modem,str,1)) { if(tst[(u_char)*(str++)]) ok=1; } } while(!ok && a!=-1); if(a==-1) *str=0; else *(str-1)=0; a++; alrm.it_interval.tv_sec=0; alrm.it_interval.tv_usec=0; alrm.it_value.tv_sec=0; alrm.it_value.tv_usec=0; if(setitimer(ITIMER_REAL,&alrm,&oalrm)==-1) fatal("error removing timer"); return a; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.