X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=blob.c;h=a6ae1acf61237aaa31b18035739acefd80c52fc1;hp=fea230f190812ca7ed42cb3146989abdf9514896;hb=277ed4a605f68118aff9e671f16c0ac6edb1d55a;hpb=68cb0aef88594f3dea1f7dfdc279f125bf5bbecc diff --git a/blob.c b/blob.c index fea230f1..a6ae1acf 100644 --- a/blob.c +++ b/blob.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2012 Andre Noll + * Copyright (C) 2007-2013 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -18,6 +18,7 @@ #include "afs.h" #include "ipc.h" #include "portable_io.h" +#include "sideband.h" #include "command.h" /** @@ -135,6 +136,7 @@ static void com_lsblob_callback(struct osl_table *table, .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, } @@ -162,7 +164,7 @@ static void com_lsblob_callback(struct osl_table *table, else if (pmd.num_matches == 0 && pmd.patterns.size > 0) para_printf(&lbad.pb, "no matches\n"); if (lbad.pb.offset) - pass_buffer_as_shm(lbad.pb.buf, lbad.pb.offset, &fd); + pass_buffer_as_shm(fd, SBD_OUTPUT, lbad.pb.buf, lbad.pb.offset); free(lbad.pb.buf); } @@ -197,20 +199,20 @@ static int com_lsblob(callback_function *f, struct command_context *cc) // if (argc > i) // return -E_BLOB_SYNTAX; return send_option_arg_callback_request(&options, cc->argc - i, - cc->argv + i, f, sc_send_result, cc); + cc->argv + i, f, afs_cb_result_handler, cc); } static int cat_blob(struct osl_table *table, struct osl_row *row, __a_unused const char *name, void *data) { - int ret = 0, ret2; + int ret = 0, ret2, fd = *(int *)data; struct osl_object obj; ret = osl(osl_open_disk_object(table, row, BLOBCOL_DEF, &obj)); if (ret < 0) return (ret == osl(-E_OSL_EMPTY))? 0 : ret; assert(obj.size > 0); - ret = pass_buffer_as_shm(obj.data, obj.size, data); + ret = pass_buffer_as_shm(fd, SBD_OUTPUT, obj.data, obj.size); ret2 = osl(osl_close_disk_object(&obj)); return (ret < 0)? ret : ret2; } @@ -230,7 +232,7 @@ static void com_catblob_callback(struct osl_table *table, int fd, for_each_matching_row(&pmd); if (pmd.num_matches == 0) { char err_msg[] = "no matches\n"; - pass_buffer_as_shm(err_msg, sizeof(err_msg), &fd); + pass_buffer_as_shm(fd, SBD_OUTPUT, err_msg, sizeof(err_msg)); } } @@ -239,7 +241,7 @@ static int com_catblob(callback_function *f, struct command_context *cc) if (cc->argc < 2) return -E_BLOB_SYNTAX; return send_standard_callback_request(cc->argc - 1, cc->argv + 1, f, - sc_send_result, cc); + afs_cb_result_handler, cc); } /** Used for removing rows from a blob table. */ @@ -269,6 +271,7 @@ static void com_rmblob_callback(struct osl_table *table, int fd, .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, } @@ -296,7 +299,7 @@ static void com_rmblob_callback(struct osl_table *table, int fd, } out: if (ret2 >= 0 && rmbd.pb.offset) - pass_buffer_as_shm(rmbd.pb.buf, rmbd.pb.offset, &fd); + pass_buffer_as_shm(fd, SBD_OUTPUT, rmbd.pb.buf, rmbd.pb.offset); free(rmbd.pb.buf); } @@ -305,7 +308,7 @@ static int com_rmblob(callback_function *f, struct command_context *cc) if (cc->argc < 2) return -E_MOOD_SYNTAX; return send_option_arg_callback_request(NULL, cc->argc - 1, cc->argv + 1, f, - sc_send_result, cc); + afs_cb_result_handler, cc); } static void com_addblob_callback(struct osl_table *table, __a_unused int fd, @@ -379,11 +382,11 @@ out: /* * write input from fd to dynamically allocated buffer, - * but maximal max_size byte. + * but maximal 10M. */ -static int fd2buf(struct stream_cipher_context *scc, unsigned max_size, struct osl_object *obj) +static int fd2buf(struct stream_cipher_context *scc, struct osl_object *obj) { - const size_t chunk_size = 1024; + const size_t chunk_size = 1024, max_size = 10 * 1024 * 1024; size_t size = 2048, received = 0; int ret; char *buf = para_malloc(size); @@ -411,41 +414,41 @@ static int fd2buf(struct stream_cipher_context *scc, unsigned max_size, struct o /* * Read data from a file descriptor, and send it to the afs process. * - * \param scc crypt context containing the file descriptor to read data from. + * \param cc Contains the file descriptor to read data from. * \param arg_obj Pointer to the arguments to \a f. * \param f The callback function. - * \param max_len Don't read more than that many bytes from stdin. * \param result_handler See \ref send_callback_request. * \param private_result_data See \ref send_callback_request. * - * This function is used by commands that wish to let para_server store - * arbitrary data specified by the user (for instance the add_blob family of - * commands). First, at most \a max_len bytes are read and decrypted from the - * file descriptor given by \a scc. The result is concatenated with the buffer - * given by \a arg_obj, and the combined buffer is made available to the afs - * process via the callback method. See \ref send_callback_request for details. + * This function is used by the addblob commands that instruct para_server to + * store arbitrary data in a blob table. Input data is read and decrypted from + * the file descriptor given by \a cc. This data is concatenated with the + * buffer given by \a arg_obj, and the combined buffer is made available to the + * afs process via the callback method. See \ref send_callback_request for + * details. * * \return Negative on errors, the return value of the underlying call to * send_callback_request() otherwise. */ static int stdin_command(struct command_context *cc, struct osl_object *arg_obj, - callback_function *f, unsigned max_len, - callback_result_handler *result_handler, + callback_function *f, callback_result_handler *result_handler, void *private_result_data) { struct osl_object query, stdin_obj; int ret; - ret = sc_send_buffer(&cc->scc, AWAITING_DATA_MSG); + ret = send_sb(&cc->scc, NULL, 0, SBD_AWAITING_DATA, false); if (ret < 0) return ret; - ret = fd2buf(&cc->scc, max_len, &stdin_obj); + 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); - memcpy((char *)query.data + arg_obj->size, stdin_obj.data, stdin_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, result_handler, private_result_data); free(query.data); @@ -462,7 +465,7 @@ static int com_addblob(callback_function *f, struct command_context *cc) return -E_BLOB_SYNTAX; arg_obj.size = strlen(cc->argv[1]) + 1; arg_obj.data = (char *)cc->argv[1]; - return stdin_command(cc, &arg_obj, f, 10 * 1024 * 1024, NULL, NULL); + return stdin_command(cc, &arg_obj, f, NULL, NULL); } /* FIXME: Print output to client, not to log file */