/* * @brief: service command to novacomd * @ret * -1 invalid command * 0 placed in queue * 1 command complete * url parsed command (when ret==0) */ int novacom_service_command(SOCKET cmdsocket, const char *cmd, novacom_command_url_t **_url) { int i=0; int rc=-1; /* error by default */ bool handled = false; struct novacom_command_url *url = NULL; /* check */ if (!_url) { goto done; /* return error */ } // parse the command if (parse_command(cmd, strlen(cmd), &url) < 0) { rc = -1; goto done; } PTRACEF(TRACE_COMMANDS, "command verb '%s', scheme '%s'\n", url->verb, url->scheme); // check command handlers i = 0; while (iohandlers[i].verb != NULL) { if ((strcasecmp(url->verb, iohandlers[i].verb) == 0) && strcasecmp(url->scheme, iohandlers[i].scheme) == 0) { handled = true; break; } i++; } if(!handled) { goto done; } /* some processing involved? */ if(!iohandlers[i].remote) { rc = iohandlers[i].spawn(cmdsocket, 0, url, NULL, NULL); if (!rc) rc = 1; /*done with command */ PTRACEF(TRACE_COMMANDS, "host command: done...\n"); } else { /* register command with device commands queue */ rc = 0; *_url = url; PTRACEF(TRACE_COMMANDS, "device specific command: postponed...\n"); } done: /* free _url only when we have error/completed cmd */ if (rc && url) { free_url(url); } PTRACEF(TRACE_COMMANDS, "return rc(%d)\n", rc); return rc; }
/* {{{ proto array parse_url(string url) Parse a URL and return its components */ void php3_parse_url(INTERNAL_FUNCTION_PARAMETERS) { pval *string; url *resource; TLS_VARS; if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &string) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string(string); resource = url_parse(string->value.str.val); if (resource == NULL) { php3_error(E_WARNING, "unable to parse url (%s)", string->value.str.val); RETURN_FALSE; } /* allocate an array for return */ if (array_init(return_value) == FAILURE) { free_url(resource); RETURN_FALSE; } /* add the various elements to the array */ if (resource->scheme != NULL) add_assoc_string(return_value, "scheme", resource->scheme, 1); if (resource->host != NULL) add_assoc_string(return_value, "host", resource->host, 1); if (resource->port != 0) add_assoc_long(return_value, "port", resource->port); if (resource->user != NULL) add_assoc_string(return_value, "user", resource->user, 1); if (resource->pass != NULL) add_assoc_string(return_value, "pass", resource->pass, 1); if (resource->path != NULL) add_assoc_string(return_value, "path", resource->path, 1); if (resource->query != NULL) add_assoc_string(return_value, "query", resource->query, 1); if (resource->fragment != NULL) add_assoc_string(return_value, "fragment", resource->fragment, 1); free_url(resource); }
char * xmms_ipc_hostname (const char *path) { xmms_url_t *url; char* ret = NULL; url = parse_url (path); if (!strcasecmp (url->protocol, "tcp")) { if (strlen (url->host)) { ret = strdup (url->host); } } free_url (url); return ret; }
xmms_ipc_transport_t * xmms_ipc_client_init (const char *path) { xmms_ipc_transport_t *transport = NULL; xmms_url_t *url; x_return_val_if_fail (path, NULL); url = parse_url (path); x_return_val_if_fail (url, NULL); if (!strcasecmp (url->protocol, "") || !strcasecmp (url->protocol, "unix")) { transport = xmms_ipc_usocket_client_init (url); } else if (!strcasecmp (url->protocol, "tcp")) { transport = xmms_ipc_tcp_client_init (url, url->ipv6_host); } free_url (url); return transport; }
UNSIGNED32 get_timestamp_response(const char* urlStr, char* hash, UNSIGNED32 hash_size, UNSIGNED32 httpTimeOut, TS_RESP** tsResponse) { UNSIGNED32 result = TINTERNALERROR; BIO* responseBio = NULL; Url* url = NULL; TS_REQ* tsRequest = NULL; BIO* requestBio = NULL; int requestHeaderLength; int requestLength; int requestContentLength; char requestHeader[2048 + 256]; char* request = NULL; void* contentBuffer = NULL; void* resultBuffer = NULL; int resultLength; TS_MSG_IMPRINT* msgImprint = NULL; ASN1_OCTET_STRING* hashedMessage = NULL; int hashedMessageLength; int httpResult; char *urlBuffer = NULL; int redirection = 0; /* Check if TS url is specified */ if (!urlStr) { goto end; } /* Get Request for timestamp */ tsRequest = get_timestamp_request(hash, hash_size, create_nonce(NONCE_LENGTH)); msgImprint = TS_REQ_get_msg_imprint(tsRequest); hashedMessage = TS_MSG_IMPRINT_get_msg(msgImprint); hashedMessageLength = ASN1_STRING_length((ASN1_STRING*)hashedMessage); if ((int)hash_size != hashedMessageLength) { goto end; } requestBio = BIO_new(BIO_s_mem()); if (requestBio == NULL) { goto end; } if (!i2d_TS_REQ_bio(requestBio, tsRequest)) { goto end; } contentBuffer = memory_alloc(BIO_number_written(requestBio)); if (contentBuffer == NULL) { goto end; } requestContentLength = BIO_read(requestBio, contentBuffer, BIO_number_written(requestBio)); /* Allocate memory buffer for timestamp server url */ urlBuffer = memory_alloc(strlen(urlStr) + 1); if (!urlBuffer) { goto end; } /* Copy TS url to allocated buffer */ strcpy(urlBuffer, urlStr); http_redirect: /* Parse and check URL */ url = parse_url(urlBuffer); if (url == NULL) { goto end; } if (strcmp(url->Scheme, "http") != 0) { goto end; } requestHeaderLength = sprintf(requestHeader, "POST %s HTTP/1.0\r\nHOST: %s\r\nPragma: no-cache\r\nContent-Type: application/timestamp-query\r\nAccept: application/timestamp-reply\r\nContent-Length: %d\r\n\r\n", urlBuffer, url->Host, requestContentLength); requestLength = requestHeaderLength + requestContentLength; request = (char*)memory_alloc(requestLength); if (request == NULL) { goto end; } memcpy(request, requestHeader, requestHeaderLength); memcpy(request + requestHeaderLength, contentBuffer, requestContentLength); httpResult = http_read(url->Host, request, requestLength, url->Port, httpTimeOut, 1, &resultBuffer, &resultLength); if (httpResult == HTTP_REDIRECTION && (resultBuffer) && !redirection) { free_url(url); url = NULL; memory_free(request); request = NULL; /* Allocated buffer for redirected url */ urlBuffer = memory_realloc(urlBuffer, resultLength); if (!urlBuffer) { goto end; } memcpy(urlBuffer, resultBuffer, resultLength); memory_free(resultBuffer); redirection++; goto http_redirect; } else if ((httpResult == HTTP_NOERROR) && (resultBuffer)) { responseBio = BIO_new(BIO_s_mem()); if (responseBio == NULL) { goto end; } BIO_write(responseBio, resultBuffer, resultLength); *tsResponse = d2i_TS_RESP_bio(responseBio, NULL); if (*tsResponse == NULL) { goto end; } result = TNOERR; } else { switch (httpResult) { case HTTP_NOLIVEINTERNET_ERROR: result = TNONET; break; case HTTP_TIMEOUT_ERROR: result = TTIMEOUT; break; case HTTP_RESPONSESTATUS_ERROR: result = TSERVERERROR; break; default: result = TINTERNALERROR; break; } } end: free_url(url); if (tsRequest != NULL) { TS_REQ_free(tsRequest); } if (requestBio != NULL) { BIO_free_all(requestBio); } if (responseBio != NULL) { BIO_free_all(responseBio); } if (request != NULL) { memory_free(request); } if (contentBuffer != NULL) { memory_free(contentBuffer); } if (resultBuffer != NULL) { memory_free(resultBuffer); } if (urlBuffer != NULL) { memory_free(urlBuffer); } return result; }
FILE *php_fopen_url_wrap_ftp(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) { FILE *fp=NULL; php_url *resource=NULL; char tmp_line[512]; unsigned short portno; char *scratch; int result; int i; char *tpath, *ttpath; resource = url_parse((char *) path); if (resource == NULL) { php_error(E_WARNING, "Invalid URL specified, %s", path); *issock = BAD_URL; return NULL; } else if (resource->path == NULL) { php_error(E_WARNING, "No file-path specified"); free_url(resource); *issock = BAD_URL; return NULL; } /* use port 21 if one wasn't specified */ if (resource->port == 0) resource->port = 21; *socketd = php_hostconnect(resource->host, resource->port, SOCK_STREAM, 0); if (*socketd == -1) goto errexit; #if 0 if ((fpc = fdopen(*socketd, "r+")) == NULL) { free_url(resource); return NULL; } #ifdef HAVE_SETVBUF if ((setvbuf(fpc, NULL, _IONBF, 0)) != 0) { free_url(resource); fclose(fpc); return NULL; } #endif #endif /* Start talking to ftp server */ result = php_get_ftp_result(*socketd); if (result > 299 || result < 200) goto errexit; /* send the user name */ SOCK_WRITE("USER ", *socketd); if (resource->user != NULL) { php_raw_url_decode(resource->user, strlen(resource->user)); SOCK_WRITE(resource->user, *socketd); } else { SOCK_WRITE("anonymous", *socketd); } SOCK_WRITE("\r\n", *socketd); /* get the response */ result = php_get_ftp_result(*socketd); /* if a password is required, send it */ if (result >= 300 && result <= 399) { SOCK_WRITE("PASS ", *socketd); if (resource->pass != NULL) { php_raw_url_decode(resource->pass, strlen(resource->pass)); SOCK_WRITE(resource->pass, *socketd); } else { /* if the user has configured who they are, send that as the password */ if (cfg_get_string("from", &scratch) == SUCCESS) { SOCK_WRITE(scratch, *socketd); } else { SOCK_WRITE("anonymous", *socketd); } } SOCK_WRITE("\r\n", *socketd); /* read the response */ result = php_get_ftp_result(*socketd); } if (result > 299 || result < 200) goto errexit; /* set the connection to be binary */ SOCK_WRITE("TYPE I\r\n", *socketd); result = php_get_ftp_result(*socketd); if (result > 299 || result < 200) goto errexit; /* find out the size of the file (verifying it exists) */ SOCK_WRITE("SIZE ", *socketd); SOCK_WRITE(resource->path, *socketd); SOCK_WRITE("\r\n", *socketd); /* read the response */ result = php_get_ftp_result(*socketd); if (mode[0] == 'r') { /* when reading file, it must exist */ if (result > 299 || result < 200) { php_error(E_WARNING, "File not found"); free_url(resource); SOCK_FCLOSE(*socketd); *socketd = 0; errno = ENOENT; return NULL; } } else { /* when writing file, it must NOT exist */ if (result <= 299 && result >= 200) { php_error(E_WARNING, "File already exists"); free_url(resource); SOCK_FCLOSE(*socketd); *socketd = 0; errno = EEXIST; return NULL; } } /* set up the passive connection */ /* We try EPSV first, needed for IPv6 and works on some IPv4 servers */ SOCK_WRITE("EPSV\r\n", *socketd); while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); /* check if we got a 229 response */ if (strncmp(tmp_line, "229", 3)) { /* EPSV failed, let's try PASV */ SOCK_WRITE("PASV\r\n", *socketd); while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); /* make sure we got a 227 response */ if (strncmp(tmp_line, "227", 3)) goto errexit; /* parse pasv command (129,80,95,25,13,221) */ tpath = tmp_line; /* skip over the "227 Some message " part */ for (tpath += 4; *tpath && !isdigit((int) *tpath); tpath++); if (!*tpath) goto errexit; /* skip over the host ip, we just assume it's the same */ for (i = 0; i < 4; i++) { for (; isdigit((int) *tpath); tpath++); if (*tpath != ',') goto errexit; tpath++; } /* pull out the MSB of the port */ portno = (unsigned short) strtol(tpath, &ttpath, 10) * 256; if (ttpath == NULL) { /* didn't get correct response from PASV */ goto errexit; } tpath = ttpath; if (*tpath != ',') goto errexit; tpath++; /* pull out the LSB of the port */ portno += (unsigned short) strtol(tpath, &ttpath, 10); } else { /* parse epsv command (|||6446|) */ for (i = 0, tpath = tmp_line + 4; *tpath; tpath++) { if (*tpath == '|') { i++; if (i == 3) break; } } if (i < 3) goto errexit; /* pull out the port */ portno = (unsigned short) strtol(tpath + 1, &ttpath, 10); } if (ttpath == NULL) { /* didn't get correct response from EPSV/PASV */ goto errexit; } if (mode[0] == 'r') { /* retrieve file */ SOCK_WRITE("RETR ", *socketd); } else { /* store file */ SOCK_WRITE("STOR ", *socketd); } if (resource->path != NULL) { SOCK_WRITE(resource->path, *socketd); } else { SOCK_WRITE("/", *socketd); } /* close control connection */ SOCK_WRITE("\r\nQUIT\r\n", *socketd); SOCK_FCLOSE(*socketd); /* open the data channel */ *socketd = php_hostconnect(resource->host, portno, SOCK_STREAM, 0); if (*socketd == -1) goto errexit; #if 0 if (mode[0] == 'r') { if ((fp = fdopen(*socketd, "r+")) == NULL) { free_url(resource); return NULL; } } else { if ((fp = fdopen(*socketd, "w+")) == NULL) { free_url(resource); return NULL; } } #ifdef HAVE_SETVBUF if ((setvbuf(fp, NULL, _IONBF, 0)) != 0) { free_url(resource); fclose(fp); return NULL; } #endif #endif free_url(resource); *issock = 1; return (fp); errexit: free_url(resource); SOCK_FCLOSE(*socketd); *socketd = 0; return NULL; }
int main() { /* toggle_bit */ ok(7 == toggle_bit(0b0101, 1)); ok(0b0100 == toggle_bit(0b0101, 0)); ok(0b0111 == toggle_bit(0b1111, 3)); /* split_url */ { char *name, *suffix; name = malloc(256*sizeof(char)); ok(0 == split_url(&name, &suffix, "github.com")); ok(0 == strcmp(name, "github")); ok(0 == strcmp(suffix, "com")); ok(0 != split_url(&name, &suffix, "www.github.com")); free(name); } /* is_valid_str */ ok(is_valid_str("github", 6)); ok(!is_valid_str("github.com", 10)); ok(is_valid_str("g1thub", 6)); /* bitsquat_char */ { char c = 'a'; ok('a' != bitsquat_char(c)); } /* random_loc */ { size_t loc = random_loc("github"); ok(loc > 0 && loc < 6); } /* create_url */ { struct Url m_url; m_url = create_url("github.com"); ok(0 == strcmp(m_url.name, "github")); ok(0 == strcmp(m_url.suffix, "com")); free_url(m_url); } /* generate_entries and bitsquat_entries */ { struct BSentries bs_entries; struct Url url = create_url("github.com"); bs_entries = generate_entries(url, 3); ok(3 == bs_entries.n_names); ok(0 == strcmp(bs_entries.suffix, "com")); ok(0 == strcmp(bs_entries.names[0], "github")); bitsquat_entries(bs_entries); ok(0 != strcmp(bs_entries.names[0], "github")); free_url(url); free_bs_entries(bs_entries); } return 0; }