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.
26 #include <sys/types.h>
30 #include <ctype.h> /* for isspace () */
33 #include <sys/types.h>
37 #include <sys/statvfs.h>
40 #include "rpm-installer-util.h"
42 int _ri_get_attribute(xmlTextReaderPtr reader, char *attribute, const char **xml_attribute)
44 if(xml_attribute == NULL){
45 _LOGE("@xml_attribute is NULL!!");
48 xmlChar *attrib_val = xmlTextReaderGetAttribute(reader,XMLCHAR(attribute));
50 *xml_attribute = ASCII(attrib_val);
55 void _ri_error_no_to_string(int errnumber, char **errstr)
60 case RPM_INSTALLER_SUCCESS:
61 *errstr = RPM_INSTALLER_SUCCESS_STR;
63 case RPM_INSTALLER_ERR_WRONG_PARAM:
64 *errstr = RPM_INSTALLER_ERR_WRONG_PARAM_STR;
66 case RPM_INSTALLER_ERR_DBUS_PROBLEM:
67 *errstr = RPM_INSTALLER_ERR_DBUS_PROBLEM_STR;
69 case RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY:
70 *errstr = RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY_STR;
72 case RPM_INSTALLER_ERR_PACKAGE_EXIST:
73 *errstr = RPM_INSTALLER_ERR_PACKAGE_EXIST_STR;
75 case RPM_INSTALLER_ERR_PACKAGE_NOT_INSTALLED:
76 *errstr = RPM_INSTALLER_ERR_PACKAGE_NOT_INSTALLED_STR;
78 case RPM_INSTALLER_ERR_RESOURCE_BUSY:
79 *errstr = RPM_INSTALLER_ERR_RESOURCE_BUSY_STR;
81 case RPM_INSTALLER_ERR_UNKNOWN:
82 *errstr = RPM_INSTALLER_ERR_UNKNOWN_STR;
84 case RPM_INSTALLER_ERR_PKG_NOT_FOUND:
85 *errstr = RPM_INSTALLER_ERR_PKG_NOT_FOUND_STR;
87 case RPM_INSTALLER_ERR_NOT_SUPPOTED_VERSION:
88 *errstr = RPM_INSTALLER_ERR_NOT_SUPPOTED_VERSION_STR;
90 case RPM_INSTALLER_ERR_NO_RPM_FILE:
91 *errstr = RPM_INSTALLER_ERR_NO_RPM_FILE_STR;
93 case RPM_INSTALLER_ERR_DB_ACCESS_FAILED:
94 *errstr = RPM_INSTALLER_ERR_DB_ACCESS_FAILED_STR;
96 case RPM_INSTALLER_ERR_RPM_OPERATION_FAILED:
97 *errstr = RPM_INSTALLER_ERR_RPM_OPERATION_FAILED_STR;
99 case RPM_INSTALLER_ERR_PACKAGE_NOT_UPGRADED:
100 *errstr = RPM_INSTALLER_ERR_PACKAGE_NOT_UPGRADED_STR;
102 case RPM_INSTALLER_ERR_RPM_SCRIPT_WRONG_ARGS:
103 *errstr = RPM_INSTALLER_ERR_RPM_SCRIPT_WRONG_ARGS_STR;
105 case RPM_INSTALLER_ERR_PACKAGE_INSTALLATION_DISABLED:
106 *errstr = RPM_INSTALLER_ERR_PACKAGE_INSTALLATION_DISABLED_STR;
108 case RPM_INSTALLER_ERR_PACKAGE_UNINSTALLATION_DISABLED:
109 *errstr = RPM_INSTALLER_ERR_PACKAGE_UNINSTALLATION_DISABLED_STR;
111 case RPM_INSTALLER_ERR_CLEAR_DATA_FAILED:
112 *errstr = RPM_INSTALLER_ERR_CLEAR_DATA_FAILED_STR;
114 case RPM_INSTALLER_ERR_INTERNAL:
115 *errstr = RPM_INSTALLER_ERR_INTERNAL_STR;
117 case RPM_INSTALLER_ERR_NO_MANIFEST:
118 *errstr = RPM_INSTALLER_ERR_NO_MANIFEST_STR;
120 case RPM_INSTALLER_ERR_INVALID_MANIFEST:
121 *errstr = RPM_INSTALLER_ERR_INVALID_MANIFEST_STR;
123 case RPM_INSTALLER_ERR_SIG_NOT_FOUND:
124 *errstr = RPM_INSTALLER_ERR_SIG_NOT_FOUND_STR;
126 case RPM_INSTALLER_ERR_SIG_INVALID:
127 *errstr = RPM_INSTALLER_ERR_SIG_INVALID_STR;
129 case RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED:
130 *errstr = RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED_STR;
132 case RPM_INSTALLER_ERR_ROOT_CERT_NOT_FOUND:
133 *errstr = RPM_INSTALLER_ERR_ROOT_CERT_NOT_FOUND_STR;
135 case RPM_INSTALLER_ERR_CERT_INVALID:
136 *errstr = RPM_INSTALLER_ERR_CERT_INVALID_STR;
138 case RPM_INSTALLER_ERR_CERTCHAIN_VERIFICATION_FAILED:
139 *errstr = RPM_INSTALLER_ERR_CERTCHAIN_VERIFICATION_FAILED_STR;
141 case RPM_INSTALLER_ERR_NO_CONFIG:
142 *errstr = RPM_INSTALLER_ERR_NO_CONFIG_STR;
144 case RPM_INSTALLER_ERR_INVALID_CONFIG:
145 *errstr = RPM_INSTALLER_ERR_INVALID_CONFIG_STR;
147 case RPM_INSTALLER_ERR_CMD_NOT_SUPPORTED:
148 *errstr = RPM_INSTALLER_ERR_CMD_NOT_SUPPORTED_STR;
151 *errstr = RPM_INSTALLER_ERR_UNKNOWN_STR;
156 int _ri_string_to_error_no(char *errstr)
158 int errnumber = RPM_INSTALLER_ERR_UNKNOWN;
162 if (strcmp(errstr, RPM_INSTALLER_SUCCESS_STR) == 0)
163 errnumber = RPM_INSTALLER_SUCCESS;
164 else if (strcmp(errstr, RPM_INSTALLER_ERR_WRONG_PARAM_STR) == 0)
165 errnumber = RPM_INSTALLER_ERR_WRONG_PARAM;
166 else if (strcmp(errstr, RPM_INSTALLER_ERR_DBUS_PROBLEM_STR) == 0)
167 errnumber = RPM_INSTALLER_ERR_DBUS_PROBLEM;
168 else if (strcmp(errstr, RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY_STR) == 0)
169 errnumber = RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
170 else if (strcmp(errstr, RPM_INSTALLER_ERR_PACKAGE_EXIST_STR) == 0)
171 errnumber = RPM_INSTALLER_ERR_PACKAGE_EXIST;
172 else if (strcmp(errstr, RPM_INSTALLER_ERR_PACKAGE_NOT_INSTALLED_STR)
174 errnumber = RPM_INSTALLER_ERR_PACKAGE_NOT_INSTALLED;
175 else if (strcmp(errstr, RPM_INSTALLER_ERR_RESOURCE_BUSY_STR) == 0)
176 errnumber = RPM_INSTALLER_ERR_RESOURCE_BUSY;
177 else if (strcmp(errstr, RPM_INSTALLER_ERR_UNKNOWN_STR) == 0)
178 errnumber = RPM_INSTALLER_ERR_UNKNOWN;
179 else if (strcmp(errstr, RPM_INSTALLER_ERR_PKG_NOT_FOUND_STR) == 0)
180 errnumber = RPM_INSTALLER_ERR_PKG_NOT_FOUND;
181 else if (strcmp(errstr, RPM_INSTALLER_ERR_NOT_SUPPOTED_VERSION_STR) ==
183 errnumber = RPM_INSTALLER_ERR_NOT_SUPPOTED_VERSION;
184 else if (strcmp(errstr, RPM_INSTALLER_ERR_NO_RPM_FILE_STR) == 0)
185 errnumber = RPM_INSTALLER_ERR_NO_RPM_FILE;
186 else if (strcmp(errstr, RPM_INSTALLER_ERR_DB_ACCESS_FAILED_STR) == 0)
187 errnumber = RPM_INSTALLER_ERR_DB_ACCESS_FAILED;
188 else if (strcmp(errstr, RPM_INSTALLER_ERR_RPM_OPERATION_FAILED_STR)
190 errnumber = RPM_INSTALLER_ERR_RPM_OPERATION_FAILED;
191 else if (strcmp(errstr, RPM_INSTALLER_ERR_PACKAGE_NOT_UPGRADED_STR) ==
193 errnumber = RPM_INSTALLER_ERR_PACKAGE_NOT_UPGRADED;
194 else if (strcmp(errstr, RPM_INSTALLER_ERR_RPM_SCRIPT_WRONG_ARGS_STR) ==
196 errnumber = RPM_INSTALLER_ERR_RPM_SCRIPT_WRONG_ARGS;
197 else if (strcmp(errstr, RPM_INSTALLER_ERR_PACKAGE_INSTALLATION_DISABLED_STR) == 0)
198 errnumber = RPM_INSTALLER_ERR_PACKAGE_INSTALLATION_DISABLED;
199 else if (strcmp(errstr, RPM_INSTALLER_ERR_PACKAGE_UNINSTALLATION_DISABLED_STR) == 0)
200 errnumber = RPM_INSTALLER_ERR_PACKAGE_UNINSTALLATION_DISABLED;
201 else if (strcmp(errstr, RPM_INSTALLER_ERR_CLEAR_DATA_FAILED_STR) == 0)
202 errnumber = RPM_INSTALLER_ERR_CLEAR_DATA_FAILED;
203 else if (strcmp(errstr, RPM_INSTALLER_ERR_INTERNAL_STR) == 0)
204 errnumber = RPM_INSTALLER_ERR_INTERNAL;
205 else if (strcmp(errstr, RPM_INSTALLER_ERR_NO_MANIFEST_STR) == 0)
206 errnumber = RPM_INSTALLER_ERR_NO_MANIFEST;
207 else if (strcmp(errstr, RPM_INSTALLER_ERR_INVALID_MANIFEST_STR) == 0)
208 errnumber = RPM_INSTALLER_ERR_INVALID_MANIFEST;
209 else if (strcmp(errstr, RPM_INSTALLER_ERR_SIG_NOT_FOUND_STR) == 0)
210 errnumber = RPM_INSTALLER_ERR_SIG_NOT_FOUND;
211 else if (strcmp(errstr, RPM_INSTALLER_ERR_SIG_INVALID_STR) == 0)
212 errnumber = RPM_INSTALLER_ERR_SIG_INVALID;
213 else if (strcmp(errstr, RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED_STR) == 0)
214 errnumber = RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED;
215 else if (strcmp(errstr, RPM_INSTALLER_ERR_ROOT_CERT_NOT_FOUND_STR) == 0)
216 errnumber = RPM_INSTALLER_ERR_ROOT_CERT_NOT_FOUND;
217 else if (strcmp(errstr, RPM_INSTALLER_ERR_CERT_INVALID_STR) == 0)
218 errnumber = RPM_INSTALLER_ERR_CERT_INVALID;
219 else if (strcmp(errstr, RPM_INSTALLER_ERR_CERTCHAIN_VERIFICATION_FAILED_STR) == 0)
220 errnumber = RPM_INSTALLER_ERR_CERTCHAIN_VERIFICATION_FAILED;
221 else if (strcmp(errstr, RPM_INSTALLER_ERR_NO_CONFIG_STR) == 0)
222 errnumber = RPM_INSTALLER_ERR_NO_CONFIG;
223 else if (strcmp(errstr, RPM_INSTALLER_ERR_INVALID_CONFIG_STR) == 0)
224 errnumber = RPM_INSTALLER_ERR_INVALID_CONFIG;
226 errnumber = RPM_INSTALLER_ERR_UNKNOWN;
231 int _rpm_delete_dir(char *dirname)
236 char abs_filename[FILENAME_MAX];
237 struct stat stFileInfo;
239 if (dirname == NULL) {
240 _LOGE("dirname is NULL.");
244 _LOGD("delete_dir=[%s]", dirname);
246 dp = opendir(dirname);
248 while ((ep = readdir(dp))) {
249 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname, ep->d_name);
250 if (lstat(abs_filename, &stFileInfo) < 0) {
251 _LOGE("lstat(%s) failed.", abs_filename);
252 perror(abs_filename);
255 if (S_ISDIR(stFileInfo.st_mode)) {
256 if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) {
257 _rpm_delete_dir(abs_filename);
258 (void)remove(abs_filename);
261 (void)remove(abs_filename);
266 _LOGE("opendir(%s) failed.", dirname);
270 ret = remove(dirname);
272 _LOGE("remove(%s) failed.", dirname);
277 char* _manifest_to_package(const char* manifest)
281 if(manifest == NULL) {
282 _LOGE("manifest is NULL.\n");
286 package = strdup(manifest);
287 if(package == NULL) {
288 _LOGE("strdup failed.\n");
292 if (!strstr(package, ".xml")) {
293 _LOGE("%s is not a manifest file\n", manifest);
301 /* Extract the basename from the file's path */
302 char *_ri_basename(char *name)
305 length = name ? strlen(name) : 0;
309 while (--length > 0 && name[length] != '/');
311 return length <= 0 ? name : name + length + (name[length] == '/');
314 int _child_element(xmlTextReaderPtr reader, int depth)
316 int ret = xmlTextReaderRead(reader);
317 int cur = xmlTextReaderDepth(reader);
320 switch (xmlTextReaderNodeType(reader)) {
321 case XML_READER_TYPE_ELEMENT:
322 if (cur == depth + 1)
325 case XML_READER_TYPE_TEXT:
326 /*text is handled by each function separately*/
327 if (cur == depth + 1)
330 case XML_READER_TYPE_END_ELEMENT:
340 ret = xmlTextReaderRead(reader);
341 cur = xmlTextReaderDepth(reader);
347 This Function get the package name from the rpm file's path..
349 int _get_pkgname_from_rpm_name(char * pkgfile, char **rpm_name){
351 char* rpm_file = NULL;
352 char name[PATH_MAX] = {0};
353 char temp[PATH_MAX]={0};
354 char *saveptr = NULL;;
357 int ret = RPM_INSTALLER_SUCCESS;
359 if(pkgfile == NULL || rpm_name == NULL){
360 _LOGE("Invalid Parameter!!");
361 return RPM_INSTALLER_ERR_WRONG_PARAM;
364 _LOGD("RPM path is [%s]",pkgfile);
366 /* Get the rpm name from rpm file's path */
367 rpm_file = _ri_basename(pkgfile);
368 _LOGD("RPM name is [%s]",rpm_file);
370 strncpy(name,rpm_file,strlen(rpm_file));
371 str = strtok_r(name, "-", &saveptr);
372 if(rpm_file[strlen(name)] != '\0'){
373 c = rpm_file[strlen(name) + 1];
375 if(strstr(name,".rpm")){
376 name[strlen(name)-strlen(".rpm")]='\0';
378 *rpm_name = strdup(name);
379 if(*rpm_name == NULL){
380 _LOGE("Malloc failed!!");
381 ret = RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
387 memset(temp,'\0',PATH_MAX);
388 str = strtok_r(NULL, "-", &saveptr);
389 snprintf(temp,PATH_MAX,"-%s",str);
390 strncat(name,temp,strlen(temp));
391 if(rpm_file[strlen(name)] != '\0'){
392 c = rpm_file[strlen(name) + 1];
397 if(strstr(name,".rpm")){
398 name[strlen(name)-strlen(".rpm")]='\0';
400 *rpm_name = strdup(name);
401 if(*rpm_name == NULL){
402 _LOGE("Malloc failed!!");
403 ret = RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
412 This Function reads the package field from the xml file.
414 int _get_package_name_from_xml(char* manifest, char** pkgname){
416 const char *val = NULL;
418 xmlTextReaderPtr reader;
419 int ret = PMINFO_R_OK;
421 if(manifest == NULL) {
422 _LOGE("Input argument is NULL\n");
423 return PMINFO_R_ERROR;
426 if(pkgname == NULL) {
427 _LOGE("Argument supplied to hold return value is NULL\n");
428 return PMINFO_R_ERROR;
431 reader = xmlReaderForFile(manifest, NULL, 0);
434 if ( _child_element(reader, -1)) {
435 node = xmlTextReaderConstName(reader);
437 _LOGE("xmlTextReaderConstName value is NULL\n");
438 ret = PMINFO_R_ERROR;
442 if (!strcmp(ASCII(node), "manifest")) {
443 ret = _ri_get_attribute(reader,"package",&val);
445 _LOGE("@Error in getting attribute value");
446 ret = PMINFO_R_ERROR;
451 *pkgname = strdup(val);
452 if(*pkgname == NULL){
453 _LOGE("Malloc Failed!!");
454 ret = PMINFO_R_ERROR;
459 _LOGE("Unable to create xml reader\n");
460 ret = PMINFO_R_ERROR;
464 _LOGE("xmlReaderForFile value is NULL\n");
465 return PMINFO_R_ERROR;
469 xmlFreeTextReader(reader);
477 int _ri_recursive_delete_dir(char *dirname)
482 char abs_filename[FILENAME_MAX];
483 struct stat stFileInfo;
484 dp = opendir(dirname);
486 while ((ep = readdir(dp))) {
487 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
489 if (lstat(abs_filename, &stFileInfo) < 0)
490 perror(abs_filename);
491 if (S_ISDIR(stFileInfo.st_mode)) {
492 if (strcmp(ep->d_name, ".") &&
493 strcmp(ep->d_name, "..")) {
494 ret=_ri_recursive_delete_dir(abs_filename);
496 _LOGE("_ri_recursive_delete_dir fail\n");
498 ret=remove(abs_filename);
500 _LOGE("remove fail\n");
503 ret = remove(abs_filename);
505 _LOGE("Couldn't remove abs_filename\n");
510 _LOGE("Couldn't open the directory\n");
512 return RPM_INSTALLER_SUCCESS;
514 return RPM_INSTALLER_ERR_CLEAR_DATA_FAILED;
517 return RPM_INSTALLER_SUCCESS;
520 int _ri_xsystem(const char *argv[])
527 perror("fork failed");
531 execvp(argv[0], (char *const *)argv);
537 if (waitpid(pid, &status, 0) == -1) {
538 perror("waitpid failed");
541 if (WIFSIGNALED(status)) {
545 if (!WIFEXITED(status)) {
546 /* shouldn't happen */
547 perror("should not happen");
550 return WEXITSTATUS(status);
552 void _ri_remove_wgt_unzip_dir()
554 if (!access(DIR_RPM_INSTALLER_APPLICATIONS_TEMP, F_OK)) {
555 _ri_recursive_delete_dir(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
556 (void)remove(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
561 int _ri_get_available_free_memory(const char *opt_path, unsigned long *free_mem)
565 if (opt_path == NULL || free_mem == NULL) {
566 _LOGE("Invalid input parameter\n");
569 memset((void *)&buf, '\0', sizeof(struct statvfs));
570 ret = statvfs(opt_path, &buf);
572 _LOGE("Unable to get /opt/usr memory information\n");
575 *free_mem = (buf.f_bfree * buf.f_bsize)/SIZE_KB;
580 unsigned long _ri_calculate_file_size(const char *filename)
582 struct stat stFileInfo;
584 if (stat(filename, &stFileInfo) < 0) {
588 return (stFileInfo.st_size/SIZE_KB);
591 void _ri_process_config_node(xmlTextReaderPtr reader, pkginfo * info)
594 const char *pkgid = NULL;
595 const char *version = NULL;
596 node = xmlTextReaderConstName(reader);
600 if (strcmp(ASCII(node), "widget") == 0) {
601 if (xmlTextReaderNodeType(reader) == 1) {
602 if(_ri_get_attribute(reader,"version",&version) != 0){
603 _LOGE("@Error while getting the attribute value");
606 snprintf(info->version, VERSION_MAX_LEN - 1, "%s", version);
607 _LOGD("<version> %s", info->version);
612 if (strcmp(ASCII(node), "tizen:application") == 0) {
613 if (xmlTextReaderNodeType(reader) == 1) {
614 if(_ri_get_attribute(reader,"package",&pkgid) != 0){
615 _LOGE("@Error while getting the attribute value");
618 snprintf(info->package_name, PKG_MAX_LEN - 1, "%s", pkgid);
619 _LOGD("<package> %s", info->package_name);
628 free((void*)version);
635 int _ri_stream_config_file(const char* filename, pkginfo *info)
637 xmlTextReaderPtr reader;
638 int ret = RPM_INSTALLER_SUCCESS;
640 _LOGD("Reading config file [%s]",filename);
641 reader = xmlReaderForFile(filename,NULL,0);
642 if (reader != NULL) {
643 ret = xmlTextReaderRead(reader);
645 _ri_process_config_node(reader, info);
646 ret = xmlTextReaderRead(reader);
648 xmlFreeTextReader(reader);
650 _LOGE("%s : failed to parse\n", filename);
651 ret = RPM_INSTALLER_ERR_INTERNAL;
654 _LOGE("Unable to open %s\n", filename);
655 ret = RPM_INSTALLER_ERR_INTERNAL;
660 unsigned long _ri_calculate_rpm_size( char* rpm_file)
667 rpmVSFlags vsflags = 0;
668 unsigned long size = 0;
671 rc = rpmReadConfigFiles(NULL,NULL);
673 _LOGE("\n failed to read RPM configuration files");
676 /* Open the rpm file */
677 fd = Fopen(rpm_file, "r.ufdio");
678 if ((!fd) || Ferror(fd)){
679 _LOGE("\n failed to open %s package file",rpm_file);
688 vsflags |= _RPMVSF_NODIGESTS;
689 vsflags |= _RPMVSF_NOSIGNATURES;
690 vsflags |= RPMVSF_NOHDRCHK;
691 (void)rpmtsSetVSFlags(ts, vsflags);
693 rc = rpmReadPackageFile(ts,fd,rpm_file,&hdr);
695 _LOGE("\n Couldn't read rpm package file");
700 headerGet(hdr,RPMTAG_SIZE,td,HEADERGET_MINMEM);
701 size = rpmtdGetNumber(td);
712 unsigned long _ri_calculate_dir_size(const char *dirname)
714 static unsigned long total = 0;
715 unsigned long size = 0;
717 struct dirent *ep = NULL;
718 char abs_filename[FILENAME_MAX] = { 0, };;
719 dp = opendir(dirname);
721 while ((ep = readdir(dp)) != NULL) {
722 struct stat stFileInfo;
724 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
727 if (stat(abs_filename, &stFileInfo) < 0)
728 perror(abs_filename);
730 /* If file is rpm then get the size from rpm header. */
731 if(strstr(ep->d_name,".rpm")){
732 size = _ri_calculate_rpm_size(abs_filename);
734 _LOGE("\n error in computing the rpm's size");
738 total += (unsigned long)stFileInfo.st_size;
741 if (S_ISDIR(stFileInfo.st_mode)) {
742 if (strcmp(ep->d_name, ".")
743 && strcmp(ep->d_name, "..")) {
744 _ri_calculate_dir_size
754 _LOGE("\n error in opening directory ");
756 return (total/SIZE_KB);
761 This function unzip the wgt package.
762 It read and validate the config.xml file.
763 It checks whether the free size avaiable to install this package.
766 int _ri_wgt_package_extract(char *pkgid)
769 return RPM_INSTALLER_ERR_INTERNAL;
771 int ret = RPM_INSTALLER_SUCCESS;
772 const char *argv[5] = { RPM_UNZIP, pkgid, "-d", DIR_RPM_INSTALLER_APPLICATIONS_TEMP, NULL};
773 char config_file_name[PATH_MAX] = {0};
774 pkginfo *info = NULL;
775 unsigned long free_mem = 0;
776 unsigned long reqd_size = 0;
777 mode_t mode = DIR_PERMS;
779 /* 1. Delete the temp folder if already present*/
780 if (!access(DIR_RPM_INSTALLER_APPLICATIONS_TEMP, F_OK)) {
781 _ri_recursive_delete_dir(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
782 (void)remove(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
785 /* 1.2 Create temp folder */
786 ret = mkdir(DIR_RPM_INSTALLER_APPLICATIONS_TEMP, mode);
788 _LOGE("Temporary folder creation failed");
789 return RPM_INSTALLER_ERR_INTERNAL;
791 /* 1.3 Unzip wgt to temp folder*/
792 ret = _ri_xsystem(argv);
794 _LOGE("Unzip to Temporary folder failed");
795 return RPM_INSTALLER_ERR_INTERNAL;
798 /* Read the config.xml file and get the information*/
799 snprintf(config_file_name,PATH_MAX,"%s/%s", DIR_RPM_INSTALLER_APPLICATIONS_TEMP,WGT_CONFIG);
800 _LOGD("Config File is [%s]",config_file_name);
801 if(access(config_file_name,F_OK)){
802 /* Return if info config is absent */
803 _LOGE("No Config File [%s] found\n", config_file_name);
804 return RPM_INSTALLER_ERR_NO_CONFIG;
806 _LOGD("Config File [%s] found\n", config_file_name);
808 /*populate pkginfo */
809 info = (pkginfo *)calloc(1, sizeof(pkginfo));
811 _LOGE("Memory allocation failed");
812 return RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
815 /* Parse config file and store the info in pkginfo struct */
816 ret = _ri_stream_config_file(config_file_name,info);
817 if(ret != RPM_INSTALLER_SUCCESS){
818 _LOGE("Config file's parsing Failed");
823 return RPM_INSTALLER_ERR_INTERNAL;
826 /* 3. Validate the pkginfo*/
827 if (strlen(info->package_name) == 0 || strlen(info->version) == 0) {
828 _LOGE("Package name or version is not found in Config File");
833 return RPM_INSTALLER_ERR_INVALID_CONFIG;
836 /* 4. Check the free memory in RW partition*/
837 ret = _ri_get_available_free_memory(RPM_INSTALLER_RW_INSTALL_PATH, &free_mem);
839 _LOGE("Error in getting available free memory");
844 return RPM_INSTALLER_ERR_INTERNAL;
846 /* Compare with size required by package*/
847 reqd_size = _ri_calculate_dir_size(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
849 _LOGE("Error in getting file size");
854 return RPM_INSTALLER_ERR_INTERNAL;
856 if (reqd_size > free_mem) {
857 _LOGE("Not enough memory");
862 return RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
867 _LOGD("Required size to install pkg is [%lu KB] and available memory is [%lu KB]",reqd_size,free_mem);
877 int _verify_wgt_package_signature_files(void)
880 char buff[PATH_MAX] = {0};
881 int ret = RPM_INSTALLER_SUCCESS;
882 char cwd[PATH_MAX]={0};
886 temp = getcwd(cwd, PATH_MAX);
887 if ( ( temp == NULL) || (cwd[0] == '\0')) {
888 _LOGE("@getcwd() failed.\n");
889 ret = RPM_INSTALLER_ERR_INTERNAL;
893 ret = chdir(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
895 _LOGE("Change directory failed!");
899 /*Verify the author-signature file */
900 memset(buff, '\0', PATH_MAX);
901 snprintf(buff, PATH_MAX, "%s/%s",DIR_RPM_INSTALLER_APPLICATIONS_TEMP,AUTHOR_SIGNATURE_XML);
903 if (access(buff, F_OK) == 0) {
904 _LOGD("auth-signature.xml found in %s\n", DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
905 ret = _ri_verify_sig_and_cert(buff, &visibility);
907 _LOGE("Failed to verify [%s]\n", buff);
908 ret = RPM_INSTALLER_ERR_SIG_INVALID;
911 _LOGD("Successfully verified [%s]\n", buff);
915 /*Verify the signature2.xml file */
916 memset(buff, '\0', PATH_MAX);
917 snprintf(buff, PATH_MAX, "%s/%s",DIR_RPM_INSTALLER_APPLICATIONS_TEMP,SIGNATURE2_XML);
919 if (access(buff, F_OK) == 0) {
920 _LOGD("signature2.xml found in %s\n", DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
921 ret = _ri_verify_sig_and_cert(buff, &visibility);
923 _LOGE("Failed to verify [%s]\n", buff);
924 ret = RPM_INSTALLER_ERR_SIG_INVALID;
927 _LOGD("Successfully verified [%s]\n", buff);
931 /*Verify the signature1.xml file*/
932 memset(buff, '\0', PATH_MAX);
933 snprintf(buff,PATH_MAX,"%s/%s", DIR_RPM_INSTALLER_APPLICATIONS_TEMP,SIGNATURE1_XML);
935 if (access(buff, F_OK) == 0) {
936 _LOGD("signature1.xml found in %s\n", DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
937 ret = _ri_verify_sig_and_cert(buff, &visibility);
939 _LOGE("Failed to verify [%s]\n", buff);
940 ret = RPM_INSTALLER_ERR_SIG_INVALID;
943 _LOGD("Successfully verified [%s]\n", buff);
948 _LOGE("chdir failed [%s]",strerror(errno));
949 ret = RPM_INSTALLER_ERR_INTERNAL;
958 char* _get_rpm_file_from_wgt_package(char* dirname)
962 struct dirent *ep = NULL;
963 char abs_filename[FILENAME_MAX] = { 0, };
964 dp = opendir(dirname);
967 while ((ep = readdir(dp)) != NULL) {
968 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
970 if (strstr(abs_filename,".rpm")!=NULL){
979 _LOGD("rpm name is [%s]",abs_filename);
980 return strdup(abs_filename);
988 This function processes the modified wgt package .
990 int _ri_process_wgt_package(char** pkgid)
993 return RPM_INSTALLER_ERR_INTERNAL;
995 unsigned long free_mem = 0;
996 unsigned long file_size = 0;
997 int ret = RPM_INSTALLER_SUCCESS;
1000 /* check memory available*/
1001 ret = _ri_get_available_free_memory(RPM_INSTALLER_RW_INSTALL_PATH, &free_mem);
1003 _LOGE("Error in getting available free memory");
1004 return RPM_INSTALLER_ERR_INTERNAL;
1006 file_size = _ri_calculate_file_size(*pkgid);
1007 if (file_size <=0) {
1008 _LOGE("Error in getting file size");
1009 return RPM_INSTALLER_ERR_INTERNAL;
1011 if (file_size > free_mem) {
1012 _LOGE("Not enough memory");
1013 return RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
1018 _LOGD("Package file [%s] size is [%lu]KB and free size in RW directory is [%lu]KB",*pkgid,file_size,free_mem);
1020 /* unzip the wgt package */
1021 ret = _ri_wgt_package_extract(*pkgid);
1022 if(ret != RPM_INSTALLER_SUCCESS)
1025 _LOGD("wgt package is extracted to [%s]",DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
1027 ret = _verify_wgt_package_signature_files();
1028 if(ret != RPM_INSTALLER_SUCCESS){
1029 _LOGE("signature verification [%d]",ret);
1032 _LOGD("Verification of wgt package's signature files is done");
1038 /* Change the data->pkgid to the unzipped package's rpm */
1039 *pkgid = _get_rpm_file_from_wgt_package(DIR_RPM_INSTALLER_APPLICATIONS_TEMP);
1041 return RPM_INSTALLER_ERR_INTERNAL;
1043 _LOGD("rpm is [%s]",*pkgid);
1045 return RPM_INSTALLER_SUCCESS;