📄 daemon.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>#include <sys/socket.h>#include <time.h>#include <sys/param.h>#include <sys/types.h>#include <sys/time.h>#include "daemon.h"#include <drvpriv.h>#include "wireless_copy.h"unsigned char essid[32];unsigned char old_essid[32];extern int print_scanning_info(FILE *pFile, int skfd, char *ifname);static void init_daemon(void){ int pid; int i; if(pid=fork()) exit(0); else if(pid<0) exit(1); setsid(); if(pid=fork()) exit(0); else if(pid<0) exit(1); chdir("/tmp/yaffs"); umask(0); return;}static int mystrcmp(char *s, char *t){ while(*s!='\0' && *t!='\0' && *s==*t) { ++s; ++t; } if(*s=='\0' || *t=='\0') return 0; else return -1;}static int daemon_drv_get_scan_results(FILE *pFile, struct wpa_scan_result *results, size_t max_size){ struct iwreq pstWrq;
int ret = 0; int i,ioctl_sock,level,curr_i,first_come; char cmd[255]; struct iwdrv_priv_oid iw_p; ioctl_sock = socket(PF_INET,SOCK_DGRAM,0); //更新level //system("/tmp/yaffs/iwlist2 eth1 scan"); print_scanning_info(pFile, ioctl_sock, "eth1"); ioctl(ioctl_sock, SIOCSIWSCAN, &pstWrq);
memset(cmd, 0, sizeof(cmd));
memset(results, 0, max_size * sizeof(struct wpa_scan_result));
iw_p.priv_id = HEOCGIWDPSCRES;
iw_p.length = max_size * sizeof(struct wpa_scan_result);
iw_p.pointer = (caddr_t)results;
memset(&pstWrq, 0, sizeof(pstWrq));
strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ);
pstWrq.u.data.pointer = (caddr_t)&iw_p;
pstWrq.u.data.length = max_size * sizeof(struct wpa_scan_result) + sizeof(struct iwdrv_priv_oid);
if (ioctl(ioctl_sock, HEOCDRIVPRIV, &pstWrq) < 0) {
//perror("ioctl error HEOCDRIVPRIV!");
ret = -1;
}
ret = iw_p.flags; fprintf(pFile, "ret = %d\n", ret); //根据scan结果确定连接对象 first_come = 0; curr_i = -1; for(i=0;i<ret;i++) { if(mystrcmp((char *)((struct wpa_scan_result *)(results + i)->ssid),"njdt-")!=0 && mystrcmp((char *)((struct wpa_scan_result *)(results + i)->ssid),"NJDT-")!=0) continue; //fprintf(pFile, "%d >> bssid = %s\n", i+1, (struct wpa_scan_result *)(results + i)->bssid); fprintf(pFile, "%d >> ssid = %s\n", i+1, (struct wpa_scan_result *)(results + i)->ssid); //fprintf(pFile, "%d >> wpa_ie = %s\n", i+1, (struct wpa_scan_result *)(results + i)->wpa_ie); //fprintf(pFile, "%d >> rsn_ie = %s\n", i+1, (struct wpa_scan_result *)(results + i)->rsn_ie); //fprintf(pFile, "%d >> freq = %d\n", i+1, (struct wpa_scan_result *)(results + i)->freq); //fprintf(pFile, "%d >> caps = %d\n", i+1, (struct wpa_scan_result *)(results + i)->caps); //fprintf(pFile, "%d >> qual = %d\n", i+1, (struct wpa_scan_result *)(results + i)->qual); //fprintf(pFile, "%d >> noise = %d\n", i+1, (struct wpa_scan_result *)(results + i)->noise); fprintf(pFile, "%d >> level = %d\n", i+1, (struct wpa_scan_result *)(results + i)->level); if((int)((struct wpa_scan_result *)(results + i)->level) > level || first_come == 0) { first_come = 1; level = (int)(struct wpa_scan_result *)(results + i)->level; curr_i = i; } } if(curr_i == -1)//未检测到njdt的sta return ret; memcpy(essid, (struct wpa_scan_result *)(results + curr_i)->ssid, 32); fprintf(pFile, "%d >> selected ssid = %s\n", i+1, essid); //get old essid memset(&pstWrq, 0, sizeof(pstWrq));
strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ); pstWrq.u.essid.pointer = (caddr_t)old_essid; pstWrq.u.essid.length = 32; pstWrq.u.essid.flags = 0; ioctl(ioctl_sock, SIOCGIWESSID, &pstWrq); fprintf(pFile, "haha ** old_essid = %s\n", old_essid); if(strcmp(essid, old_essid)!=0) { //struct timeval tv; //struct timezone tz; //strcpy(cmd, "iwconfig eth1 essid "); //strcat(cmd, essid); //gettimeofday(&tv, &tz); //fprintf(pFile, "before ** tv_sec = %d\n", tv.tv_sec); //fprintf(pFile, "before ** tv_usec = %d\n", tv.tv_usec); //system(cmd); //gettimeofday(&tv, &tz); //连接sta //set new essid memset(&pstWrq, 0, sizeof(pstWrq));
strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ); pstWrq.u.essid.pointer = (caddr_t)essid; pstWrq.u.essid.length = strlen(essid)+1; pstWrq.u.essid.flags = 1; ioctl(ioctl_sock, SIOCSIWESSID, &pstWrq); //fprintf(pFile, "after ** tv_sec = %d\n", tv.tv_sec); //fprintf(pFile, "after ** tv_usec = %d\n", tv.tv_usec); } close(ioctl_sock);
return ret;
}static int daemon_get_scan_results()
{
#define SCAN_AP_LIMIT 16
struct wpa_scan_result *results, *tmp;
int num; FILE *pFile; pFile = fopen("/tmp/yaffs/log.txt","at");
results = malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
if (results == NULL) {
fprintf(pFile, "Failed to allocate memory for scan results");
return -1;
}
num = daemon_drv_get_scan_results(pFile, results, SCAN_AP_LIMIT); fprintf(pFile, "Scan results num: %d\n", num);
if (num < 0) {
fprintf(pFile, "Failed to get scan results");
free(results);
return -1;
}
if (num > SCAN_AP_LIMIT) {
fprintf(pFile, "Not enough room for all APs (%d < %d)", num, SCAN_AP_LIMIT);
num = SCAN_AP_LIMIT;
}
fclose(pFile);
return 0;
}static int eth1_detect(){ char buff[256]; FILE *fh; fh = fopen("/proc/net/wireless","r"); if(fh != NULL) { fgets(buff, sizeof(buff), fh); fgets(buff, sizeof(buff), fh); while(fgets(buff, sizeof(buff), fh)) { if(strstr(buff, "eth1") != 0) { fclose(fh); return 1; } } fclose(fh); } return 0;}main(){ init_daemon(); while(eth1_detect() == 0) { sleep(50); } system("iwconfig eth1 mode ad-hoc"); while(1) { //开始处理sta切换 daemon_get_scan_results(); sleep(10); //usleep(1000000); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -