📄 func.c
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <glib.h>#include <errno.h>#include <wait.h>#include <gtk/gtk.h>#include "main.h"#include "callbacks.h"#include "func.h"#include "debug.h"#include "config.h"long int t_sec = 0;extern GtkWidget *label;void set_to(char *str,char a,char b){ while(*str){ if(*str==a)*str=b; str++; }} char *get_addr(char *str,char ch) { char *p=str; while(*p){ if(*p==ch)break; p++; } return *p?p:str; }int is_pppoe_on(void){ FILE *fp = NULL; char *line = NULL; static char *fpath = "/proc/net/pppoe"; size_t len=0; int t = 0; //g_print("is_pppoe_on ():%s\n",fpath); if(access(fpath,F_OK)==0){ fp = fopen(fpath,"r"); } else return t; if(!fp ){ g_print("is_pppoe_on():fopen %s error :%s .\n",fpath,strerror(errno)); return t; } while(getline(&line,&len,fp)!=-1) { //g_print("is_pppoe_on ():%s\n",line); if(g_strrstr(line,"Address")) continue; t = (!0); break; } if(line)free(line); if(fp)fclose(fp); return t;}/*int fselect(FILE *fp){ //fp->_fileno = 0; //printf("fp->_fileno = %d\n",fp->_fileno); //write(fp->_fileno,"goddamn it !\n",13); int fd = fp->_fileno; fd_set fds; FD_ZERO(&fds); FD_SET(fd,&fds); select(fd+1,&fds,NULL,NULL,NULL); if(FD_ISSET(fd,&fds))return (!0); return 0;}*/ppp * get_ppps(FILE *fp ){ //char *fpath = "/proc/net/dev"; //FILE *fp; ppp *p = NULL,*head = NULL;//{{},0,0,0,0}; char *line; char **args; //char *argv[6]; size_t len = 0 ; /* fp = fopen(fpath,"r"); if(!fp){ g_print("Can't fopen(): %s !\n",fpath); return NULL; } */ //head = g_malloc(sizeof(ppp)); //head = &p; while(getline(&line,&len,fp) != -1){ if(g_strrstr(line,"|")||g_strrstr(line,"lo"))continue; //debug(g_print(line)); if(!p) head= p = g_malloc(sizeof(ppp)); else { p->nt = g_malloc(sizeof(ppp)); p=p->nt; } set_to(line,':',' '); args = get_args(line);//g_strsplit_set(line,"\t :\n",-1); //int i=0,j=0; //while(args[i]){if(args[i][0])g_print("args[%d]:%s j = %d \n",i,args[i],j),j++;i++;} /*i=0;j=0; while(args[i]){ if(args[i][0]){ //if(j>10)break;on_window_delete_event if(j==0)argv[0]=args[i]; if(j==1)argv[1]=args[i]; if(j==2)argv[2]=args[i]; if(j==9)argv[3]=args[i]; if(j==10)argv[4]=args[i]; j++; } if(j>11)break; i++; }*/ strcpy(p->name,args[0]); p->rev_bytes=atol(args[1]); p->rev_pkts=atol(args[2]); p->tsm_bytes=atol(args[9]); p->tsm_pkts=atol(args[10]); if(args)free_args(args);//g_strfreev(args); p->nt = NULL; } //p=head->nt; //g_free(head); if(line)free(line); return head;}void print_ppp(ppp *p){ do { if(p)g_print( "ppp->name :%s\n" "ppp->rev_bytes:%ld\n" "ppp->rev_pkts :%ld\n" "ppp->tsm_bytes:%ld\n" "ppp->tsm_pkts :%ld\n", p->name,p->rev_bytes,p->rev_pkts, p->tsm_bytes,p->tsm_pkts ); else g_print("NULL!\n"); p=p->nt; }while(p);}char *sprint_ppp(ppp *p){ static char str[1024*2]={0}; int i=0; do { if(p)i = sprintf(&str[i],"Interface:%s\n"" rev_bytes:%ld\n"" rev_pkts :%ld\n"" tsm_bytes:%ld\n"" tsm_pkts :%ld\n", p->name,p->rev_bytes,p->rev_pkts, p->tsm_bytes,p->tsm_pkts ); else sprintf(str,"NULL!\n"); p=p->nt; }while(p); return str;}void free_ppp(ppp *p){ ppp *tmp1=p; ppp *tmp2=NULL; tmp2 = tmp1->nt; while(tmp1){ g_free(tmp1); if(tmp2)tmp1= tmp2->nt; else return; if(tmp1)tmp2=tmp1->nt; }}//voidgboolean handler(gpointer data){ static long int total= -3; static FILE *fd = NULL; static char *fpath ="/proc/net/dev"; ppp *p = NULL; char *stt = NULL; char a[16]={0}; char *cmd[]={shell_path"/scripts/pppoecount.sh",def.username,NULL,NULL}; //alarm(2); cmd[2]=a; fd= fopen (fpath, "r" ); if(!fd){ g_print("Can't fopen(): %s :%s\n",fpath,strerror(errno)); return FALSE; } //g_print("come to handler for alarm .\n"); p = get_ppps(fd); //print_ppp(p); stt = sprint_ppp(p); if(g_strrstr(stt,"ppp")){ t_sec+=2; sprintf( &stt[strlen(stt)], "ppp time: %ld:%ld:%ld.\n", t_sec/(3600), (t_sec/60)%60, t_sec%60 ); } else { sprintf(a,"%ld",t_sec); if(t_sec)my_exec(cmd,1); t_sec = 0; total = get_time_of(def.username); } if(total<-2)total = get_time_of(def.username); long int tmp = total + t_sec; sprintf(&stt[strlen(stt)],"Total : %ld:%ld:%ld .\n",tmp/3600,(tmp/60)%60,tmp%60); if(data) gtk_label_set_text(GTK_LABEL(data),stt); free_ppp(p); if(fd)fclose(fd); return TRUE;}gboolean dialog_handler(gpointer data){ debug(g_print("dialog_handler() :\n")); if(GTK_IS_BUTTON(data))gtk_button_clicked (GTK_BUTTON(data)); debug(print("dialog_handler(): exit .\n")); return FALSE;}int my_exec(char **cmd,int flag){ int status = 0; int pid = 0; pid = fork(); if(pid == 0){ //child ! execv(cmd[0],cmd); fprintf(stderr,"execv() %s:%s .\n",cmd[0],strerror(errno)); exit(errno); } else if(pid == -1 ){ ///error . fprintf(stderr,"my_exec:fork():%s \n",strerror(errno)); return pid; } if(flag == 0){//father waitpid(pid,&status, 0); if(WIFEXITED(status)){ fprintf(stderr,"My_exec():%s Normal exit .\n",cmd[0]); return WEXITSTATUS(status); }else { fprintf(stderr,"My_exec():%s .\n",strerror(errno)); } } else if (flag == 1 ) return pid; return (-2);}int my_exec_str(char * cmdstr,int flag){ char **cmd = NULL;/// no more argc -1 argumnets; int i=0; cmd = get_args(cmdstr); i = my_exec(cmd,flag); if(cmd)free_args(cmd); return i;}void del_user_in(char * file,char *user){ char cmd [ 1024 ]={0}; sprintf(cmd,"/bin/sed -i -e 's/%s/d' %s",user,file); my_exec_str(cmd,0);}char ** get_args(char *cmdstr){#define argc 18 static char *cmd[argc] ;/// no more argc -1 argumnets; char *str = NULL, *head = NULL; int i=0; int j=0; if(!cmdstr||!cmdstr[0]) return NULL; head = str = malloc(strlen(cmdstr)+1); if(str == NULL){ fprintf(stderr,"get_args():malloc():%s .\n",strerror(errno)); exit(errno); } strcpy(str,cmdstr); if(*str&&*str!=' '&&*str!='\n')cmd[i++]=str; while(*str){ char tmp; tmp =*str; if(tmp != '\''&&j==1){ str++;continue;} if(tmp=='\'')j++; if(j==2)j=0; if(tmp=='\''||tmp ==' '||tmp == '\n')*str=0; str++; if((tmp=='\''||tmp==' ')&&(*str!='\''&&*str!=' '&&*str!='\n')){ if(!(i<argc-2))break; cmd[i++]=str; } } cmd[i]=NULL; cmd[i+1]=head; //int args=0; while(args<i&&cmd[args][0]){ g_print("%s args = %d\n",cmd[args++],args);} g_print("i = %d\n",i); return cmd;#undef argc}int get_run_proc_dir(){ if(access(pid_file,F_OK)==0){ FILE *fd =NULL; char str[32]="/proc/"; fd = fopen(pid_file,"r"); fscanf(fd,"%s",str+6); fclose(fd); if(access(str,F_OK)==0)return 1; else return 0; } return 0;}void deal_pid_file(void){ if(get_run_proc_dir()){ fprintf(stderr,"Gtk-pppoe is running .\n"); exit(1); } else { FILE *fs =NULL; fs = fopen(pid_file,"w"); if(!fs){ fprintf(stderr,"deal_pid_file():fopen():%s .\n",strerror(errno)); exit(errno); } fprintf(fs,"%d",getpid()); fclose(fs); }}void free_args(char **args){ int i=0; while(args[i])i++; free(args[i]);}void my_exit(void){ if(access(pid_file,F_OK)==0)unlink(pid_file); if(tail_pid >20&&kill(tail_pid,15)) fprintf(stderr,"kill():%s .\n",strerror(errno)); char *cmd[]={"/usr/bin/poff",def.adslname,NULL}; my_exec(cmd,0); fprintf(stderr,"gtk-pppoe: My_exit was runed .\n");}long int get_time_of(char *name){ char *s = "/home/.pppoe.log"; FILE *f = NULL; size_t len = 0; char *line = NULL; long int t = 0; if(!(name&&*name))return t; f = fopen(s,"r"); if(!f){ fprintf(stderr,"fopen():%s:%s .\n",s,strerror(errno)); t= -1; }else while(getline(&line,&len,f)!=-1){ if(g_strrstr(line,name)){ t = atol(get_addr(line,'=')+1); } } if(f)fclose(f); if(line)free(line); return t;}char *get_gw(void) ///temporary{ return "ppp";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -