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 + -
显示快捷键?