- 论坛徽章:
- 0
|
在sco unix5.05中,如何限制用户按delete键
我来一段实达密码键盘的读取c程序:
#include <signal.h>;
#include <stdio.h>;
#include <termio.h>;
#include <fcntl.h>;
#include <time.h>;
#define ESC 0x1B
#define CAN 24
#define DEL 0x7F
#define ERRCODE -1
#define OKCODE 0
/* t++++ */
#define debug 0
#define QUITKEY 0x4
#define ERRKEY 0xff
#define AUXLEAD "\033[>;"
#define AUXEND "\033[<"
#define ABORTCHAR 4
static struct termio oterm,term;
static int star_fd,star_fd_state=0;
/*
磁卡读写器命令
*/
//#define OPENMSR "\033[>;\033%B" 扩展盒
#define OPENMSR "\033[>;"
//#define CLOSEMSR "\033%A\033[<"
#define CLOSEMSR "\033[<"
#define MSR_RESET "\0330"
#define MSR_ENQ "\033j"
#define MSR_READ "\033]"
#define MSR_READ_3 "\033T]"
#define MSR_WRID "\033t"
#define MSR_WRID_3 "\033tA"
#define MSR_WRTAIL "\035\033\\"
/*
密码键盘命令
*/
#define OPENPAD "\033[3-"
#define CLOSEPAD "\033[3="
/*
*/
#define LNKPRN "\033[5i"
#define EXITPRN "\033[4i"
#define LPI 6
#define CPI 10
#define CR 0x0D
#define LF 0x0A
#define LINEUNIT 240
#define HOMEADD 2
#define PAPERLENGTH 55
#define PAPERWIDTH 80
#define OPENPRN "\033n\033l\033.\033l\033Z"
#define PR40REST "\033l\033&40\033Q080\033Z\033M010\033<"
#define CLRERR "\033l"
#define A_V_P "\033L"
#define A_H_P "\033H"
#define R_V_P "\033I"
#define L_H_M "\033J"
#define TOF "\033T"
#define BOF "\033M"
#define LINEFEED "\033&"
#define HALF_FONT "\x1cg"
#define DUBL_FONT "\x1ck"
#define IN_PAPER "\033l\033Uq"
#define EXP_DOC "\033l\033O"
#define NORMAL "\x1bw\x30\x1b\x34"
#define WIDE "\x1bw\x30\x1b\x33"
#define HIGH "\x1b\x34\x1bw\x31"
#define WIDE_HIGH "\x1bw\x31\x1b\x33"
#define PAPERIR "\033r%"
static int open_switch = -1; /* not open */
static int paper_on = -1; /* no paper */
static int lpi = LPI; /* 5 lpi */
static float cpi = CPI; /* 10 cpi */
static int curlin, curch;
static int homex = 0; /* x home position */
static int homey = 0; /* y home position */
static int actpos = 0; /* active position */
static int charnum = 0; /* length of printed string without CR
and LF at the end of the string */
static int wide; /* 1:normal wide 2:double wide */
static int font; /* 1:normal 2:wide 3:high 4:wide high */
/*
DPK printer
*/
int ttyfd;
static char open_flag=0;
static int curline=0;
/*
System para
*/
static terminited = 0;
static struct termio ORG_tm,tm;
int t_msrwr=100;
/* +++++++++++++++++++++++++++++++++++++++++++++++++++ */
/*
+-----------------------------------------------+
| II. API functions specification for MSR |
+-----------------------------------------------+
*/
/* -------------------------------------------------------- */
int star_msr_init()
{
char buf[3],ch;
int flg;
return (0);
/*
seterm(30);
printf("%s",OPENMSR);
printf("%s",MSR_RESET);
*/
/*
printf("%s",MSR_ENQ);
if( (buf[0]=getchar()) != ESC ) {
printf("%s",CLOSEMSR);
reseterm();
return(ERRCODE);
}
buf[1] = getchar();
buf[2] = getchar();
reseterm();
printf("%s",CLOSEMSR);
return(OKCODE);
*/
if((star_fd=setterm(0))==-1)
return -1;
sendprt(OPENMSR);
sendprt(MSR_RESET);
/*
set_nowait(1);
do {
ch=getchar();
ch&=0xff;
}
while(ch!=0xff);
*/
sendprt(CLOSEMSR);
reseterm();
return 0;
}
/* -------------------------------------------------------- */
int star_msr_read( int track,unsigned char *read_buff,int time_out)
{
int i,j,k,len,flag,mflag;
int l_se=260;
time_t begin_t ,now_t;
char ch,buf[260];
memset(buf,0,sizeof(buf));
if((track!=2)&&(track!=3)) return -2;
strcpy(buf,"\0" ;
strcpy(read_buff,"\0" ;
if((star_fd=setterm(0))==-1) return -4;
sendprt(OPENMSR);
sendprt(MSR_RESET);
sleep(1);
if(track==2)
sendprt(MSR_READ);
else
sendprt(MSR_READ_3);
set_nowait(0);
time(&begin_t);
do { ch=getchar();
ch&=0xff;
time(&now_t);
if((now_t-begin_t)>;=time_out)
{
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return -99;
}
} while( (ch != ESC) && (ch != ABORTCHAR) );
if( ch != ESC ){
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return(-3);
}
set_nowait(1);
i = 0;
buf[0] = ch;
i++;
if ( ( buf = getchar() ) != 's' ){
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return(-3);
}
time(&begin_t);
if(track==3)
{
i++;
if ( ( buf = getchar() ) != 'A' ){
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return(-3);
}
}
do { i = i + 1;
buf=getchar();
if (buf == 0xff) i--;
time(&now_t);
if(buf==0x7f)
{
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return -98;
}
if((now_t-begin_t)>;=time_out)
{
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return -99;
}
}while( (buf != 0x1c) && (i<l_se) );
sendprt(CLOSEMSR);
buf[i+1]=0;
if(track==2)
{
for(j=0;j<i+1-4;j++) read_buff[j]=buf[j+2];
read_buff[j+1] = 0x00;
dis_hex(buf,40);
}
else
{
for(j=0;j<i+1-5;j++) read_buff[j]=buf[j+3];
read_buff[j] = 0x00;
}
resetterm();
if(buf[track] ==DEL) return(ERRCODE);
return(OKCODE);
}
/* -------------------------------------------------------- */
int star_msr_write( track, wrt_buff )
int track;
unsigned char *wrt_buff;
{
char buf[4];
char data[270];
if((track!=2)&&(track!=3)) return -2;
if((star_fd=setterm(0))==-1) return -4;
strcpy(data,"\0" ;
if(track==2)
sprintf(data,"%s%s%s",MSR_WRID,wrt_buff,MSR_WRTAIL);
else
sprintf(data,"%s%s%s",MSR_WRID_3,wrt_buff,MSR_WRTAIL);
sendprt(OPENMSR);
/*
sendprt(MSR_RESET);
sleep(1); */
sendprt(data);
sendprt(MSR_ENQ);
set_nowait(90);
fflush(stdin);
fflush(stdout);
buf[0]=getchar();
if ( (buf[0] != ESC ) && (buf[0] != ABORTCHAR) ) {
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return(-3);
}
if ( buf[0] == ABORTCHAR ) { /* CTRL d */
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return(-3);
}
buf[1]=getchar();
buf[2]=getchar();
if(track==3)
buf[3]=getchar();
sendprt(CLOSEMSR);
resetterm();
/* fflush(stdin); */
if(track==2)
if(buf[2]=='q') return(ERRCODE);
else
if(buf[3]=='q') return(ERRCODE);
return(OKCODE);
}
/* -------------------------------------------------------- */
int star_msr_timeout( timeout )
int timeout;
{
if ( timeout<0 ) return (ERRCODE);
t_msrwr = timeout;
return (OKCODE);
}
/* -------------------------------------------------------- */
int star_msr_clear()
{
if((star_fd=setterm(0))==-1) return -4;
sendprt(OPENMSR);
sendprt(MSR_RESET);
sendprt(CLOSEMSR);
resetterm();
return 0;
}
/* -------------------------------------------------------- */
/*
+-----------------------------------------------+
| III. API functions specification for PAD |
+-----------------------------------------------+
*/
/* ---------------------------------------------------------- */
#ifdef PINPADVOICE
int star_pinpad_enable(istate)
int istate;
{
if((star_fd=setterm(0))==-1) return -1;
sendprt(OPENPAD);
resetterm();
return 0;
}
#else
int star_pinpad_enable() /* 开密码键盘 */
{
if((star_fd=setterm(0))==-1) return -1;
sendprt(OPENPAD);
resetterm();
return 0;
}
#endif
/* ---------------------------------------------------------- */
int star_pinpad_enable2() /* 开密码键盘 */
{
int i;
fflush(stdin);
if((star_fd=setterm(0))==-1) return -1;
/*
for (i=0;i<10;i++) {
getchar();
}
*/
sendprt(OPENPAD);
resetterm();
return 0;
}
#ifdef PINPADVOICE
int pass_err()
{
return 0;
}
#endif
/* ---------------------------------------------------------- */
int star_pinpad_disable() /* 关密码键盘 */
{
if((star_fd=setterm(0))==-1) return -1;
sendprt(CLOSEPAD);
resetterm();
return 0;
}
/* ---------------------------------------------------------- */
int star_pinpad_read( read_buff ) /* 读密码键盘 */
char *read_buff;
{
if((star_fd=setterm(0))==-1) return -1;
sendprt(OPENPAD);
strcpy(read_buff,"\0" ;
read_pin(read_buff);
resetterm();
return 0;
}
star_pinpad_getch()
{
unsigned char ch;
fflush(stdin);
if((star_fd=setterm(0))==-1) return -1;
sendprt(OPENPAD);
ch=getchar();
if(ch==
ch=1;
resetterm();
return(ch);
}
read_pin(s)
char *s;
{
int i,j,k;
char ch0;
set_nowait(0);
i=0;
ch0=getchar();
while( ch0 !=0xd && ch0 != 0xa) { /* 确认键 */
if(ch0<='9' && ch0>;='0'){
s=ch0;
i++;
s='\0';
}
if(ch0==0x0 { /* 清除键 */
i=0;
s='\0';
}
ch0=getchar();
}
s='\0';
}
/* ------------------------------------------------------------ */
/*
+-----------------------------------------------+
| I. API functions specification for DPK |
+-----------------------------------------------+
*/
/*-----------------------------------------------------*/
int star_pptr_open()
{
open_flag = 1;
curline = 0;
printf("\033[5i\033k\033[4i" ;
return 0;
}
/*-----------------------------------------------------*/
int star_pptr_reset()
{
printf("\033[5i" ;
printf("%c",CAN);
printf("\033b" ; /* print end */
/*
printf("\033%%6" ; */ /* default to be 1/6 inch */
printf("\033I" ; /* set high_density printing */
printf("\033Y" ; /* cancel underline format */
printf("\033>;\033]"); /* cancel horizontal,vertical entension */
printf("\033[4i");
star_set_lpi(7);
star_set_cpi(15);
curline = 0;
return 0;
}
/*-----------------------------------------------------*/
int star_pptr_print(buff,len)
unsigned char *buff;
int len;
{
int i,wnum;
int wrt_len;
char locstr[80];
char wrt_buff[512];
if (!open_flag) return -3; /* printer not opened yet */
wrt_len = strlen(buff);
wrt_len = (wrt_len >;len) ? len: wrt_len;
if (wrt_len >; 512) return -1; /* buffer data greater than 512 butes */
strncpy(wrt_buff,buff,wrt_len);
wrt_buff[wrt_len]='\0';
printf("\033[5i");
printf("%s",wrt_buff);
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_pptr_close()
{
if (!open_flag) return -2;
open_flag = 0;
return 0;
}
/*-----------------------------------------------------*/
int star_get_paper()
{
return 0;
}
/*-----------------------------------------------------*/
int star_rel_paper()
{
printf("\033[5i\014\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_set_enlarge(kind)
int kind;
{
if (open_flag==0) return -1;
if ((kind<1) || (kind>;5)) return -2; /* invalid parameter */
printf("\033[5i");
switch (kind) {
case 1: printf("\033U\033R\033[\033]");
break;
case 2: printf("\033[\033]\033U");
break;
case 3: printf("\033[\033U\033R");
break;
case 4: printf("\033[\033U");
break;
case 5: printf("\033<");
}
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_reset_enlarge()
{
star_set_enlarge(1);
return 0;
}
/*-----------------------------------------------------*/
int star_skip_n_line(line)
int line;
{
int n1,n2;
if (open_flag==0) return -1;
if ((line<1) ||(line>;165)) return -2;
n1 = line/10+0x30;
n2 = line%10+0x30;
printf("\033[5i");
printf("\033\013%c%c",n1,n2);
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_skip_n_char(coln)
int coln;
{
int dire=3;
int n1,n2;
if (open_flag==0) return -1;
if (coln<0) dire=4;
n1 = coln/256;
n2 = coln%256;
printf("\033[5i");
printf("\033%%%c%c%c",dire,n1,n2);
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_move_to(top,left)
float top,left;
{
return 0;
}
/*-----------------------------------------------------*/
int star_set_pos()
{
return 0;
}
/*-----------------------------------------------------*/
int star_set_home(top,left)
float top,left;
{
return 0;
}
/*-----------------------------------------------------*/
int star_set_margin(top,left,bottom,right)
int top,left,bottom,right;
{
return 0;
}
/*-----------------------------------------------------*/
int star_set_cpi(num)
int num;
{
if (num>;255) num=255;
if (num==0x11) num ++;
if (num==0x13) num --;
printf("\033[5i");
printf("%c%c%c",0x1c,0x24,num);
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_set_lpi(num)
int num;
{
num = 120/num;
if (num==0x11) num ++;
if (num==0x13) num --;
printf("\033[5i");
printf("\033%%9%c%c",0x30,num);
printf("\033[4i");
return 0;
}
/*-----------------------------------------------------*/
int star_pptr_clear()
{
if (open_flag==0) return -1;
printf("\033[5i%c\033[4i",CAN);
return 0;
}
/*-----------------------------------------------------*/
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
seterm(t)
int t;
{
if(!terminited){
ioctl(0,TCGETA,&ORG_tm);
ioctl(0,TCGETA,&tm);
tm.c_lflag &= (~ISIG & ~ECHO & ~ICANON);
tm.c_cc[VMIN] = 0;
tm.c_cc[VTIME] =t;
ioctl(0,TCSETA,&tm);
terminited = 1;
}
else {
reseterm();
ioctl(0,TCGETA,&ORG_tm);
ioctl(0,TCGETA,&tm);
tm.c_lflag &= (~ISIG & ~ECHO & ~ICANON);
tm.c_cc[VMIN] = 0;
tm.c_cc[VTIME] =t;
ioctl(0,TCSETA,&tm);
terminited = 1;
};
}
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
reseterm()
{
ioctl(0,TCSETA,&ORG_tm);
terminited = 0;
}
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
/* t ++++++ */
/* set para: must read out one char */
setterm(fstat)
int fstat;
{
star_fd=open((char *)ttyname(1),O_RDWR|fstat);
if(star_fd<0) return -1;
if(ioctl(star_fd,TCGETA,&term)<0) return 1;
oterm=term;
term.c_iflag&=~IXON;
term.c_lflag&=~ECHO;
term.c_lflag&=~ICANON;
term.c_cc[VMIN]=1;
term.c_cc[VTIME]=0;
term.c_cc[VQUIT]=QUITKEY;
if(ioctl(star_fd,TCSETA,&term)<0) return 1;
return star_fd;
}
/* set time for read one char, but not read */
set_nowait(time)
{
if(star_fd<0) return -1;
if(ioctl(star_fd,TCGETA,&term)<0) return 1;
term.c_cc[VMIN]=0;
term.c_cc[VTIME]=time;
if(ioctl(star_fd,TCSETA,&term)<0) return 1;
return 0;
}
/* restore para, and close file */
resetterm()
{
if(star_fd<0) return -1;
if(ioctl(star_fd,TCSETA,&oterm)<0) return 1;
close(star_fd);
return 2;
}
/* send string to aux port */
sendaux(s)
char *s;
{
write(star_fd,AUXLEAD,strlen(AUXLEAD));
write(star_fd,s,strlen(s));
write(star_fd,AUXEND,strlen(AUXEND));
}
/* send out a string */
sendprt(s)
char *s;
{
write(star_fd,s,strlen(s));
}
sendch(ch)
char ch;
{
write(star_fd,ch,1);
}
void star_set_up()
{
}
/* send command into sight print */
int pro_deal()
{
if((star_fd=setterm(0))==-1) return -2;
entersightprt();
return 0;
}
/* read out a char within 2 second,otherwise return 0xFF */
char t_getchar()
{
time_t ot,ct,lt;
char ch;
ot=time(&lt);
do {
if(read(star_fd,&ch,1)!=0) break;
ct=time(&lt);
if((ct-ot)>;2) return ERRKEY;
} while(1);
return ch;
}
/*
read out "ESC * *" squene into *s
within ti second.
return: 0, -1
*/
int pptr_get_answer(ti,s)
int ti;
char *s;
{
int time;
char ch1,ch2,ch3;
set_nowait(1);
s[0]='\0';
time=0;
do{ s[0]=getchar();
if(++time/10>;ti) return -1;
} while(s[0]!=0x1b);
if(s[0]==0x1b){
do{ s[1]=getchar();
if(++time/10>;ti) return -1;
} while(s[1]==-1);
do{ s[2]=getchar();
if(++time/10>;ti) return -1;
} while(s[2]==-1);
s[3]=0;
} else return -1;
/* fflush(stdin); */
return 0;
}
closeaux()
{
write(star_fd,AUXEND,strlen(AUXEND));
}
entersightprt()
{
write(star_fd,LNKPRN,strlen(LNKPRN));
fflush(stdout);
}
exitsightprt()
{
write(star_fd,EXITPRN,strlen(EXITPRN));
fflush(stdout);
}
static int dis_hex( unsigned char *buf, int len)
{
int i, j, line ;
unsigned char *p, *q ;
char str[ 30] ;
p = buf ;
q = buf ;
line = len / 16 ;
for ( i = 0 ; i < line ; i++ ) {
printf( "HEX%07d=< ", i*16) ;
for ( j = 0 ; j < 16 ; j++ )
printf( "%02x ", *p++) ;
printf( ">; ") ;
for ( j = 0 ; j < 16 ; j++, q++)
printf( "%c",(*q>;32) ? ((*q<12 ? *q :'*') :'.') ;
printf( "\n") ;
}
i = len - line * 16 ;
if ( i >; 0) {
printf( "HEX%07d=< ", line*16) ;
for( j = 0 ; j < i ; j++ )
printf( "%02x ", *p++) ;
for( j = i ; j < 16 ; j++)
printf( " ") ;
printf( ">; ") ;
for ( j = 0 ; j < i ; j++, q++)
printf( "%c",(*q>;32) ? ((*q<12 ? *q :'*') :'.') ;
printf( "\n") ;
}
return( 0) ;
} |
|