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*/
39 #include "librpminternals.h"
41 /* This is backend lib's filter string for dlogutil*/
42 #define LOCAL_LOG_TAG "librpm"
45 #define RPM_INSTALLER_LIBRPM_LOG_FILE "/tmp/librpm"
49 void _librpm_print_msg(int type, int exetype, char *format, ...)
51 char buffer[FILENAME_MAX] = { 0 };
52 char tbuffer[FILENAME_MAX] = { 0 };
56 va_start(args, format);
57 nbuffer = vsnprintf(tbuffer, FILENAME_MAX, format, args);
62 LOG(LOG_ERROR, LOCAL_LOG_TAG, "%s", tbuffer);
65 LOG(LOG_WARN, LOCAL_LOG_TAG, "%s", tbuffer);
68 LOG(LOG_DEBUG, LOCAL_LOG_TAG, "%s", tbuffer);
76 if (DEBUG_ERR == (logging & type)) {
77 nbuffer = snprintf(buffer, FILENAME_MAX, "ERROR:%s", tbuffer);
78 vfprintf(stderr, format, args);
79 } else if (DEBUG_INFO == (logging & type)) {
80 nbuffer = snprintf(buffer, FILENAME_MAX, "INFO:%s", tbuffer);
81 vfprintf(stdout, format, args);
82 } else if (DEBUG_RESULT == (logging & type)) {
83 nbuffer = snprintf(buffer, FILENAME_MAX, "RESULT:%s", tbuffer);
84 vfprintf(stdout, format, args);
91 fwrite(buffer, sizeof(char), strlen(buffer), logfile);
92 #endif /*LOG_IN_FILE */
95 int _librpm_app_is_installed(char *pkgid)
101 rpmdbMatchIterator mi;
111 mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
112 while (NULL != (hdr = rpmdbNextIterator(mi))) {
114 hdr = headerLink(hdr);
115 rc = headerGet(hdr, RPMTAG_NAME, tn, HEADERGET_MINMEM);
116 if (strcmp(pkgid, rpmtdGetString(tn) ) == 0) {
126 _librpm_print(DEBUG_INFO, "Package not found in DB\n");
131 _librpm_print(DEBUG_INFO, "Package found in DB\n");
140 rpmdbFreeIterator(mi);
145 int _librpm_get_installed_package_info(char *pkgid,
146 package_manager_pkg_detail_info_t *pkg_detail_info)
152 rpmdbMatchIterator mi;
153 rpmtd td, tn, tv, ta;
164 mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
165 while (NULL != (hdr = rpmdbNextIterator(mi))) {
167 hdr = headerLink(hdr);
168 rc = headerGet(hdr, RPMTAG_NAME, tn, HEADERGET_MINMEM);
169 if (strcmp(pkgid, rpmtdGetString(tn) ) == 0) {
179 /*Print the header info */
181 _librpm_print(DEBUG_ERR, "Package not found in DB\n");
186 headerGet(hdr, RPMTAG_NAME, tn, HEADERGET_MINMEM);
187 strncpy(pkg_detail_info->pkgid, rpmtdGetString(tn), PKG_NAME_STRING_LEN_MAX-1);
189 headerGet(hdr, RPMTAG_VERSION, tv, HEADERGET_MINMEM);
190 strncpy(pkg_detail_info->version, rpmtdGetString(tv), PKG_VERSION_STRING_LEN_MAX-1);
192 headerGet(hdr, RPMTAG_DESCRIPTION, td, HEADERGET_MINMEM);
193 strncpy(pkg_detail_info->pkg_description, rpmtdGetString(td), PKG_VALUE_STRING_LEN_MAX-1);
195 headerGet(hdr, RPMTAG_SIZE, ta, HEADERGET_MINMEM);
196 pkg_detail_info->app_size = rpmtdGetNumber(ta);
197 ret = LIBRPM_SUCCESS;
209 rpmdbFreeIterator(mi);
216 int _librpm_get_package_header_info(char *pkg_path,
217 package_manager_pkg_detail_info_t *pkg_detail_info)
226 rpmVSFlags vsflags = 0;
228 fd = Fopen(pkg_path, "r.ufdio");
229 if ((!fd) || Ferror(fd)) {
230 _librpm_print(DEBUG_ERR, "Failed to open package file (%s)\n", Fstrerror(fd));
239 vsflags |= _RPMVSF_NODIGESTS;
240 vsflags |= _RPMVSF_NOSIGNATURES;
241 vsflags |= RPMVSF_NOHDRCHK;
242 (void) rpmtsSetVSFlags(ts, vsflags);
244 rc = rpmReadPackageFile(ts, fd, pkg_path, &hdr);
245 if (rc != RPMRC_OK) {
246 _librpm_print(DEBUG_ERR, "Could not read package file\n");
252 headerGet(hdr, RPMTAG_NAME, td, HEADERGET_MINMEM);
253 strncpy(pkg_detail_info->pkgid, rpmtdGetString(td), PKG_NAME_STRING_LEN_MAX-1);
256 headerGet(hdr, RPMTAG_VERSION, td, HEADERGET_MINMEM);
257 strncpy(pkg_detail_info->version, rpmtdGetString(td), PKG_VERSION_STRING_LEN_MAX-1);
260 headerGet(hdr, RPMTAG_DESCRIPTION, td, HEADERGET_MINMEM);
261 strncpy(pkg_detail_info->pkg_description, rpmtdGetString(td), PKG_VALUE_STRING_LEN_MAX-1);
264 headerGet(hdr, RPMTAG_SIZE, td, HEADERGET_MINMEM);
265 pkg_detail_info->app_size = rpmtdGetNumber(td);
267 ret = LIBRPM_SUCCESS;
277 long long _librpm_calculate_dir_size(char *dirname)
281 int q = 0; /*quotient*/
282 int r = 0; /*remainder*/
284 struct dirent *ep = NULL;
285 struct stat fileinfo;
286 char abs_filename[FILENAME_MAX] = { 0, };
287 if (dirname == NULL) {
288 _librpm_print(DEBUG_ERR,
292 dp = opendir(dirname);
294 while ((ep = readdir(dp)) != NULL) {
295 if (!strcmp(ep->d_name, ".") ||
296 !strcmp(ep->d_name, "..")) {
299 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
301 if (stat(abs_filename, &fileinfo) < 0)
302 perror(abs_filename);
304 if (S_ISDIR(fileinfo.st_mode)) {
305 total += fileinfo.st_size;
306 if (strcmp(ep->d_name, ".")
307 && strcmp(ep->d_name, "..")) {
308 ret = _librpm_calculate_dir_size
313 /*It is a file. Calculate the actual
314 size occupied (in terms of 4096 blocks)*/
315 q = (fileinfo.st_size / BLOCK_SIZE);
316 r = (fileinfo.st_size % BLOCK_SIZE);
320 total += q * BLOCK_SIZE;
326 _librpm_print(DEBUG_ERR,
327 "Couldn't open the directory\n");