blob: 048e784af2a00bcffaefc0e922a84080732aff9d [file] [log] [blame]
San Mehate67651c2009-05-12 15:50:49 -07001#include <stdlib.h>
2#include <sys/socket.h>
3#include <sys/select.h>
4#include <sys/time.h>
5#include <sys/types.h>
San Mehat1441e762009-05-07 11:37:10 -07006#include <errno.h>
7#include <pthread.h>
8
9#define LOG_TAG "WifiScanner"
10#include <cutils/log.h>
11
12#include "WifiScanner.h"
13#include "Supplicant.h"
14
15extern "C" int pthread_cancel(pthread_t thread);
16
17WifiScanner::WifiScanner(Supplicant *suppl, int period) {
18 mSuppl = suppl;
19 mPeriod = period;
20 mActive = false;
San Mehat1441e762009-05-07 11:37:10 -070021}
22
San Mehate67651c2009-05-12 15:50:49 -070023int WifiScanner::start(bool active) {
San Mehat1441e762009-05-07 11:37:10 -070024 mActive = active;
25
San Mehate67651c2009-05-12 15:50:49 -070026 if(pipe(mCtrlPipe))
San Mehat1441e762009-05-07 11:37:10 -070027 return -1;
28
San Mehate67651c2009-05-12 15:50:49 -070029 if (pthread_create(&mThread, NULL, WifiScanner::threadStart, this))
30 return -1;
San Mehat1441e762009-05-07 11:37:10 -070031 return 0;
32}
33
34void *WifiScanner::threadStart(void *obj) {
35 WifiScanner *me = reinterpret_cast<WifiScanner *>(obj);
36 me->run();
37 pthread_exit(NULL);
38 return NULL;
39}
40
San Mehate67651c2009-05-12 15:50:49 -070041int WifiScanner::stop() {
42 char c = 0;
San Mehat1441e762009-05-07 11:37:10 -070043
San Mehate67651c2009-05-12 15:50:49 -070044 if (write(mCtrlPipe[1], &c, 1) != 1) {
45 LOGE("Error writing to control pipe (%s)", strerror(errno));
46 return -1;
San Mehat1441e762009-05-07 11:37:10 -070047 }
San Mehat1441e762009-05-07 11:37:10 -070048
San Mehate67651c2009-05-12 15:50:49 -070049 void *ret;
50 if (pthread_join(mThread, &ret)) {
51 LOGE("Error joining to scanner thread (%s)", strerror(errno));
52 return -1;
53 }
San Mehat1441e762009-05-07 11:37:10 -070054
San Mehate67651c2009-05-12 15:50:49 -070055 close(mCtrlPipe[0]);
56 close(mCtrlPipe[1]);
San Mehat1441e762009-05-07 11:37:10 -070057 return 0;
58}
59
60void WifiScanner::run() {
San Mehate67651c2009-05-12 15:50:49 -070061 LOGD("Starting wifi scanner (active = %d)", mActive);
San Mehat1441e762009-05-07 11:37:10 -070062
63 while(1) {
San Mehate67651c2009-05-12 15:50:49 -070064 fd_set read_fds;
65 struct timeval to;
66 int rc = 0;
67
San Mehat48765672009-05-20 15:28:43 -070068 to.tv_usec = 0;
San Mehate67651c2009-05-12 15:50:49 -070069 to.tv_sec = mPeriod;
70
71 FD_ZERO(&read_fds);
72 FD_SET(mCtrlPipe[0], &read_fds);
73
San Mehat1441e762009-05-07 11:37:10 -070074 if (mSuppl->triggerScan(mActive)) {
75 LOGW("Error triggering scan (%s)", strerror(errno));
76 }
77
San Mehate67651c2009-05-12 15:50:49 -070078 if ((rc = select(mCtrlPipe[0] + 1, &read_fds, NULL, NULL, &to)) < 0) {
79 LOGE("select failed (%s) - sleeping for one scanner period", strerror(errno));
80 sleep(mPeriod);
81 continue;
82 } else if (!rc) {
83 } else if (FD_ISSET(mCtrlPipe[0], &read_fds))
84 break;
85 } // while
San Mehat48765672009-05-20 15:28:43 -070086 LOGD("Stopping wifi scanner");
San Mehat1441e762009-05-07 11:37:10 -070087}