#include <glib.h>
+#include "pkgmgrinfo_type.h"
+#include "pkgmgr-info.h"
#include "pkgmgr-server.h"
#include "queue.h"
return job;
}
-int _push_queue(uid_t uid, const char *req_id, int req_type,
- const char *queue_type, const char *pkgid, const char *args)
+int _push_queue(uid_t target_uid, uid_t caller_uid, const char *req_id,
+ int req_type, const char *queue_type, const char *pkgid,
+ const char *args, void *extra_data)
{
struct backend_queue *queue;
struct backend_job *job;
}
job = calloc(1, sizeof(struct backend_job));
- job->uid = uid;
+ job->target_uid = target_uid;
+ job->caller_uid = caller_uid;
if (req_id)
job->req_id = strdup(req_id);
job->req_type = req_type;
job->backend_slot = queue->slot;
job->backend_type = queue->type;
job->backend_path = queue->path;
+ if (extra_data)
+ job->extra_data = extra_data;
queue->job_list = g_list_append(queue->job_list, (gpointer)job);
static int __init_backends(const char *fpath, const struct stat *sb,
int typeflag, struct FTW *ftwbuf)
{
+ int r;
struct backend_queue *queue;
if (typeflag != FTW_F && typeflag != FTW_SL)
queue->path = strdup(fpath);
} else if (typeflag == FTW_SL) {
queue->path = malloc(sb->st_size + 1);
- if (readlink(fpath, queue->path, sb->st_size + 1) < 0) {
+ r = readlink(fpath, queue->path, sb->st_size + 1);
+ if (r < 0 || r > sb->st_size) {
ERR("failed to readlink for %s", fpath);
free(queue->path);
free(queue);
return -1;
}
+ queue->path[r] = '\0';
}
queue->type = strdup(fpath + ftwbuf->base);
queue->slot = num_of_backends++;
return strcasecmp(str1, str2) == 0;
}
+void __free_extra_info(struct backend_job *job)
+{
+ struct getsize_sync_extra_info *getsize_sync_data;
+ pkgmgrinfo_updateinfo_h update_info;
+
+ switch (job->req_type) {
+ case REQUEST_TYPE_GETSIZE_SYNC:
+ getsize_sync_data = (struct getsize_sync_extra_info *)job->extra_data;
+ if (!getsize_sync_data)
+ break;
+ if (getsize_sync_data->getsize_io)
+ g_io_channel_unref(getsize_sync_data->getsize_io);
+ if (getsize_sync_data->getsize_fd)
+ close(getsize_sync_data->getsize_fd);
+ if (getsize_sync_data->getsize_fifo) {
+ unlink(getsize_sync_data->getsize_fifo);
+ free(getsize_sync_data->getsize_fifo);
+ }
+ free(getsize_sync_data);
+ job->extra_data = NULL;
+ break;
+ case REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO:
+ update_info = (pkgmgrinfo_updateinfo_h)job->extra_data;
+ if (!update_info)
+ break;
+ pkgmgrinfo_updateinfo_destroy(update_info);
+ job->extra_data = NULL;
+ break;
+ }
+}
+
void _free_backend_job(struct backend_job *job)
{
+ __free_extra_info(job);
free(job->req_id);
free(job->pkgid);
free(job->appid);