mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 11:19:47 +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_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
|
||||
|
||||
|
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