Brandon Williams <[email protected]> writes:
> +/* Returns 1 if packet_buffer is a protocol version pkt-line, 0 otherwise. */
> +static int process_protocol_version(void)
> +{
> + switch (determine_protocol_version_client(packet_buffer)) {
> + case protocol_v1:
> + return 1;
> + case protocol_v0:
> + return 0;
> + default:
> + die("server is speaking an unknown protocol");
> + }
> +}
For the purpose of "technology demonstration" v1 protocol, it is OK
to discard the result of "determine_pvc()" like the above code, but
in a real application, we would do a bit more than just ignoring an
extra "version #" packet that appears at the beginning, no?
It would be sensible to design how the result of determien_pvc()
call is propagated to the remainder of the program in this patch and
implement it. Perhaps add a new global (like server_capabilities
already is) and store the value there, or something? Or pass a
pointer to enum protocol_version as a return-location parameter to
this helper function so that the process_capabilities() can pass a
pointer to its local variable?
> static void process_capabilities(int *len)
> {
> @@ -224,12 +239,19 @@ struct ref **get_remote_heads(int in, char *src_buf,
> size_t src_len,
> */
> int responded = 0;
> int len;
> - int state = EXPECTING_FIRST_REF;
> + int state = EXPECTING_PROTOCOL_VERSION;
>
> *list = NULL;
>
> while ((len = read_remote_ref(in, &src_buf, &src_len, &responded))) {
> switch (state) {
> + case EXPECTING_PROTOCOL_VERSION:
> + if (process_protocol_version()) {
> + state = EXPECTING_FIRST_REF;
> + break;
> + }
> + state = EXPECTING_FIRST_REF;
> + /* fallthrough */
> case EXPECTING_FIRST_REF:
> process_capabilities(&len);
> if (process_dummy_ref()) {