summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorIrfan Sheriff <isheriff@google.com>2011-08-26 14:39:38 -0700
committerIrfan Sheriff <isheriff@google.com>2011-08-26 14:39:38 -0700
commit67ba2276b9a5232685e14d416fea0b1250515594 (patch)
tree8c2483a293317f609aee16862d8c889e5d1a71cb /wifi
parent953c1140659ae935e4718d4fd48662db178814f6 (diff)
downloadhardware_libhardware_legacy-67ba2276b9a5232685e14d416fea0b1250515594.zip
hardware_libhardware_legacy-67ba2276b9a5232685e14d416fea0b1250515594.tar.gz
hardware_libhardware_legacy-67ba2276b9a5232685e14d416fea0b1250515594.tar.bz2
Add support seperate p2p config file
Also, fixed a bug with config overwrite with ctrl_interface update Bug: 5002384 Change-Id: I870c12ee58d60f696512c27deb4b9d35b4dc3b2a
Diffstat (limited to 'wifi')
-rw-r--r--wifi/wifi.c156
1 files changed, 93 insertions, 63 deletions
diff --git a/wifi/wifi.c b/wifi/wifi.c
index 5afefdc..332133c 100644
--- a/wifi/wifi.c
+++ b/wifi/wifi.c
@@ -86,6 +86,8 @@ static const char SUPPLICANT_NAME[] = "wpa_supplicant";
static const char SUPP_PROP_NAME[] = "init.svc.wpa_supplicant";
static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
+static const char P2P_CONFIG_FILE[] = "/data/misc/wifi/p2p_supplicant.conf";
+static const char CONTROL_IFACE_PATH[] = "/data/misc/wifi";
static const char MODULE_FILE[] = "/proc/modules";
static const char SUPP_ENTROPY_FILE[] = WIFI_ENTROPY_FILE;
@@ -298,70 +300,88 @@ int ensure_entropy_file_exists()
return 0;
}
-int ensure_config_file_exists()
-{
- char buf[2048];
+int update_ctrl_interface(const char *config_file) {
+
+ int srcfd, destfd;
+ int nread;
char ifc[PROPERTY_VALUE_MAX];
- char *sptr;
char *pbuf;
+ char *sptr;
+ struct stat sb;
+
+ if (stat(config_file, &sb) != 0)
+ return -1;
+
+ pbuf = malloc(sb.st_size + PROPERTY_VALUE_MAX);
+ if (!pbuf)
+ return 0;
+ srcfd = open(config_file, O_RDONLY);
+ if (srcfd < 0) {
+ LOGE("Cannot open \"%s\": %s", config_file, strerror(errno));
+ free(pbuf);
+ return 0;
+ }
+ nread = read(srcfd, pbuf, sb.st_size);
+ close(srcfd);
+ if (nread < 0) {
+ LOGE("Cannot read \"%s\": %s", config_file, strerror(errno));
+ free(pbuf);
+ return 0;
+ }
+
+ if (!strcmp(config_file, SUPP_CONFIG_FILE)) {
+ property_get("wifi.interface", ifc, WIFI_TEST_INTERFACE);
+ } else {
+ strcpy(ifc, CONTROL_IFACE_PATH);
+ }
+ if ((sptr = strstr(pbuf, "ctrl_interface="))) {
+ char *iptr = sptr + strlen("ctrl_interface=");
+ int ilen = 0;
+ int mlen = strlen(ifc);
+ int nwrite;
+ if (strncmp(ifc, iptr, mlen) != 0) {
+ LOGE("ctrl_interface != %s", ifc);
+ while (((ilen + (iptr - pbuf)) < nread) && (iptr[ilen] != '\n'))
+ ilen++;
+ mlen = ((ilen >= mlen) ? ilen : mlen) + 1;
+ memmove(iptr + mlen, iptr + ilen + 1, nread - (iptr + ilen + 1 - pbuf));
+ memset(iptr, '\n', mlen);
+ memcpy(iptr, ifc, strlen(ifc));
+ destfd = open(config_file, O_RDWR, 0660);
+ if (destfd < 0) {
+ LOGE("Cannot update \"%s\": %s", config_file, strerror(errno));
+ free(pbuf);
+ return -1;
+ }
+ write(destfd, pbuf, nread + mlen - ilen -1);
+ close(destfd);
+ }
+ }
+ free(pbuf);
+ return 0;
+}
+
+int ensure_config_file_exists(const char *config_file)
+{
+ char buf[2048];
int srcfd, destfd;
struct stat sb;
int nread;
int ret;
- ret = access(SUPP_CONFIG_FILE, R_OK|W_OK);
+ ret = access(config_file, R_OK|W_OK);
if ((ret == 0) || (errno == EACCES)) {
if ((ret != 0) &&
- (chmod(SUPP_CONFIG_FILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) {
- LOGE("Cannot set RW to \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
+ (chmod(config_file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) {
+ LOGE("Cannot set RW to \"%s\": %s", config_file, strerror(errno));
return -1;
}
/* return if filesize is at least 10 bytes */
- if (stat(SUPP_CONFIG_FILE, &sb) == 0 && sb.st_size > 10) {
- pbuf = malloc(sb.st_size + PROPERTY_VALUE_MAX);
- if (!pbuf)
- return 0;
- srcfd = open(SUPP_CONFIG_FILE, O_RDONLY);
- if (srcfd < 0) {
- LOGE("Cannot open \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
- free(pbuf);
- return 0;
- }
- nread = read(srcfd, pbuf, sb.st_size);
- close(srcfd);
- if (nread < 0) {
- LOGE("Cannot read \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
- free(pbuf);
- return 0;
- }
- property_get("wifi.interface", ifc, WIFI_TEST_INTERFACE);
- if ((sptr = strstr(pbuf, "ctrl_interface="))) {
- char *iptr = sptr + strlen("ctrl_interface=");
- int ilen = 0;
- int mlen = strlen(ifc);
- if (strncmp(ifc, iptr, mlen) != 0) {
- LOGE("ctrl_interface != %s", ifc);
- while (((ilen + (iptr - pbuf)) < nread) && (iptr[ilen] != '\n'))
- ilen++;
- mlen = ((ilen >= mlen) ? ilen : mlen) + 1;
- memmove(iptr + mlen, iptr + ilen + 1, nread - (iptr + ilen + 1 - pbuf));
- memset(iptr, '\n', mlen);
- memcpy(iptr, ifc, strlen(ifc));
- destfd = open(SUPP_CONFIG_FILE, O_RDWR, 0660);
- if (destfd < 0) {
- LOGE("Cannot update \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
- free(pbuf);
- return -1;
- }
- write(destfd, pbuf, nread);
- close(destfd);
- }
- }
- free(pbuf);
- return 0;
+ if (stat(config_file, &sb) == 0 && sb.st_size > 10) {
+ return update_ctrl_interface(config_file);
}
} else if (errno != ENOENT) {
- LOGE("Cannot access \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
+ LOGE("Cannot access \"%s\": %s", config_file, strerror(errno));
return -1;
}
@@ -371,10 +391,10 @@ int ensure_config_file_exists()
return -1;
}
- destfd = open(SUPP_CONFIG_FILE, O_CREAT|O_RDWR, 0660);
+ destfd = open(config_file, O_CREAT|O_RDWR, 0660);
if (destfd < 0) {
close(srcfd);
- LOGE("Cannot create \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
+ LOGE("Cannot create \"%s\": %s", config_file, strerror(errno));
return -1;
}
@@ -383,7 +403,7 @@ int ensure_config_file_exists()
LOGE("Error reading \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno));
close(srcfd);
close(destfd);
- unlink(SUPP_CONFIG_FILE);
+ unlink(config_file);
return -1;
}
write(destfd, buf, nread);
@@ -393,20 +413,20 @@ int ensure_config_file_exists()
close(srcfd);
/* chmod is needed because open() didn't set permisions properly */
- if (chmod(SUPP_CONFIG_FILE, 0660) < 0) {
+ if (chmod(config_file, 0660) < 0) {
LOGE("Error changing permissions of %s to 0660: %s",
- SUPP_CONFIG_FILE, strerror(errno));
- unlink(SUPP_CONFIG_FILE);
+ config_file, strerror(errno));
+ unlink(config_file);
return -1;
}
- if (chown(SUPP_CONFIG_FILE, AID_SYSTEM, AID_WIFI) < 0) {
+ if (chown(config_file, AID_SYSTEM, AID_WIFI) < 0) {
LOGE("Error changing group ownership of %s to %d: %s",
- SUPP_CONFIG_FILE, AID_WIFI, strerror(errno));
- unlink(SUPP_CONFIG_FILE);
+ config_file, AID_WIFI, strerror(errno));
+ unlink(config_file);
return -1;
}
- return 0;
+ return update_ctrl_interface(config_file);
}
/**
@@ -448,7 +468,7 @@ void wifi_wpa_ctrl_cleanup(void)
closedir(dir);
}
-int wifi_start_supplicant()
+int wifi_start_supplicant_common(const char *config_file)
{
char daemon_cmd[PROPERTY_VALUE_MAX];
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
@@ -465,7 +485,7 @@ int wifi_start_supplicant()
}
/* Before starting the daemon, make sure its config file exists */
- if (ensure_config_file_exists() < 0) {
+ if (ensure_config_file_exists(config_file) < 0) {
LOGE("Wi-Fi will not be enabled");
return -1;
}
@@ -491,7 +511,7 @@ int wifi_start_supplicant()
}
#endif
property_get("wifi.interface", iface, WIFI_TEST_INTERFACE);
- snprintf(daemon_cmd, PROPERTY_VALUE_MAX, "%s:-i%s", SUPPLICANT_NAME, iface);
+ snprintf(daemon_cmd, PROPERTY_VALUE_MAX, "%s:-i%s -c%s", SUPPLICANT_NAME, iface, config_file);
property_set("ctl.start", daemon_cmd);
sched_yield();
@@ -520,6 +540,16 @@ int wifi_start_supplicant()
return -1;
}
+int wifi_start_supplicant()
+{
+ return wifi_start_supplicant_common(SUPP_CONFIG_FILE);
+}
+
+int wifi_start_p2p_supplicant()
+{
+ return wifi_start_supplicant_common(P2P_CONFIG_FILE);
+}
+
int wifi_stop_supplicant()
{
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};