system/core: add libpackagelistparser There are 4 components that all implement package parsing, they are: 1. sdcardd 2. libselinux 3. logd 4. runas Create a library that can be used by all of them, and new ones as needed. (Moved from frameworks/base) Change-Id: I282ec1204e592502ef3b28fedf577af824338c58
diff --git a/packagelistparser/packagelistparser.h b/packagelistparser/packagelistparser.h new file mode 100644 index 0000000..d602c26 --- /dev/null +++ b/packagelistparser/packagelistparser.h
@@ -0,0 +1,92 @@ +/* + * Copyright 2015, Intel Corporation + * Copyright (C) 2015 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. + * + * Written by William Roberts <william.c.roberts@intel.com> + * + * This is a parser library for parsing the packages.list file generated + * by PackageManager service. + * + * This simple parser is sensitive to format changes in + * frameworks/base/services/core/java/com/android/server/pm/Settings.java + * A dependency note has been added to that file to correct + * this parser. + */ + +#ifndef PACKAGELISTPARSER_H_ +#define PACKAGELISTPARSER_H_ + +#include <stdbool.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +__BEGIN_DECLS + +/** The file containing the list of installed packages on the system */ +#define PACKAGES_LIST_FILE "/data/system/packages.list" + +typedef struct pkg_info pkg_info; +typedef struct gid_list gid_list; + +struct gid_list { + size_t cnt; + gid_t *gids; +}; + +struct pkg_info { + char *name; + uid_t uid; + bool debuggable; + char *data_dir; + char *seinfo; + gid_list gids; + void *private_data; +}; + +/** + * Callback function to be used by packagelist_parse() routine. + * @param info + * The parsed package information + * @param userdata + * The supplied userdata pointer to packagelist_parse() + * @return + * true to keep processing, false to stop. + */ +typedef bool (*pfn_on_package)(pkg_info *info, void *userdata); + +/** + * Parses the file specified by PACKAGES_LIST_FILE and invokes the callback on + * each entry found. Once the callback is invoked, ownership of the pkg_info pointer + * is passed to the callback routine, thus they are required to perform any cleanup + * desired. + * @param callback + * The callback function called on each parsed line of the packages list. + * @param userdata + * An optional userdata supplied pointer to pass to the callback function. + * @return + * true on success false on failure. + */ +extern bool packagelist_parse(pfn_on_package callback, void *userdata); + +/** + * Frees a pkg_info structure. + * @param info + * The struct to free + */ +extern void packagelist_free(pkg_info *info); + +__END_DECLS + +#endif /* PACKAGELISTPARSER_H_ */