+static gboolean getsize_io_handler(GIOChannel *io, GIOCondition cond,
+ gpointer data)
+{
+ GError *err = NULL;
+ GIOStatus s;
+ gsize len;
+ char buf[MAX_LONGLONG_LENGTH];
+ long long result = 0;
+ struct backend_job *job = (struct backend_job *)data;
+
+ s = g_io_channel_read_chars(io, (gchar *)buf, sizeof(buf), &len, &err);
+ if (s != G_IO_STATUS_NORMAL) {
+ ERR("getsize fd read failed: %s", err->message);
+ g_error_free(err);
+ result = -1;
+ } else {
+ if (strlen(buf) == 0) {
+ ERR("empty result");
+ result = -1;
+ } else {
+ result = atoll(buf);
+ }
+ }
+
+ _return_value_to_caller(job->req_id, g_variant_new("(ix)",
+ (result < 0) ? PKGMGR_R_ERROR : PKGMGR_R_OK, result));
+
+ unlink(job->extra->getsize_fifo);
+ free(job->extra->getsize_fifo);
+ job->extra->getsize_fifo = NULL;
+
+ return FALSE;
+}
+
+static int __setup_size_info_io(struct backend_job *job)
+{
+ guint getsize_wid;
+
+ job->extra->getsize_fd = open(job->extra->getsize_fifo,
+ O_RDONLY | O_NONBLOCK);
+ if (job->extra->getsize_fd < 0) {
+ ERR("failed to open the fifo(%s), errno(%d)",
+ job->extra->getsize_fifo, errno);
+ return -1;
+ }
+
+ job->extra->getsize_io = g_io_channel_unix_new(job->extra->getsize_fd);
+ if (!job->extra->getsize_io)
+ return -1;
+ g_io_channel_set_encoding(job->extra->getsize_io, NULL, NULL);
+ g_io_channel_set_buffered(job->extra->getsize_io, FALSE);
+ getsize_wid = g_io_add_watch(job->extra->getsize_io,
+ G_IO_IN, getsize_io_handler, job);
+ if (!getsize_wid) {
+ ERR("failed to add io watch");
+ return -1;
+ }
+
+ return 0;
+}
+