4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
29 #include <sys/types.h>
33 /*rpm specific headers*/
40 #include "librpminternals.h"
41 #include "rpm-installer-util.h"
43 int _librpm_app_is_installed(const char *pkgid)
48 rpmdbMatchIterator mi;
51 mi = rpmtsInitIterator(ts, RPMTAG_NAME, pkgid, 0);
52 while (NULL != rpmdbNextIterator(mi)) {
57 _LOGD("Package not found in DB\n");
62 _LOGD("Package found in DB\n");
68 rpmdbFreeIterator(mi);
72 int _librpm_get_installed_package_info(const char *pkgid,
73 package_manager_pkg_detail_info_t *pkg_detail_info)
79 rpmdbMatchIterator mi;
88 mi = rpmtsInitIterator(ts, RPMTAG_NAME, pkgid, 0);
89 while (NULL != (hdr = rpmdbNextIterator(mi))) {
90 hdr = headerLink(hdr);
95 /*Print the header info */
97 _LOGE("Package not found in DB\n");
102 headerGet(hdr, RPMTAG_NAME, tn, HEADERGET_MINMEM);
103 strncpy(pkg_detail_info->pkgid, rpmtdGetString(tn), PKG_NAME_STRING_LEN_MAX-1);
105 headerGet(hdr, RPMTAG_VERSION, tv, HEADERGET_MINMEM);
106 strncpy(pkg_detail_info->version, rpmtdGetString(tv), PKG_VERSION_STRING_LEN_MAX-1);
108 headerGet(hdr, RPMTAG_DESCRIPTION, td, HEADERGET_MINMEM);
109 strncpy(pkg_detail_info->pkg_description, rpmtdGetString(td), PKG_VALUE_STRING_LEN_MAX-1);
111 headerGet(hdr, RPMTAG_SIZE, ta, HEADERGET_MINMEM);
112 pkg_detail_info->app_size = rpmtdGetNumber(ta);
113 ret = LIBRPM_SUCCESS;
125 rpmdbFreeIterator(mi);
132 int _librpm_get_package_header_info(const char *pkg_path,
133 package_manager_pkg_detail_info_t *pkg_detail_info)
141 rpmVSFlags vsflags = 0;
143 fd = Fopen(pkg_path, "r.ufdio");
144 if ((!fd) || Ferror(fd)) {
145 _LOGE("Failed to open package file (%s)\n", Fstrerror(fd));
154 vsflags |= _RPMVSF_NODIGESTS;
155 vsflags |= _RPMVSF_NOSIGNATURES;
156 vsflags |= RPMVSF_NOHDRCHK;
157 (void) rpmtsSetVSFlags(ts, vsflags);
159 rc = rpmReadPackageFile(ts, fd, pkg_path, &hdr);
160 if (rc != RPMRC_OK) {
161 _LOGE("Could not read package file\n");
167 headerGet(hdr, RPMTAG_NAME, td, HEADERGET_MINMEM);
168 strncpy(pkg_detail_info->pkgid, rpmtdGetString(td), PKG_NAME_STRING_LEN_MAX-1);
171 headerGet(hdr, RPMTAG_VERSION, td, HEADERGET_MINMEM);
172 strncpy(pkg_detail_info->version, rpmtdGetString(td), PKG_VERSION_STRING_LEN_MAX-1);
175 headerGet(hdr, RPMTAG_DESCRIPTION, td, HEADERGET_MINMEM);
176 strncpy(pkg_detail_info->pkg_description, rpmtdGetString(td), PKG_VALUE_STRING_LEN_MAX-1);
179 headerGet(hdr, RPMTAG_SIZE, td, HEADERGET_MINMEM);
180 pkg_detail_info->app_size = rpmtdGetNumber(td);
182 ret = LIBRPM_SUCCESS;
192 long long _librpm_calculate_dir_size(const char *dirname)
196 int q = 0; /*quotient*/
197 int r = 0; /*remainder*/
199 struct dirent *ep = NULL;
200 struct stat fileinfo;
201 char abs_filename[FILENAME_MAX] = { 0, };
202 if (dirname == NULL) {
207 dp = opendir(dirname);
209 while ((ep = readdir(dp)) != NULL) {
210 if (!strcmp(ep->d_name, ".") ||
211 !strcmp(ep->d_name, "..")) {
214 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
216 if (stat(abs_filename, &fileinfo) < 0)
217 perror(abs_filename);
219 if (S_ISDIR(fileinfo.st_mode)) {
220 total += fileinfo.st_size;
221 if (strcmp(ep->d_name, ".")
222 && strcmp(ep->d_name, "..")) {
223 ret = _librpm_calculate_dir_size
228 /*It is a file. Calculate the actual
229 size occupied (in terms of 4096 blocks)*/
230 q = (fileinfo.st_size / BLOCK_SIZE);
231 r = (fileinfo.st_size % BLOCK_SIZE);
235 total += q * BLOCK_SIZE;
242 "Couldn't open the directory\n");