diff --git a/include/git2/pkt.h b/include/git2/pkt.h new file mode 100644 index 000000000..4a0767e27 --- /dev/null +++ b/include/git2/pkt.h @@ -0,0 +1,51 @@ +/* + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, + * as published by the Free Software Foundation. + * + * In addition to the permissions in the GNU General Public License, + * the authors give you unlimited permission to link the compiled + * version of this file into combinations with other programs, + * and to distribute those combinations without any restriction + * coming from the use of this file. (The General Public License + * restrictions do apply in other respects; for example, they cover + * modification of the file, and distribution when not linked into + * a combined executable.) + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "git2/net.h" + +enum git_pkt_type { + GIT_PKT_CMD, + GIT_PKT_FLUSH, + GIT_PKT_HEAD, + GIT_PKT_HAVE, +}; + +/* This would be a flush pkt */ +struct git_pkt { + enum git_pkt_type type; +}; + +struct git_pkt_cmd { + enum git_pkt_type type; + char *cmd; + char *path; + char *host; +}; + +/* This is a pkt-line with some info in it */ +struct git_pkt_head { + enum git_pkt_type type; + git_remote_head head; +}; diff --git a/include/git2/types.h b/include/git2/types.h index 8e0659127..94f42db62 100644 --- a/include/git2/types.h +++ b/include/git2/types.h @@ -182,6 +182,12 @@ typedef int (*git_transport_cb)(git_transport *transport); typedef struct git_remote_head git_remote_head; typedef struct git_headarray git_headarray; +/* Several types of packets */ +typedef enum git_pkt_type git_pkt_type; +typedef struct git_pkt git_pkt; +typedef struct git_pkt_cmd git_pkt_cmd; +typedef struct git_pkt_head git_pkt_head; + /** @} */ GIT_END_DECL diff --git a/src/pkt.c b/src/pkt.c new file mode 100644 index 000000000..5dce0bf59 --- /dev/null +++ b/src/pkt.c @@ -0,0 +1,80 @@ +/* + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, + * as published by the Free Software Foundation. + * + * In addition to the permissions in the GNU General Public License, + * the authors give you unlimited permission to link the compiled + * version of this file into combinations with other programs, + * and to distribute those combinations without any restriction + * coming from the use of this file. (The General Public License + * restrictions do apply in other respects; for example, they cover + * modification of the file, and distribution when not linked into + * a combined executable.) + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "git2/pkt.h" +#include "git2/types.h" +#include "git2/errors.h" + +#include "common.h" +#include "util.h" + +/* + * As per the documentation, the syntax is: + * + * pkt-line = data-pkt / flush-pkt + * data-pkt = pkt-len pkt-payload + * pkt-len = 4*(HEXDIG) + * pkt-payload = (pkt-len -4)*(OCTET) + * flush-pkt = "0000" + * + * Which means that the first four bytes are the length of the line, + * in ASCII hexadecimal (including itself) + */ + +int git_pkt_parse_line(git_pkt **head, const char *line, const char **out) +{ + int error = GIT_SUCCESS; + long int len; + const char *num_end; + git_pkt *pkt; + + error = git__strtol32(&len, line, &num_end, 16); + if (error < GIT_SUCCESS) + return error; + + /* + * TODO: How do we deal with empty lines? Try again? with the next + * line? + */ + if (len == 4) { + *out = num_end; + return GIT_SUCCESS; + } + + if (len == 0) { /* Flush, should go into its own fn */ + pkt = git__malloc(sizeof(git_pkt)); + if (pkt == NULL) + return GIT_ENOMEM; + + pkt->type = GIT_PKT_FLUSH; + *head = pkt; + *out = num_end; + return GIT_SUCCESS; + } + + /* TODO: Write the rest of this thing */ + + return GIT_SUCCESS; +}