/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* this program is used to read a set of system properties and their values * from the emulator program and set them in the currently-running emulated * system. It does so by connecting to the 'boot-properties' qemud service. * * This file parses the sys/class/virtio-ports/<id>/name * and set up vendor.qemu.vport.modem=/dev/<id> so that reference-ril * can open it later */ #include <fstream> #include <string> #include <android-base/strings.h> #include <log/log.h> #include <cutils/properties.h> #include <dirent.h> #include <error.h> #include <string.h> #include <unistd.h> static void set_port_prop(const char* filename, const char* portname) { std::ifstream myfile(filename); if (myfile.is_open()) { const std::string portdev = std::string{"/dev/"} + portname; for (std::string line; std::getline(myfile, line); ) { std::string serialname = android::base::Trim(line); if (serialname.empty()) { continue; } serialname = std::string("vendor.qemu.vport.") + serialname; if(property_set(serialname.c_str(), portdev.c_str()) < 0) { ALOGW("could not set property '%s' to '%s'", serialname.c_str(), portdev.c_str()); } else { ALOGI("successfully set property '%s' to '%s'", serialname.c_str(), portdev.c_str()); } } myfile.close(); } else { ALOGW("could not open '%s'", filename); } } static void close_dir(DIR *dp) { closedir(dp); } static void read_virio_ports_dir(const char *cpath) { std::unique_ptr<DIR, decltype(&close_dir)> mydp(opendir(cpath), &close_dir); if (!mydp) { ALOGW("cannot open dir %s; %s\n", cpath, strerror(errno)); return; } const std::string path(cpath); struct dirent *files; while ((files = readdir(mydp.get())) != NULL) { if (strcmp(files->d_name, ".") == 0 || strcmp(files->d_name, "..") == 0) { continue; } std::string filename = path + std::string("/") + std::string(files->d_name) + "/name"; set_port_prop(filename.c_str(), files->d_name); } } void parse_virtio_serial() { read_virio_ports_dir("/sys/class/virtio-ports"); }