/* * Copyright (C) 2023 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. */ #include "./string-utils.h" #include #include #include namespace shell_as { bool StringToUInt32(const char* s, uint32_t* i) { uint64_t value = 0; if (!StringToUInt64(s, &value)) { return false; } if (value > UINT_MAX) { return false; } *i = value; return true; } bool StringToUInt64(const char* s, uint64_t* i) { char* endptr = nullptr; // Reset errno to a non-error value since strtoul does not clear errno. errno = 0; *i = strtoul(s, &endptr, 10); // strtoul will return 0 if the value cannot be parsed as an unsigned long. If // this occurs, ensure that the ID actually was zero. This is done by ensuring // that the end pointer was advanced and that it now points to the end of the // string (a null byte). return errno == 0 && (*i != 0 || (endptr != s && *endptr == '\0')); } bool SplitIdsAndSkip(char* line, const char* separators, int num_to_skip, std::vector* ids) { if (line == nullptr) { return false; } ids->clear(); for (char* id_string = strtok(line, separators); id_string != nullptr; id_string = strtok(nullptr, separators)) { if (num_to_skip > 0) { num_to_skip--; continue; } gid_t id; if (!StringToUInt32(id_string, &id)) { return false; } ids->push_back(id); } return true; } } // namespace shell_as