acct.c
来自「国际标准协议的」· C语言 代码 · 共 994 行 · 第 1/2 页
C
994 行
if((fd=open(buffer,O_RDWR)) == -1) {
sprintf(msg,"Acct: Couldn't open file %s\n",buffer);
msg[127] = '\0';
log_err(msg);
printf("\nAcct 无法打开 online 文件!!");
return(-1);
}
/* ptr = (USER_ONLINE *)malloc(sizeof(USER_ONLINE));*/
if((ptr = (USER_ONLINE *)malloc(sizeof(USER_ONLINE))) ==
(USER_ONLINE *)NULL) {
printf("\n无法为 online 分配内存!!");
perror("ERROR! ");
}
/*----- Modified by Edward Ng, 1999.09.15 ---- */
/* user alread log in ? */
while (read(fd,ptr, sizeof(USER_ONLINE))) {
if (!strcmp(u_name, ptr->user_name) && ptr->active_status==1) {
close(fd);
free(ptr);
return(-1);
}
}
/* new_online_rec = (USER_ONLINE *)malloc(sizeof(USER_ONLINE));*/
if((new_online_rec = (USER_ONLINE *)malloc(sizeof(USER_ONLINE))) ==
(USER_ONLINE *)NULL) {
printf("\n无法为 online 分配内存!!");
perror("ERROR! ");
}
curtime = time(0);
strcpy(new_online_rec->login_time,ctime(&curtime));
strcpy(new_online_rec->acct_session_id,s_id);
strcpy(new_online_rec->user_name, u_name);
strcpy(new_online_rec->nas_ip_addr, nas_ip);
new_online_rec->nas_port = nas_port;
new_online_rec->active_status = 1;
/* ---- try to find out an "Empty" record ---- */
found = 0;
lseek(fd, 0L, SEEK_SET);
while (read(fd,ptr, sizeof(USER_ONLINE)))
{
if (ptr->nas_port==nas_port && !strcmp(nas_ip, ptr->nas_ip_addr) && ptr->active_status==1)
{
lseek(fd, -sizeof(USER_ONLINE), SEEK_CUR);
if (lockf(fd, F_LOCK, sizeof(USER_ONLINE))!=0)
{
printf("\n发现用户 %s 被挂起,但无法解除挂起\n",ptr->user_name);
sprintf(msg,"发现用户 %s 被挂起,但无法解除挂起\n",ptr->user_name);
msg[127] = '\0';
log_err(msg);
continue;
}
printf("\n发现用户 %s 被挂起,现已解除挂起\n",ptr->user_name);
sprintf(msg,"发现用户 %s 被挂起,现已解除挂起\n",ptr->user_name);
msg[127] = '\0';
log_err(msg);
found = 1;
break;
}
}
if(found==0)
{
lseek(fd, 0L, SEEK_SET);
while (read(fd,ptr, sizeof(USER_ONLINE)))
{
if (!ptr->active_status)
{
lseek(fd, -sizeof(USER_ONLINE), SEEK_CUR);
if (lockf(fd, F_LOCK, sizeof(USER_ONLINE))!=0)
continue;
found = 1;
break;
}
}
}
/*
found = 0;
lseek(fd, 0L, SEEK_SET);
while (read(fd,ptr, sizeof(USER_ONLINE))) {
if (!ptr->active_status) {
lseek(fd, -sizeof(USER_ONLINE), SEEK_CUR);
if (lockf(fd, F_LOCK, sizeof(USER_ONLINE))!=0)
continue;
found = 1;
break;
}
}
*/
/* write(fd, new_online_rec, sizeof(USER_ONLINE));*/
if(write(fd, new_online_rec, sizeof(USER_ONLINE))==-1)
{
printf("\n无法写 online 文件!!");
perror("ERROR! ");
}
lseek(fd, -sizeof(USER_ONLINE), SEEK_CUR);
lockf(fd, F_ULOCK, sizeof(USER_ONLINE));
/*
lseek(fd, F_ULOCK, sizeof(USER_ONLINE));
*/
free(new_online_rec);
free(ptr);
close(fd);
return(0);
}
/*------------------------------*/
/* Func: log_to_result() */
/*------------------------------*/
int log_to_result(AUTH_REQ *authreq) {
int infd,fd;
FILE *outfd;
char msg[128];
char s_id[10];
char u_name[32];
USER_ONLINE *ptr;
VALUE_PAIR *vtp;
char login_time[26];
long logout_time;
char buffer[256];
char clientname[32];
int found;
int check_isdigit_account();
ACCOUNT_PW *ppt;
long s_time;
vtp = authreq->request;
while(vtp != (VALUE_PAIR *)NULL) {
if(vtp->attribute == PW_USER_NAME) {
memcpy(u_name,vtp->strvalue,sizeof(u_name));
}else if(vtp->attribute == PW_ACCT_SESSION_ID) {
strcpy(s_id,vtp->strvalue);
}else if(vtp->attribute == PW_ACCT_SESSION_TIME) {
s_time = vtp->lvalue;
}
vtp = vtp->next;
}
sprintf(buffer,"%s/%s",radius_dir,RADIUS_ONLINE);
if((infd=open(buffer,O_RDWR)) == -1) {
sprintf(msg,"Acct: Couldn't open file %s\n",buffer);
msg[127] = '\0';
log_err(msg);
printf("\nlog_to_result can not open online file!!");
return(-1);
}
found = 0;
/* ptr = (USER_ONLINE *)malloc(sizeof(USER_ONLINE));*/
if((ptr = (USER_ONLINE *)malloc(sizeof(USER_ONLINE))) ==
(USER_ONLINE *)NULL) {
printf("\nlog_to_result 无法为 online 分配内存!!");
perror("ERROR! ");
}
while(read(infd,ptr,sizeof(USER_ONLINE))) {
if(strcmp(u_name,ptr->user_name)==0 && strcmp(s_id,ptr->acct_session_id)==0 && ptr->active_status==1) {
found = 1;
strcpy(login_time,ptr->login_time);
memset(ptr->user_name,0,sizeof(ptr->user_name));
ptr->active_status = 0;
lseek(infd,-sizeof(USER_ONLINE),SEEK_CUR);
lockf(infd,F_LOCK,sizeof(USER_ONLINE));
/* write(infd,ptr,sizeof(USER_ONLINE));*/
if(write(infd, ptr, sizeof(USER_ONLINE))==-1)
{
printf("\nlog_to_result 无法写 online 文件!!");
perror("ERROR! ");
}
lseek(infd,-sizeof(USER_ONLINE),SEEK_CUR);
lockf(infd,F_ULOCK,sizeof(USER_ONLINE));
memset(ptr,0,sizeof(USER_ONLINE));
free(ptr);
break;
}
}
if(found==0)
free(ptr);
close(infd);
ipaddr2str(clientname,authreq->ipaddr);
sprintf(buffer, "%s/%s.%s", radacct_dir, RADIUS_RESULT,clientname);
if((outfd=fopen(buffer,"a")) == (FILE *)NULL) {
sprintf(msg,"Acct: Couldn't open file %s\n",buffer);
msg[127] = '\0';
log_err(msg);
return(-1);
}
/* Post a timestamp */
logout_time = time(0);
fputs("\t",outfd);
if(found) {
fputs("Acct-Start-Time = ",outfd);
fputs(login_time, outfd);
}else {
fputs("Acct-Start-Time = ",outfd);
fputs(ctime(&login_time), outfd);
}
fputs("\t",outfd);
fputs("Acct-Stop-Time = ",outfd);
fputs(ctime(&logout_time), outfd);
/* Write each attribute/value to the log file */
vtp = authreq->request;
while(vtp != (VALUE_PAIR *)NULL) {
fputs("\t", outfd);
fprint_attr_val(outfd, vtp);
fputs("\n", outfd);
vtp = vtp->next;
}
fputs("\n", outfd);
fclose(outfd);
return(0);
}
/******************************************/
/*********向消费系统发送记帐信息**************/
/******************************************/
int send_acct(VALUE_PAIR *request)
{
int sockfd, n, i,x=0,sess_time,use_time,y;
char recvline[1500 + 1];
char sendbuf[1500];
struct sockaddr_in servaddr;
VALUE_PAIR *tempptr;
TRANSACTION tst;
char name[64];
char passwd[64];
char msg[128];
char calling_phone[20];
char called_phone[20];
char frame_ipaddr[20];
char nas_ipaddr[20];
char note[40];
char name_str[32];
char realm_suffix[64];
time_t logtime;
char thetime[30];
BYTE recvbuf[1500];
TRANSACTION rfs;
char utime[5];
time(&logtime);
strcpy(thetime,ctime(&logtime));
thetime[24]=0;
tempptr=request;
while(tempptr!=NULL)
{
if(strcmp(tempptr->name,"User-Name")==0)
{
memset(name,0,64);
memcpy(name,tempptr->strvalue,strlen(tempptr->strvalue));
printf("\n记帐 %s username=[%s]\t",thetime,name);
if(realm_user(name))
{
memset(name_str,'\0',sizeof(name_str));
memset(realm_suffix,'\0',sizeof(realm_suffix));
if(parse_user(name, name_str,realm_suffix) != 0)
{
printf("REALM error!\n");
printf("name_str is [%s]\n",name_str);
printf("realm_suffix is [%s]\n",realm_suffix);
sprintf(msg,"\nREALM error!\t时间:%s\t用户名:%s",thetime,name);
msg[127]='\0';
log_err_inf(msg);
return(0);
}
else
{
memset(name,0,64);
memcpy(name,name_str,strlen(name_str));
/* printf("REALM域是 [%s]\n",realm_suffix);
printf("REALM用户名是 [%s]\n",name);
*/
}
}
}
if(strcmp(tempptr->name,"Acct-Session-Time")==0)
{
sess_time=tempptr->lvalue;
if(sess_time==0)
{
return(0);
}
else if(sess_time<60)
{
use_time=1;
}
else
{
use_time=sess_time/60;
}
}
if(strcmp(tempptr->name,"Calling-Station-Id")==0)
{
memset(calling_phone,0,20);
memcpy(calling_phone,tempptr->strvalue,strlen(tempptr->strvalue));
/* printf("主叫号码是 [%s]\t",calling_phone);*/
}
if(strcmp(tempptr->name,"Called-Station-Id")==0)
{
memset(called_phone,0,20);
memcpy(called_phone,tempptr->strvalue,strlen(tempptr->strvalue));
/* printf("被叫号码是 [%s]\t",called_phone);*/
}
if(strcmp(tempptr->name,"Framed-IP-Address")==0)
{
memset(frame_ipaddr,0,20);
ipaddr2str(frame_ipaddr, tempptr->lvalue);
/* printf("拨号用户的IP地址是 [%s]\t",frame_ipaddr);*/
}
if(strcmp(tempptr->name,"NAS-IP-Address")==0)
{
memset(nas_ipaddr,0,20);
ipaddr2str(nas_ipaddr, tempptr->lvalue);
/* printf("NAS的IP地址是 [%s]\n",nas_ipaddr);*/
}
tempptr=tempptr->next;
}
memset(utime,0,5);
sprintf(utime,"%d",use_time);
if(strlen(called_phone)==0)
{
memset(note,0,40);
strcat(note,"上网 ");
strcat(note,utime);
strcat(note," 分钟");
}
else
{
memset(note,0,40);
strcat(note,calling_phone);
strcat(note," 拨 ");
strcat(note,called_phone);
strcat(note," ");
strcat(note,utime);
strcat(note,"分钟");
}
printf("\n%s",note);
tst.Tcode=204;
tst.Version=2;
memset(&tst.User,0,12);
memcpy(&tst.User,name,strlen(name));
memset(passwd,0,64);
memcpy(passwd,ACCTPASS,strlen(ACCTPASS));
memset(&tst.Passwd,0,12);
memcpy(&tst.Passwd,passwd,strlen(passwd));
memset(&tst.Operator,0,12);
memcpy(&tst.Operator,ACCTNAME,strlen(ACCTNAME));
tst.Time=time(NULL);
memset(&tst.Note,0,40);
memcpy(&tst.Note,note,strlen(note));
tst.data.csu.CsuType=1;
tst.data.csu.CsuUnit=use_time;
packer(sendbuf,&tst);
/*目前只设为发送一次计帐请求*/
for(y=0;y<1;y++)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd==-1)
{
sprintf(msg,"\n%s Acct could not open socket!! %s",thetime,strerror(errno));
msg[127]='\0';
log_err_inf(msg);
printf("\nAcct could not open socket!! %s",strerror(errno));
perror("ERROR!!");
return(-1);
}
servaddr.sin_family = AF_INET;
servaddr.sin_port= htons(XIAOFEI_TCP_PORT);
servaddr.sin_addr.s_addr=inet_addr(XIAOFEI_IP_ADDR);
if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
{
printf("\nacct.c: 无法连接消费系统!");
sprintf(msg,"\nACCT.C无法连接消费系统\t时间:%s\t用户名:%s\t用户IP地址:%s\t拨号使用时间:%d秒\t主叫号码:%s\t被叫号码:%s\tNAS地址:%s",thetime,name,frame_ipaddr,sess_time,calling_phone,called_phone,nas_ipaddr);
msg[127]='\0';
log_err_inf(msg);
close(sockfd);
return(0);
}
write(sockfd,sendbuf,sizeof(sendbuf));
while ( (n = read(sockfd, recvline, 1500)) > 0)
{
memcpy(recvbuf+x,recvline,n);
x=x+n;
}
unpacker(recvbuf,&rfs);
sprintf(msg,"\n记帐 %s [%d]秒=[%d]分 Tcode=[%d] User=[%s] Note=[%s] 现余:%d 积余:%d ",thetime,sess_time,use_time,rfs.Tcode,rfs.User,rfs.Note,rfs.data.csu.CashAmt,rfs.data.csu.PointAmt);
msg[127] = '\0';
log_inf(msg);
if(rfs.Tcode==204)
{
close(sockfd);
return(0);
}
}
printf("%s",rfs.Note);
sprintf(msg,"\n无法计账 %s 用户 [%s] 使用 %d秒 Tcode %d Note %s",thetime,name,sess_time,rfs.Tcode,rfs.Note);
msg[127]='\0';
log_err_inf(msg);
close(sockfd);
return(0);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?