Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Improve sockets IO by processing all pending messages.
Vsevolod Stakhov committed 11 years ago
commit 9ca67386c187583f3b0e7f1835141d98feff53f5
parent 486306aa988aa43ff4ae7d57e3e72b3c128af6ff
1 file changed +47 -44
modified libpkg/pkg_repo_create.c
@@ -440,6 +440,8 @@ pkg_create_repo_read_pipe(int fd, struct digest_list_entry **dlist)
				/* Treat it as the end of a connection */
				return (EPKG_END);
			}
+
			else if (errno == EAGAIN || errno == EWOULDBLOCK)
+
				return (EPKG_OK);

			pkg_emit_errno("pkg_create_repo_read_pipe", "read");
			return (EPKG_FATAL);
@@ -447,57 +449,58 @@ pkg_create_repo_read_pipe(int fd, struct digest_list_entry **dlist)
		else if (r == 0)
			return (EPKG_END);

-
		break;
-
	}
-

-
	/*
-
	 * XXX: can parse merely full lines
-
	 */
-
	start = 0;
-
	for (i = 0; i < r; i ++) {
-
		if (buf[i] == ':') {
-
			switch(state) {
-
			case s_set_origin:
-
				dig = calloc(1, sizeof(*dig));
-
				dig->origin = malloc(i - start + 1);
-
				strlcpy(dig->origin, &buf[start], i - start + 1);
-
				state = s_set_digest;
-
				break;
-
			case s_set_digest:
-
				dig->digest = malloc(i - start + 1);
-
				strlcpy(dig->digest, &buf[start], i - start + 1);
-
				state = s_set_mpos;
-
				break;
-
			case s_set_mpos:
-
				dig->manifest_pos = strtol(&buf[start], NULL, 10);
-
				state = s_set_fpos;
-
				break;
-
			case s_set_fpos:
-
				dig->files_pos = strtol(&buf[start], NULL, 10);
-
				state = s_set_mlen;
-
				break;
-
			case s_set_mlen:
-
				/* Record should actually not finish with ':' */
+
		/*
+
		 * XXX: can parse merely full lines
+
		 */
+
		start = 0;
+
		for (i = 0; i < r; i ++) {
+
			if (buf[i] == ':') {
+
				switch(state) {
+
				case s_set_origin:
+
					dig = calloc(1, sizeof(*dig));
+
					dig->origin = malloc(i - start + 1);
+
					strlcpy(dig->origin, &buf[start], i - start + 1);
+
					state = s_set_digest;
+
					break;
+
				case s_set_digest:
+
					dig->digest = malloc(i - start + 1);
+
					strlcpy(dig->digest, &buf[start], i - start + 1);
+
					state = s_set_mpos;
+
					break;
+
				case s_set_mpos:
+
					dig->manifest_pos = strtol(&buf[start], NULL, 10);
+
					state = s_set_fpos;
+
					break;
+
				case s_set_fpos:
+
					dig->files_pos = strtol(&buf[start], NULL, 10);
+
					state = s_set_mlen;
+
					break;
+
				case s_set_mlen:
+
					/* Record should actually not finish with ':' */
+
					dig->manifest_length = strtol(&buf[start], NULL, 10);
+
					state = s_set_origin;
+
					break;
+
				}
+
				start = i + 1;
+
			}
+
			else if (buf[i] == '\n') {
				dig->manifest_length = strtol(&buf[start], NULL, 10);
+
				assert(dig->origin != NULL);
+
				assert(dig->digest != NULL);
+
				DL_APPEND(*dlist, dig);
				state = s_set_origin;
+
				start = i + 1;
				break;
			}
-
			start = i + 1;
-
		}
-
		else if (buf[i] == '\n') {
-
			dig->manifest_length = strtol(&buf[start], NULL, 10);
-
			assert(dig->origin != NULL);
-
			assert(dig->digest != NULL);
-
			DL_APPEND(*dlist, dig);
-
			state = s_set_origin;
-
			start = i + 1;
-
			break;
-
		}
-
		else if (buf[i] == '.' && buf[i + 1] == '\n') {
-
			return (EPKG_END);
+
			else if (buf[i] == '.' && buf[i + 1] == '\n') {
+
				return (EPKG_END);
+
			}
		}
	}

+
	/*
+
	 * Never reached
+
	 */
	return (EPKG_OK);
}