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.