smart: typedef git_pkt_type and clarify recv_pkt return type
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
diff --git a/src/transports/smart.h b/src/transports/smart.h
index e33a254..c75c2a3 100644
--- a/src/transports/smart.h
+++ b/src/transports/smart.h
@@ -33,7 +33,7 @@
extern bool git_smart__ofs_delta_enabled;
-enum git_pkt_type {
+typedef enum {
GIT_PKT_CMD,
GIT_PKT_FLUSH,
GIT_PKT_REF,
@@ -48,7 +48,7 @@ enum git_pkt_type {
GIT_PKT_OK,
GIT_PKT_NG,
GIT_PKT_UNPACK,
-};
+} git_pkt_type;
/* Used for multi_ack and mutli_ack_detailed */
enum git_ack_status {
@@ -60,11 +60,11 @@ enum git_ack_status {
/* This would be a flush pkt */
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
} git_pkt;
struct git_pkt_cmd {
- enum git_pkt_type type;
+ git_pkt_type type;
char *cmd;
char *path;
char *host;
@@ -72,25 +72,25 @@ struct git_pkt_cmd {
/* This is a pkt-line with some info in it */
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
git_remote_head head;
char *capabilities;
} git_pkt_ref;
/* Useful later */
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
git_oid oid;
enum git_ack_status status;
} git_pkt_ack;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
char comment[GIT_FLEX_ARRAY];
} git_pkt_comment;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
int len;
char data[GIT_FLEX_ARRAY];
} git_pkt_data;
@@ -98,24 +98,24 @@ typedef struct {
typedef git_pkt_data git_pkt_progress;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
int len;
char error[GIT_FLEX_ARRAY];
} git_pkt_err;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
char *ref;
} git_pkt_ok;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
char *ref;
char *msg;
} git_pkt_ng;
typedef struct {
- enum git_pkt_type type;
+ git_pkt_type type;
int unpack_ok;
} git_pkt_unpack;
diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c
index aecfece..5138f6a 100644
--- a/src/transports/smart_protocol.c
+++ b/src/transports/smart_protocol.c
@@ -209,11 +209,11 @@ int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vec
return 0;
}
-static int recv_pkt(git_pkt **out, gitno_buffer *buf)
+static int recv_pkt(git_pkt **out, git_pkt_type *pkt_type, gitno_buffer *buf)
{
const char *ptr = buf->data, *line_end = ptr;
git_pkt *pkt = NULL;
- int pkt_type, error = 0, ret;
+ int error = 0, ret;
do {
if (buf->offset > 0)
@@ -236,13 +236,14 @@ static int recv_pkt(git_pkt **out, gitno_buffer *buf)
} while (error);
gitno_consume(buf, line_end);
- pkt_type = pkt->type;
+ if (pkt_type)
+ *pkt_type = pkt->type;
if (out != NULL)
*out = pkt;
else
git__free(pkt);
- return pkt_type;
+ return error;
}
static int store_common(transport_smart *t)
@@ -252,7 +253,7 @@ static int store_common(transport_smart *t)
int error;
do {
- if ((error = recv_pkt(&pkt, buf)) < 0)
+ if ((error = recv_pkt(&pkt, NULL, buf)) < 0)
return error;
if (pkt->type == GIT_PKT_ACK) {
@@ -320,7 +321,7 @@ static int wait_while_ack(gitno_buffer *buf)
while (1) {
git__free(pkt);
- if ((error = recv_pkt((git_pkt **)&pkt, buf)) < 0)
+ if ((error = recv_pkt((git_pkt **)&pkt, NULL, buf)) < 0)
return error;
if (pkt->type == GIT_PKT_NAK)
@@ -345,7 +346,8 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
gitno_buffer *buf = &t->buffer;
git_buf data = GIT_BUF_INIT;
git_revwalk *walk = NULL;
- int error = -1, pkt_type;
+ int error = -1;
+ git_pkt_type pkt_type;
unsigned int i;
git_oid oid;
@@ -395,16 +397,13 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
if ((error = store_common(t)) < 0)
goto on_error;
} else {
- pkt_type = recv_pkt(NULL, buf);
-
- if (pkt_type == GIT_PKT_ACK) {
+ error = recv_pkt(NULL, &pkt_type, buf);
+ if (error < 0) {
+ goto on_error;
+ } else if (pkt_type == GIT_PKT_ACK) {
break;
} else if (pkt_type == GIT_PKT_NAK) {
continue;
- } else if (pkt_type < 0) {
- /* recv_pkt returned an error */
- error = pkt_type;
- goto on_error;
} else {
giterr_set(GITERR_NET, "Unexpected pkt type");
error = -1;
@@ -470,10 +469,10 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
/* Now let's eat up whatever the server gives us */
if (!t->caps.multi_ack && !t->caps.multi_ack_detailed) {
- pkt_type = recv_pkt(NULL, buf);
+ error = recv_pkt(NULL, &pkt_type, buf);
- if (pkt_type < 0) {
- return pkt_type;
+ if (error < 0) {
+ return error;
} else if (pkt_type != GIT_PKT_ACK && pkt_type != GIT_PKT_NAK) {
giterr_set(GITERR_NET, "Unexpected pkt type");
return -1;
@@ -594,7 +593,7 @@ int git_smart__download_pack(
goto done;
}
- if ((error = recv_pkt(&pkt, buf)) >= 0) {
+ if ((error = recv_pkt(&pkt, NULL, buf)) >= 0) {
/* Check cancellation after network call */
if (t->cancelled.val) {
giterr_clear();