/* IRCfs - IRC FileServ for *nix. * Copyright (C) 2002 Nick 'Zaf' Clifford * For licensing details, refer to the LICENSE file in the source * code directory. */ #include "runtime.h" #include "module.h" #include "timeutil.h" #include "socket.h" #include "select.h" #include "circbuf.h" #include "server.h" #include "file.h" #include "appconf/appconf.h" #include #include "crash.h" DEBUG main_debug; int getdata(struct socket *s, enum socket_event_type event, void *d) { static char buf[20],ip[20]; int r; while(1) { r = socket_readline(s,buf,20); if (r == -1 || (r == 0 && socket_get_error(s) == socket_err_closed)) { socket_destroy(s); return 0; } if (r == 0) { debug(main_debug,"socket_readline returned 0"); return 0; } buf[r]=0; socket_get_remote_addr(s,ip,20); debug(main_debug,"[%s:%d] got: '%s'\n", ip,socket_get_remote_port(s),buf); socket_write_str(s,"You said: "); socket_write(s,buf,r); } return 0; } int answer(struct socket *s, enum socket_event_type event, void *d) { struct socket *ns; char buf[20]; debug(main_debug,"Hello"); ns = socket_accept(s); if (ns != NULL) { socket_get_remote_addr(ns,buf,20); debug(main_debug,"New connection from %s:%d", buf,socket_get_remote_port(ns)); } socket_set_callback(ns,socket_event_read,getdata,NULL); socket_set_buffer_size(ns,1024); return 0; } void test_socket() { struct socket *s; s = socket_create(socket_type_tcp); assert(s != NULL); socket_set_local_port(s,6666); socket_set_callback(s,socket_event_connect,answer,NULL); if (socket_bind(s) == -1) { return; } socket_listen(s); while (1) { debug(main_debug,"loop"); if (select_wait(NULL) == -1) break; } } int test_circbuf() { struct circbuf *cb; char buffer[20]; int r; int size=20; cb = circbuf_create(NULL,size); if (cb == NULL) { debug(main_debug,"create failed"); return -1; } debug(main_debug,"created buffer: %d",size); if (circbuf_size(cb) != size || circbuf_bytes(cb) != 0 || circbuf_remaining(cb) != size) { debug(main_debug,"Error size: %d bytes: %d remain: %d", circbuf_size(cb), circbuf_bytes(cb), circbuf_remaining(cb)); return -1; } circbuf_add(cb,"TestBlah\n",9); debug(main_debug,"Added 'TestBlah\\n'"); if (circbuf_size(cb) != size || circbuf_bytes(cb) != 9 || circbuf_remaining(cb) != size-9) { debug(main_debug,"Error size: %d bytes: %d remain: %d", circbuf_size(cb), circbuf_bytes(cb), circbuf_remaining(cb)); return -1; } circbuf_add(cb,"Boo\n",4); debug(main_debug,"Added 'Boo\\n'"); if (circbuf_size(cb) != size || circbuf_bytes(cb) != 13 || circbuf_remaining(cb) != size-13) { debug(main_debug,"Error size: %d bytes: %d remain: %d", circbuf_size(cb), circbuf_bytes(cb), circbuf_remaining(cb)); return -1; } r=circbuf_get_till(cb,buffer,20,'\n'); debug(main_debug,"get_till_ch(20): %d",r); if (r == -1) { debug(main_debug,"Error"); return -1; } buffer[r] = 0; if (strcmp(buffer,"TestBlah\n") != 0) { debug(main_debug,"Error buffer=%s",buffer); return -1; } debug(main_debug,"ok size: %d bytes: %d remain: %d", circbuf_size(cb), circbuf_bytes(cb), circbuf_remaining(cb)); circbuf_add(cb,"GoogleBlah\n",11); debug(main_debug,"Added 'GoogleBlah\\n'(%d)",strlen("GoogleBlah\n")); if (circbuf_size(cb) != size || circbuf_bytes(cb) != 15 || circbuf_remaining(cb) != size-15) { debug(main_debug,"Error size: %d bytes: %d remain: %d", circbuf_size(cb), circbuf_bytes(cb), circbuf_remaining(cb)); return -1; } r=circbuf_get_till(cb,buffer,20,'\n'); debug(main_debug,"get_till_ch(20): %d",r); if (r == -1) { debug(main_debug,"Error"); return -1; } buffer[r] = 0; if (strcasecmp(buffer,"Boo\n") != 0) { debug(main_debug,"Error buffer=%s",buffer); return -1; } r=circbuf_get(cb,buffer,20); debug(main_debug,"get(20): %d",r); if (r == -1) { debug(main_debug,"Error"); return -1; } buffer[r] = 0; if (r != 11) { debug(main_debug,"Error buffer=%s",buffer); return -1; } if (strcasecmp(buffer,"GoogleBlah\n") != 0) { debug(main_debug,"Error buffer=%s",buffer); return -1; } return 0; } int test_console() { while (1) { //debug(main_debug,"loop"); if (select_wait(NULL) == -1) break; } error(main_debug,"select_wait returned -1"); return 0; } int print_dir_entry(struct dir *dir, const char *name, void *d) { debug(main_debug,"%s",name); return 0; } int test_file() { struct dir_handler *dh; struct file_handler *fh; struct dir *d; struct dir *nd; struct file *f; char buffer[20],*str; int r; dh = find_dir_handler("ufs"); if (dh == NULL) { debug(main_debug,"Can't find ufs dirhandlers"); return -1; } fh = find_file_handler("ufs"); if (fh == NULL) { debug(main_debug,"Can't find ufs file handlers"); return -1; } str = "/../home/zaf/./././"; debug(main_debug,"Opening NULL,%s",str); d = dh->open(NULL,str); if (d == NULL) { debug(main_debug,"Failed to open dir"); return -1; } str = "src/"; debug(main_debug,"Opening d,%s",str); nd = dh->open(d,str); if (nd == NULL) { debug(main_debug,"Failed to open dir"); return -1; } dh->close(d); str = ".."; debug(main_debug,"Opening d,%s",str); d = dh->open(nd,str); if (d == NULL) { debug(main_debug,"Failed to open dir"); return -1; } dh->close(nd); nd = d; str = ".."; debug(main_debug,"Opening d,%s",str); d = dh->open(nd,str); if (d == NULL) { debug(main_debug,"Failed to open dir"); return -1; } dh->close(nd); nd = d; str = "src/../src/../src/ircfs2/../"; debug(main_debug,"Opening d,%s",str); d = dh->open(nd,str); if (d == NULL) { debug(main_debug,"Failed to open dir"); return -1; } dh->close(nd); nd = d; //dh->list_files(nd,print_dir_entry,NULL); //dh->list_dirs(nd,print_dir_entry,NULL); f = fh->create(nd,"test.txt",file_flag_readwrite); if (f == NULL) { debug(main_debug,"Failed to open file"); return -1; } r = fh->write(f,"testing\n",8); if (r == -1) { debug(main_debug,"Write failed"); return -1; } fh->lseek(f,SEEK_SET,0); r = fh->read(f,buffer,19); if (r == -1) { debug(main_debug,"Failed to read file"); return -1; } buffer[r] = 0; debug(main_debug,"Read: %s",buffer); fh->close(f); dh->close(nd); return 0; } int main(int argc, char *argv[]) { struct timeval tv; setup_core_dump(); signal_setup(); gettimeofday(&tv,NULL); srand(tv.tv_usec + tv.tv_sec); load_modules(); main_debug = debug_register("main"); //test_socket(); // //test_circbuf(); test_console(); //test_file(); unload_modules(); return 0; }