- 论坛徽章:
- 0
|
在sco unix5.05中,如何限制用户按delete键
我有:
#include <stdio.h>;
#include <fcntl.h>;
#include <time.h>;
#include <stdlib.h>;
#include <string.h>;
#include <termio.h>;
#include "user.h"
#include "term.h"
#include "msr.h"
int Select();
void Wait();
main()
{
int Choice,mode;
char tr2[38],tr3[108];
int q,ret_code;
int timeout=10;
char pin[10];
do {
Choice=Select();
switch (Choice) {
case 1:
case 2:
printf(" lease input PIN:\n" ;
if (ret_code==0) printf("\nYour Pin is %s\n",pin);
else printf("read PIN timeout\n" ;
Wait();
break;
case 3:
printf("please input read_mode(1-3):" ;
fflush(stdin);
scanf("%d",&mode);
fflush(stdin);
printf("please read card !\n" ;
q=starMsrRead(mode,tr2,tr3,timeout);
printf("\ntr2=" ;
puts(tr2);
printf("tr3=" ;
puts(tr3);
printf("q=%d\n",q);
Wait();
break;
case 4:
fflush(stdin);
printf("\ninput track2 data(no data return)\n" ;
gets(tr2);
fflush(stdin);
printf("input track3 data(no data return)\n" ;
gets(tr3);
q=starMsrWrite(tr2,tr3,timeout);
printf("\nq=%d\n",q);
Wait();
break;
}
}
while (Choice!=0);
}
int Select()
{
char c;
do {
printf("\033[2J\n" ;
printf( "\033[8;20H============================================\n" ;
printf( "\033[9;20H= \033[7mPinpad & Msr Test\033[0m =\n");
printf("\033[10;20H============================================\n");
printf("\033[11;20H= [1] 绿灯亮读密码 =\n");
printf("\033[12;20H= [2] 红灯亮读密码 =\n");
printf("\033[13;20H= [3] Read Card =\n");
printf("\033[14;20H= [4] Write Card =\n");
printf("\033[15;20H= [0] Exit =\n");
printf("\033[16;20H============================================\n");
printf("\033[17;20H\n");
fflush(stdin);
c=getchar();
}
while (c<'0' || c>;'4');
return (c-'0');
}
void Wait()
{ char c;
fflush(stdin);
c=getchar();
}
int starMsrRead(read_mode,track2_data,track3_data,timeout)
int read_mode;
char *track2_data;
char *track3_data;
int timeout;
{ int i,j,k,k1,flag;
char ch;
char data[300],state[5];
int ret_code;
track2_data[0]=0;
track3_data[0]=0;
openPort(MSR_PORT);
switch(read_mode)
{ case 2:dataToDevice(MSR_READ2);
break;
case 3:dataToDevice(MSR_READ3);
break;
case 0:
case 1:
default:dataToDevice(MSR_READ23);
break;
}
ret_code=readLeadEndStr(data,MSR_READ_DATA_LEAD,MSR_READ_DATA_END,timeout*10);
if (ret_code==-1)
{ dataToDevice(MSR_RESET);
closePort();
return -1;
}
if (data[0]==MSR102_READ_DATA_LEAD)
{
fflush(stdin);
#if MSR102_COMM_SET
dataToDevice(MSR_STATE);
#endif
ret_code=readLeadEndStr(state,MSR_RW_STATE_LEAD,MSR_RW_STATE_END,timeout*10);
if (ret_code==-1)
{ closePort();
return -1;
}
if (state[strlen(state)-1]!=MSR_RW_OK)
{ closePort();
return -1;
}
}
closePort();
j=strlen(data);
for (i=0;i<j;i++)
{
if (strchr(MSR_READ_DATA_END,data)!=NULL)
{ flag=1; break; }
}
if (flag==1)
{ data[i+1]=0;
j=strlen(data);
}
else
{ return -1; }
flag=0;
k=k1=0;
for (i=0;i<j-2;i++)
{
if (strchr(MSR_READ23_DATA_SEP_CHAR,data)!=NULL)
{ flag=1;
continue;
}
if (strchr(MSR_READ_DATA_LEAD,data)!=NULL)
{
continue;
}
if ((data<'A')&&(data>;0x20))
{
if (flag==0)
{ if(data!='?')
track2_data[k++]=data;
}
else
{ if(data!='?')
track3_data[k1++]=data;
}
}
}
track2_data[k]=0;
track3_data[k1]=0;
return 0;
}
int starMsrWrite(track2_data,track3_data,timeout)
char *track2_data;
char *track3_data;
int timeout;
{ int i,ret_code;
char ch;
char state[5];
if ((strlen(track2_data)==0)&&(strlen(track3_data)==0)) return -1;
openPort(MSR_PORT);
#if MSR_FORMAT dataToDevice(MSR_SET_IBM_FORMAT);
#else dataToDevice(MSR_SET_ISO_FORMAT);
#endif
#if MSR_CHARATER_SET dataToDevice(MSR_SET_IBM_CHARACTER);
#else dataToDevice(MSR_SET_ISO_CHARACTER);
#endif
#if MSR102_COMM_SET
dataToDevice(MSR_WRITE_LEAD);
dataToDevice(track2_data);
if (strlen(track3_data)!=0)
{
dataToDevice(MSR_WRITE23_SEP_STR);
dataToDevice(track3_data);
}
dataToDevice(MSR_WRITE_END);
dataToDevice(MSR_STATE);
#else
if ((strlen(track2_data)==0)||(strlen(track3_data)==0))
{
if (strlen(track2_data)==0)
{ dataToDevice(MSR_WRITE3_LEAD);
dataToDevice(track3_data);
dataToDevice(MSR_WRITE_END);
}
else
{ dataToDevice(MSR_WRITE2_LEAD);
dataToDevice(track2_data);
dataToDevice(MSR_WRITE_END);
}
}
else
{ dataToDevice(MSR_WRITE23_LEAD);
dataToDevice(track2_data);
dataToDevice(MSR_WRITE23_SEP_STR);
dataToDevice(track3_data);
dataToDevice(MSR_WRITE_END);
}
#endif
ret_code=readLeadEndStr(state,MSR_RW_STATE_LEAD,MSR_RW_STATE_END,timeout*10);
if (ret_code==-1)
{ dataToDevice(MSR_RESET);
closePort();
return -1;
}
closePort();
if (state[strlen(state)-1]!=MSR_RW_OK)
{ return -1; }
return 0;
} /* 返回状态: 0: 正确返回 -1: 出错 */
/* int setTerm(void);
设置UNIX通讯口参数
设成非正则方式
返回: -1: 出错 0: 正确返回
*/
static int star_fd=1;
static struct termio oterm_attr,term_attr;
int setTerm()
{
if(star_fd<0) return -1;
if(ioctl(star_fd,TCGETA,&oterm_attr)<0) return -1;
if(ioctl(star_fd,TCGETA,&term_attr)<0) return -1;
term_attr.c_lflag &=~(ISIG|ECHO|ICANON|NOFLSH|XCLUDE);
term_attr.c_iflag &=~(IXON|INLCR|IGNCR|ICRNL|ISTRIP);
term_attr.c_oflag &=~OPOST;
term_attr.c_cc[VMIN]=0;
term_attr.c_cc[VTIME]=3;
term_attr.c_cc[VQUIT]=0x7f;
#if UNIXPC
term_attr.c_cflag&=~CBAUD;
term_attr.c_cflag&=~CSIZE;
term_attr.c_cflag|=B9600;
term_attr.c_cflag|=CS8;
term_attr.c_cflag|=(CLOCAL|CREAD);
term_attr.c_cflag&=~(PARENB|CSTOPB);
#endif
if(ioctl(star_fd,TCSETAW,&term_attr)<0) return -1;
return star_fd;
}
int setNowait()
{ if(star_fd<0) return -1;
if(ioctl(star_fd,TCGETA,&term_attr)<0) return -1;
term_attr.c_cc[VMIN]=0;
term_attr.c_cc[VTIME]=1;
if(ioctl(star_fd,TCSETAW,&term_attr)<0) return -1;
return 0;
}
int resetNowait()
{ if(star_fd<0) return -1;
if(ioctl(star_fd,TCGETA,&term_attr)<0) return -1;
term_attr.c_cc[VMIN]=1;
term_attr.c_cc[VTIME]=0;
if(ioctl(star_fd,TCSETAW,&term_attr)<0) return -1;
return 0;
}
// int resetTerm(void);
// 恢复UNIX通讯口参数
// 返回: -1: 出错 0: 正确返回
int resetTerm()
{
if(star_fd<0) return -1;
if(ioctl(star_fd,TCSETAW,&oterm_attr)<0) return -1;
if(star_fd!=0) close(star_fd);
return 0;
}
/* 打开外设通讯口
参数: port: 通讯口号
连UNIXPC 1: Serial Com 1 2: Serial Com 2
连终端 1: Aux 1 2: Aux 2 3: Aux 3
*/
int openPort(port)
int port;
{ int ret_code;
#if UNIXPC
switch(port){
case 1:star_fd=open(SERIALCOM1_TTYNAME,O_RDWR);
break;
case 2:star_fd=open(SERIALCOM2_TTYNAME,O_RDWR);
break;
default:
return -1;
}
if (star_fd<0)
{
return -1;
}
#else star_fd=open((char *)ttyname(1),O_RDWR);
#endif ret_code=setTerm();
if (ret_code==-1) return -1;
#if UNIXPC
#else
switch(port){
case 1:dataToTerminal(OPEN_AUX1);
break;
case 2:dataToTerminal(OPEN_AUX2);
break;
case 3:dataToTerminal(OPEN_AUX3);
break;
default:
return -1;
}
#endif
return 0;
}
/* 关闭外设通讯口*/
int closePort()
{ int ret_code;
#if UNIXPC
#else dataToTerminal(CLOSE_AUX);
#endif
ret_code=resetTerm();
return ret_code;
}
/* 数据送往终端 data: 要送往终端的数据*/
int dataToTerminal(data)
char *data;
{
#if UNIXPC write(star_fd,data,strlen(data));
#else write(star_fd,data,strlen(data));
#endif
return 0;
}
/* int dataToDevice(char *data);
数据送往外设
data: 要送往外设的数据
*/
int dataToDevice(data)
char *data;
{
#if UNIXPC write(star_fd,data,strlen(data));
#else write(star_fd,AUXLEAD,strlen(AUXLEAD));
write(star_fd,data,strlen(data));
write(star_fd,AUXEND,strlen(AUXEND));
#endif
return 0;
}
// 从外设接收一个字符
// ch_point: 从外设返回的字符
// 返回值: 0:接收到字符 -1:未接收到字符
int charFromDevice(ch_point)
char *ch_point;
{
int ret_code;
ret_code=read(star_fd,ch_point,1);
if (ret_code==1) return 0;
return -1;
}
int readChar(ch,timeout)
char *ch;
int timeout;
{
int i,ret_code;
for(i=0;i<timeout;i++)
{
ret_code=charFromDevice(ch);
if(ret_code==0) break;
}
if (ret_code==0) return 0;
return -1;
}
/* 读定长度字符串
string: 返回字符串
length: 要读的字符串长度
timeout: 超时时间
*/
int readLenStr(string,length,timeout)
char *string;
int length,timeout;
{
int i,j,ret_code;
char ch;
fflush(stdin);
for (i=0;i<length;i++)
{
for(j=0;j<timeout;j++)
{
ret_code=charFromDevice(&ch);
if (ret_code==0) break;
}
if (ret_code==-1) break;
string=ch;
}
return ret_code;
}
/*
读一个有起始与结束字符的字符串
string: 返回字符串
lead_char: 起始字符的字符串
end_char: 结束字符的字符串
timeout: 超时时间
*/
int readLeadEndStr(string,lead_char,end_char,timeout)
char *string;
char *lead_char,*end_char;
int timeout;
{ int i,j,ret_code;
char ch;
do
{
for(j=0;j<timeout;j++)
{
ret_code=charFromDevice(&ch);
if (ret_code==0) break;
}
string[0]=ch;
if (ret_code==-1) break;
if (ch==ABORTCHAR) break;
} while(strchr(lead_char,ch)==NULL);
if ((ret_code==-1)||(ch==ABORTCHAR))
{
return -1;
}
i=1;
do
{
for(j=0;j<timeout;j++)
{
ret_code=charFromDevice(&ch);
if (ret_code==0) break;
}
string[i++]=ch;
if (ret_code==-1) break;
if (ch==ABORTCHAR) break;
} while(strchr(end_char,ch)==NULL);
if ((ret_code==-1)||(ch==ABORTCHAR))
{
return -1;
}
string=0;
return 0;
} |
|