int ensure_config_file_exists(const char *config_file) { char buf[2048]; int srcfd, destfd; struct stat sb; int nread; int ret; ret = access(config_file, R_OK|W_OK); if ((ret == 0) || (errno == EACCES)) { if ((ret != 0) && (chmod(config_file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) { ALOGE("Cannot set RW to \"%s\": %s", config_file, strerror(errno)); return -1; } /* return if filesize is at least 10 bytes */ if (stat(config_file, &sb) == 0 && sb.st_size > 10) { return update_ctrl_interface(config_file); } } else if (errno != ENOENT) { ALOGE("Cannot access \"%s\": %s", config_file, strerror(errno)); return -1; } srcfd = TEMP_FAILURE_RETRY(open(SUPP_CONFIG_TEMPLATE, O_RDONLY)); if (srcfd < 0) { ALOGE("Cannot open \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno)); return -1; } destfd = TEMP_FAILURE_RETRY(open(config_file, O_CREAT|O_RDWR, 0660)); if (destfd < 0) { close(srcfd); ALOGE("Cannot create \"%s\": %s", config_file, strerror(errno)); return -1; } while ((nread = TEMP_FAILURE_RETRY(read(srcfd, buf, sizeof(buf)))) != 0) { if (nread < 0) { ALOGE("Error reading \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno)); close(srcfd); close(destfd); unlink(config_file); return -1; } TEMP_FAILURE_RETRY(write(destfd, buf, nread)); } close(destfd); close(srcfd); /* chmod is needed because open() didn't set permisions properly */ if (chmod(config_file, 0660) < 0) { ALOGE("Error changing permissions of %s to 0660: %s", config_file, strerror(errno)); unlink(config_file); return -1; } if (chown(config_file, AID_SYSTEM, AID_WIFI) < 0) { ALOGE("Error changing group ownership of %s to %d: %s", config_file, AID_WIFI, strerror(errno)); unlink(config_file); return -1; } return update_ctrl_interface(config_file); }
int ensure_config_file_exists(const char *config_file) { char buf[2048]; int srcfd, destfd; struct stat sb; int nread; int ret; ret = access(config_file, R_OK|W_OK); if ((ret == 0) || (errno == EACCES)) { if ((ret != 0) && (chmod(config_file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) { ALOGE("Cannot set RW to \"%s\": %s", config_file, strerror(errno)); return -1; } /* return if we were able to update control interface properly */ if (update_ctrl_interface(config_file) >=0) { return 0; } else { /* This handles the scenario where the file had bad data * for some reason. We continue and recreate the file. */ } } else if (errno != ENOENT) { ALOGE("Cannot access \"%s\": %s", config_file, strerror(errno)); return -1; } srcfd = TEMP_FAILURE_RETRY(open(SUPP_CONFIG_TEMPLATE, O_RDONLY)); if (srcfd < 0) { ALOGE("Cannot open \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno)); return -1; } destfd = TEMP_FAILURE_RETRY(open(config_file, O_CREAT|O_RDWR, 0660)); if (destfd < 0) { close(srcfd); ALOGE("Cannot create \"%s\": %s", config_file, strerror(errno)); return -1; } while ((nread = TEMP_FAILURE_RETRY(read(srcfd, buf, sizeof(buf)))) != 0) { if (nread < 0) { ALOGE("Error reading \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno)); close(srcfd); close(destfd); unlink(config_file); return -1; } TEMP_FAILURE_RETRY(write(destfd, buf, nread)); } if (!strcmp(config_file, SUPP_CONFIG_FILE)) { TEMP_FAILURE_RETRY(write(destfd, P2P_DISABLE_PARM, strlen(P2P_DISABLE_PARM))); } close(destfd); close(srcfd); /* chmod is needed because open() didn't set permisions properly */ if (chmod(config_file, 0660) < 0) { ALOGE("Error changing permissions of %s to 0660: %s", config_file, strerror(errno)); unlink(config_file); return -1; } if (chown(config_file, AID_SYSTEM, AID_WIFI) < 0) { ALOGE("Error changing group ownership of %s to %d: %s", config_file, AID_WIFI, strerror(errno)); unlink(config_file); return -1; } return update_ctrl_interface(config_file); }