mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 17:20:22 +00:00
Lay the foundations for pkt-line parsing
This are the types I intend to use for pkt-line parsing and (later) creation. git_pkt serves as a base pointer type and once you know what type it is you can use the real one (command, tip list, etc.) Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
This commit is contained in:
parent
d6258debbe
commit
f7fc68df83
51
include/git2/pkt.h
Normal file
51
include/git2/pkt.h
Normal file
@ -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;
|
||||||
|
};
|
@ -182,6 +182,12 @@ typedef int (*git_transport_cb)(git_transport *transport);
|
|||||||
typedef struct git_remote_head git_remote_head;
|
typedef struct git_remote_head git_remote_head;
|
||||||
typedef struct git_headarray git_headarray;
|
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
|
GIT_END_DECL
|
||||||
|
|
||||||
|
80
src/pkt.c
Normal file
80
src/pkt.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user