+/*
+ * Read blob from a file descriptor and send it to afs.
+ *
+ * This function is called from the addblob command handlers to instruct the
+ * afs process to store the input in a blob table. Input is read and decrypted
+ * from the file descriptor given by cc and appended to arg_obj, which contains
+ * the name of the blob to create. The combined buffer is made available to the
+ * afs process via the callback method.
+ */
+static int stdin_command(struct command_context *cc, struct osl_object *arg_obj,
+ afs_callback *f)
+{
+ struct osl_object query, stdin_obj;
+ int ret;
+
+ ret = send_sb(&cc->scc, NULL, 0, SBD_AWAITING_DATA, false);
+ if (ret < 0)
+ return ret;
+ ret = fd2buf(&cc->scc, &stdin_obj);
+ if (ret < 0)
+ return ret;
+ query.size = arg_obj->size + stdin_obj.size;
+ query.data = para_malloc(query.size);
+ memcpy(query.data, arg_obj->data, arg_obj->size);
+ if (stdin_obj.size > 0)
+ memcpy((char *)query.data + arg_obj->size, stdin_obj.data,
+ stdin_obj.size);
+ free(stdin_obj.data);
+ ret = send_callback_request(f, &query, afs_cb_result_handler, cc);
+ free(query.data);
+ return ret;
+}
+
+static int com_addblob(afs_callback *f, struct command_context *cc)