ftp.nice.ch/pub/next/unix/communication/am.1.16.NIHS.bs.tar.gz#/am.1.16.NIHS.bs/src/fax.c

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.