diff --git a/connect.c b/connect.c index a666f76..25a5363 100644 --- a/connect.c +++ b/connect.c @@ -544,7 +544,7 @@ static int build_path( NW_PATH *path, int len, int only_dir) /* - * fills path structur with the right values + * fills path structure with the right values * if only_dir > 0, then the full path will be interpreted * as directory, in the other way, the last segment of path * will be interpreted as fn. @@ -700,6 +700,7 @@ int conn_get_kpl_path(NW_PATH *nwpath, int dirhandle, } else if (dirhandle) lastdirhandle = dirhandle; #endif completition = build_path(nwpath, data, len, only_dir); + XDPRINTF((5, 0, "conn_get_kpl_path %s", conn_get_nwpath_name(nwpath))); if (!completition) completition = build_verz_name(nwpath, dirhandle); return(completition); } @@ -1049,7 +1050,7 @@ int insert_new_dir(NW_PATH *nwpath, int inode, int drive, int is_temp, int task) int freehandle = 0; int timedhandle = 0; - /* first look, wether drive is allready in use */ + /* first look, whether drive is allready in use */ for (j = 0; j < (int)used_dirs; j++) { NW_DIR *d = &(dirs[j]); if (d->inode && !is_temp && !d->is_temp && (int)d->drive == drive) { @@ -1183,9 +1184,9 @@ int nw_open_dir_handle( int dir_handle, completition = 0xff; /* Alle Rechte */ } XDPRINTF((5,0,"NW_OPEN_DIR_2: completition = 0x%x", - (int)completition)); + completition)); } else { - XDPRINTF((4,0,"NW_OPEN_DIR failed: completition = 0x%x", (int)completition)); + XDPRINTF((4,0,"NW_OPEN_DIR failed: completition = -0x%x", -completition)); } return(completition); } @@ -1291,13 +1292,12 @@ static int s_nw_scan_dir_info(int dir_handle, uint8 *subname, uint8 *subdatetime, uint8 *owner, uint8 *wild) { - int volume; - int searchsequence; - int dir_id; - int rights = nw_open_dir_handle(dir_handle, data, len, + int volume; + int searchsequence; + int dir_id; + int rights = nw_open_dir_handle(dir_handle, data, len, &volume, &dir_id, &searchsequence); - if (rights > -1) { DIR_HANDLE *dh = &(dir_handles[dir_id-1]); struct stat stbuff; @@ -1352,18 +1352,20 @@ int nw_scan_dir_info(int dir_handle, uint8 *data, int len, uint8 *subnr, int k = len; uint8 *p = data+len; uint8 dirname[256]; - while (k--) { + while (k) { uint8 c = *--p; if (c == '/' || c == '\\' || c == ':') { p++; - k++; break; } + --k; } if (len && k < len) { strmaxcpy(dirname, p, len-k); len = k; } else dirname[0] = '\0'; + XDPRINTF((7, 0, "nw_scan_dir_info, dirname=`%s`, len=%d, k=%d", + dirname, len , k)); return(s_nw_scan_dir_info(dir_handle, data, len, subnr, subname, subdatetime, owner, dirname)); } diff --git a/examples/config.h b/examples/config.h index c0822a9..48977c8 100644 --- a/examples/config.h +++ b/examples/config.h @@ -1,4 +1,4 @@ -/* config.h: 01-Mar-96 */ +/* config.h: 14-Mar-96 */ /* some of this config is needed by make, others by cc */ #define DO_DEBUG 1 /* Compile in debug code */ #define DO_TESTING 0 @@ -7,10 +7,12 @@ # define FILENAME_NW_INI "./nw.ini" /* full name of ini (conf) file */ # define PATHNAME_PROGS "." /* path location of progs */ # define PATHNAME_BINDERY "." /* path location of bindery */ +# define FUNC_17_02_IS_DEBUG 1 #else # define FILENAME_NW_INI "/etc/nwserv.conf" /* full name of ini (conf) file */ # define PATHNAME_PROGS "/sbin" /* path location of progs */ # define PATHNAME_BINDERY "/etc" /* path location of bindery */ +# define FUNC_17_02_IS_DEBUG 0 #endif #define NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */ diff --git a/makefile.unx b/makefile.unx index a9aaebe..32b0ae4 100644 --- a/makefile.unx +++ b/makefile.unx @@ -1,5 +1,5 @@ #if 0 -#makefile.unx 08-Mar-96 +#makefile.unx 10-Mar-96 #endif VPATH=$(V_VPATH) @@ -9,8 +9,9 @@ C=.c V_H=0 V_L=97 -P_L=0 -#define D_P_L 0 +P_L=1 + +#define D_P_L 1 DISTRIB=mars_nwe #if D_P_L DISTRIBF=$(DISTRIB)-$(V_H).$(V_L).pl$(P_L) @@ -160,20 +161,20 @@ echo "********************************************************"; \ echo ""; \ fi; cd $(OBJDIR) ) -n_clean1: +clean_d: cd $(VPATH) && (\ - find . \( -name .e.pck -o -name '~*' -o -name '*~' -o -name core \) \ + find $(DISTRIB) \( -name .e.pck -o -name '~*' -o -name '*~' -o -name core \) \ -exec rm {} \; \ ; cd $(OBJDIR)) -n_clean: n_clean1 +n_clean: rm -f *.o cd $(VPATH) && (rm -f $(PROGS); cd $(OBJDIR) ) -n_distclean: n_clean +n_distclean: n_clean clean_d cd $(VPATH) && (rm -f *.dir *.pag; cd $(OBJDIR)) -n_make_dir: n_clean1 +make_dir: cd $(VPATH) && (rm -rf $(OBJDIR)/$(VPATH)/$(DISTRIB) \ ; mkdir $(DISTRIB) \ ; mkdir $(DISTRIB)/examples \ @@ -194,7 +195,7 @@ n_make_dir: n_clean1 $(DISTRIB)/doc/. \ ; cd $(OBJDIR) ) -n_diff: n_make_dir +n_diff: make_dir clean_d cd $(VPATH) && ( \ makepatch $(DISTRIB).org $(DISTRIB) > $(PATCHF) \ ; gzip -9 -f $(PATCHF) \ diff --git a/ncpserv.c b/ncpserv.c index 4da2c7c..f48f07d 100644 --- a/ncpserv.c +++ b/ncpserv.c @@ -1,5 +1,5 @@ /* ncpserv.c */ -#define REVISION_DATE "10-Mar-96" +#define REVISION_DATE "14-Mar-96" /* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * This program is free software; you can redistribute it and/or modify @@ -496,6 +496,26 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) } break; +#if FUNC_17_02_IS_DEBUG + case 0x02 : { /* I hope this is call isn't used */ + /* now missused as a debug switch :) */ + struct XDATA { + uint8 nw_debug; /* old level */ + } *xdata = (struct XDATA*) responsedata; + errorp(2, "0x17, ufunc=2", "Got debugchange =%d for module=%d", + (int)*(rdata+1), (int) *rdata); + if (*rdata == NWCONN) + return(-1); /* let nwconn do the call */ + + if (*rdata == NCPSERV) { + xdata->nw_debug = (uint8) nw_debug; + nw_debug = (int) *(rdata+1); + data_len = 1; + } else completition=0xff; + } + break; +#endif + case 0x0c : { /* Verify Serialization */ completition=0xff; } diff --git a/net.h b/net.h index a6863df..cfc7011 100644 --- a/net.h +++ b/net.h @@ -116,6 +116,15 @@ # define DO_DEBUG 1 #endif +#if DO_DEBUG +# ifndef FUNC_17_02_IS_DEBUG +# define FUNC_17_02_IS_DEBUG 0 +# endif +#else +# undef FUNC_17_02_IS_DEBUG +# define FUNC_17_02_IS_DEBUG 0 +#endif + #ifndef MAX_CONNECTIONS # define MAX_CONNECTIONS 5 /* maximum Number of Connections */ #endif diff --git a/nwclient.c b/nwclient.c index 8cc3f5a..b36d68d 100644 --- a/nwclient.c +++ b/nwclient.c @@ -244,8 +244,6 @@ static int do_17_17(void) return(-1); } - - static int get_network_serial_number(void) { uint8 data[] = {0, 1, 0x12}; @@ -317,6 +315,26 @@ static int file_search_cont(DIR_IDS *di, int seq, return(-1); } +static int scan_dir_info(int dirhandle, char *path, int sub_dir) +{ + uint8 *p=requestdata; + uint8 pathlen= (path) ? strlen(path) : 0; + *p++ = 0; + *p++ = pathlen+4; + *p++ = 0x2; + + *p++ = dirhandle; + U16_TO_BE16(sub_dir, p); + p+=2; + *p++ = pathlen; + memcpy(p, path, pathlen); + VDATA(0x16, pathlen+7 , "SCAN DIR INFO"); + if (!handle_event()) { + return((int)GET_BE16(responsedata+26)); + } + return(-1); +} + static int allocate_dir_handle(int dirhandle, int drive, char *path, @@ -601,8 +619,7 @@ static int read_datei(int fh, int offs, int size) } - - +#if 0 static void test1(void) { int dirhandle = allocate_dir_handle(0, 'F', "SYS:PUBLIC", 0); @@ -611,6 +628,21 @@ static void test1(void) scan_irgendwas(dirhandle, 6, "NET$LOG.DAT"); } } +#endif + +static void test1(void) +{ + int dirhandle = allocate_dir_handle(0, 'd', "SYS:", 1); + if (dirhandle > -1) { + int i; + scan_dir_info(dirhandle, "SYSTEM", 1); + scan_dir_info(dirhandle, "SYSTE*", 1); + i = scan_dir_info(dirhandle, "SYSTEM\\*", 1); + while (i > -1) + i = scan_dir_info(dirhandle, "", i+1); + + } +} static void test2(void) { diff --git a/nwconn.c b/nwconn.c index cff5934..5b2401a 100644 --- a/nwconn.c +++ b/nwconn.c @@ -1,4 +1,4 @@ -/* nwconn.c 01-Mar-96 */ +/* nwconn.c 14-Mar-96 */ /* one process / connection */ /* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany @@ -244,9 +244,10 @@ static void handle_ncp_serv() /******** Scan Dir Info ****************/ struct INPUT { uint8 header[7]; /* Requestheader */ - uint8 div[3]; /* 0x0, dlen, typ */ + uint8 div[3]; /* 0x0, dlen, typ */ uint8 dir_handle; /* Verzeichnis Handle */ uint8 sub_dir_nmbr[2]; /* HI LOW */ + /* firsttime 1 */ uint8 len; /* kann auch 0 sein */ uint8 path[2]; } *input = (struct INPUT *) (ncprequest); @@ -635,8 +636,27 @@ static void handle_ncp_serv() #if 1 case 0x17 : { /* FILE SERVER ENVIRONMENT */ /* uint8 len = *(requestdata+1); */ - uint8 ufunc = *(requestdata+2); + uint8 ufunc = *(requestdata+2); + uint8 *rdata = requestdata+3; + switch (ufunc) { + +#if FUNC_17_02_IS_DEBUG + case 0x02 : { + /* I hope this is call isn't used */ + /* now missused as a debug switch :) */ + struct XDATA { + uint8 nw_debug; /* old level */ + } *xdata = (struct XDATA*) responsedata; + if (*rdata == NWCONN) { + xdata->nw_debug = (uint8)org_nw_debug; + nw_debug = org_nw_debug = (int) *(rdata+1); + data_len = 1; + } else completition=0xff; + } + break; +#endif + case 0x14: case 0x18: { /* ncpserv have change the structure */ struct INPUT { @@ -815,6 +835,20 @@ static void handle_ncp_serv() else completition=0xfb; /* request not known */ } break; + case 0x3d : { /* commit file, flush file buffers */ + struct INPUT { + uint8 header[7]; /* Requestheader */ + uint8 reserve; + uint8 ext_fhandle[2]; /* all zero */ + uint8 fhandle[4]; /* filehandle */ + } *input = (struct INPUT *)ncprequest; + uint32 fhandle = GET_BE32(input->fhandle); + XDPRINTF((2,0, "TODO: COMMIT FILE:fhandle=%ld", fhandle)); + /* TODO */ + ; + } break; + + case 0x3e : { /* FILE SEARCH INIT */ /* returns dhandle for searchings */ int dir_handle = (int)*requestdata; @@ -840,18 +874,6 @@ static void handle_ncp_serv() } else completition = (uint8) -rights; } break; - case 0x3d : { /* commit file, flush file buffers */ - struct INPUT { - uint8 header[7]; /* Requestheader */ - uint8 reserve; - uint8 ext_fhandle[2]; /* all zero */ - uint8 fhandle[4]; /* filehandle */ - } *input = (struct INPUT *)ncprequest; - uint32 fhandle = GET_BE32(input->fhandle); - XDPRINTF((2,0, "TODO: COMMIT FILE:fhandle=%ld", fhandle)); - /* TODO */ - ; - } break; case 0x3f : { /* file search continue */ /* Dir_id is from file search init */ @@ -896,7 +918,7 @@ static void handle_ncp_serv() } break; - case 0x40 : /* GET File Mode ?? */ + case 0x40 : /* Search for a File */ { struct INPUT { uint8 header[7]; /* Requestheader */ @@ -907,8 +929,8 @@ static void handle_ncp_serv() uint8 data[2]; /* Name */ } *input = (struct INPUT *)ncprequest; struct OUTPUT { - uint8 sequenz[2]; /* Antwort Sequenz */ - uint8 reserve2[2]; /* z.B 0x0 0x0 */ + uint8 sequenz[2]; /* answer sequence */ + uint8 reserved[2]; /* z.B 0x0 0x0 */ union { NW_DIR_INFO d; NW_FILE_INFO f; diff --git a/nwfile.c b/nwfile.c index 17bc6b4..ffdbc4a 100644 --- a/nwfile.c +++ b/nwfile.c @@ -357,6 +357,9 @@ int nw_lock_datei(int fhandle, int offset, int size, int do_lock) flockd.l_start = offset; flockd.l_len = size; result = fcntl(fh->fd, F_SETLK, &flockd); + XDPRINTF((2, 0, "nw_%s_datei result=%d, fh=%d, offset=%d, size=%d", + (do_lock) ? "lock" : "unlock", result, fhandle, offset, size)); + if (!result) return(0); else return(-0x21); /* LOCK Violation */ } diff --git a/tools.c b/tools.c index d4d7a53..5d98636 100644 --- a/tools.c +++ b/tools.c @@ -31,6 +31,8 @@ FILE *logfile=stdout; static int in_module=0; /* in which process i am ? */ static int connection=0; /* which connection (nwconn) */ +static int my_pid = -1; +static void (*sigsegv_func)(int isig); static char *modnames[] = { "???????", "NWSERV ", @@ -121,7 +123,7 @@ void errorp(int mode, char *what, char *p, ...) int errnum = errno; FILE *lologfile = logfile; while (1) { - if (mode) fprintf(lologfile, "\n!! %s %d:PANIC !!\n", get_modstr(), connection); + if (mode==1) fprintf(lologfile, "\n!! %s %d:PANIC !!\n", get_modstr(), connection); if (errnum >= 0 && errnum < _sys_nerr) fprintf(lologfile, "%s %d:%s:%s\n", get_modstr(), connection, what, _sys_errlist[errnum]); else @@ -219,10 +221,11 @@ void get_ini_debug(int module) static void sig_segv(int isig) { - char *s= "PANIC signal SIGSEGV" ; - XDPRINTF((0, 0, s)); - fprintf(stderr, s); - exit(99); + char *s= "!!!! PANIC signal SIGSEGV at pid=%d !!!!!\n" ; + XDPRINTF((0, 0, s, my_pid)); + fprintf(stderr, "\n"); + fprintf(stderr, s, my_pid); + (*sigsegv_func)(isig); } void init_tools(int module, int conn) @@ -269,7 +272,8 @@ void init_tools(int module, int conn) XDPRINTF((1, 0, "Starting Version: %d.%02dpl%d", _VERS_H_, _VERS_L_, _VERS_P_ )); } - signal(SIGSEGV, sig_segv); + sigsegv_func = signal(SIGSEGV, sig_segv); + my_pid = getpid(); } void exit_tools(int what)