//static void VolumeManager::InitConfig() { MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop()); // This function uses /system/etc/volume.cfg to add additional volumes // to the Volume Manager. // // This is useful on devices like the Nexus 4, which have no physical sd card // or dedicated partition. // // The format of the volume.cfg file is as follows: // create volume-name mount-point // Blank lines and lines starting with the hash character "#" will be ignored. ScopedCloseFile fp; int n = 0; char line[255]; char *command, *volNamePtr, *mountPointPtr, *save_ptr; const char *filename = "/system/etc/volume.cfg"; if (!(fp = fopen(filename, "r"))) { LOG("Unable to open volume configuration file '%s' - ignoring", filename); return; } while(fgets(line, sizeof(line), fp)) { const char *delim = " \t\n"; n++; if (line[0] == '#') continue; if (!(command = strtok_r(line, delim, &save_ptr))) { // Blank line - ignore continue; } if (!strcmp(command, "create")) { if (!(volNamePtr = strtok_r(nullptr, delim, &save_ptr))) { ERR("No vol_name in %s line %d", filename, n); continue; } if (!(mountPointPtr = strtok_r(nullptr, delim, &save_ptr))) { ERR("No mount point for volume '%s'. %s line %d", volNamePtr, filename, n); continue; } nsCString mountPoint(mountPointPtr); nsCString volName(volNamePtr); RefPtr<Volume> vol = FindAddVolumeByName(volName); vol->SetFakeVolume(mountPoint); } else { ERR("Unrecognized command: '%s'", command); } } }
//static void VolumeManager::InitConfig() { MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop()); // This function uses /system/etc/volume.cfg to add additional volumes // to the Volume Manager. // // This is useful on devices like the Nexus 4, which have no physical sd card // or dedicated partition. // // The format of the volume.cfg file is as follows: // create volume-name mount-point // configure volume-name preference preference-value // Blank lines and lines starting with the hash character "#" will be ignored. ScopedCloseFile fp; int n = 0; char line[255]; const char *filename = "/system/etc/volume.cfg"; if (!(fp = fopen(filename, "r"))) { LOG("Unable to open volume configuration file '%s' - ignoring", filename); return; } while(fgets(line, sizeof(line), fp)) { n++; if (line[0] == '#') continue; nsCString commandline(line); nsCWhitespaceTokenizer tokenizer(commandline); if (!tokenizer.hasMoreTokens()) { // Blank line - ignore continue; } nsCString command(tokenizer.nextToken()); if (command.EqualsLiteral("create")) { if (!tokenizer.hasMoreTokens()) { ERR("No vol_name in %s line %d", filename, n); continue; } nsCString volName(tokenizer.nextToken()); if (!tokenizer.hasMoreTokens()) { ERR("No mount point for volume '%s'. %s line %d", volName.get(), filename, n); continue; } nsCString mountPoint(tokenizer.nextToken()); RefPtr<Volume> vol = FindAddVolumeByName(volName); vol->SetFakeVolume(mountPoint); continue; } if (command.EqualsLiteral("configure")) { if (!tokenizer.hasMoreTokens()) { ERR("No vol_name in %s line %d", filename, n); continue; } nsCString volName(tokenizer.nextToken()); if (!tokenizer.hasMoreTokens()) { ERR("No configuration name specified for volume '%s'. %s line %d", volName.get(), filename, n); continue; } nsCString configName(tokenizer.nextToken()); if (!tokenizer.hasMoreTokens()) { ERR("No value for configuration name '%s'. %s line %d", configName.get(), filename, n); continue; } nsCString configValue(tokenizer.nextToken()); RefPtr<Volume> vol = FindVolumeByName(volName); if (vol) { vol->SetConfig(configName, configValue); } else { ERR("Invalid volume name '%s'.", volName.get()); } continue; } if (command.EqualsLiteral("ignore")) { // This command is useful to remove volumes which are being tracked by // vold, but for which we have no interest. if (!tokenizer.hasMoreTokens()) { ERR("No vol_name in %s line %d", filename, n); continue; } nsCString volName(tokenizer.nextToken()); RemoveVolumeByName(volName); continue; } ERR("Unrecognized command: '%s'", command.get()); } }