|
|
| version 1.1, 2010/03/02 15:10:19 | version 1.1.2.1, 2010/03/02 15:10:19 |
|---|---|
| Line 0 | Line 1 |
| /************************************************************************* | |
| * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com> | |
| * by Michael Pounov <misho@openbsd-bg.org> | |
| * | |
| * $Author$ | |
| * $Id$ | |
| * | |
| *************************************************************************/ | |
| #include "global.h" | |
| /* | |
| * ioURLGet() Parse and get data from input URL | |
| * @csURL = Input URL line | |
| * @url = Output parsed URL | |
| * return: 0 error format not find tech:// and return URL like path; | |
| -1 error:: can`t read; >0 ok, up bits for known elements | |
| */ | |
| int ioURLGet(const char *csURL, struct tagIOURL *url) | |
| { | |
| char *pos, *at, *cl, *sl; | |
| int ret = 0; | |
| if (!url) | |
| return -1; | |
| else | |
| memset(url, 0, sizeof(*url)); | |
| strlcpy((char*) url->url_line, csURL, BUFSIZ); | |
| // Tech | |
| if (!(pos = strstr((char*) url->url_line, "://"))) { | |
| url->url_path.vallen = strlen((char*) url->url_line); | |
| url->url_path.value = (char*) url->url_line; | |
| return ret; | |
| } else { | |
| url->url_tech.value = (char*) url->url_line; | |
| url->url_tech.vallen = pos - (char*) url->url_line; | |
| if (url->url_tech.vallen) | |
| ret |= 1; | |
| *pos = 0; | |
| pos += 3; | |
| } | |
| // User | |
| if ((at = strchr(pos, '@'))) { | |
| *at++ = 0; | |
| // Pass | |
| if ((cl = strchr(pos, ':'))) { | |
| *cl++ = 0; | |
| url->url_pass.value = cl; | |
| url->url_pass.vallen = at - cl - 1; | |
| if (url->url_pass.vallen) | |
| ret |= 4; | |
| } else | |
| cl = at; | |
| url->url_user.value = pos; | |
| url->url_user.vallen = cl - pos - 1; | |
| if (url->url_user.vallen) | |
| ret |= 2; | |
| pos = at; | |
| } | |
| // Host | |
| if ((sl = strchr(pos, '/'))) | |
| *sl++ = 0; | |
| else | |
| sl = pos + strlen(pos) + 1; | |
| // Port | |
| if ((cl = strchr(pos, ':'))) { | |
| *cl++ = 0; | |
| url->url_port.value = cl; | |
| url->url_port.vallen = sl - cl - 1; | |
| if (url->url_port.vallen) | |
| ret |= 16; | |
| } else | |
| cl = sl; | |
| url->url_host.value = pos; | |
| url->url_host.vallen = cl - pos - 1; | |
| if (url->url_host.vallen) | |
| ret |= 8; | |
| pos = sl; | |
| // Args | |
| if ((at = strchr(pos, '?'))) { | |
| *at++ = 0; | |
| url->url_args.value = at; | |
| url->url_args.vallen = strlen(at); | |
| if (url->url_args.vallen) | |
| ret |= 64; | |
| } else | |
| at = pos + strlen(pos) + 1; | |
| // Path | |
| url->url_path.value = pos; | |
| url->url_path.vallen = at - pos - 1; | |
| if (url->url_path.vallen) | |
| ret |= 32; | |
| pos = at + strlen(at); | |
| // Reserved | |
| url->url_reserved = pos; | |
| if (*pos) | |
| ret |= 128; | |
| return ret; | |
| } |