summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/clump.c8
-rw-r--r--src/bin/cuturl.c95
-rw-r--r--src/bin/dcchelper.c22
-rw-r--r--src/bin/filemon.c155
-rw-r--r--src/bin/ipconvert.c6
-rw-r--r--src/bin/normalpath.c4
-rw-r--r--src/bin/urcdump.c30
-rw-r--r--src/libexec/httpd.c16
8 files changed, 184 insertions, 152 deletions
diff --git a/src/bin/clump.c b/src/bin/clump.c
index 18c8e5b..ec06d17 100644
--- a/src/bin/clump.c
+++ b/src/bin/clump.c
@@ -8,17 +8,19 @@
//printf "a a\na b\na c\nb a\nb b\nc a\nc b\n" | clump
//still working on the name.
-int main() {
+int main(int argc,char *argv[]) {
char line[256];
char *id;
+ char sep=' ';
char *value;
char *oldid=malloc(1);
*oldid=0;
+ if(argc > 1) sep=argv[1][0];
while(fgets(line,sizeof(line),stdin)) {
id=line;
if(strchr(line,'\n')) *strchr(line,'\n')=0;
- if(strchr(id,' ')) {
- value=strchr(id,' ');
+ if(strchr(id,sep)) {
+ value=strchr(id,sep);
*value=0;
value++;
}
diff --git a/src/bin/cuturl.c b/src/bin/cuturl.c
index d706fd3..40b7766 100644
--- a/src/bin/cuturl.c
+++ b/src/bin/cuturl.c
@@ -2,9 +2,10 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+
/*
schemes are case sensitive but cononicals are lower case.
- domain is case insensitive. return it lowercased.
+ domain is case insensitive. return it lowercased?
port is optional and in decimal
path
scheme://username:password@domain:port/path?query_string#fragment_id
@@ -14,23 +15,6 @@
scheme, username, password, port, path, query_string, fragment_id
*/
-/*
-#define DEFAULT_SCHEME "http"
-#define DEFAULT_USERNAME "anonymous"
-#define DEFAULT_PASSWORD "anonymous"
-#define DEFAULT_PORT "80"
-#define DEFAULT_QUERY_STRING ""
-#define DEFAULT_FRAGMENT_ID ""
-
-#define DEFAULT_SCHEME "DEFAULT"
-#define DEFAULT_USERNAME "DEFAULT"
-#define DEFAULT_PASSWORD "DEFAULT"
-#define DEFAULT_PORT "DEFAULT"
-#define DEFAULT_PATH "DEFAULT"
-#define DEFAULT_QUERY_STRING "DEFAULT"
-#define DEFAULT_FRAGMENT_ID "DEFAULT"
-*/
-
#define AorB(a,b) ((a)?(a):(b))
#define F_SCHEME 1<<0
@@ -46,7 +30,7 @@ char *long_opts[]={"scheme","username","password","domain","port","path","query_
char *short_opts[]={"s","u","k","d","P","p","q","f"};
int main(int argc,char *argv[]) {
- char *line;
+ char *line=0;
char *scheme=0;
char *username=0;
char *password=0;
@@ -56,11 +40,11 @@ int main(int argc,char *argv[]) {
char *query_string=0;
char *fragment_id=0;
char sport[10];
+ char args[256];
struct servent *serv;
- //exactly 8 parts! let's store that in a byte.
- unsigned char flags=0;
- int i;
+ int i,j,c=0;
int size=1024;
+ char fixme=0;
char using_stdin=1;
char malloced=0;
if(argc > 1) {
@@ -74,6 +58,8 @@ int main(int argc,char *argv[]) {
printf("To set default values use environment variables like: CUTURL_[OPTION]\n");
return 2;
}
+ argc--;
+ argv++;
}
while(1) {
scheme=0;
@@ -84,24 +70,33 @@ int main(int argc,char *argv[]) {
path=0;
query_string=0;
fragment_id=0;
- if(!using_stdin) flags=0;
- if(argc > 1) {
- for(argc--,argv++;argc>0;argc--,argv++) {
+ 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])) {
- flags|=(1<<i);
+ args[c]=1<<i;
+ c++;
break;
}
}
- else if(**argv=='-') {
- if(*(*argv+1)==*short_opts[i]) {
- flags|=(1<<i);
- 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--;
@@ -109,6 +104,9 @@ int main(int argc,char *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;
@@ -120,6 +118,9 @@ int main(int argc,char *argv[]) {
for(i=0;line[i] && line[i] != '\n' && line[i] != '\r';i++);
line[i]=0;
+/// end of interface logic
+/// beginning of business logic
+
//split at first single / into line and path
for(i=0;line[i];i++) {
if(line[i] == '/' && line[i+1] == '/') {
@@ -198,7 +199,7 @@ int main(int argc,char *argv[]) {
}
}
- if(domain) {
+ if(domain) {//for magnet links.
if(strchr(domain,'?')) {
query_string=strchr(domain,'?');
*query_string=0;
@@ -218,11 +219,7 @@ int main(int argc,char *argv[]) {
password=0;
}
-// before deciding to also handle magnets
-// if(!domain) {
-// fprintf(stderr,"how the fuck is this supposed to be a URL?\n");
-// return 1;
-// }
+/// end of business logic
// printf("scheme://username:password@domain:port/path?query_string#fragment_id\n\n");
//let's set them to what'll get printed now...
@@ -234,22 +231,21 @@ int main(int argc,char *argv[]) {
serv=getservbyname(scheme,strcmp(scheme,"udp")?"tcp":"udp");
if(serv) snprintf(sport,sizeof(sport)-1,"%d",ntohs(serv->s_port));
port=AorB(port,AorB(getenv("CUTURL_PORT"),(serv?sport:"DEFAULT")));
- //port=AorB(port,AorB(getenv("CUTURL_PORT"),"DEFAULT"));
-
-
path=AorB(path,AorB(getenv("CUTURL_PATH"),"DEFAULT"));
query_string=AorB(query_string,AorB(getenv("CUTURL_QUERY_STRING"),"DEFAULT"));
fragment_id=AorB(fragment_id,AorB(getenv("CUTURL_FRAGMENT_ID"),"DEFAULT"));
- if(flags) {
- if(flags&F_SCHEME) printf("%s\n",scheme);
- if(flags&F_USERNAME) printf("%s\n",username);
- if(flags&F_PASSWORD) printf("%s\n",password);
- if(flags&F_DOMAIN) printf("%s\n",domain);
- if(flags&F_PORT) printf("%s\n",port);
- if(flags&F_PATH) printf("%s\n",path);
- if(flags&F_QUERY_STRING) printf("%s\n",query_string);
- if(flags&F_FRAGMENT_ID) printf("%s\n",fragment_id);
+ if(c) {
+ for(i=0;i<c;i++) {
+ if(args[i]&F_SCHEME) printf("%s\n",scheme);
+ if(args[i]&F_USERNAME) printf("%s\n",username);
+ if(args[i]&F_PASSWORD) printf("%s\n",password);
+ if(args[i]&F_DOMAIN) printf("%s\n",domain);
+ if(args[i]&F_PORT) printf("%s\n",port);
+ if(args[i]&F_PATH) printf("%s\n",path);
+ if(args[i]&F_QUERY_STRING) printf("%s\n",query_string);
+ if(args[i]&F_FRAGMENT_ID) printf("%s\n",fragment_id);
+ }
} else {
printf("scheme: %s\n",scheme);
printf("username: %s\n",username);
@@ -263,8 +259,9 @@ int main(int argc,char *argv[]) {
if(malloced) {
free(line);
malloced=0;
- } else {
line=0;
+ } else {
+ line=0;//???
}
}
return 0;
diff --git a/src/bin/dcchelper.c b/src/bin/dcchelper.c
deleted file mode 100644
index 50009aa..0000000
--- a/src/bin/dcchelper.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-int main(int argc,char *argv[]) {
- char *wanip;
- if(argc < 2) {
- return printf("usage: %s [IP]\n",argv[0]);
- }
- if(!strncmp(argv[1],"127.",4)) {
- wanip="127.0.0.1";
- }
- else if(!strncmp(argv[1],"1.",2)) {
- wanip="1.41.41.1";
- }
- else if(!strncmp(argv[1],"192.168.0.",10)) {
- wanip="192.168.0.2";
- } else {
- wanip="98.159.69.172";
- }
- return printf("%u\n",htonl(inet_addr(wanip)));
-}
diff --git a/src/bin/filemon.c b/src/bin/filemon.c
index 6930673..2f0af24 100644
--- a/src/bin/filemon.c
+++ b/src/bin/filemon.c
@@ -1,72 +1,93 @@
//ripped from the netbsd man page for kqueue
//and modified very slightly.
//I'll add some more stuff as I find a use for it.
- #include <sys/types.h>
- #include <sys/event.h>
- #include <sys/time.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <err.h>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <err.h>
- int
- main(int argc, char *argv[])
- {
- int fd, kq, nev;
- struct kevent ev;
- static const struct timespec tout = { 1, 0 };
+int main(int argc, char *argv[]) {
+ if(argc < 2) {
+ printf("usage: filemon file [prog]");
+ return 1;
+ }
+ monitor(argv[1],argv[2]);
+}
- if ((fd = open(argv[1], O_RDONLY)) == -1)
- err(1, "Cannot open `%s'", argv[1]);
-
- if ((kq = kqueue()) == -1)
- err(1, "Cannot create kqueue");
-
- EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
- NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|
- NOTE_RENAME|NOTE_REVOKE, 0, 0);
- if (kevent(kq, &ev, 1, NULL, 0, &tout) == -1)
- err(1, "kevent");
- for (;;) {
- nev = kevent(kq, NULL, 0, &ev, 1, &tout);
- if (nev == -1)
- err(1, "kevent");
- if (nev == 0)
- continue;
- if (ev.fflags & (NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|NOTE_RENAME|NOTE_REVOKE)) {
- printf("%s: ",argv[1]);
- }
- if (ev.fflags & NOTE_DELETE) {
- printf("deleted ");
- ev.fflags &= ~NOTE_DELETE;
- }
- if (ev.fflags & NOTE_WRITE) {
- printf("written ");
- ev.fflags &= ~NOTE_WRITE;
- }
- if (ev.fflags & NOTE_EXTEND) {
- printf("extended ");
- ev.fflags &= ~NOTE_EXTEND;
- }
- if (ev.fflags & NOTE_ATTRIB) {
- printf("chmod/chown/utimes ");
- ev.fflags &= ~NOTE_ATTRIB;
- }
- if (ev.fflags & NOTE_LINK) {
- printf("hardlinked ");
- ev.fflags &= ~NOTE_LINK;
- }
- if (ev.fflags & NOTE_RENAME) {
- printf("renamed ");
- ev.fflags &= ~NOTE_RENAME;
- }
- if (ev.fflags & NOTE_REVOKE) {
- printf("revoked ");
- ev.fflags &= ~NOTE_REVOKE;
- }
- printf("\n");
- if (ev.fflags)
- warnx("unknown event 0x%x\n", ev.fflags);
- }
- }
+int monitor(char *file,char *handler) {
+ int fd, kq, nev;
+ struct kevent ev;
+ struct stat sb;
+ char buffer[
+ static const struct timespec tout = { 1, 0 };
+ if ((fd = open(file, O_RDONLY)) == -1) err(1, "Cannot open `%s'", argv[1]);
+ fstat(fd,&sb);
+ if(S_ISDIR(sb.st_mode)) {
+ //read list of files from dir?
+ //rerun self on all files in that dir.
+ //system("filemon file/*"); //XD
+ getdents(fd,,);
+ }
+ if ((kq = kqueue()) == -1) err(1, "Cannot create kqueue");
+ EV_SET(&ev,
+ fd,
+ EVFILT_VNODE,
+ EV_ADD | EV_ENABLE | EV_CLEAR,
+ NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|NOTE_RENAME|NOTE_REVOKE,
+ 0,
+ 0);
+ if (kevent(kq, &ev, 1, NULL, 0, &tout) == -1) err(1, "kevent");
+ for (;;) {
+ nev = kevent(kq, NULL, 0, &ev, 1, &tout);
+ if (nev == -1) err(1, "kevent");
+ if (nev == 0) continue;
+ printf("nev:%x\n",nev);//probably fd that triggered event?
+ printf("ev.ident:%x\n",ev.ident);
+ printf("ev.filter:%x\n",ev.filter);
+ printf("ev.flags:%x\n",ev.flags);
+ printf("ev.fflags:%x\n",ev.fflags);
+ printf("ev.data:%x\n",ev.data);
+ printf("ev.udata:%x\n",ev.udata);
+ if (ev.fflags & (NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|NOTE_RENAME|NOTE_REVOKE)) {
+ printf("%s: ",file);
+ if(argv[2]) system(handler);
+ }
+ if (ev.fflags & NOTE_DELETE) {
+ printf("deleted ");
+ ev.fflags &= ~NOTE_DELETE;
+ }
+ if (ev.fflags & NOTE_WRITE) {
+ printf("written ");
+ ev.fflags &= ~NOTE_WRITE;
+ }
+ if (ev.fflags & NOTE_EXTEND) {
+ printf("extended ");
+ ev.fflags &= ~NOTE_EXTEND;
+ }
+ if (ev.fflags & NOTE_ATTRIB) {
+ printf("chmod/chown/utimes ");
+ ev.fflags &= ~NOTE_ATTRIB;
+ }
+ if (ev.fflags & NOTE_LINK) {
+ printf("hardlinked ");
+ ev.fflags &= ~NOTE_LINK;
+ }
+ if (ev.fflags & NOTE_RENAME) {
+ printf("renamed ");
+ ev.fflags &= ~NOTE_RENAME;
+ }
+ if (ev.fflags & NOTE_REVOKE) {
+ printf("revoked ");
+ ev.fflags &= ~NOTE_REVOKE;
+ }
+ printf("\n");
+ if (ev.fflags) {
+ warnx("unknown event 0x%x\n", ev.fflags);
+ }
+ }
+ return 0;
+}
diff --git a/src/bin/ipconvert.c b/src/bin/ipconvert.c
index d106d13..0390aff 100644
--- a/src/bin/ipconvert.c
+++ b/src/bin/ipconvert.c
@@ -3,8 +3,8 @@
int main(int argc,char *argv[]) {
int addr=inet_addr(argv[1]);
- printf("%x\n",htonl(addr));
- printf("%u\n",htonl(addr));
- printf("%u.%u.%u.%u\n",addr&255,addr>>8&255,addr>>16&255,addr>>24&255);
+ printf("hex: %x\n",htonl(addr));
+ printf("dec: %u\n",htonl(addr));
+ printf("dotted-quad: %u.%u.%u.%u\n",addr&255,addr>>8&255,addr>>16&255,addr>>24&255);
return 0;
}
diff --git a/src/bin/normalpath.c b/src/bin/normalpath.c
index 2ea916f..a80ecda 100644
--- a/src/bin/normalpath.c
+++ b/src/bin/normalpath.c
@@ -18,7 +18,9 @@ int main(int argc,char *argv[]) {
strcpy(out,(char *)getenv("HOME"));
break;
default:
- getcwd(out,MAXPATHLEN);
+//old code, but might be what I decide I /really/ want.
+// getcwd(out,MAXPATHLEN);
+ if(getenv("PWD")) strcpy(out,getenv("PWD"));
strcat(out,"/");
}
strcat(out,s);
diff --git a/src/bin/urcdump.c b/src/bin/urcdump.c
index 8d19370..0fea8ed 100644
--- a/src/bin/urcdump.c
+++ b/src/bin/urcdump.c
@@ -7,7 +7,8 @@
int main(int argc,char *argv[]) {
int s;
struct sockaddr_in name;
- char *tmp;
+ //char *tmp;
+ int tmp;
char chunk[BS];
int off=0;
char buf[BS];
@@ -25,15 +26,34 @@ int main(int argc,char *argv[]) {
if(connect(s,(struct sockaddr *)&name,len) == -1) return -1;
while((len=read(s,buf,BS-1)) > 0) {
- memcpy(chunk+off,buf,len);
- off+=len;
- if(off > 26) {
+ for(tmp=0;tmp<len;tmp++) {
+ if(isprint(*(buf+tmp))) {
+ write(1,(buf+tmp),1);
+ } else {
+ write(1,"%",1);
+ write(1,"0123456789abcdef"+((buf[tmp])>>4&15),1);
+ write(1,"0123456789abcdef"+((buf[tmp])&15),1);
+ }
+ }
+/*
+ while(off > 26) {
if((tmp=memchr(chunk+26,'\n',off-26))) {
tmp++;
- write(1,chunk+26,tmp-chunk-26);
+//old write(1,chunk+26,tmp-chunk-26);
+//testing:
+ for(len=26;len<tmp-chunk-1;len++) {
+ if(isprint(*(chunk+len))) {
+ write(1,(chunk+len),1);
+ } else {
+ write(1,"%",1);
+ write(1,"0123456789abcdef"+((*chunk+len)>>4 & 15),1);
+ write(1,"0123456789abcdef"+((*chunk+len)&15),1);
+ }
+ }
memmove(chunk,tmp,tmp-chunk+1);
off-=(tmp-chunk);
}
}
+ */
}
}
diff --git a/src/libexec/httpd.c b/src/libexec/httpd.c
index f22e139..c2a5daf 100644
--- a/src/libexec/httpd.c
+++ b/src/libexec/httpd.c
@@ -64,11 +64,21 @@ int main(int argc,char *argv[]) {
struct sockaddr_in6 sa6;
unsigned int sl=sizeof(sa6);
char h[NI_MAXHOST];
+ char p[NI_MAXSERV];
openlog("httpd",LOG_PID,LOG_DAEMON);
+
if(getpeername(0,(struct sockaddr *)&sa6,&sl) == -1)
syslog(LOG_WARNING,"getpeername: %m");
- getnameinfo((struct sockaddr *)&sa6,sl,h,sizeof(h),0,0,NI_NUMERICHOST);
+ getnameinfo((struct sockaddr *)&sa6,sl,h,sizeof(h),p,sizeof(p),NI_NUMERICHOST|NI_NUMERICSERV);
setenv("REMOTE_ADDR",h,1);
+ setenv("REMOTE_PORT",p,1);
+
+ if(getsockname(0,(struct sockaddr *)&sa6,&sl) == -1)
+ syslog(LOG_WARNING,"getsockname: %m");
+ getnameinfo((struct sockaddr *)&sa6,sl,h,sizeof(h),p,sizeof(p),NI_NUMERICHOST|NI_NUMERICSERV);
+ setenv("SERVER_ADDR",h,1);
+ setenv("SERVER_PORT",p,1);
+
if(!strchr(line,'\n')) {
printf("HTTP/1.1 413 Entity Too Large\r\n");
standard_headers();
@@ -116,7 +126,7 @@ int main(int argc,char *argv[]) {
}
alarm(0);//no more timeout.
//
- syslog(LOG_WARNING,"%s: %s %s %s\n",h,getenv("HTTP_USER_AGENT"),page,get_param);
+ syslog(LOG_WARNING,"%s: %s %s %s %s\n",h,getenv("HTTP_HOST"),getenv("HTTP_USER_AGENT"),page,get_param);
//TODO: sanitize this.
if(chdir(VHOST_ROOT) == -1) {
printf("HTTP/1.1 500 Internal Server Error\r\n");
@@ -195,6 +205,8 @@ int main(int argc,char *argv[]) {
printf("HTTP/1.1 200 OK\r\n");
standard_headers();
fflush(stdout);
+ //what was this needed for? breaks ?page=ident if closed.
+ if(!strcmp(method,"GET")) close(STDIN_FILENO);
execv(name[0],name);
}
return 0;