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.
28 #include <appcore-efl.h>
29 #include <pkgmgr_installer.h>
30 #include <security-server.h>
31 #include "rpm-frontend.h"
32 #include "rpm-installer-util.h"
33 #include "rpm-installer.h"
34 #include "rpm-homeview.h"
37 extern struct appdata ad;
39 extern pkgmgr_installer *pi;
40 ri_frontend_data front_data;
41 char scrolllabel[256];
44 static void __ri_show_usage(char **arg);
45 static int __ri_process_request(ri_frontend_cmdline_arg *fdata);
47 static void __ri_show_usage(char **arg)
53 while (arg[i] != NULL) {
54 snprintf(buffer, 256, "%s %s", buff, arg[i]);
55 strncpy(buff, buffer, 255);
59 _d_msg(DEBUG_INFO, "%s\n", buffer);
61 "\nrpm-backend usage\n rpm-backend -k <keyid> <command> <pkgid | pkg_path> [-q] \n\n");
62 _d_msg(DEBUG_INFO, "<Commands> \n");
64 "\t -i <package file path> : install package file \n");
66 "\t -k <keyid> : key id file \n");
68 "\t -r : (recover). Must ignore specific package name or path \n");
70 "\t -d <package name> : delete a package with package name \n");
72 "\t -q : (quiet) run in background without any user interaction \n");
75 int _ri_parse_cmdline(int argc, char **argv, ri_frontend_cmdline_arg *data)
77 int req_cmd = INVALID_CMD;
78 const char *pkgid = NULL;
80 const char *pkeyid = NULL;
83 pi = pkgmgr_installer_new();
86 "Failure in creating the pkgmgr_installer object \n");
87 return RPM_INSTALLER_ERR_WRONG_PARAM;
89 ret = pkgmgr_installer_receive_request(pi, argc, argv);
91 _d_msg(DEBUG_ERR, "pkgmgr_installer_receive_request failed \n");
92 return RPM_INSTALLER_ERR_WRONG_PARAM;
94 ret = pkgmgr_installer_get_request_type(pi);
96 case PKGMGR_REQ_INSTALL:
97 req_cmd = INSTALL_CMD;
99 case PKGMGR_REQ_UNINSTALL:
100 req_cmd = DELETE_CMD;
102 case PKGMGR_REQ_RECOVER:
103 req_cmd = RECOVER_CMD;
105 case PKGMGR_REQ_CLEAR:
106 req_cmd = CLEARDATA_CMD;
108 case PKGMGR_REQ_MOVE:
111 case PKGMGR_REQ_PERM:
113 case PKGMGR_REQ_INVALID:
114 req_cmd = INVALID_CMD;
119 if (req_cmd != RECOVER_CMD) {
120 pkgid = pkgmgr_installer_get_request_info(pi);
123 "pkgmgr_installer_get_request_info failed \n");
124 return RPM_INSTALLER_ERR_WRONG_PARAM;
126 pkeyid = pkgmgr_installer_get_session_id(pi);
128 _d_msg(DEBUG_ERR, "pkgmgr_installer_get_session_id failed \n");
129 return RPM_INSTALLER_ERR_WRONG_PARAM;
132 quiet = pkgmgr_installer_is_quiet(pi);
133 if (quiet != 0 && quiet != 1) {
134 _d_msg(DEBUG_ERR, "pkgmgr_installer_is_quiet failed \n");
135 return RPM_INSTALLER_ERR_WRONG_PARAM;
138 move_type = pkgmgr_installer_get_move_type(pi);
140 if ((req_cmd < INSTALL_CMD) ||(req_cmd > MOVE_CMD)) {
141 _d_msg(DEBUG_ERR, "invalid command \n");
145 data->req_cmd = req_cmd;
146 data->pkgid = (char *)pkgid;
148 data->keyid = (char *)pkeyid;
149 data->move_type = move_type;
150 return RPM_INSTALLER_SUCCESS;
153 _d_msg(DEBUG_ERR, "Error in parsing input parameter\n");
154 __ri_show_usage(argv);
155 return RPM_INSTALLER_ERR_WRONG_PARAM;
159 static int __ri_process_request(ri_frontend_cmdline_arg *data)
163 return RPM_INSTALLER_ERR_WRONG_PARAM;
166 if (data->req_cmd != RECOVER_CMD) {
167 pkgid = strdup(data->pkgid);
168 if (PM_UNLIKELY(pkgid == NULL)) {
169 _d_msg(DEBUG_ERR, "strdup failed\n");
170 return RPM_INSTALLER_ERR_WRONG_PARAM;
172 keyid = strdup(data->keyid);
173 if (PM_UNLIKELY(keyid == NULL)) {
174 _d_msg(DEBUG_ERR, "strdup failed\n");
176 return RPM_INSTALLER_ERR_WRONG_PARAM;
179 switch (data->req_cmd) {
181 _d_msg(DEBUG_INFO, "rpm-backend -i %s\n", pkgid);
182 ret = _rpm_backend_interface(keyid, pkgid, "install");
185 _d_msg(DEBUG_INFO, "rpm-backend -d %s\n", pkgid);
186 ret = _rpm_backend_interface(keyid, pkgid, "remove");
189 _d_msg(DEBUG_INFO, "rpm-backend -c %s\n", pkgid);
190 ret = _rpm_backend_interface(keyid, pkgid, "cleardata");
193 _d_msg(DEBUG_INFO, "rpm-backend -m %s -t %d\n", pkgid, data->move_type);
194 move_type = data->move_type;
195 ret = _rpm_backend_interface(keyid, pkgid, "move");
198 _d_msg(DEBUG_INFO, "rpm-backend -r \n");
199 ret = _rpm_backend_interface(keyid, pkgid, "recover");
203 "Error Never Come Here as Error is already checked\n");
218 void _ri_stat_cb(const char *pkgid, const char *key, const char *val)
221 if (NULL == pkgid || NULL == key || NULL == val) {
222 _d_msg(DEBUG_ERR, "Either pkgid/key/val is NULL\n");
223 return; /*TODO: handle error. */
226 char *pkgid_modified = NULL;
229 char *pkgid_tmp = NULL;
230 char *saveptr = NULL;
232 pkgid_modified = (char *)malloc(strlen(pkgid) + 1);
233 if (pkgid_modified == NULL) {
234 _d_msg(DEBUG_ERR, "pkgid_modified is NULL. Malloc failed\n");
237 memset(pkgid_modified, '\0', strlen(pkgid) + 1);
238 memcpy(pkgid_modified, pkgid, strlen(pkgid));
240 result = strtok_r(pkgid_modified, delims, &saveptr);
241 while (result != NULL) {
243 result = strtok_r(NULL, delims, &saveptr);
246 if (strcmp(key, "install_percent") == 0) {
248 } else if (strcmp(key, "error") == 0) {
249 /* Store the error to be display to the user */
250 front_data.error = strdup(val);
251 } else if (strcmp(key, "end") == 0) {
253 char requesttype[32];
254 switch (front_data.args->req_cmd) {
256 snprintf(requesttype, sizeof(requesttype),
260 snprintf(requesttype, sizeof(requesttype), _("Deletion"));
263 snprintf(requesttype, sizeof(requesttype),
267 snprintf(requesttype, sizeof(requesttype),
271 snprintf(requesttype, sizeof(requesttype), _("Recovery"));
275 if (front_data.error) {
277 snprintf(scrolllabel, sizeof(scrolllabel),
278 "%s :: %s:: %s:: %s", requesttype, pkgid_tmp,
279 dgettext("sys_string", "IDS_COM_POP_ERROR"),
281 _d_msg(DEBUG_ERR, "%s\n", scrolllabel);
282 ret_val = _ri_string_to_error_no(front_data.error);
283 _d_msg(DEBUG_ERR, "%d\n", ret_val);
286 snprintf(scrolllabel, sizeof(scrolllabel),
287 " %s :: %s :: %s", requesttype, pkgid_tmp,
288 dgettext("sys_string", "IDS_COM_POP_SUCCESS"));
289 _d_msg(DEBUG_INFO, "%s\n", scrolllabel);
295 int _ri_cmdline_process(ri_frontend_data *data)
302 ri_frontend_cmdline_arg *fdata = data->args;
304 cookie_size = security_server_get_cookie_size();
305 /* If security server is down or some other
306 error occured, raise failure */
307 if (0 >= cookie_size) {
308 /* TODO: raise error */
310 "security_server_get_cookie_size: Security server down \n");
312 cookie = calloc(cookie_size, sizeof(char));
314 security_server_request_cookie(cookie, cookie_size);
315 /* TODO: Check cookie_ret...
316 (See security-server.h to check return code) */
320 _d_msg(DEBUG_INFO, "Got Cookie with size = %d\n", cookie_size);
322 data->security_cookie = cookie;
324 ret = __ri_process_request(fdata);
325 if (ret != RPM_INSTALLER_SUCCESS) {
326 _d_msg(DEBUG_ERR, "__ri_process_request: Error\n");
330 return RPM_INSTALLER_SUCCESS;
334 if (data->security_cookie) {
335 free(data->security_cookie);
336 data->security_cookie = NULL;
342 int _ri_cmdline_destroy(ri_frontend_data *data)
347 if (data->security_cookie)
348 free(data->security_cookie);