summaryrefslogtreecommitdiff
path: root/src/pkt.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-06-16 01:54:19 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-06-26 20:43:44 +0200
commitc4d0fa85b1032690a89989bf15f984b3840b3eee (patch)
tree32b0982966e63e977cc6517c644f4ed7c6e4958c /src/pkt.c
parent4e95ef0268137cf17c43f72863606803b0277bdf (diff)
downloadlibgit2-c4d0fa85b1032690a89989bf15f984b3840b3eee.tar.gz
Implement and use git_pkt_send_request
This makes it easier to send a requqest for an URL. It assumes there is a socket where the string should go out to. Make git_pkt_gen_proto accept a command parameter, which defaults to git-upload-pack Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Diffstat (limited to 'src/pkt.c')
-rw-r--r--src/pkt.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/pkt.c b/src/pkt.c
index 17edf320a..a7365cc0f 100644
--- a/src/pkt.c
+++ b/src/pkt.c
@@ -29,6 +29,7 @@
#include "common.h"
#include "util.h"
+#include "netops.h"
#include <ctype.h>
@@ -207,10 +208,10 @@ void git_pkt_free(git_pkt *pkt)
*
* TODO: the command should not be hard-coded
*/
-int git_pkt_gen_proto(char **out, int *outlen, const char *url)
+int git_pkt_gen_proto(char **out, int *outlen, const char *cmd, const char *url)
{
char *delim, *repo, *ptr;
- char command[] = "git-upload-pack";
+ char default_command[] = "git-upload-pack";
char host[] = "host=";
int len;
@@ -224,7 +225,10 @@ int git_pkt_gen_proto(char **out, int *outlen, const char *url)
if (delim == NULL)
delim = strchr(url, '/');
- len = 4 + STRLEN(command) + 1 + strlen(repo) + 1 + STRLEN(host) + (delim - url) + 2;
+ if (cmd == NULL)
+ cmd = default_command;
+
+ len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + STRLEN(host) + (delim - url) + 2;
*out = git__malloc(len);
if (*out == NULL)
@@ -234,7 +238,30 @@ int git_pkt_gen_proto(char **out, int *outlen, const char *url)
ptr = *out;
memset(ptr, 0x0, len);
/* We expect the return value to be > len - 1 so don't bother checking it */
- snprintf(ptr, len -1, "%04x%s %s%c%s%s", len - 1, command, repo, 0, host, url);
+ snprintf(ptr, len -1, "%04x%s %s%c%s%s", len - 1, cmd, repo, 0, host, url);
return GIT_SUCCESS;
}
+
+int git_pkt_send_request(int s, const char *cmd, const char *url)
+{
+ int error, len;
+ char *msg = NULL;
+
+ error = git_pkt_gen_proto(&msg, &len, cmd, url);
+ if (error < GIT_SUCCESS)
+ goto cleanup;
+
+ error = gitno_send(s, msg, len, 0);
+
+cleanup:
+ free(msg);
+ return error;
+}
+
+int git_pkt_send_flush(int s)
+{
+ char flush[] = "0000";
+
+ return gitno_send(s, flush, STRLEN(flush), 0);
+}