+out:
+ if (ret < 0 && ret2 >= 0)
+ para_printf(&pb, "%s: %s\n", p, para_strerror(-ret));
+ if (pb.offset)
+ pass_buffer_as_shm(fd, SBD_OUTPUT, pb.buf, pb.offset);
+ free(pb.buf);
+}
+
+int com_addatt(struct command_context *cc)
+{
+ int ret;
+
+ if (cc->argc < 2)
+ return -E_ATTR_SYNTAX;
+ ret = send_standard_callback_request(cc->argc - 1, cc->argv + 1,
+ com_addatt_callback, afs_cb_result_handler, cc);
+ if (ret < 0)
+ send_strerror(cc, -ret);
+ return ret;
+}
+
+static void com_mvatt_callback(int fd, const struct osl_object *query)
+{
+ char *old = query->data;
+ size_t size = strlen(old) + 1;
+ char *new = old + size;
+ struct osl_object obj = {.data = old, .size = size};
+ struct osl_row *row;
+ struct para_buffer pb = {
+ .max_size = shm_get_shmmax(),
+ .private_data = &(struct afs_max_size_handler_data) {
+ .fd = fd,
+ .band = SBD_OUTPUT
+ },
+ .max_size_handler = afs_max_size_handler,
+ };
+ int ret;
+
+ ret = osl(osl_get_row(attribute_table, ATTCOL_NAME, &obj, &row));
+ if (ret < 0)
+ goto out;
+ obj.data = new;
+ obj.size = strlen(new) + 1;
+ ret = osl(osl_update_object(attribute_table, row, ATTCOL_NAME, &obj));