summaryrefslogtreecommitdiff
path: root/uricut.c
diff options
context:
space:
mode:
authorepoch <epoch@hacking.allowed.org>2019-04-20 05:32:27 -0500
committerepoch <epoch@hacking.allowed.org>2019-04-20 05:32:27 -0500
commit6f402e2d2f052972886712f60d592684c8671982 (patch)
tree47a09324bd3c5e577ec5b7059bd6c8834bead115 /uricut.c
parentd42135919f480c8bba4ca1f043fbabf44dac708f (diff)
downloaduritools-6f402e2d2f052972886712f60d592684c8671982.tar.gz
uritools-6f402e2d2f052972886712f60d592684c8671982.zip
rebased on an old copy of this repo. renamed everything. rewrote the uri parser. added uricmp. wew.
Diffstat (limited to 'uricut.c')
-rw-r--r--uricut.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/uricut.c b/uricut.c
new file mode 100644
index 0000000..5fe8764
--- /dev/null
+++ b/uricut.c
@@ -0,0 +1,158 @@
+#include "uri.h"
+
+#include <netdb.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+/*
+ schemes are case sensitive but cononicals are lower case.
+ domain is case insensitive. return it lowercased?
+ port is optional and in decimal
+ path
+ scheme://username:password@domain:port/path?query_string#fragment_id
+ mailto:username@domain
+
+ optional stuff:
+ scheme, username, password, port, path, query_string, fragment_id
+*/
+
+#define AorB(a,b) ((a)?(a):(b))
+
+#define F_SCHEME 1<<0
+#define F_USERNAME 1<<1
+#define F_PASSWORD 1<<2
+#define F_DOMAIN 1<<3
+#define F_PORT 1<<4
+#define F_PATH 1<<5
+#define F_QUERY_STRING 1<<6
+#define F_FRAGMENT_ID 1<<7
+#define F_WHOLE_URI 1<<8
+
+char *long_opts[]={"scheme","username","password","domain","port","path","query_string","fragment_id","URI",0};
+char *short_opts[]={"s","u","k","d","P","p","q","f","U"};
+
+int main(int argc,char *argv[]) {
+ char *uri;
+ char *line=0;
+ short args[256];//this needs to be a short to make room for the F_WHOLE_URI
+ int i,j,c=0;
+ int size=1024;
+ char fixme=0;
+ char using_stdin=1;
+ char malloced=0;
+ struct uri u;
+ if(argc > 1) {
+ if(!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h")) {
+ printf("usage: echo uris | uricut [options]\n");
+ printf("usage: uricut [options] uri [options] [uri]\n\n");
+ printf("options: \n");
+ for(i=0;long_opts[i];i++) {
+ printf(" -%s|--%s\n",short_opts[i],long_opts[i]);
+ }
+ printf("To set default values use environment variables like: CUTURI_[OPTION]\n");
+ return 2;
+ }
+ }
+ argv++;
+ argc--;
+ while(1) {
+ u.scheme=0;
+ u.username=0;
+ u.password=0;
+ u.domain=0;
+ u.port=0;
+ u.path=0;
+ u.query_string=0;
+ u.fragment_id=0;
+ if(!using_stdin) c=0;
+ if(argc >= 1) {
+ for(;argc>0;argc--,argv++) {
+ for(i=0;long_opts[i];i++) {
+ if(!strncmp(*argv,"--",2)) {
+ if(!strcmp(*argv+2,long_opts[i])) {
+ args[c]=1<<i;
+ c++;
+ break;
+ }
+ }
+ }
+ fixme=0;
+ if(**argv=='-' && argv[0][1] != '-') {
+ for(j=1;argv[0][j];j++) {
+ for(i=0;short_opts[i];i++) {
+ if(argv[0][j]==*short_opts[i]) {
+ args[c]=1<<i;
+ c++;
+ fixme=1;
+ }
+ }
+ }
+ }
+ if(fixme) continue;
+ if(long_opts[i]) continue;
+ //if we get here we are at data instead of flags. work on it.
+ line=*argv;
+ using_stdin=0;
+ argc--;
+ argv++;
+ break;
+ }
+ }
+ if(!argc && !line) {//if we are out of arguments and it didn't include data
+ using_stdin=1;
+ }
+ if(using_stdin) {
+ line=malloc(size+1);
+ malloced=1;
+ if(!fgets(line,size,stdin)) {
+ return 0;
+ }
+ }
+ if(!line) return 0;
+ for(i=0;line[i] && line[i] != '\n' && line[i] != '\r';i++);
+ line[i]=0;
+
+ uri=strdup(line);
+ urifromline(&u,line);
+
+ // printf("scheme://username:password@domain:port/path?query_string#fragment_id\n\n");
+ //let's set them to what'll get printed now...
+
+ if(c) {
+ for(i=0;i<c;i++) {
+ if(args[i]&F_SCHEME) printf("%s\n",AorB(u.scheme,""));
+ if(args[i]&F_USERNAME) printf("%s\n",AorB(u.username,""));
+ if(args[i]&F_PASSWORD) printf("%s\n",AorB(u.password,""));
+ if(args[i]&F_DOMAIN) printf("%s\n",AorB(u.domain,""));
+ if(args[i]&F_PORT) printf("%s\n",AorB(u.port,""));
+ if(args[i]&F_PATH) printf("%s\n",AorB(u.path,""));
+ if(args[i]&F_QUERY_STRING) printf("%s\n",AorB(u.query_string,""));
+ if(args[i]&F_FRAGMENT_ID) printf("%s\n",AorB(u.fragment_id,""));
+ if(args[i]&F_WHOLE_URI) printf("%s\n",uri);
+ }
+ } else {
+ printf("scheme: %s\n",u.scheme);
+ printf("username: %s\n",u.username);
+ printf("password: %s\n",u.password);
+ printf("domain: %s\n",u.domain);
+ printf("port: %s\n",u.port);
+ printf("path: %s\n",u.path);
+ printf("query_string: %s\n",u.query_string);
+ printf("fragment_id: %s\n",u.fragment_id);
+ printf("whole_uri: %s\n",uri);
+ }
+ free(uri);//this is definitely malloc()d
+ if(malloced) {
+ free(line);
+ malloced=0;
+ line=0;
+ } else {
+ line=0;//???
+ }
+ }
+ return 0;
+}