Refactoring updateinfo related codes
[platform/core/appfw/pkgmgr-server.git] / src / queue.c
index 2d741ae..61220c8 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <glib.h>
 
+#include "pkgmgrinfo_type.h"
+#include "pkgmgr-info.h"
 #include "pkgmgr-server.h"
 #include "queue.h"
 
@@ -84,8 +86,9 @@ struct backend_job *_pop_queue(int pos)
        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;
@@ -98,7 +101,8 @@ int _push_queue(uid_t uid, const char *req_id, int req_type,
        }
 
        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;
@@ -110,6 +114,8 @@ int _push_queue(uid_t uid, const char *req_id, int 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);
 
@@ -119,6 +125,7 @@ int _push_queue(uid_t uid, const char *req_id, int req_type,
 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)
@@ -129,12 +136,14 @@ static int __init_backends(const char *fpath, const struct stat *sb,
                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++;
@@ -157,8 +166,40 @@ static gboolean __str_equal(gconstpointer v1, gconstpointer v2)
        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);