/* * Receive the response from the server, which include the HEAD info. And * store result to dl->di_length, dl->di_filename. */ static int dlinfo_recv_and_parsing(struct dlinfo *dl) { int n; int code; char buf[DLINFO_RCV_SZ]; char tmp[DLINFO_ENCODE_NAME_MAX]; char *p; /* any error or end-of-file will cause parsing header fails */ if ((n = read(dl->di_remote, buf, DLINFO_RCV_SZ - 1)) <= 0) return -1; buf[n] = 0; err_dbg(2, "--------------Received Meta info---------------\n" "%s\n", buf); /* response code valid range [200-300) */ code = getrcode(buf); if (code < 200 || code >= 300) return -1; #define _CONTENT_LENGTH "Content-Length: " if (NULL != (p = strcasestr(buf, _CONTENT_LENGTH))) { dl->di_length = strtol(p + sizeof(_CONTENT_LENGTH) - 1, NULL, 10); } /* User specified filename */ if (*dl->di_filename) return 0; #define FILENAME "filename=" if ((p = strcasestr(buf, FILENAME))) { p = memccpy(tmp, p + sizeof(FILENAME) - 1, '\n', DLINFO_ENCODE_NAME_MAX); if (!p) { err_sys("memccpy"); return -1; } strncpy(dl->di_filename, string_decode(tmp), sizeof(dl->di_filename) - 1); return 0; } /* if filename parsing failed, then parsing filename from url. */ if ((p = strrchr(dl->di_url, '/'))) { strcpy(tmp, p + 1); strncpy(dl->di_filename, string_decode(tmp), sizeof(dl->di_filename) - 1); return 0; } return -1; }
char * muscle_percent_define_get (char const *variable) { uniqstr name = muscle_name (variable, NULL); char *value = string_decode (name); if (!value) value = xstrdup (""); muscle_percent_define_use (variable); return value; }
void muscle_percent_define_check_values (char const * const *values) { for (; *values; ++values) { char const * const *variablep = values; uniqstr name = muscle_name (*variablep, NULL); char *value = string_decode (name); muscle_percent_define_check_kind (*variablep, muscle_keyword); if (value) { for (++values; *values; ++values) { if (STREQ (value, *values)) break; } if (!*values) { unsigned i = 0; location loc = muscle_percent_define_get_loc (*variablep); complain_indent (&loc, complaint, &i, _("invalid value for %%define variable %s: %s"), quote (*variablep), quote_n (1, value)); i += SUB_INDENT; for (values = variablep + 1; *values; ++values) complain_indent (&loc, complaint | no_caret | silent, &i, _("accepted value: %s"), quote (*values)); } else { while (*values) ++values; } free (value); } else complain (NULL, fatal, _("%s: undefined %%define variable %s"), "muscle_percent_define_check_values", quote (*variablep)); } }