void write_tty_normal(char buf) { if(buf == '\n') { update_scr(scr_pos); scr_pos = add_mod(scr_pos, C-(scr_pos%C)); update_scr(scr_pos); } else if(buf == '\t') { update_scr(scr_pos); scr_pos = add_mod(scr_pos, 8-(scr_pos%C%8)); update_scr(scr_pos); } else if(buf == '\b') { update_scr(scr_pos); scr_pos = add_mod(scr_pos, -1); scr[scr_pos] = ' '; fg[scr_pos] = cur_fg; bg[scr_pos] = cur_bg; update_scr(scr_pos); } else { scr[scr_pos] = buf; fg[scr_pos] = cur_fg; bg[scr_pos] = cur_bg; update_scr(scr_pos); scr_pos = add_mod(scr_pos, 1); } }
void draw_cur() { int r, c; if(!scr_pos_hide) { r = add_mod(scr_pos, -cur_top)/C; c = add_mod(scr_pos, -cur_top)%C; update_scr(scr_pos); draw_ascii(canv, c*FW, (r+1)*FH, scr[scr_pos], bg[scr_pos], fg[scr_pos]); refresh_scr(p_x1, p_y1, p_x2, p_y2); } }
int main(int argc, char *argv[]) { struct ap_list apl; struct ap_info api; struct iw_dev dev; struct pollfd pfd[2]; struct deauth_thread_args ta; struct timeval tv1, tv2; suseconds_t msec; pthread_t deauth_thread; pthread_mutex_t chan_mutex, list_mutex, cnc_mutex; pthread_cond_t chan_cond; channelset_t chans; int ret, sigfd, c, n, chan; char *ifname, *chans_str; sigset_t exit_sig; time_t tm; if (argc < 2) { print_usage(stderr); return EXIT_FAILURE; } /* arguments */ ifname = argv[argc-1]; chans_str = NULL; while((c = getopt(argc, argv, "c:lh")) != -1) { switch (c) { case 'c': chans_str = optarg; break; case 'l': return print_interfaces(); case 'h': print_usage(stdout); return EXIT_SUCCESS; case '?': default: return EXIT_FAILURE; } } if (argv[optind] != ifname) { print_usage(stderr); return EXIT_FAILURE; } if (getuid()) { fprintf(stderr, "Not root?\n"); return EXIT_FAILURE; } /* init channel set */ if (chans_str == NULL) { channel_zero(&chans); for (n=1; n<=14; n++) channel_set(&chans, n); } else { if (parse_chans_str(chans_str, &chans) == -1) { fprintf(stderr, "Can not parse the channels\n"); return EXIT_FAILURE; } } /* init access point list */ init_ap_list(&apl); /* init signals */ sigemptyset(&exit_sig); sigaddset(&exit_sig, SIGINT); sigaddset(&exit_sig, SIGTERM); if (sigprocmask(SIG_BLOCK, &exit_sig, NULL) < 0) { err_msg("sigprocmask"); return EXIT_FAILURE; } sigfd = signalfd(-1, &exit_sig, 0); if (sigfd < 0) { err_msg("signalfd"); return EXIT_FAILURE; } pfd[0].fd = sigfd; pfd[0].revents = 0; pfd[0].events = POLLIN; /* init device */ iw_init_dev(&dev); strncpy(dev.ifname, ifname, sizeof(dev.ifname)-1); if (iw_open(&dev) < 0) { print_error(); goto _errout_no_thread; } pfd[1].fd = dev.fd_in; pfd[1].revents = 0; pfd[1].events = POLLIN; /* set channel */ n = 0; chan = 0; do { chan = (chan % CHANNEL_MAX) + 1; if (channel_isset(&chans, chan)) ret = iw_set_channel(&dev, chan); else ret = -1; /* if fails try next channel */ } while(++n < CHANNEL_MAX && ret < 0); if (ret < 0) { print_error(); goto _errout_no_thread; } /* start deauth thread */ ta.stop = 0; ta.apl = &apl; ta.dev = &dev; pthread_mutex_init(&chan_mutex, NULL); ta.chan_mutex = &chan_mutex; pthread_cond_init(&chan_cond, NULL); ta.chan_cond = &chan_cond; pthread_mutex_init(&list_mutex, NULL); ta.list_mutex = &list_mutex; ta.chan_changed = 1; pthread_mutex_init(&cnc_mutex, NULL); ta.cnc_mutex = &cnc_mutex; ta.chan_need_change = 0; if (pthread_create(&deauth_thread, NULL, deauth_thread_func, &ta) < 0) { err_msg("pthread_create"); goto _errout_no_thread; } clear_scr(); update_scr(&apl, &dev); tm = time(NULL); gettimeofday(&tv1, NULL); while (!ta.stop) { if (poll(pfd, 2, 0) < 0) { err_msg("poll"); goto _errout; } if (pfd[0].revents & POLLIN) /* got SIGTERM or SIGINT */ break; if (pfd[1].revents & POLLIN) { ret = read_ap_info(&dev, &api); if (ret < 0 && ret != ERRNODATA) { /* error */ print_error(); goto _errout; } else if (ret == 0 && channel_isset(&chans, api.chan)) { /* got infos */ pthread_mutex_lock(&list_mutex); if (add_or_update_ap(&apl, &api) < 0) { pthread_mutex_unlock(&list_mutex); print_error(); goto _errout; } pthread_mutex_unlock(&list_mutex); } } gettimeofday(&tv2, NULL); if (tv2.tv_usec > tv1.tv_usec) msec = tv2.tv_usec - tv1.tv_usec; else msec = tv1.tv_usec - tv2.tv_usec; /* update screen every 0.5 second */ if (msec >= 500000) { pthread_mutex_lock(&list_mutex); update_scr(&apl, &dev); pthread_mutex_unlock(&list_mutex); gettimeofday(&tv1, NULL); } /* change channel at least every 1 second */ if (time(NULL) - tm >= 1) { if (!ta.chan_changed) { pthread_mutex_lock(&cnc_mutex); ta.chan_need_change = 0; pthread_mutex_unlock(&cnc_mutex); pthread_mutex_lock(&chan_mutex); n = 0; do { chan = (chan % CHANNEL_MAX) + 1; if (channel_isset(&chans, chan)) ret = iw_set_channel(&dev, chan); else ret = -1; /* if fails try next channel */ } while(++n < CHANNEL_MAX && ret < 0); /* if all channels failed */ if (ret < 0) { print_error(); goto _errout; } tm = time(NULL); ta.chan_changed = 1; pthread_cond_signal(&chan_cond); pthread_mutex_unlock(&chan_mutex); } else { pthread_mutex_lock(&cnc_mutex); ta.chan_need_change = 1; pthread_mutex_unlock(&cnc_mutex); } } } /* we got an error from deauth thread */ if (ta.stop == 2) goto _errout; printf("\nExiting..\n"); ta.stop = 1; pthread_mutex_unlock(&list_mutex); pthread_cond_broadcast(&chan_cond); pthread_mutex_unlock(&chan_mutex); pthread_join(deauth_thread, NULL); iw_close(&dev); free_ap_list(&apl); return EXIT_SUCCESS; _errout: ta.stop = 1; pthread_mutex_unlock(&list_mutex); pthread_cond_broadcast(&chan_cond); pthread_mutex_unlock(&chan_mutex); pthread_join(deauth_thread, NULL); _errout_no_thread: iw_close(&dev); free_ap_list(&apl); return EXIT_FAILURE; }