X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=blob.c;h=a6ae1acf61237aaa31b18035739acefd80c52fc1;hb=277ed4a605f68118aff9e671f16c0ac6edb1d55a;hp=f51f4de0257ede9e9bfaea933d6e1077f823d1fd;hpb=02dd632ab2a6696aff7b6c6d108069704cfe871a;p=paraslash.git diff --git a/blob.c b/blob.c index f51f4de0..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. */ @@ -382,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); @@ -414,44 +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; - if (cc->use_sideband) - ret = send_sb(&cc->scc, NULL, 0, SBD_AWAITING_DATA, false); - else - 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); @@ -468,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 */