diff options
Diffstat (limited to 'source/client')
-rw-r--r-- | source/client/.cvsignore | 1 | ||||
-rw-r--r-- | source/client/client.c | 1050 | ||||
-rw-r--r-- | source/client/clitar.c | 195 | ||||
-rw-r--r-- | source/client/smbmnt.c | 8 | ||||
-rw-r--r-- | source/client/smbmount.c | 134 | ||||
-rw-r--r-- | source/client/smbspool.c | 101 | ||||
-rw-r--r-- | source/client/testsmbc.c | 455 | ||||
-rw-r--r-- | source/client/tree.c | 811 |
8 files changed, 678 insertions, 2077 deletions
diff --git a/source/client/.cvsignore b/source/client/.cvsignore index 49a52f7616d..e69de29bb2d 100644 --- a/source/client/.cvsignore +++ b/source/client/.cvsignore @@ -1 +0,0 @@ -client_proto.h
\ No newline at end of file diff --git a/source/client/client.c b/source/client/client.c index f25ed1623b0..b620064195c 100644 --- a/source/client/client.c +++ b/source/client/client.c @@ -1,8 +1,8 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 1.9. SMB client Copyright (C) Andrew Tridgell 1994-1998 - Copyright (C) Simo Sorce 2001-2002 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,19 +22,17 @@ #define NO_SYSLOG #include "includes.h" -#include "../client/client_proto.h" + #ifndef REGISTER #define REGISTER 0 #endif -const char prog_name[] = "smbclient"; - struct cli_state *cli; extern BOOL in_client; extern BOOL AllowDebugChange; -static int port = 0; +static int port = SMB_PORT; pstring cur_dir = "\\"; -static pstring cd_path = ""; +pstring cd_path = ""; static pstring service; static pstring desthost; extern pstring global_myname; @@ -44,14 +42,13 @@ static pstring workgroup; static char *cmdstr; static BOOL got_pass; static int io_bufsize = 64512; -static BOOL use_kerberos; static int name_type = 0x20; static int max_protocol = PROTOCOL_NT1; extern pstring user_socket_options; static int process_tok(fstring tok); -static int cmd_help(void); +static void cmd_help(void); /* 30 second timeout on most commands */ #define CLIENT_TIMEOUT (30*1000) @@ -61,9 +58,9 @@ static int cmd_help(void); #define FID_UNUSED (0xFFFF) time_t newer_than = 0; -static int archive_level = 0; +int archive_level = 0; -static BOOL translation = False; +BOOL translation = False; static BOOL have_ip; @@ -74,39 +71,36 @@ extern BOOL tar_reset; /* clitar bits end */ -static mode_t myumask = 0755; +mode_t myumask = 0755; -static BOOL prompt = True; +BOOL prompt = True; -static int printmode = 1; +int printmode = 1; static BOOL recurse = False; BOOL lowercase = False; -static struct in_addr dest_ip; +struct in_addr dest_ip; #define SEPARATORS " \t\n\r" -static BOOL abort_mget = True; +BOOL abort_mget = True; -static pstring fileselection = ""; +pstring fileselection = ""; extern file_info def_finfo; /* timing globals */ int get_total_size = 0; int get_total_time_ms = 0; -static int put_total_size = 0; -static int put_total_time_ms = 0; +int put_total_size = 0; +int put_total_time_ms = 0; /* totals globals */ static double dir_total; #define USENMB -/* some forward declarations */ -static struct cli_state *do_connect(const char *server, const char *share); - /**************************************************************************** write to a local file with CR/LF->LF translation if appropriate. return the number taken from the buffer. This may not equal the number written. @@ -138,17 +132,17 @@ static int writefile(int f, char *b, int n) read from a file with LF->CR/LF translation if appropriate. return the number read. read approx n bytes. ****************************************************************************/ -static int readfile(char *b, int n, XFILE *f) +static int readfile(char *b, int size, int n, FILE *f) { int i; int c; - if (!translation) - return x_fread(b,1,n,f); + if (!translation || (size != 1)) + return(fread(b,size,n,f)); i = 0; while (i < (n - 1) && (i < BUFFER_SIZE)) { - if ((c = x_getc(f)) == EOF) { + if ((c = getc(f)) == EOF) { break; } @@ -172,12 +166,12 @@ static void send_message(void) int grp_id; if (!cli_message_start(cli, desthost, username, &grp_id)) { - d_printf("message start: %s\n", cli_errstr(cli)); + DEBUG(0,("message start: %s\n", cli_errstr(cli))); return; } - d_printf("Connected. Type your message, ending it with a Control-D\n"); + printf("Connected. Type your message, ending it with a Control-D\n"); while (!feof(stdin) && total_len < 1600) { int maxlen = MIN(1600 - total_len,127); @@ -193,8 +187,15 @@ static void send_message(void) msg[l] = c; } + /* + * The message is in UNIX codepage format. Convert to + * DOS before sending. + */ + + unix_to_dos(msg); + if (!cli_message_text(cli, msg, l, grp_id)) { - d_printf("SMBsendtxt failed (%s)\n",cli_errstr(cli)); + printf("SMBsendtxt failed (%s)\n",cli_errstr(cli)); return; } @@ -202,12 +203,12 @@ static void send_message(void) } if (total_len >= 1600) - d_printf("the message was truncated to 1600 bytes\n"); + printf("the message was truncated to 1600 bytes\n"); else - d_printf("sent %d bytes\n",total_len); + printf("sent %d bytes\n",total_len); if (!cli_message_end(cli, grp_id)) { - d_printf("SMBsendend failed (%s)\n",cli_errstr(cli)); + printf("SMBsendend failed (%s)\n",cli_errstr(cli)); return; } } @@ -217,36 +218,33 @@ static void send_message(void) /**************************************************************************** check the space on a device ****************************************************************************/ -static int do_dskattr(void) +static void do_dskattr(void) { int total, bsize, avail; if (!cli_dskattr(cli, &bsize, &total, &avail)) { - d_printf("Error in dskattr: %s\n",cli_errstr(cli)); - return 1; + DEBUG(0,("Error in dskattr: %s\n",cli_errstr(cli))); + return; } - d_printf("\n\t\t%d blocks of size %d. %d blocks available\n", - total, bsize, avail); - - return 0; + DEBUG(0,("\n\t\t%d blocks of size %d. %d blocks available\n", + total, bsize, avail)); } /**************************************************************************** show cd/pwd ****************************************************************************/ -static int cmd_pwd(void) +static void cmd_pwd(void) { - d_printf("Current directory is %s",service); - d_printf("%s\n",cur_dir); - return 0; + DEBUG(0,("Current directory is %s",service)); + DEBUG(0,("%s\n",cur_dir)); } /**************************************************************************** change directory - inner section ****************************************************************************/ -static int do_cd(char *newdir) +static void do_cd(char *newdir) { char *p = newdir; pstring saved_dir; @@ -271,30 +269,25 @@ static int do_cd(char *newdir) if (!strequal(cur_dir,"\\")) { if (!cli_chkpath(cli, dname)) { - d_printf("cd %s: %s\n", dname, cli_errstr(cli)); + DEBUG(0,("cd %s: %s\n", dname, cli_errstr(cli))); pstrcpy(cur_dir,saved_dir); } } pstrcpy(cd_path,cur_dir); - - return 0; } /**************************************************************************** change directory ****************************************************************************/ -static int cmd_cd(void) +static void cmd_cd(void) { fstring buf; - int rc = 0; - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) - rc = do_cd(buf); + if (next_token(NULL,buf,NULL,sizeof(buf))) + do_cd(buf); else - d_printf("Current directory is %s\n",cur_dir); - - return rc; + DEBUG(0,("Current directory is %s\n",cur_dir)); } @@ -331,11 +324,11 @@ static void display_finfo(file_info *finfo) { if (do_this_one(finfo)) { time_t t = finfo->mtime; /* the time is assumed to be passed as GMT */ - d_printf(" %-30s%7.7s %8.0f %s", + DEBUG(0,(" %-30s%7.7s %8.0f %s", finfo->name, attrib_string(finfo->mode), (double)finfo->size, - asctime(LocalTime(&t))); + asctime(LocalTime(&t)))); dir_total += finfo->size; } } @@ -377,6 +370,7 @@ functions for do_list_queue static void reset_do_list_queue(void) { SAFE_FREE(do_list_queue); + do_list_queue = 0; do_list_queue_size = 0; do_list_queue_start = 0; do_list_queue_end = 0; @@ -388,8 +382,8 @@ static void init_do_list_queue(void) do_list_queue_size = 1024; do_list_queue = malloc(do_list_queue_size); if (do_list_queue == 0) { - d_printf("malloc fail for size %d\n", - (int)do_list_queue_size); + DEBUG(0,("malloc fail for size %d\n", + (int)do_list_queue_size)); reset_do_list_queue(); } else { memset(do_list_queue, 0, do_list_queue_size); @@ -423,6 +417,7 @@ static void adjust_do_list_queue(void) static void add_to_do_list_queue(const char* entry) { char *dlq; + long new_end = do_list_queue_end + ((long)strlen(entry)) + 1; while (new_end > do_list_queue_size) { @@ -430,13 +425,11 @@ static void add_to_do_list_queue(const char* entry) DEBUG(4,("enlarging do_list_queue to %d\n", (int)do_list_queue_size)); dlq = Realloc(do_list_queue, do_list_queue_size); - if (! dlq) { - d_printf("failure enlarging do_list_queue to %d bytes\n", - (int)do_list_queue_size); + if (!dlq) { + DEBUG(0,("failure enlarging do_list_queue to %d bytes\n", + (int)do_list_queue_size)); reset_do_list_queue(); - } - else - { + } else { do_list_queue = dlq; memset(do_list_queue + do_list_queue_size / 2, 0, do_list_queue_size / 2); @@ -488,7 +481,7 @@ static void do_list_helper(file_info *f, const char *mask, void *state) char *p; pstrcpy(mask2, mask); - p = strrchr_m(mask2,'\\'); + p = strrchr(mask2,'\\'); if (!p) return; p[1] = 0; pstrcat(mask2, f->name); @@ -553,7 +546,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec, strlen(next_file) - 2; *save_ch = '\0'; } - d_printf("\n%s\n",next_file); + DEBUG(0,("\n%s\n",next_file)); if (save_ch) { *save_ch = '\\'; @@ -565,7 +558,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec, { if (cli_list(cli, mask, attribute, do_list_helper, NULL) == -1) { - d_printf("%s listing %s\n", cli_errstr(cli), mask); + DEBUG(0, ("%s listing %s\n", cli_errstr(cli), mask)); } } @@ -576,20 +569,19 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec, /**************************************************************************** get a directory listing ****************************************************************************/ -static int cmd_dir(void) +static void cmd_dir(void) { uint16 attribute = aDIR | aSYSTEM | aHIDDEN; pstring mask; fstring buf; char *p=buf; - int rc; dir_total = 0; pstrcpy(mask,cur_dir); if(mask[strlen(mask)-1]!='\\') pstrcat(mask,"\\"); - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (next_token(NULL,buf,NULL,sizeof(buf))) { dos_format(p); if (*p == '\\') pstrcpy(mask,p); @@ -602,31 +594,28 @@ static int cmd_dir(void) do_list(mask, attribute, display_finfo, recurse, True); - rc = do_dskattr(); + do_dskattr(); DEBUG(3, ("Total bytes listed: %.0f\n", dir_total)); - - return rc; } /**************************************************************************** get a directory listing ****************************************************************************/ -static int cmd_du(void) +static void cmd_du(void) { uint16 attribute = aDIR | aSYSTEM | aHIDDEN; pstring mask; fstring buf; char *p=buf; - int rc; dir_total = 0; pstrcpy(mask,cur_dir); if(mask[strlen(mask)-1]!='\\') pstrcat(mask,"\\"); - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (next_token(NULL,buf,NULL,sizeof(buf))) { dos_format(p); if (*p == '\\') pstrcpy(mask,p); @@ -638,29 +627,25 @@ static int cmd_du(void) do_list(mask, attribute, do_du, recurse, True); - rc = do_dskattr(); - - d_printf("Total number of bytes: %.0f\n", dir_total); + do_dskattr(); - return rc; + DEBUG(0, ("Total number of bytes: %.0f\n", dir_total)); } /**************************************************************************** get a file from rname to lname ****************************************************************************/ -static int do_get(char *rname, char *lname, BOOL reget) +static void do_get(char *rname,char *lname) { - int handle = 0, fnum; + int handle=0,fnum; BOOL newhandle = False; char *data; struct timeval tp_start; int read_size = io_bufsize; uint16 attr; size_t size; - off_t start = 0; off_t nread = 0; - int rc = 0; GetTimeOfDay(&tp_start); @@ -671,30 +656,19 @@ static int do_get(char *rname, char *lname, BOOL reget) fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE); if (fnum == -1) { - d_printf("%s opening remote file %s\n",cli_errstr(cli),rname); - return 1; + DEBUG(0,("%s opening remote file %s\n",cli_errstr(cli),rname)); + return; } if(!strcmp(lname,"-")) { handle = fileno(stdout); } else { - if (reget) { - handle = sys_open(lname, O_WRONLY|O_CREAT, 0644); - if (handle >= 0) { - start = sys_lseek(handle, 0, SEEK_END); - if (start == -1) { - d_printf("Error seeking local file\n"); - return 1; - } - } - } else { - handle = sys_open(lname, O_WRONLY|O_CREAT|O_TRUNC, 0644); - } + handle = sys_open(lname,O_WRONLY|O_CREAT|O_TRUNC,0644); newhandle = True; } if (handle < 0) { - d_printf("Error opening local file %s\n",lname); - return 1; + DEBUG(0,("Error opening local file %s\n",lname)); + return; } @@ -702,45 +676,41 @@ static int do_get(char *rname, char *lname, BOOL reget) &attr, &size, NULL, NULL, NULL, NULL, NULL) && !cli_getattrE(cli, fnum, &attr, &size, NULL, NULL, NULL)) { - d_printf("getattrib: %s\n",cli_errstr(cli)); - return 1; + DEBUG(0,("getattrib: %s\n",cli_errstr(cli))); + return; } DEBUG(2,("getting file %s of size %.0f as %s ", rname, (double)size, lname)); if(!(data = (char *)malloc(read_size))) { - d_printf("malloc fail for size %d\n", read_size); + DEBUG(0,("malloc fail for size %d\n", read_size)); cli_close(cli, fnum); - return 1; + return; } while (1) { - int n = cli_read(cli, fnum, data, nread + start, read_size); + int n = cli_read(cli, fnum, data, nread, read_size); if (n <= 0) break; if (writefile(handle,data, n) != n) { - d_printf("Error writing local file\n"); - rc = 1; + DEBUG(0,("Error writing local file\n")); break; } nread += n; } - if (nread + start < size) { + if (nread < size) { DEBUG (0, ("Short read when getting file %s. Only got %ld bytes.\n", - rname, (long)nread)); - - rc = 1; + rname, (long)nread)); } SAFE_FREE(data); if (!cli_close(cli, fnum)) { - d_printf("Error %s closing remote file\n",cli_errstr(cli)); - rc = 1; + DEBUG(0,("Error %s closing remote file\n",cli_errstr(cli))); } if (newhandle) { @@ -766,15 +736,13 @@ static int do_get(char *rname, char *lname, BOOL reget) nread / (1.024*this_time + 1.0e-4), get_total_size / (1.024*get_total_time_ms))); } - - return rc; } /**************************************************************************** get a file ****************************************************************************/ -static int cmd_get(void) +static void cmd_get(void) { pstring lname; pstring rname; @@ -785,16 +753,16 @@ static int cmd_get(void) p = rname + strlen(rname); - if (!next_token_nr(NULL,p,NULL,sizeof(rname)-strlen(rname))) { - d_printf("get <filename>\n"); - return 1; + if (!next_token(NULL,p,NULL,sizeof(rname)-strlen(rname))) { + DEBUG(0,("get <filename>\n")); + return; } pstrcpy(lname,p); dos_clean_name(rname); - next_token_nr(NULL,lname,NULL,sizeof(lname)); + next_token(NULL,lname,NULL,sizeof(lname)); - return do_get(rname, lname, False); + do_get(rname, lname); } @@ -812,7 +780,7 @@ static void do_mget(file_info *finfo) return; if (abort_mget) { - d_printf("mget aborted\n"); + DEBUG(0,("mget aborted\n")); return; } @@ -828,7 +796,7 @@ static void do_mget(file_info *finfo) if (!(finfo->mode & aDIR)) { pstrcpy(rname,cur_dir); pstrcat(rname,finfo->name); - do_get(rname, finfo->name, False); + do_get(rname,finfo->name); return; } @@ -844,13 +812,13 @@ static void do_mget(file_info *finfo) if (!directory_exist(finfo->name,NULL) && mkdir(finfo->name,0777) != 0) { - d_printf("failed to create directory %s\n",finfo->name); + DEBUG(0,("failed to create directory %s\n",finfo->name)); pstrcpy(cur_dir,saved_curdir); return; } if (chdir(finfo->name) != 0) { - d_printf("failed to chdir to directory %s\n",finfo->name); + DEBUG(0,("failed to chdir to directory %s\n",finfo->name)); pstrcpy(cur_dir,saved_curdir); return; } @@ -867,12 +835,11 @@ static void do_mget(file_info *finfo) /**************************************************************************** view the file using the pager ****************************************************************************/ -static int cmd_more(void) +static void cmd_more(void) { fstring rname,lname,pager_cmd; char *pager; int fd; - int rc = 0; fstrcpy(rname,cur_dir); fstrcat(rname,"\\"); @@ -880,19 +847,19 @@ static int cmd_more(void) slprintf(lname,sizeof(lname)-1, "%s/smbmore.XXXXXX",tmpdir()); fd = smb_mkstemp(lname); if (fd == -1) { - d_printf("failed to create temporary file for more\n"); - return 1; + DEBUG(0,("failed to create temporary file for more\n")); + return; } close(fd); - if (!next_token_nr(NULL,rname+strlen(rname),NULL,sizeof(rname)-strlen(rname))) { - d_printf("more <filename>\n"); + if (!next_token(NULL,rname+strlen(rname),NULL,sizeof(rname)-strlen(rname))) { + DEBUG(0,("more <filename>\n")); unlink(lname); - return 1; + return; } dos_clean_name(rname); - rc = do_get(rname, lname, False); + do_get(rname,lname); pager=getenv("PAGER"); @@ -900,8 +867,6 @@ static int cmd_more(void) "%s %s",(pager? pager:PAGER), lname); system(pager_cmd); unlink(lname); - - return rc; } @@ -909,7 +874,7 @@ static int cmd_more(void) /**************************************************************************** do a mget command ****************************************************************************/ -static int cmd_mget(void) +static void cmd_mget(void) { uint16 attribute = aSYSTEM | aHIDDEN; pstring mget_mask; @@ -923,7 +888,7 @@ static int cmd_mget(void) abort_mget = False; - while (next_token_nr(NULL,p,NULL,sizeof(buf))) { + while (next_token(NULL,p,NULL,sizeof(buf))) { pstrcpy(mget_mask,cur_dir); if(mget_mask[strlen(mget_mask)-1]!='\\') pstrcat(mget_mask,"\\"); @@ -942,8 +907,6 @@ static int cmd_mget(void) pstrcat(mget_mask,"*"); do_list(mget_mask, attribute,do_mget,False,True); } - - return 0; } @@ -953,8 +916,8 @@ make a directory of name "name" static BOOL do_mkdir(char *name) { if (!cli_mkdir(cli, name)) { - d_printf("%s making remote directory %s\n", - cli_errstr(cli),name); + DEBUG(0,("%s making remote directory %s\n", + cli_errstr(cli),name)); return(False); } @@ -962,38 +925,35 @@ static BOOL do_mkdir(char *name) } /**************************************************************************** -show 8.3 name of a file + Show 8.3 name of a file. ****************************************************************************/ + static BOOL do_altname(char *name) { fstring altname; if (!NT_STATUS_IS_OK(cli_qpathinfo_alt_name(cli, name, altname))) { - d_printf("%s getting alt name for %s\n", - cli_errstr(cli),name); + DEBUG(0,("%s getting alt name for %s\n", cli_errstr(cli),name)); return(False); } - d_printf("%s\n", altname); + DEBUG(0,("%s\n", altname)); return(True); } - /**************************************************************************** Exit client. ****************************************************************************/ -static int cmd_quit(void) +static void cmd_quit(void) { cli_shutdown(cli); exit(0); - /* NOTREACHED */ - return 0; } /**************************************************************************** make a directory ****************************************************************************/ -static int cmd_mkdir(void) +static void cmd_mkdir(void) { pstring mask; fstring buf; @@ -1001,10 +961,10 @@ static int cmd_mkdir(void) pstrcpy(mask,cur_dir); - if (!next_token_nr(NULL,p,NULL,sizeof(buf))) { + if (!next_token(NULL,p,NULL,sizeof(buf))) { if (!recurse) - d_printf("mkdir <dirname>\n"); - return 1; + DEBUG(0,("mkdir <dirname>\n")); + return; } pstrcat(mask,p); @@ -1027,89 +987,62 @@ static int cmd_mkdir(void) } else { do_mkdir(mask); } - - return 0; } - /**************************************************************************** show alt name ****************************************************************************/ -static int cmd_altname(void) + +static void cmd_altname(void) { pstring name; fstring buf; char *p=buf; - + pstrcpy(name,cur_dir); - if (!next_token_nr(NULL,p,NULL,sizeof(buf))) { - d_printf("altname <file>\n"); - return 1; + if (!next_token(NULL,p,NULL,sizeof(buf))) { + DEBUG(0,("altname <file>\n")); + return; } pstrcat(name,p); do_altname(name); - - return 0; } - /**************************************************************************** put a single file ****************************************************************************/ -static int do_put(char *rname, char *lname, BOOL reput) +static void do_put(char *rname,char *lname) { int fnum; - XFILE *f; - int start = 0; - int nread = 0; - char *buf = NULL; - int maxwrite = io_bufsize; - int rc = 0; + FILE *f; + int nread=0; + char *buf=NULL; + int maxwrite=io_bufsize; struct timeval tp_start; GetTimeOfDay(&tp_start); - if (reput) { - fnum = cli_open(cli, rname, O_RDWR|O_CREAT, DENY_NONE); - if (fnum >= 0) { - if (!cli_qfileinfo(cli, fnum, NULL, &start, NULL, NULL, NULL, NULL, NULL) && - !cli_getattrE(cli, fnum, NULL, &start, NULL, NULL, NULL)) { - d_printf("getattrib: %s\n",cli_errstr(cli)); - return 1; - } - } - } else { - fnum = cli_open(cli, rname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE); - } + fnum = cli_open(cli, rname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE); if (fnum == -1) { - d_printf("%s opening remote file %s\n",cli_errstr(cli),rname); - return 1; + DEBUG(0,("%s opening remote file %s\n",cli_errstr(cli),rname)); + return; } /* allow files to be piped into smbclient - jdblair 24.jun.98 - - Note that in this case this function will exit(0) rather - than returning. */ + jdblair 24.jun.98 */ if (!strcmp(lname, "-")) { - f = x_stdin; + f = stdin; /* size of file is not known */ } else { - f = x_fopen(lname,O_RDONLY, 0); - if (f && reput) { - if (x_tseek(f, start, SEEK_SET) == -1) { - d_printf("Error seeking local file\n"); - return 1; - } - } + f = sys_fopen(lname,"r"); } if (!f) { - d_printf("Error opening local file %s\n",lname); - return 1; + DEBUG(0,("Error opening local file %s\n",lname)); + return; } @@ -1118,27 +1051,25 @@ static int do_put(char *rname, char *lname, BOOL reput) buf = (char *)malloc(maxwrite); if (!buf) { - d_printf("ERROR: Not enough memory!\n"); - return 1; + DEBUG(0, ("ERROR: Not enough memory!\n")); + return; } - while (!x_feof(f)) { + while (!feof(f)) { int n = maxwrite; int ret; - if ((n = readfile(buf,n,f)) < 1) { - if((n == 0) && x_feof(f)) + if ((n = readfile(buf,1,n,f)) < 1) { + if((n == 0) && feof(f)) break; /* Empty local file. */ - d_printf("Error reading local file: %s\n", strerror(errno)); - rc = 1; + DEBUG(0,("Error reading local file: %s\n", strerror(errno) )); break; } - ret = cli_write(cli, fnum, 0, buf, nread + start, n); + ret = cli_write(cli, fnum, 0, buf, nread, n); if (n != ret) { - d_printf("Error writing file: %s\n", cli_errstr(cli)); - rc = 1; + DEBUG(0,("Error writing file: %s\n", cli_errstr(cli))); break; } @@ -1146,17 +1077,14 @@ static int do_put(char *rname, char *lname, BOOL reput) } if (!cli_close(cli, fnum)) { - d_printf("%s closing remote file %s\n",cli_errstr(cli),rname); - x_fclose(f); + DEBUG(0,("%s closing remote file %s\n",cli_errstr(cli),rname)); + fclose(f); SAFE_FREE(buf); - return 1; + return; } - if (f != x_stdin) { - x_fclose(f); - } - + fclose(f); SAFE_FREE(buf); { @@ -1175,12 +1103,10 @@ static int do_put(char *rname, char *lname, BOOL reput) put_total_size / (1.024*put_total_time_ms))); } - if (f == x_stdin) { + if (f == stdin) { cli_shutdown(cli); exit(0); } - - return rc; } @@ -1188,7 +1114,7 @@ static int do_put(char *rname, char *lname, BOOL reput) /**************************************************************************** put a file ****************************************************************************/ -static int cmd_put(void) +static void cmd_put(void) { pstring lname; pstring rname; @@ -1198,13 +1124,13 @@ static int cmd_put(void) pstrcpy(rname,cur_dir); pstrcat(rname,"\\"); - if (!next_token_nr(NULL,p,NULL,sizeof(buf))) { - d_printf("put <filename>\n"); - return 1; + if (!next_token(NULL,p,NULL,sizeof(buf))) { + DEBUG(0,("put <filename>\n")); + return; } pstrcpy(lname,p); - if (next_token_nr(NULL,p,NULL,sizeof(buf))) + if (next_token(NULL,p,NULL,sizeof(buf))) pstrcat(rname,p); else pstrcat(rname,lname); @@ -1217,12 +1143,12 @@ static int cmd_put(void) jdblair, 24.jun.98 */ if (!file_exist(lname,&st) && (strcmp(lname,"-"))) { - d_printf("%s does not exist\n",lname); - return 1; + DEBUG(0,("%s does not exist\n",lname)); + return; } } - return do_put(rname, lname, False); + do_put(rname,lname); } /************************************* @@ -1272,12 +1198,10 @@ static BOOL seek_list(struct file_list *list, char *name) /**************************************************************************** set the file selection mask ****************************************************************************/ -static int cmd_select(void) +static void cmd_select(void) { pstrcpy(fileselection,""); - next_token_nr(NULL,fileselection,NULL,sizeof(fileselection)); - - return 0; + next_token(NULL,fileselection,NULL,sizeof(fileselection)); } /**************************************************************************** @@ -1307,7 +1231,7 @@ static int file_find(struct file_list **list, const char *directory, } isdir = False; - if (!match || !gen_fnmatch(expression, dname)) { + if (!match || !ms_fnmatch(expression, dname)) { if (recurse) { ret = stat(path, &statbuf); if (ret == 0) { @@ -1316,7 +1240,7 @@ static int file_find(struct file_list **list, const char *directory, ret = file_find(list, path, expression, False); } } else { - d_printf("file_find: cannot stat file %s\n", path); + DEBUG(0,("file_find: cannot stat file %s\n", path)); } if (ret == -1) { @@ -1327,7 +1251,7 @@ static int file_find(struct file_list **list, const char *directory, } entry = (struct file_list *) malloc(sizeof (struct file_list)); if (!entry) { - d_printf("Out of memory in file_find\n"); + DEBUG(0,("Out of memory in file_find\n")); closedir(dir); return -1; } @@ -1346,12 +1270,12 @@ static int file_find(struct file_list **list, const char *directory, /**************************************************************************** mput some files ****************************************************************************/ -static int cmd_mput(void) +static void cmd_mput(void) { fstring buf; char *p=buf; - while (next_token_nr(NULL,p,NULL,sizeof(buf))) { + while (next_token(NULL,p,NULL,sizeof(buf))) { int ret; struct file_list *temp_list; char *quest, *lname, *rname; @@ -1389,7 +1313,7 @@ static int cmd_mput(void) break; } else { /* Yes */ SAFE_FREE(rname); - if(asprintf(&rname, "%s%s", cur_dir, lname) < 0) break; + if (asprintf(&rname, "%s%s", cur_dir, lname) < 0) break; dos_format(rname); if (!cli_chkpath(cli, rname) && !do_mkdir(rname)) { @@ -1414,29 +1338,25 @@ static int cmd_mput(void) dos_format(rname); - do_put(rname, lname, False); + do_put(rname, lname); } free_file_list(file_list); SAFE_FREE(quest); SAFE_FREE(lname); SAFE_FREE(rname); } - - return 0; } /**************************************************************************** cancel a print job ****************************************************************************/ -static int do_cancel(int job) +static void do_cancel(int job) { if (cli_printjob_del(cli, job)) { - d_printf("Job %d cancelled\n",job); - return 0; + printf("Job %d cancelled\n",job); } else { - d_printf("Error cancelling job %d : %s\n",job,cli_errstr(cli)); - return 1; + printf("Error cancelling job %d : %s\n",job,cli_errstr(cli)); } } @@ -1444,40 +1364,38 @@ static int do_cancel(int job) /**************************************************************************** cancel a print job ****************************************************************************/ -static int cmd_cancel(void) +static void cmd_cancel(void) { fstring buf; int job; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { - d_printf("cancel <jobid> ...\n"); - return 1; + if (!next_token(NULL,buf,NULL,sizeof(buf))) { + printf("cancel <jobid> ...\n"); + return; } do { job = atoi(buf); do_cancel(job); - } while (next_token_nr(NULL,buf,NULL,sizeof(buf))); - - return 0; + } while (next_token(NULL,buf,NULL,sizeof(buf))); } /**************************************************************************** print a file ****************************************************************************/ -static int cmd_print(void) +static void cmd_print(void) { pstring lname; pstring rname; char *p; - if (!next_token_nr(NULL,lname,NULL, sizeof(lname))) { - d_printf("print <filename>\n"); - return 1; + if (!next_token(NULL,lname,NULL, sizeof(lname))) { + DEBUG(0,("print <filename>\n")); + return; } pstrcpy(rname,lname); - p = strrchr_m(rname,'/'); + p = strrchr(rname,'/'); if (p) { slprintf(rname, sizeof(rname)-1, "%s-%d", p+1, (int)sys_getpid()); } @@ -1486,7 +1404,7 @@ static int cmd_print(void) slprintf(rname, sizeof(rname)-1, "stdin-%d", (int)sys_getpid()); } - return do_put(rname, lname, False); + do_put(rname, lname); } @@ -1495,17 +1413,15 @@ static int cmd_print(void) ****************************************************************************/ static void queue_fn(struct print_job_info *p) { - d_printf("%-6d %-9d %s\n", (int)p->id, (int)p->size, p->name); + DEBUG(0,("%-6d %-9d %s\n", (int)p->id, (int)p->size, p->name)); } /**************************************************************************** show a print queue ****************************************************************************/ -static int cmd_queue(void) +static void cmd_queue(void) { - cli_print_queue(cli, queue_fn); - - return 0; + cli_print_queue(cli, queue_fn); } /**************************************************************************** @@ -1522,14 +1438,14 @@ static void do_del(file_info *finfo) return; if (!cli_unlink(cli, mask)) { - d_printf("%s deleting remote file %s\n",cli_errstr(cli),mask); + DEBUG(0,("%s deleting remote file %s\n",cli_errstr(cli),mask)); } } /**************************************************************************** delete some files ****************************************************************************/ -static int cmd_del(void) +static void cmd_del(void) { pstring mask; fstring buf; @@ -1540,74 +1456,68 @@ static int cmd_del(void) pstrcpy(mask,cur_dir); - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { - d_printf("del <filename>\n"); - return 1; + if (!next_token(NULL,buf,NULL,sizeof(buf))) { + DEBUG(0,("del <filename>\n")); + return; } pstrcat(mask,buf); do_list(mask, attribute,do_del,False,False); - - return 0; } /**************************************************************************** ****************************************************************************/ -static int cmd_open(void) +static void cmd_open(void) { pstring mask; fstring buf; pstrcpy(mask,cur_dir); - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { - d_printf("open <filename>\n"); - return 1; + if (!next_token(NULL,buf,NULL,sizeof(buf))) { + DEBUG(0,("open <filename>\n")); + return; } pstrcat(mask,buf); cli_open(cli, mask, O_RDWR, DENY_ALL); - - return 0; } /**************************************************************************** remove a directory ****************************************************************************/ -static int cmd_rmdir(void) +static void cmd_rmdir(void) { pstring mask; fstring buf; pstrcpy(mask,cur_dir); - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { - d_printf("rmdir <dirname>\n"); - return 1; + if (!next_token(NULL,buf,NULL,sizeof(buf))) { + DEBUG(0,("rmdir <dirname>\n")); + return; } pstrcat(mask,buf); if (!cli_rmdir(cli, mask)) { - d_printf("%s removing remote directory file %s\n", - cli_errstr(cli),mask); - } - - return 0; + DEBUG(0,("%s removing remote directory file %s\n", + cli_errstr(cli),mask)); + } } /**************************************************************************** UNIX hardlink. ****************************************************************************/ -static int cmd_link(void) +static void cmd_link(void) { pstring src,dest; fstring buf,buf2; if (!SERVER_HAS_UNIX_CIFS(cli)) { - d_printf("Server doesn't support UNIX CIFS calls.\n"); - return 1; + DEBUG(0,("Server doesn't support UNIX CIFS calls.\n")); + return; } pstrcpy(src,cur_dir); @@ -1615,33 +1525,32 @@ static int cmd_link(void) if (!next_token(NULL,buf,NULL,sizeof(buf)) || !next_token(NULL,buf2,NULL, sizeof(buf2))) { - d_printf("link <src> <dest>\n"); - return 1; + DEBUG(0,("link <src> <dest>\n")); + return; } pstrcat(src,buf); pstrcat(dest,buf2); if (!cli_unix_hardlink(cli, src, dest)) { - d_printf("%s linking files (%s -> %s)\n", cli_errstr(cli), src, dest); - return 1; + DEBUG(0,("%s linking files (%s -> %s)\n", + cli_errstr(cli), src, dest)); + return; } - - return 0; } /**************************************************************************** UNIX symlink. ****************************************************************************/ -static int cmd_symlink(void) +static void cmd_symlink(void) { pstring src,dest; fstring buf,buf2; if (!SERVER_HAS_UNIX_CIFS(cli)) { - d_printf("Server doesn't support UNIX CIFS calls.\n"); - return 1; + DEBUG(0,("Server doesn't support UNIX CIFS calls.\n")); + return; } pstrcpy(src,cur_dir); @@ -1649,62 +1558,58 @@ static int cmd_symlink(void) if (!next_token(NULL,buf,NULL,sizeof(buf)) || !next_token(NULL,buf2,NULL, sizeof(buf2))) { - d_printf("symlink <src> <dest>\n"); - return 1; + DEBUG(0,("symlink <src> <dest>\n")); + return; } pstrcat(src,buf); pstrcat(dest,buf2); if (!cli_unix_symlink(cli, src, dest)) { - d_printf("%s symlinking files (%s -> %s)\n", - cli_errstr(cli), src, dest); - return 1; - } - - return 0; + DEBUG(0,("%s symlinking files (%s -> %s)\n", + cli_errstr(cli), src, dest)); + return; + } } /**************************************************************************** UNIX chmod. ****************************************************************************/ -static int cmd_chmod(void) +static void cmd_chmod(void) { pstring src; mode_t mode; fstring buf, buf2; if (!SERVER_HAS_UNIX_CIFS(cli)) { - d_printf("Server doesn't support UNIX CIFS calls.\n"); - return 1; + DEBUG(0,("Server doesn't support UNIX CIFS calls.\n")); + return; } pstrcpy(src,cur_dir); if (!next_token(NULL,buf,NULL,sizeof(buf)) || !next_token(NULL,buf2,NULL, sizeof(buf2))) { - d_printf("chmod mode file\n"); - return 1; + DEBUG(0,("chmod mode file\n")); + return; } mode = (mode_t)strtol(buf, NULL, 8); pstrcat(src,buf2); if (!cli_unix_chmod(cli, src, mode)) { - d_printf("%s chmod file %s 0%o\n", - cli_errstr(cli), src, (unsigned int)mode); - return 1; - } - - return 0; + DEBUG(0,("%s chmod file %s 0%o\n", + cli_errstr(cli), src, (unsigned int)mode)); + return; + } } /**************************************************************************** UNIX chown. ****************************************************************************/ -static int cmd_chown(void) +static void cmd_chown(void) { pstring src; uid_t uid; @@ -1712,8 +1617,8 @@ static int cmd_chown(void) fstring buf, buf2, buf3; if (!SERVER_HAS_UNIX_CIFS(cli)) { - d_printf("Server doesn't support UNIX CIFS calls.\n"); - return 1; + DEBUG(0,("Server doesn't support UNIX CIFS calls.\n")); + return; } pstrcpy(src,cur_dir); @@ -1721,8 +1626,8 @@ static int cmd_chown(void) if (!next_token(NULL,buf,NULL,sizeof(buf)) || !next_token(NULL,buf2,NULL, sizeof(buf2)) || !next_token(NULL,buf3,NULL, sizeof(buf3))) { - d_printf("chown uid gid file\n"); - return 1; + DEBUG(0,("chown uid gid file\n")); + return; } uid = (uid_t)atoi(buf); @@ -1730,18 +1635,16 @@ static int cmd_chown(void) pstrcat(src,buf3); if (!cli_unix_chown(cli, src, uid, gid)) { - d_printf("%s chown file %s uid=%d, gid=%d\n", - cli_errstr(cli), src, (int)uid, (int)gid); - return 1; + DEBUG(0,("%s chown file %s uid=%d, gid=%d\n", + cli_errstr(cli), src, (int)uid, (int)gid)); + return; } - - return 0; } /**************************************************************************** rename some files ****************************************************************************/ -static int cmd_rename(void) +static void cmd_rename(void) { pstring src,dest; fstring buf,buf2; @@ -1749,46 +1652,42 @@ static int cmd_rename(void) pstrcpy(src,cur_dir); pstrcpy(dest,cur_dir); - if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || - !next_token_nr(NULL,buf2,NULL, sizeof(buf2))) { - d_printf("rename <src> <dest>\n"); - return 1; + if (!next_token(NULL,buf,NULL,sizeof(buf)) || + !next_token(NULL,buf2,NULL, sizeof(buf2))) { + DEBUG(0,("rename <src> <dest>\n")); + return; } pstrcat(src,buf); pstrcat(dest,buf2); if (!cli_rename(cli, src, dest)) { - d_printf("%s renaming files\n",cli_errstr(cli)); - return 1; - } - - return 0; + DEBUG(0,("%s renaming files\n",cli_errstr(cli))); + return; + } } /**************************************************************************** toggle the prompt flag ****************************************************************************/ -static int cmd_prompt(void) +static void cmd_prompt(void) { prompt = !prompt; DEBUG(2,("prompting is now %s\n",prompt?"on":"off")); - - return 1; } /**************************************************************************** set the newer than time ****************************************************************************/ -static int cmd_newer(void) +static void cmd_newer(void) { fstring buf; BOOL ok; SMB_STRUCT_STAT sbuf; - ok = next_token_nr(NULL,buf,NULL,sizeof(buf)); + ok = next_token(NULL,buf,NULL,sizeof(buf)); if (ok && (sys_stat(buf,&sbuf) == 0)) { newer_than = sbuf.st_mtime; DEBUG(1,("Getting files newer than %s", @@ -1797,38 +1696,30 @@ static int cmd_newer(void) newer_than = 0; } - if (ok && newer_than == 0) { - d_printf("Error setting newer-than time\n"); - return 1; - } - - return 0; + if (ok && newer_than == 0) + DEBUG(0,("Error setting newer-than time\n")); } /**************************************************************************** set the archive level ****************************************************************************/ -static int cmd_archive(void) +static void cmd_archive(void) { fstring buf; - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (next_token(NULL,buf,NULL,sizeof(buf))) { archive_level = atoi(buf); } else - d_printf("Archive level is %d\n",archive_level); - - return 0; + DEBUG(0,("Archive level is %d\n",archive_level)); } /**************************************************************************** toggle the lowercaseflag ****************************************************************************/ -static int cmd_lowercase(void) +static void cmd_lowercase(void) { lowercase = !lowercase; DEBUG(2,("filename lowercasing is now %s\n",lowercase?"on":"off")); - - return 0; } @@ -1837,36 +1728,32 @@ static int cmd_lowercase(void) /**************************************************************************** toggle the recurse flag ****************************************************************************/ -static int cmd_recurse(void) +static void cmd_recurse(void) { recurse = !recurse; DEBUG(2,("directory recursion is now %s\n",recurse?"on":"off")); - - return 0; } /**************************************************************************** toggle the translate flag ****************************************************************************/ -static int cmd_translate(void) +static void cmd_translate(void) { translation = !translation; DEBUG(2,("CR/LF<->LF and print text translation now %s\n", translation?"on":"off")); - - return 0; } /**************************************************************************** do a printmode command ****************************************************************************/ -static int cmd_printmode(void) +static void cmd_printmode(void) { fstring buf; fstring mode; - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (next_token(NULL,buf,NULL,sizeof(buf))) { if (strequal(buf,"text")) { printmode = 0; } else { @@ -1891,90 +1778,24 @@ static int cmd_printmode(void) } DEBUG(2,("the printmode is now %s\n",mode)); - - return 0; } /**************************************************************************** - do the lcd command - ****************************************************************************/ -static int cmd_lcd(void) +do the lcd command +****************************************************************************/ +static void cmd_lcd(void) { fstring buf; pstring d; - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) + if (next_token(NULL,buf,NULL,sizeof(buf))) chdir(buf); DEBUG(2,("the local directory is now %s\n",sys_getwd(d))); - - return 0; } /**************************************************************************** - get a file restarting at end of local file - ****************************************************************************/ -static int cmd_reget(void) -{ - pstring local_name; - pstring remote_name; - char *p; - - pstrcpy(remote_name, cur_dir); - pstrcat(remote_name, "\\"); - - p = remote_name + strlen(remote_name); - - if (!next_token_nr(NULL, p, NULL, sizeof(remote_name) - strlen(remote_name))) { - d_printf("reget <filename>\n"); - return 1; - } - pstrcpy(local_name, p); - dos_clean_name(remote_name); - - next_token_nr(NULL, local_name, NULL, sizeof(local_name)); - - return do_get(remote_name, local_name, True); -} - -/**************************************************************************** - put a file restarting at end of local file - ****************************************************************************/ -static int cmd_reput(void) -{ - pstring local_name; - pstring remote_name; - fstring buf; - char *p = buf; - SMB_STRUCT_STAT st; - - pstrcpy(remote_name, cur_dir); - pstrcat(remote_name, "\\"); - - if (!next_token_nr(NULL, p, NULL, sizeof(buf))) { - d_printf("reput <filename>\n"); - return 1; - } - pstrcpy(local_name, p); - - if (!file_exist(local_name, &st)) { - d_printf("%s does not exist\n", local_name); - return 1; - } - - if (next_token_nr(NULL, p, NULL, sizeof(buf))) - pstrcat(remote_name, p); - else - pstrcat(remote_name, local_name); - - dos_clean_name(remote_name); - - return do_put(remote_name, local_name, True); -} - - -/**************************************************************************** - list a share name - ****************************************************************************/ +list a share name +****************************************************************************/ static void browse_fn(const char *name, uint32 m, const char *comment, void *state) { @@ -1993,11 +1814,9 @@ static void browse_fn(const char *name, uint32 m, case STYPE_IPC: fstrcpy(typestr,"IPC"); break; } - /* FIXME: If the remote machine returns non-ascii characters - in any of these fields, they can corrupt the output. We - should remove them. */ - d_printf("\t%-15.15s%-10.10s%s\n", - name,typestr,comment); + + printf("\t%-15.15s%-10.10s%s\n", + name, typestr,comment); } @@ -2008,11 +1827,11 @@ static BOOL browse_host(BOOL sort) { int ret; - d_printf("\n\tSharename Type Comment\n"); - d_printf("\t--------- ---- -------\n"); + printf("\n\tSharename Type Comment\n"); + printf("\t--------- ---- -------\n"); if((ret = cli_RNetShareEnum(cli, browse_fn, NULL)) == -1) - d_printf("Error returning browse list: %s\n", cli_errstr(cli)); + printf("Error returning browse list: %s\n", cli_errstr(cli)); return (ret != -1); } @@ -2023,7 +1842,7 @@ list a server name static void server_fn(const char *name, uint32 m, const char *comment, void *state) { - d_printf("\t%-16.16s %s\n", name, comment); + printf("\t%-16.16s %s\n", name, comment); } /**************************************************************************** @@ -2032,14 +1851,14 @@ try and browse available connections on a host static BOOL list_servers(char *wk_grp) { if (!cli->server_domain) return False; - - d_printf("\n\tServer Comment\n"); - d_printf("\t--------- -------\n"); + + printf("\n\tServer Comment\n"); + printf("\t--------- -------\n"); cli_NetServerEnum(cli, cli->server_domain, SV_TYPE_ALL, server_fn, NULL); - d_printf("\n\tWorkgroup Master\n"); - d_printf("\t--------- -------\n"); + printf("\n\tWorkgroup Master\n"); + printf("\t--------- -------\n"); cli_NetServerEnum(cli, cli->server_domain, SV_TYPE_DOMAIN_ENUM, server_fn, NULL); return True; @@ -2056,10 +1875,10 @@ static BOOL list_servers(char *wk_grp) * field is NULL, and NULL in that field is used in process_tok() * (below) to indicate the end of the list. crh */ -static struct +struct { char *name; - int (*fn)(void); + void (*fn)(void); char *description; char compl_args[2]; /* Completion argument info */ } commands[] = @@ -2101,17 +1920,15 @@ static struct {"quit",cmd_quit,"logoff the server",{COMPL_NONE,COMPL_NONE}}, {"rd",cmd_rmdir,"<directory> remove a directory",{COMPL_NONE,COMPL_NONE}}, {"recurse",cmd_recurse,"toggle directory recursion for mget and mput",{COMPL_NONE,COMPL_NONE}}, - {"reget",cmd_reget,"<remote name> [local name] get a file restarting at end of local file",{COMPL_REMOTE,COMPL_LOCAL}}, {"rename",cmd_rename,"<src> <dest> rename some files",{COMPL_REMOTE,COMPL_REMOTE}}, - {"reput",cmd_reput,"<local name> [remote name] put a file restarting at end of remote file",{COMPL_LOCAL,COMPL_REMOTE}}, {"rm",cmd_del,"<mask> delete all matching files",{COMPL_REMOTE,COMPL_NONE}}, {"rmdir",cmd_rmdir,"<directory> remove a directory",{COMPL_NONE,COMPL_NONE}}, {"setmode",cmd_setmode,"filename <setmode string> change modes of file",{COMPL_REMOTE,COMPL_NONE}}, {"symlink",cmd_symlink,"<src> <dest> create a UNIX symlink",{COMPL_REMOTE,COMPL_REMOTE}}, {"tar",cmd_tar,"tar <c|x>[IXFqbgNan] current directory to/from <file name>",{COMPL_NONE,COMPL_NONE}}, {"tarmode",cmd_tarmode,"<full|inc|reset|noreset> tar's behaviour towards archive bits",{COMPL_NONE,COMPL_NONE}}, - {"translate",cmd_translate,"toggle text translation for printing",{COMPL_NONE,COMPL_NONE}}, - + {"translate",cmd_translate,"toggle text translation for printing",{COMPL_NONE,COMPL_NONE}}, + /* Yes, this must be here, see crh's comment above. */ {"!",NULL,"run a shell command on the local system",{COMPL_NONE,COMPL_NONE}}, {"",NULL,NULL,{COMPL_NONE,COMPL_NONE}} @@ -2151,41 +1968,39 @@ static int process_tok(fstring tok) /**************************************************************************** help ****************************************************************************/ -static int cmd_help(void) +static void cmd_help(void) { int i=0,j; fstring buf; - if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (next_token(NULL,buf,NULL,sizeof(buf))) { if ((i = process_tok(buf)) >= 0) - d_printf("HELP %s:\n\t%s\n\n",commands[i].name,commands[i].description); + DEBUG(0,("HELP %s:\n\t%s\n\n",commands[i].name,commands[i].description)); } else { while (commands[i].description) { for (j=0; commands[i].description && (j<5); j++) { - d_printf("%-15s",commands[i].name); + DEBUG(0,("%-15s",commands[i].name)); i++; } - d_printf("\n"); + DEBUG(0,("\n")); } } - return 0; } /**************************************************************************** process a -c command string ****************************************************************************/ -static int process_command_string(char *cmd) +static void process_command_string(char *cmd) { pstring line; char *ptr; - int rc = 0; /* establish the connection if not already */ if (!cli) { cli = do_connect(desthost, service); if (!cli) - return 0; + return; } while (cmd[0] != '\0') { @@ -2193,7 +2008,7 @@ static int process_command_string(char *cmd) fstring tok; int i; - if ((p = strchr_m(cmd, ';')) == 0) { + if ((p = strchr(cmd, ';')) == 0) { strncpy(line, cmd, 999); line[1000] = '\0'; cmd += strlen(cmd); @@ -2206,24 +2021,22 @@ static int process_command_string(char *cmd) /* and get the first part of the command */ ptr = line; - if (!next_token_nr(&ptr,tok,NULL,sizeof(tok))) continue; + if (!next_token(&ptr,tok,NULL,sizeof(tok))) continue; if ((i = process_tok(tok)) >= 0) { - rc = commands[i].fn(); + commands[i].fn(); } else if (i == -2) { - d_printf("%s: command abbreviation ambiguous\n",tok); + DEBUG(0,("%s: command abbreviation ambiguous\n",tok)); } else { - d_printf("%s: command not found\n",tok); + DEBUG(0,("%s: command not found\n",tok)); } } - - return rc; } /**************************************************************************** handle completion of commands for readline ****************************************************************************/ -static char **completion_fn(char *text, int start, int end) +static char **completion_fn(const char *text, int start, int end) { #define MAX_COMPLETIONS 100 char **matches; @@ -2302,17 +2115,14 @@ static void process_stdin(void) while (1) { fstring tok; fstring the_prompt; - char *cline; - pstring line; + char *line; int i; /* display a prompt */ slprintf(the_prompt, sizeof(the_prompt)-1, "smb: %s> ", cur_dir); - cline = smb_readline(the_prompt, readline_callback, completion_fn); - - if (!cline) break; - - pstrcpy(line, cline); + line = smb_readline(the_prompt, readline_callback, completion_fn); + + if (!line) break; /* special case - first char is ! */ if (*line == '!') { @@ -2322,14 +2132,14 @@ static void process_stdin(void) /* and get the first part of the command */ ptr = line; - if (!next_token_nr(&ptr,tok,NULL,sizeof(tok))) continue; + if (!next_token(&ptr,tok,NULL,sizeof(tok))) continue; if ((i = process_tok(tok)) >= 0) { commands[i].fn(); } else if (i == -2) { - d_printf("%s: command abbreviation ambiguous\n",tok); + DEBUG(0,("%s: command abbreviation ambiguous\n",tok)); } else { - d_printf("%s: command not found\n",tok); + DEBUG(0,("%s: command not found\n",tok)); } } } @@ -2338,11 +2148,11 @@ static void process_stdin(void) /***************************************************** return a connection to a server *******************************************************/ -static struct cli_state *do_connect(const char *server, const char *share) +struct cli_state *do_connect(char *server, char *share) { struct cli_state *c; struct nmb_name called, calling; - const char *server_n; + char *server_n; struct in_addr ip; fstring servicename; char *sharename; @@ -2352,7 +2162,7 @@ static struct cli_state *do_connect(const char *server, const char *share) sharename = servicename; if (*sharename == '\\') { server = sharename+2; - sharename = strchr_m(server,'\\'); + sharename = strchr(server,'\\'); if (!sharename) return NULL; *sharename = 0; sharename++; @@ -2370,21 +2180,20 @@ static struct cli_state *do_connect(const char *server, const char *share) if (have_ip) ip = dest_ip; /* have to open a new connection */ - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, port) != port) || + if (!(c=cli_initialise(NULL)) || (cli_set_port(c, port) == 0) || !cli_connect(c, server_n, &ip)) { - d_printf("Connection to %s failed\n", server_n); + DEBUG(0,("Connection to %s failed\n", server_n)); return NULL; } c->protocol = max_protocol; - c->use_kerberos = use_kerberos; if (!cli_session_request(c, &calling, &called)) { char *p; - d_printf("session request to %s failed (%s)\n", - called.name, cli_errstr(c)); + DEBUG(0,("session request to %s failed (%s)\n", + called.name, cli_errstr(c))); cli_shutdown(c); - if ((p=strchr_m(called.name, '.'))) { + if ((p=strchr(called.name, '.'))) { *p = 0; goto again; } @@ -2398,7 +2207,7 @@ static struct cli_state *do_connect(const char *server, const char *share) DEBUG(4,(" session request ok\n")); if (!cli_negprot(c)) { - d_printf("protocol negotiation failed\n"); + DEBUG(0,("protocol negotiation failed\n")); cli_shutdown(c); return NULL; } @@ -2415,45 +2224,34 @@ static struct cli_state *do_connect(const char *server, const char *share) password, strlen(password), workgroup)) { /* if a password was not supplied then try again with a null username */ - if (password[0] || !username[0] || use_kerberos || + if (password[0] || !username[0] || !cli_session_setup(c, "", "", 0, "", 0, workgroup)) { - d_printf("session setup failed: %s\n", cli_errstr(c)); + DEBUG(0,("session setup failed: %s\n", cli_errstr(c))); cli_shutdown(c); return NULL; } - d_printf("Anonymous login successful\n"); + DEBUG(0,("Anonymous login successful\n")); } - if (*c->server_domain) { + /* + * These next two lines are needed to emulate + * old client behaviour for people who have + * scripts based on client output. + * QUESTION ? Do we want to have a 'client compatibility + * mode to turn these on/off ? JRA. + */ + + if (*c->server_domain || *c->server_os || *c->server_type) DEBUG(1,("Domain=[%s] OS=[%s] Server=[%s]\n", c->server_domain,c->server_os,c->server_type)); - } else if (*c->server_os || *c->server_type){ - DEBUG(1,("OS=[%s] Server=[%s]\n", - c->server_os,c->server_type)); - } DEBUG(4,(" session setup ok\n")); if (!cli_send_tconX(c, sharename, "?????", password, strlen(password)+1)) { - pstring full_share; - - /* - * Some servers require \\server\share for the share - * while others are happy with share as we gave above - * Lets see if we give it the long form if it works - */ - pstrcpy(full_share, "\\\\"); - pstrcat(full_share, server); - pstrcat(full_share, "\\"); - pstrcat(full_share, sharename); - if (!cli_send_tconX(c, full_share, "?????", password, - strlen(password) + 1)) { - - d_printf("tree connect failed: %s\n", cli_errstr(c)); - cli_shutdown(c); - return NULL; - } + DEBUG(0,("tree connect failed: %s\n", cli_errstr(c))); + cli_shutdown(c); + return NULL; } DEBUG(4,(" tconx ok\n")); @@ -2465,25 +2263,23 @@ static struct cli_state *do_connect(const char *server, const char *share) /**************************************************************************** process commands from the client ****************************************************************************/ -static int process(char *base_directory) +static BOOL process(char *base_directory) { - int rc = 0; - cli = do_connect(desthost, service); if (!cli) { - return 1; + return(False); } if (*base_directory) do_cd(base_directory); if (cmdstr) { - rc = process_command_string(cmdstr); + process_command_string(cmdstr); } else { process_stdin(); } cli_shutdown(cli); - return rc; + return(True); } /**************************************************************************** @@ -2491,35 +2287,34 @@ usage on the program ****************************************************************************/ static void usage(char *pname) { - d_printf("Usage: %s service <password> [options]", pname); - - d_printf("\nVersion %s\n",VERSION); - d_printf("\t-s smb.conf pathname to smb.conf file\n"); - d_printf("\t-O socket_options socket options to use\n"); - d_printf("\t-R name resolve order use these name resolution services only\n"); - d_printf("\t-M host send a winpopup message to the host\n"); - d_printf("\t-i scope use this NetBIOS scope\n"); - d_printf("\t-N don't ask for a password\n"); - d_printf("\t-n netbios name. Use this name as my netbios name\n"); - d_printf("\t-d debuglevel set the debuglevel\n"); - d_printf("\t-P connect to service as a printer\n"); - d_printf("\t-p port connect to the specified port\n"); - d_printf("\t-l log basename. Basename for log/debug files\n"); - d_printf("\t-h Print this help message.\n"); - d_printf("\t-I dest IP use this IP to connect to\n"); - d_printf("\t-E write messages to stderr instead of stdout\n"); - d_printf("\t-k use kerberos (active directory) authentication\n"); - d_printf("\t-U username set the network username\n"); - d_printf("\t-L host get a list of shares available on a host\n"); - d_printf("\t-t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex}\n"); - d_printf("\t-m max protocol set the max protocol level\n"); - d_printf("\t-A filename get the credentials from a file\n"); - d_printf("\t-W workgroup set the workgroup name\n"); - d_printf("\t-T<c|x>IXFqgbNan command line tar\n"); - d_printf("\t-D directory start from directory\n"); - d_printf("\t-c command string execute semicolon separated commands\n"); - d_printf("\t-b xmit/send buffer changes the transmit/send buffer (default: 65520)\n"); - d_printf("\n"); + DEBUG(0,("Usage: %s service <password> [options]", pname)); + + DEBUG(0,("\nVersion %s\n",VERSION)); + DEBUG(0,("\t-s smb.conf pathname to smb.conf file\n")); + DEBUG(0,("\t-O socket_options socket options to use\n")); + DEBUG(0,("\t-R name resolve order use these name resolution services only\n")); + DEBUG(0,("\t-M host send a winpopup message to the host\n")); + DEBUG(0,("\t-i scope use this NetBIOS scope\n")); + DEBUG(0,("\t-N don't ask for a password\n")); + DEBUG(0,("\t-n netbios name. Use this name as my netbios name\n")); + DEBUG(0,("\t-d debuglevel set the debuglevel\n")); + DEBUG(0,("\t-P connect to service as a printer\n")); + DEBUG(0,("\t-p port connect to the specified port\n")); + DEBUG(0,("\t-l log basename. Basename for log/debug files\n")); + DEBUG(0,("\t-h Print this help message.\n")); + DEBUG(0,("\t-I dest IP use this IP to connect to\n")); + DEBUG(0,("\t-E write messages to stderr instead of stdout\n")); + DEBUG(0,("\t-U username set the network username\n")); + DEBUG(0,("\t-L host get a list of shares available on a host\n")); + DEBUG(0,("\t-t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex}\n")); + DEBUG(0,("\t-m max protocol set the max protocol level\n")); + DEBUG(0,("\t-A filename get the credentials from a file\n")); + DEBUG(0,("\t-W workgroup set the workgroup name\n")); + DEBUG(0,("\t-T<c|x>IXFqgbNan command line tar\n")); + DEBUG(0,("\t-D directory start from directory\n")); + DEBUG(0,("\t-c command string execute semicolon separated commands\n")); + DEBUG(0,("\t-b xmit/send buffer changes the transmit/send buffer (default: 65520)\n")); + DEBUG(0,("\n")); } @@ -2633,27 +2428,22 @@ static int do_message_op(void) { struct in_addr ip; struct nmb_name called, calling; - fstring server_name; - char name_type_hex[10]; + + zero_ip(&ip); make_nmb_name(&calling, global_myname, 0x0); make_nmb_name(&called , desthost, name_type); - safe_strcpy(server_name, desthost, sizeof(server_name)); - snprintf(name_type_hex, sizeof(name_type_hex), "#%X", name_type); - safe_strcat(server_name, name_type_hex, sizeof(server_name)); - - zero_ip(&ip); + zero_ip(&ip); if (have_ip) ip = dest_ip; - if (!(cli=cli_initialise(NULL)) || (cli_set_port(cli, port) != port) || - !cli_connect(cli, server_name, &ip)) { - d_printf("Connection to %s failed\n", desthost); + if (!(cli=cli_initialise(NULL)) || (cli_set_port(cli, port) == 0) || !cli_connect(cli, desthost, &ip)) { + DEBUG(0,("Connection to %s failed\n", desthost)); return 1; } if (!cli_session_request(cli, &calling, &called)) { - d_printf("session request failed\n"); + DEBUG(0,("session request failed\n")); cli_shutdown(cli); return 1; } @@ -2665,27 +2455,6 @@ static int do_message_op(void) } -/** - * Process "-L hostname" option. - * - * We don't actually do anything yet -- we just stash the name in a - * global variable and do the query when all options have been read. - **/ -static void remember_query_host(const char *arg, - pstring query_host) -{ - char *slash; - - while (*arg == '\\' || *arg == '/') - arg++; - pstrcpy(query_host, arg); - if ((slash = strchr(query_host, '/')) - || (slash = strchr(query_host, '\\'))) { - *slash = 0; - } -} - - /**************************************************************************** main program ****************************************************************************/ @@ -2694,17 +2463,17 @@ static void remember_query_host(const char *arg, fstring base_directory; char *pname = argv[0]; int opt; + extern FILE *dbf; extern char *optarg; extern int optind; - int old_debug; pstring query_host; BOOL message = False; extern char tar_type; + static pstring servicesf = CONFIGFILE; pstring term_code; pstring new_name_resolve_order; pstring logfile; char *p; - int rc = 0; #ifdef KANJI pstrcpy(term_code, KANJI); @@ -2730,15 +2499,34 @@ static void remember_query_host(const char *arg, for (opt = 1; opt < argc; opt++) { if (strcmp(argv[opt], "-E") == 0) - dbf = x_stderr; + dbf = stderr; else if(strncmp(argv[opt], "-s", 2) == 0) { if(argv[opt][2] != '\0') - pstrcpy(dyn_CONFIGFILE, &argv[opt][2]); + pstrcpy(servicesf, &argv[opt][2]); else if(argv[opt+1] != NULL) { /* * At least one more arg left. */ - pstrcpy(dyn_CONFIGFILE, argv[opt+1]); + pstrcpy(servicesf, argv[opt+1]); + } else { + usage(pname); + exit(1); + } + } + else if(strncmp(argv[opt], "-d", 2) == 0) { + if(argv[opt][2] != '\0') { + if (argv[opt][2] == 'A') + DEBUGLEVEL = 10000; + else + DEBUGLEVEL = atoi(&argv[opt][2]); + } else if(argv[opt+1] != NULL) { + /* + * At least one more arg left. + */ + if (argv[opt+1][0] == 'A') + DEBUGLEVEL = 10000; + else + DEBUGLEVEL = atoi(argv[opt+1]); } else { usage(pname); exit(1); @@ -2746,15 +2534,21 @@ static void remember_query_host(const char *arg, } } + TimeInit(); + charset_initialise(); + in_client = True; /* Make sure that we tell lp_load we are */ - old_debug = DEBUGLEVEL; - if (!lp_load(dyn_CONFIGFILE,True,False,False)) { - fprintf(stderr, "%s: Can't load %s - run testparm to debug it\n", - prog_name, dyn_CONFIGFILE); + if (!lp_load(servicesf,True,False,False)) { + fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf); } - DEBUGLEVEL = old_debug; + codepage_initialise(lp_client_code_page()); + +#ifdef WITH_SSL + sslutil_init(0); +#endif + pstrcpy(workgroup,lp_workgroup()); load_interfaces(); @@ -2767,12 +2561,13 @@ static void remember_query_host(const char *arg, /* modification to support userid%passwd syntax in the USER var 25.Aug.97, jdblair@uab.edu */ - if ((p=strchr_m(username,'%'))) { + if ((p=strchr(username,'%'))) { *p = 0; pstrcpy(password,p+1); got_pass = True; - memset(strchr_m(getenv("USER"),'%')+1,'X',strlen(password)); + memset(strchr(getenv("USER"),'%')+1,'X',strlen(password)); } + strupper(username); } /* modification to support PASSWD environmental var @@ -2789,6 +2584,7 @@ static void remember_query_host(const char *arg, if (*username == 0 && getenv("LOGNAME")) { pstrcpy(username,getenv("LOGNAME")); + strupper(username); } if (*username == 0) { @@ -2799,13 +2595,7 @@ static void remember_query_host(const char *arg, usage(pname); exit(1); } - - /* FIXME: At the moment, if the user should happen to give the - * options ahead of the service name (in standard Unix - * fashion) then smbclient just spits out the usage message - * with no explanation of what in particular was wrong. Is - * there any reason we can't just parse out the service name - * and password after running getopt?? -- mbp */ + if (*argv[1] != '-') { pstrcpy(service,argv[1]); /* Convert any '/' characters in the service name to '\' characters */ @@ -2815,7 +2605,7 @@ static void remember_query_host(const char *arg, if (count_chars(service,'\\') < 3) { usage(pname); - d_printf("\n%s: Not enough '\\' characters in service\n",service); + printf("\n%s: Not enough '\\' characters in service\n",service); exit(1); } @@ -2829,10 +2619,10 @@ static void remember_query_host(const char *arg, } while ((opt = - getopt(argc, argv,"s:O:R:M:i:Nn:d:Pp:l:hI:EU:L:t:m:W:T:D:c:b:A:k")) != EOF) { + getopt(argc, argv,"s:O:R:M:i:Nn:d:Pp:l:hI:EU:L:t:m:W:T:D:c:b:A:")) != EOF) { switch (opt) { case 's': - pstrcpy(dyn_CONFIGFILE, optarg); + pstrcpy(servicesf, optarg); break; case 'O': pstrcpy(user_socket_options,optarg); @@ -2887,40 +2677,39 @@ static void remember_query_host(const char *arg, } break; case 'E': - display_set_stderr(); - dbf = x_stderr; + dbf = stderr; break; case 'U': { char *lp; pstrcpy(username,optarg); - if ((lp=strchr_m(username,'%'))) { + if ((lp=strchr(username,'%'))) { *lp = 0; pstrcpy(password,lp+1); got_pass = True; - memset(strchr_m(optarg,'%')+1,'X',strlen(password)); + memset(strchr(optarg,'%')+1,'X',strlen(password)); } } break; case 'A': { - XFILE *auth; + FILE *auth; fstring buf; uint16 len = 0; char *ptr, *val, *param; - if ((auth=x_fopen(optarg, O_RDONLY, 0)) == NULL) + if ((auth=sys_fopen(optarg, "r")) == NULL) { /* fail if we can't open the credentials file */ - d_printf("ERROR: Unable to open credentials file!\n"); + DEBUG(0,("ERROR: Unable to open credentials file!\n")); exit (-1); } - while (!x_feof(auth)) + while (!feof(auth)) { /* get a line from the file */ - if (!x_fgets(buf, sizeof(buf), auth)) + if (!fgets (buf, sizeof(buf), auth)) continue; len = strlen(buf); @@ -2935,7 +2724,7 @@ static void remember_query_host(const char *arg, /* break up the line into parameter & value. will need to eat a little whitespace possibly */ param = buf; - if (!(ptr = strchr_m (buf, '='))) + if (!(ptr = strchr (buf, '='))) continue; val = ptr+1; *ptr = '\0'; @@ -2955,12 +2744,15 @@ static void remember_query_host(const char *arg, pstrcpy(workgroup,val); memset(buf, 0, sizeof(buf)); } - x_fclose(auth); + fclose(auth); } break; case 'L': - remember_query_host(optarg, query_host); + p = optarg; + while(*p == '\\' || *p == '/') + p++; + pstrcpy(query_host,p); break; case 't': pstrcpy(term_code, optarg); @@ -2986,15 +2778,6 @@ static void remember_query_host(const char *arg, case 'b': io_bufsize = MAX(1, atoi(optarg)); break; - case 'k': -#ifdef HAVE_KRB5 - use_kerberos = True; - got_pass = True; -#else - d_printf("No kerberos support compiled in\n"); - exit(1); -#endif - break; default: usage(pname); exit(1); @@ -3006,6 +2789,9 @@ static void remember_query_host(const char *arg, if(*new_name_resolve_order) lp_set_name_resolve_order(new_name_resolve_order); + if (*term_code) + interpret_coding_system(term_code); + if (!tar_type && !*query_host && !*service && !message) { usage(pname); exit(1); @@ -3019,7 +2805,7 @@ static void remember_query_host(const char *arg, return do_tar_op(base_directory); } - if ((p=strchr_m(query_host,'#'))) { + if ((p=strchr(query_host,'#'))) { *p = 0; p++; sscanf(p, "%x", &name_type); @@ -3033,9 +2819,9 @@ static void remember_query_host(const char *arg, return do_message_op(); } - if (process(base_directory)) { - return 1; + if (!process(base_directory)) { + return(1); } - return rc; + return(0); } diff --git a/source/client/clitar.c b/source/client/clitar.c index c453cfbb548..50a46c70007 100644 --- a/source/client/clitar.c +++ b/source/client/clitar.c @@ -1,5 +1,6 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 1.9. Tar Extensions Copyright (C) Ricky Poulten 1995-1998 Copyright (C) Richard Sharpe 1998 @@ -37,7 +38,6 @@ #include "includes.h" #include "clitar.h" -#include "../client/client_proto.h" static int clipfind(char **aret, int ret, char *tok); @@ -66,8 +66,11 @@ typedef struct } stack; +stack dir_stack = {NULL, 0}; /* Want an empty stack */ + #define SEPARATORS " \t\n\r" extern struct cli_state *cli; +extern FILE *dbf; /* These defines are for the do_setrattr routine, to indicate * setting and reseting of file attributes in the function call */ @@ -84,25 +87,25 @@ static char *tarbuf, *buffer_p; static int tp, ntarf, tbufsiz; static double ttarf; /* Incremental mode */ -static BOOL tar_inc=False; +BOOL tar_inc=False; /* Reset archive bit */ -static BOOL tar_reset=False; +BOOL tar_reset=False; /* Include / exclude mode (true=include, false=exclude) */ -static BOOL tar_excl=True; +BOOL tar_excl=True; /* use regular expressions for search on file names */ -static BOOL tar_re_search=False; +BOOL tar_re_search=False; #ifdef HAVE_REGEX_H regex_t *preg; #endif /* Do not dump anything, just calculate sizes */ -static BOOL dry_run=False; +BOOL dry_run=False; /* Dump files with System attribute */ -static BOOL tar_system=True; +BOOL tar_system=True; /* Dump files with Hidden attribute */ -static BOOL tar_hidden=True; +BOOL tar_hidden=True; /* Be noisy - make a catalogue */ -static BOOL tar_noisy=True; -static BOOL tar_real_noisy=False; /* Don't want to be really noisy by default */ +BOOL tar_noisy=True; +BOOL tar_real_noisy=False; /* Don't want to be really noisy by default */ char tar_type='\0'; static char **cliplist=NULL; @@ -117,9 +120,10 @@ extern int max_xmit; extern pstring cur_dir; extern int get_total_time_ms; extern int get_total_size; +extern int Protocol; -static int blocksize=20; -static int tarhandle; +int blocksize=20; +int tarhandle; static void writetarheader(int f, char *aname, int size, time_t mtime, char *amode, unsigned char ftype); @@ -416,12 +420,31 @@ static void dotareof(int f) ****************************************************************************/ static void fixtarname(char *tptr, char *fp, int l) { - /* add a '.' to start of file name, convert from ugly dos \'s in path - * to lovely unix /'s :-} */ - *tptr++='.'; - - safe_strcpy(tptr, fp, l); - string_replace(tptr, '\\', '/'); + /* add a '.' to start of file name, convert from ugly dos \'s in path + * to lovely unix /'s :-} */ + + *tptr++='.'; + + while (l > 0) { + int skip = get_character_len(*fp); + if(skip != 0) { + if (skip == 2) { + *tptr++ = *fp++; + *tptr++ = *fp++; + l -= 2; + } else if (skip == 1) { + *tptr++ = *fp++; + l--; + } + } else if (*fp == '\\') { + *tptr++ = '/'; + fp++; + l--; + } else { + *tptr++ = *fp++; + l--; + } + } } /**************************************************************************** @@ -492,7 +515,7 @@ static int strslashcmp(char *s1, char *s2) if (!*s2 && (*s1 == '/' || *s1 == '\\') && !*(s1+1)) return 0; /* check for s1 is an "initial" string of s2 */ - if ((*s2 == '/' || *s2 == '\\') && !*s1) return 0; + if (*s2 == '/' || *s2 == '\\') return 0; return *s1-*s2; } @@ -528,7 +551,7 @@ static BOOL ensurepath(char *fname) safe_strcpy(ffname, fname, strlen(fname)); /* do a `basename' on ffname, so don't try and make file name directory */ - if ((basehack=strrchr_m(ffname, '\\')) == NULL) + if ((basehack=strrchr(ffname, '\\')) == NULL) return True; else *basehack='\0'; @@ -853,25 +876,43 @@ Convert from UNIX to DOS file names ***************************************************************************/ static void unfixtarname(char *tptr, char *fp, int l, BOOL first) { - /* remove '.' from start of file name, convert from unix /'s to - * dos \'s in path. Kill any absolute path names. But only if first! - */ - - DEBUG(5, ("firstb=%lX, secondb=%lX, len=%i\n", (long)tptr, (long)fp, l)); - - if (first) { - if (*fp == '.') { - fp++; - l--; - } - if (*fp == '\\' || *fp == '/') { - fp++; - l--; - } - } + /* remove '.' from start of file name, convert from unix /'s to + * dos \'s in path. Kill any absolute path names. But only if first! + */ - safe_strcpy(tptr, fp, l); - string_replace(tptr, '/', '\\'); + DEBUG(5, ("firstb=%lX, secondb=%lX, len=%i\n", (long)tptr, (long)fp, l)); + + if (first) { + if (*fp == '.') { + fp++; + l--; + } + if (*fp == '\\' || *fp == '/') { + fp++; + l--; + } + } + + while (l > 0) { + int skip = get_character_len(*fp); + if(skip != 0) { + if (skip == 2) { + *tptr++ = *fp++; + *tptr++ = *fp++; + l -= 2; + } else if (skip == 1) { + *tptr++ = *fp++; + l--; + } + } else if (*fp == '/') { + *tptr++ = '\\'; + fp++; + l--; + } else { + *tptr++ = *fp++; + l--; + } + } } @@ -1275,38 +1316,36 @@ static void do_tarput(void) /**************************************************************************** Blocksize command ***************************************************************************/ -int cmd_block(void) +void cmd_block(void) { fstring buf; int block; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) + if (!next_token(NULL,buf,NULL,sizeof(buf))) { DEBUG(0, ("blocksize <n>\n")); - return 1; + return; } block=atoi(buf); if (block < 0 || block > 65535) { DEBUG(0, ("blocksize out of range")); - return 1; + return; } blocksize=block; DEBUG(2,("blocksize is now %d\n", blocksize)); - - return 0; } /**************************************************************************** command to set incremental / reset mode ***************************************************************************/ -int cmd_tarmode(void) +void cmd_tarmode(void) { fstring buf; - while (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + while (next_token(NULL,buf,NULL,sizeof(buf))) { if (strequal(buf, "full")) tar_inc=False; else if (strequal(buf, "inc")) @@ -1337,13 +1376,12 @@ int cmd_tarmode(void) tar_reset ? "reset" : "noreset", tar_noisy ? "verbose" : "quiet")); - return 0; } /**************************************************************************** Feeble attrib command ***************************************************************************/ -int cmd_setmode(void) +void cmd_setmode(void) { char *q; fstring buf; @@ -1353,16 +1391,16 @@ int cmd_setmode(void) attra[0] = attra[1] = 0; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) + if (!next_token(NULL,buf,NULL,sizeof(buf))) { DEBUG(0, ("setmode <filename> <[+|-]rsha>\n")); - return 1; + return; } safe_strcpy(fname, cur_dir, sizeof(pstring)); safe_strcat(fname, buf, sizeof(pstring)); - while (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + while (next_token(NULL,buf,NULL,sizeof(buf))) { q=buf; while(*q) @@ -1380,47 +1418,43 @@ int cmd_setmode(void) case 'a': attra[direct]|=aARCH; break; default: DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n")); - return 1; + return; } } if (attra[ATTRSET]==0 && attra[ATTRRESET]==0) { DEBUG(0, ("setmode <filename> <[+|-]rsha>\n")); - return 1; + return; } DEBUG(2, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET])); do_setrattr(fname, attra[ATTRSET], ATTRSET); do_setrattr(fname, attra[ATTRRESET], ATTRRESET); - - return 0; } /**************************************************************************** Principal command for creating / extracting ***************************************************************************/ -int cmd_tar(void) +void cmd_tar(void) { fstring buf; char **argl; int argcl; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) + if (!next_token(NULL,buf,NULL,sizeof(buf))) { DEBUG(0,("tar <c|x>[IXbgan] <filename>\n")); - return 1; + return; } argl=toktocliplist(&argcl, NULL); if (!tar_parseargs(argcl, argl, buf, 0)) - return 1; + return; process_tar(); SAFE_FREE(argl); - - return 0; } /**************************************************************************** @@ -1453,7 +1487,7 @@ int process_tar(void) *(cliplist[i]+strlen(cliplist[i])-1)='\0'; } - if (strrchr_m(cliplist[i], '\\')) { + if (strrchr(cliplist[i], '\\')) { pstring saved_dir; safe_strcpy(saved_dir, cur_dir, sizeof(pstring)); @@ -1465,7 +1499,7 @@ int process_tar(void) safe_strcat(tarmac, cliplist[i], sizeof(pstring)); } safe_strcpy(cur_dir, tarmac, sizeof(pstring)); - *(strrchr_m(cur_dir, '\\')+1)='\0'; + *(strrchr(cur_dir, '\\')+1)='\0'; DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac)); do_list(tarmac,attribute,do_tar, False, True); @@ -1516,13 +1550,13 @@ static int clipfind(char **aret, int ret, char *tok) if (aret==NULL) return 0; /* ignore leading slashes or dots in token */ - while(strchr_m("/\\.", *tok)) tok++; + while(strchr("/\\.", *tok)) tok++; while(ret--) { char *pkey=*aret++; /* ignore leading slashes or dots in list */ - while(strchr_m("/\\.", *pkey)) pkey++; + while(strchr("/\\.", *pkey)) pkey++; if (!strslashcmp(pkey, tok)) return 1; } @@ -1536,7 +1570,7 @@ accordingly. ***************************************************************************/ static int read_inclusion_file(char *filename) { - XFILE *inclusion = NULL; + FILE *inclusion = NULL; char buf[MAXPATHLEN + 1]; char *inclusion_buffer = NULL; int inclusion_buffer_size = 0; @@ -1548,7 +1582,7 @@ static int read_inclusion_file(char *filename) clipn = 0; buf[MAXPATHLEN] = '\0'; /* guarantee null-termination */ - if ((inclusion = x_fopen(filename, O_RDONLY, 0)) == NULL) { + if ((inclusion = sys_fopen(filename, "r")) == NULL) { /* XXX It would be better to include a reason for failure, but without * autoconf, it's hard to use strerror, sys_errlist, etc. */ @@ -1556,7 +1590,7 @@ static int read_inclusion_file(char *filename) return 0; } - while ((! error) && (x_fgets(buf, sizeof(buf)-1, inclusion))) { + while ((! error) && (fgets(buf, sizeof(buf)-1, inclusion))) { if (inclusion_buffer == NULL) { inclusion_buffer_size = 1024; if ((inclusion_buffer = malloc(inclusion_buffer_size)) == NULL) { @@ -1575,19 +1609,18 @@ static int read_inclusion_file(char *filename) inclusion_buffer_size *= 2; ib = Realloc(inclusion_buffer,inclusion_buffer_size); if (! ib) { - DEBUG(0,("failure enlarging inclusion buffer to %d bytes\n", - inclusion_buffer_size)); - error = 1; - break; - } - else inclusion_buffer = ib; + DEBUG(0,("failure enlarging inclusion buffer to %d bytes\n", inclusion_buffer_size)); + error = 1; + break; + } else + inclusion_buffer = ib; } safe_strcpy(inclusion_buffer + inclusion_buffer_sofar, buf, inclusion_buffer_size - inclusion_buffer_sofar); inclusion_buffer_sofar += strlen(buf) + 1; clipn++; } - x_fclose(inclusion); + fclose(inclusion); if (! error) { /* Allocate an array of clipn + 1 char*'s for cliplist */ @@ -1608,7 +1641,7 @@ static int read_inclusion_file(char *filename) } else { unfixtarname(tmpstr, p, strlen(p) + 1, True); cliplist[i] = tmpstr; - if ((p = strchr_m(p, '\000')) == NULL) { + if ((p = strchr(p, '\000')) == NULL) { DEBUG(0,("INTERNAL ERROR: inclusion_buffer is of unexpected contents.\n")); abort(); } @@ -1619,7 +1652,9 @@ static int read_inclusion_file(char *filename) } } - SAFE_FREE(inclusion_buffer); + if (inclusion_buffer) { + SAFE_FREE(inclusion_buffer); + } if (error) { if (cliplist) { char **pp; @@ -1683,7 +1718,7 @@ int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind) SMB_STRUCT_STAT stbuf; extern time_t newer_than; - if (sys_stat(argv[Optind], &stbuf) == 0) { + if (sys_stat(dos_to_unix_static(argv[Optind]), &stbuf) == 0) { newer_than = stbuf.st_mtime; DEBUG(1,("Getting files newer than %s", asctime(LocalTime(&newer_than)))); @@ -1828,7 +1863,7 @@ int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind) * tar output */ if (tarhandle == 1) - dbf = x_stderr; + dbf = stderr; } else { if (tar_type=='c' && (dry_run || strcmp(argv[Optind], "/dev/null")==0)) { diff --git a/source/client/smbmnt.c b/source/client/smbmnt.c index ce406179cfd..36248987b1e 100644 --- a/source/client/smbmnt.c +++ b/source/client/smbmnt.c @@ -111,13 +111,13 @@ fullpath(const char *p) OK then we change into that directory - this prevents race conditions */ static int mount_ok(char *mount_point) { - struct stat st; + SMB_STRUCT_STAT st; if (chdir(mount_point) != 0) { return -1; } - if (stat(".", &st) != 0) { + if (sys_stat(".", &st) != 0) { return -1; } @@ -148,8 +148,8 @@ do_mount(char *share_name, unsigned int flags, struct smb_mount_data *data) uname(&uts); release = uts.release; - major = strtok(release, "."); - minor = strtok(NULL, "."); + major = strsep(&release, "."); + minor = strsep(&release, "."); if (major && minor && atoi(major) == 2 && atoi(minor) < 4) { /* < 2.4, assume struct */ data1 = (char *) data; diff --git a/source/client/smbmount.c b/source/client/smbmount.c index 0db990e8bd6..40e21e1eb1d 100644 --- a/source/client/smbmount.c +++ b/source/client/smbmount.c @@ -1,5 +1,6 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 2.0. SMBFS mount program Copyright (C) Andrew Tridgell 1999 @@ -29,6 +30,7 @@ extern BOOL in_client; extern pstring user_socket_options; extern BOOL append_log; +extern fstring remote_machine; static pstring credentials; static pstring my_netbios_name; @@ -41,7 +43,7 @@ static pstring options; static struct in_addr dest_ip; static BOOL have_ip; -static int smb_port = 0; +static int smb_port = 139; static BOOL got_pass; static uid_t mount_uid; static gid_t mount_gid; @@ -109,7 +111,8 @@ static void usr1_handler(int x) /***************************************************** return a connection to a server *******************************************************/ -static struct cli_state *do_connection(char *the_service) + +static struct cli_state *do_connection(char *svc_name) { struct cli_state *c; struct nmb_name called, calling; @@ -118,13 +121,13 @@ static struct cli_state *do_connection(char *the_service) pstring server; char *share; - if (the_service[0] != '\\' || the_service[1] != '\\') { + if (svc_name[0] != '\\' || svc_name[1] != '\\') { usage(); exit(1); } - pstrcpy(server, the_service+2); - share = strchr_m(server,'\\'); + pstrcpy(server, svc_name+2); + share = strchr(server,'\\'); if (!share) { usage(); exit(1); @@ -138,28 +141,25 @@ static struct cli_state *do_connection(char *the_service) make_nmb_name(&called , server, 0x20); again: - zero_ip(&ip); + zero_ip(&ip); if (have_ip) ip = dest_ip; /* have to open a new connection */ - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, smb_port) != smb_port) || + if (!(c=cli_initialise(NULL)) || (cli_set_port(c, smb_port) == 0) || !cli_connect(c, server_n, &ip)) { - DEBUG(0,("%d: Connection to %s failed\n", sys_getpid(), server_n)); + DEBUG(0,("%d: Connection to %s failed\n", getpid(), server_n)); if (c) { cli_shutdown(c); } return NULL; } - /* SPNEGO doesn't work till we get NTSTATUS error support */ - c->use_spnego = False; - if (!cli_session_request(c, &calling, &called)) { char *p; DEBUG(0,("%d: session request to %s failed (%s)\n", - sys_getpid(), called.name, cli_errstr(c))); + getpid(), called.name, cli_errstr(c))); cli_shutdown(c); - if ((p=strchr_m(called.name, '.'))) { + if ((p=strchr(called.name, '.'))) { *p = 0; goto again; } @@ -170,10 +170,10 @@ static struct cli_state *do_connection(char *the_service) return NULL; } - DEBUG(4,("%d: session request ok\n", sys_getpid())); + DEBUG(4,("%d: session request ok\n", getpid())); if (!cli_negprot(c)) { - DEBUG(0,("%d: protocol negotiation failed\n", sys_getpid())); + DEBUG(0,("%d: protocol negotiation failed\n", getpid())); cli_shutdown(c); return NULL; } @@ -186,37 +186,37 @@ static struct cli_state *do_connection(char *the_service) } /* This should be right for current smbfs. Future versions will support - large files as well as unicode and oplocks. */ + large files as well as unicode and oplocks. */ c->capabilities &= ~(CAP_UNICODE | CAP_LARGE_FILES | CAP_NT_SMBS | - CAP_NT_FIND | CAP_STATUS32 | CAP_LEVEL_II_OPLOCKS); + CAP_NT_FIND | CAP_STATUS32 | CAP_LEVEL_II_OPLOCKS); c->force_dos_errors = True; if (!cli_session_setup(c, username, password, strlen(password), password, strlen(password), workgroup)) { /* if a password was not supplied then try again with a - null username */ + null username */ if (password[0] || !username[0] || - !cli_session_setup(c, "", "", 0, "", 0, workgroup)) { + !cli_session_setup(c, "", "", 0, "", 0, workgroup)) { DEBUG(0,("%d: session setup failed: %s\n", - sys_getpid(), cli_errstr(c))); + getpid(), cli_errstr(c))); cli_shutdown(c); return NULL; } DEBUG(0,("Anonymous login successful\n")); } - DEBUG(4,("%d: session setup ok\n", sys_getpid())); + DEBUG(4,("%d: session setup ok\n", getpid())); if (!cli_send_tconX(c, share, "?????", password, strlen(password)+1)) { DEBUG(0,("%d: tree connect failed: %s\n", - sys_getpid(), cli_errstr(c))); + getpid(), cli_errstr(c))); cli_shutdown(c); return NULL; } - DEBUG(4,("%d: tconx ok\n", sys_getpid())); + DEBUG(4,("%d: tconx ok\n", getpid())); got_pass = True; @@ -246,12 +246,12 @@ static void smb_umount(char *mount_point) */ if (umount(mount_point) != 0) { DEBUG(0,("%d: Could not umount %s: %s\n", - sys_getpid(), mount_point, strerror(errno))); + getpid(), mount_point, strerror(errno))); return; } if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) { - DEBUG(0,("%d: Can't get "MOUNTED"~ lock file", sys_getpid())); + DEBUG(0,("%d: Can't get "MOUNTED"~ lock file", getpid())); return; } @@ -259,7 +259,7 @@ static void smb_umount(char *mount_point) if ((mtab = setmntent(MOUNTED, "r")) == NULL) { DEBUG(0,("%d: Can't open " MOUNTED ": %s\n", - sys_getpid(), strerror(errno))); + getpid(), strerror(errno))); return; } @@ -267,7 +267,7 @@ static void smb_umount(char *mount_point) if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) { DEBUG(0,("%d: Can't open " MOUNTED_TMP ": %s\n", - sys_getpid(), strerror(errno))); + getpid(), strerror(errno))); endmntent(mtab); return; } @@ -282,7 +282,7 @@ static void smb_umount(char *mount_point) if (fchmod (fileno (new_mtab), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) { DEBUG(0,("%d: Error changing mode of %s: %s\n", - sys_getpid(), MOUNTED_TMP, strerror(errno))); + getpid(), MOUNTED_TMP, strerror(errno))); return; } @@ -290,12 +290,12 @@ static void smb_umount(char *mount_point) if (rename(MOUNTED_TMP, MOUNTED) < 0) { DEBUG(0,("%d: Cannot rename %s to %s: %s\n", - sys_getpid(), MOUNTED, MOUNTED_TMP, strerror(errno))); + getpid(), MOUNTED, MOUNTED_TMP, strerror(errno))); return; } if (unlink(MOUNTED"~") == -1) { - DEBUG(0,("%d: Can't remove "MOUNTED"~", sys_getpid())); + DEBUG(0,("%d: Can't remove "MOUNTED"~", getpid())); return; } } @@ -307,7 +307,7 @@ static void smb_umount(char *mount_point) * not exit after open_sockets() or send_login() errors, * as the smbfs mount would then have no way to recover. */ -static void send_fs_socket(char *the_service, char *mount_point, struct cli_state *c) +static void send_fs_socket(char *svc_name, char *mount_point, struct cli_state *c) { int fd, closed = 0, res = 1; pid_t parentpid = getppid(); @@ -318,7 +318,7 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat while (1) { if ((fd = open(mount_point, O_RDONLY)) < 0) { DEBUG(0,("mount.smbfs[%d]: can't open %s\n", - sys_getpid(), mount_point)); + getpid(), mount_point)); break; } @@ -338,7 +338,7 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat res = ioctl(fd, SMB_IOC_NEWCONN, &conn_options); if (res != 0) { DEBUG(0,("mount.smbfs[%d]: ioctl failed, res=%d\n", - sys_getpid(), res)); + getpid(), res)); close(fd); break; } @@ -376,11 +376,11 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat } /* here we are no longer interactive */ - set_remote_machine_name("smbmount"); /* sneaky ... */ + pstrcpy(remote_machine, "smbmount"); /* sneaky ... */ setup_logging("mount.smbfs", False); append_log = True; reopen_logs(); - DEBUG(0, ("mount.smbfs: entering daemon mode for service %s, pid=%d\n", the_service, sys_getpid())); + DEBUG(0, ("mount.smbfs: entering daemon mode for service %s, pid=%d\n", svc_name, getpid())); closed = 1; } @@ -390,20 +390,20 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat while (!c) { CatchSignal(SIGUSR1, &usr1_handler); pause(); - DEBUG(2,("mount.smbfs[%d]: got signal, getting new socket\n", sys_getpid())); - c = do_connection(the_service); + DEBUG(2,("mount.smbfs[%d]: got signal, getting new socket\n", getpid())); + c = do_connection(svc_name); } } smb_umount(mount_point); - DEBUG(2,("mount.smbfs[%d]: exit\n", sys_getpid())); + DEBUG(2,("mount.smbfs[%d]: exit\n", getpid())); exit(1); } -/** - * Mount a smbfs - **/ +/**************************************************************************** +mount smbfs +****************************************************************************/ static void init_mount(void) { char mount_point[MAXPATHLEN+1]; @@ -473,22 +473,13 @@ static void init_mount(void) } if (sys_fork() == 0) { - char *smbmnt_path; - - asprintf(&smbmnt_path, "%s/smbmnt", dyn_BINDIR); - - if (file_exist(smbmnt_path, NULL)) { - execv(smbmnt_path, args); - fprintf(stderr, - "smbfs/init_mount: execv of %s failed. Error was %s.", - smbmnt_path, strerror(errno)); + if (file_exist(BINDIR "/smbmnt", NULL)) { + execv(BINDIR "/smbmnt", args); + fprintf(stderr,"execv of %s failed. Error was %s.", BINDIR "/smbmnt", strerror(errno)); } else { execvp("smbmnt", args); - fprintf(stderr, - "smbfs/init_mount: execv of %s failed. Error was %s.", - "smbmnt", strerror(errno)); + fprintf(stderr,"execvp of smbmnt failed. Error was %s.", strerror(errno) ); } - free(smbmnt_path); exit(1); } @@ -713,7 +704,7 @@ static void parse_mount_smb(int argc, char **argv) */ for (opts = strtok(optarg, ","); opts; opts = strtok(NULL, ",")) { DEBUG(3, ("opts: %s\n", opts)); - if ((opteq = strchr_m(opts, '='))) { + if ((opteq = strchr(opts, '='))) { val = atoi(opteq + 1); *opteq = '\0'; @@ -721,13 +712,13 @@ static void parse_mount_smb(int argc, char **argv) !strcmp(opts, "logon")) { char *lp; pstrcpy(username,opteq+1); - if ((lp=strchr_m(username,'%'))) { + if ((lp=strchr(username,'%'))) { *lp = 0; pstrcpy(password,lp+1); got_pass = True; - memset(strchr_m(opteq+1,'%')+1,'X',strlen(password)); + memset(strchr(opteq+1,'%')+1,'X',strlen(password)); } - if ((lp=strchr_m(username,'/'))) { + if ((lp=strchr(username,'/'))) { *lp = 0; pstrcpy(workgroup,lp+1); } @@ -808,6 +799,7 @@ static void parse_mount_smb(int argc, char **argv) { extern char *optarg; extern int optind; + static pstring servicesf = CONFIGFILE; char *p; DEBUGLEVEL = 1; @@ -815,27 +807,19 @@ static void parse_mount_smb(int argc, char **argv) /* here we are interactive, even if run from autofs */ setup_logging("mount.smbfs",True); -#if 0 /* JRA - Urban says not needed ? */ - /* CLI_FORCE_ASCII=false makes smbmount negotiate unicode. The default - is to not announce any unicode capabilities as current smbfs does - not support it. */ - p = getenv("CLI_FORCE_ASCII"); - if (p && !strcmp(p, "false")) - unsetenv("CLI_FORCE_ASCII"); - else - setenv("CLI_FORCE_ASCII", "true", 1); -#endif - + TimeInit(); + charset_initialise(); + in_client = True; /* Make sure that we tell lp_load we are */ if (getenv("USER")) { pstrcpy(username,getenv("USER")); - if ((p=strchr_m(username,'%'))) { + if ((p=strchr(username,'%'))) { *p = 0; pstrcpy(password,p+1); got_pass = True; - memset(strchr_m(getenv("USER"),'%')+1,'X',strlen(password)); + memset(strchr(getenv("USER"),'%')+1,'X',strlen(password)); } strupper(username); } @@ -854,9 +838,9 @@ static void parse_mount_smb(int argc, char **argv) pstrcpy(username,getenv("LOGNAME")); } - if (!lp_load(dyn_CONFIGFILE,True,False,False)) { + if (!lp_load(servicesf,True,False,False)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", - dyn_CONFIGFILE); + servicesf); } parse_mount_smb(argc, argv); @@ -867,6 +851,8 @@ static void parse_mount_smb(int argc, char **argv) DEBUG(3,("mount.smbfs started (version %s)\n", VERSION)); + codepage_initialise(lp_client_code_page()); + if (*workgroup == 0) { pstrcpy(workgroup,lp_workgroup()); } diff --git a/source/client/smbspool.c b/source/client/smbspool.c index ecb5c311c54..64484f0aa99 100644 --- a/source/client/smbspool.c +++ b/source/client/smbspool.c @@ -1,9 +1,9 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 2.0. SMB backend for the Common UNIX Printing System ("CUPS") Copyright 1999 by Easy Software Products Copyright Andrew Tridgell 1994-1998 - Copyright Andrew Bartlett 2002 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -133,7 +133,7 @@ static int smb_print(struct cli_state *, char *, FILE *); * Extract the destination from the URI... */ - if ((sep = strrchr_m(uri, '@')) != NULL) + if ((sep = strrchr(uri, '@')) != NULL) { username = uri + 6; *sep++ = '\0'; @@ -144,7 +144,7 @@ static int smb_print(struct cli_state *, char *, FILE *); * Extract password as needed... */ - if ((password = strchr_m(username, ':')) != NULL) + if ((password = strchr(username, ':')) != NULL) *password++ = '\0'; else password = ""; @@ -156,7 +156,7 @@ static int smb_print(struct cli_state *, char *, FILE *); server = uri + 6; } - if ((sep = strchr_m(server, '/')) == NULL) + if ((sep = strchr(server, '/')) == NULL) { fputs("ERROR: Bad URI - need printer name!\n", stderr); return (1); @@ -165,7 +165,7 @@ static int smb_print(struct cli_state *, char *, FILE *); *sep++ = '\0'; printer = sep; - if ((sep = strchr_m(printer, '/')) != NULL) + if ((sep = strchr(printer, '/')) != NULL) { /* * Convert to smb://[username:password@]workgroup/server/printer... @@ -186,17 +186,22 @@ static int smb_print(struct cli_state *, char *, FILE *); setup_logging("smbspool", True); + TimeInit(); + charset_initialise(); + in_client = True; /* Make sure that we tell lp_load we are */ - if (!lp_load(dyn_CONFIGFILE, True, False, False)) + if (!lp_load(CONFIGFILE, True, False, False)) { - fprintf(stderr, "ERROR: Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE); + fprintf(stderr, "ERROR: Can't load %s - run testparm to debug it\n", CONFIGFILE); return (1); } if (workgroup == NULL) workgroup = lp_workgroup(); + codepage_initialise(lp_client_code_page()); + load_interfaces(); do @@ -272,27 +277,83 @@ smb_connect(char *workgroup, /* I - Workgroup */ char *password) /* I - Password */ { struct cli_state *c; /* New connection */ + struct nmb_name called, /* NMB name of server */ + calling; /* NMB name of client */ + struct in_addr ip; /* IP address of server */ pstring myname; /* Client name */ - NTSTATUS nt_status; + /* * Get the names and addresses of the client and server... */ get_myname(myname); - - nt_status = cli_full_connection(&c, myname, server, NULL, 0, share, "?????", - username, workgroup, password, 0); - - if (!NT_STATUS_IS_OK(nt_status)) { - fprintf(stderr, "ERROR: Connection failed with error %s\n", nt_errstr(nt_status)); - return NULL; + + zero_ip(&ip); + + make_nmb_name(&calling, myname, 0x0); + make_nmb_name(&called, server, 0x20); + + /* + * Open a new connection to the SMB server... + */ + + if ((c = cli_initialise(NULL)) == NULL) + { + fputs("ERROR: cli_initialise() failed...\n", stderr); + return (NULL); + } + + if (!cli_set_port(c, SMB_PORT)) + { + fputs("ERROR: cli_set_port() failed...\n", stderr); + return (NULL); + } + + if (!cli_connect(c, server, &ip)) + { + fputs("ERROR: cli_connect() failed...\n", stderr); + return (NULL); + } + + if (!cli_session_request(c, &calling, &called)) + { + fputs("ERROR: cli_session_request() failed...\n", stderr); + return (NULL); + } + + if (!cli_negprot(c)) + { + fputs("ERROR: SMB protocol negotiation failed\n", stderr); + cli_shutdown(c); + return (NULL); } - /* - * Return the new connection... - */ - + /* + * Do password stuff... + */ + + if (!cli_session_setup(c, username, + password, strlen(password), + password, strlen(password), + workgroup)) + { + fprintf(stderr, "ERROR: SMB session setup failed: %s\n", cli_errstr(c)); + return (NULL); + } + + if (!cli_send_tconX(c, share, "?????", + password, strlen(password)+1)) + { + fprintf(stderr, "ERROR: SMB tree connect failed: %s\n", cli_errstr(c)); + cli_shutdown(c); + return (NULL); + } + + /* + * Return the new connection... + */ + return (c); } diff --git a/source/client/testsmbc.c b/source/client/testsmbc.c deleted file mode 100644 index ec98774dcf5..00000000000 --- a/source/client/testsmbc.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB client library test program - Copyright (C) Andrew Tridgell 1998 - Copyright (C) Richard Sharpe 2000 - Copyright (C) John Terpsra 2000 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include <stdio.h> -#include <errno.h> -#include <sys/time.h> -#include <string.h> -#include <unistd.h> -#include <stdlib.h> -#include <libsmbclient.h> - -void auth_fn(const char *server, const char *share, - char *workgroup, int wgmaxlen, char *username, int unmaxlen, - char *password, int pwmaxlen) -{ - char temp[128]; - - fprintf(stdout, "Need password for //%s/%s\n", server, share); - - fprintf(stdout, "Enter workgroup: [%s] ", workgroup); - fgets(temp, sizeof(temp), stdin); - - if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */ - temp[strlen(temp) - 1] = 0x00; - - if (temp[0]) strncpy(workgroup, temp, wgmaxlen - 1); - - fprintf(stdout, "Enter username: [%s] ", username); - fgets(temp, sizeof(temp), stdin); - - if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */ - temp[strlen(temp) - 1] = 0x00; - - if (temp[0]) strncpy(username, temp, unmaxlen - 1); - - fprintf(stdout, "Enter password: [%s] ", password); - fgets(temp, sizeof(temp), stdin); - - if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */ - temp[strlen(temp) - 1] = 0x00; - - if (temp[0]) strncpy(password, temp, pwmaxlen - 1); - -} - -int global_id = 0; - -void print_list_fn(struct print_job_info *pji) -{ - - fprintf(stdout, "Print job: ID: %u, Prio: %u, Size: %u, User: %s, Name: %s\n", - pji->id, pji->priority, pji->size, pji->user, pji->name); - - global_id = pji->id; - -} - -int main(int argc, char *argv[]) -{ - int err, fd, dh1, dh2, dh3, dsize, dirc; - const char *file = "smb://samba/public/testfile.txt"; - const char *file2 = "smb://samba/public/testfile2.txt"; - char buff[256]; - char dirbuf[512]; - char *dirp; - struct stat st1, st2; - - err = smbc_init(auth_fn, 10); /* Initialize things */ - - if (err < 0) { - - fprintf(stderr, "Initializing the smbclient library ...: %s\n", strerror(errno)); - - } - - if (argc > 1) { - - /* Try to list the print jobs ... */ - - if (smbc_list_print_jobs("smb://samba/pclp", print_list_fn) < 0) { - - fprintf(stderr, "Could not list print jobs: %s, %d\n", strerror(errno), errno); - exit(1); - - } - - /* Try to delete the last job listed */ - - if (global_id > 0) { - - fprintf(stdout, "Trying to delete print job %u\n", global_id); - - if (smbc_unlink_print_job("smb://samba/pclp", global_id) < 0) { - - fprintf(stderr, "Failed to unlink job id %u, %s, %u\n", global_id, - strerror(errno), errno); - - exit(1); - - } - - } - - /* Try to print a file ... */ - - if (smbc_print_file("smb://samba/public/testfile2.txt", "smb://samba/pclp") < 0) { - - fprintf(stderr, "Failed to print job: %s %u\n", strerror(errno), errno); - exit(1); - - } - - /* Try to delete argv[1] as a file ... */ - - if (smbc_unlink(argv[1]) < 0) { - - fprintf(stderr, "Could not unlink: %s, %s, %d\n", - argv[1], strerror(errno), errno); - - exit(0); - - } - - if ((dh1 = smbc_opendir("smb://"))<1) { - - fprintf(stderr, "Could not open directory: smb://: %s\n", - strerror(errno)); - - exit(1); - - } - - if ((dh2 = smbc_opendir("smb://sambanet")) < 0) { - - fprintf(stderr, "Could not open directory: smb://sambanet: %s\n", - strerror(errno)); - - exit(1); - - } - - if ((dh3 = smbc_opendir("smb://samba")) < 0) { - - fprintf(stderr, "Could not open directory: smb://samba: %s\n", - strerror(errno)); - - exit(1); - - } - - fprintf(stdout, "Directory handles: %u, %u, %u\n", dh1, dh2, dh3); - - /* Now, list those directories, but in funny ways ... */ - - dirp = (char *)dirbuf; - - if ((dirc = smbc_getdents(dh1, (struct smbc_dirent *)dirp, - sizeof(dirbuf))) < 0) { - - fprintf(stderr, "Problems getting directory entries: %s\n", - strerror(errno)); - - exit(1); - - } - - /* Now, process the list of names ... */ - - fprintf(stdout, "Directory listing, size = %u\n", dirc); - - while (dirc > 0) { - - dsize = ((struct smbc_dirent *)dirp)->dirlen; - fprintf(stdout, "Dir Ent, Type: %u, Name: %s, Comment: %s\n", - ((struct smbc_dirent *)dirp)->smbc_type, - ((struct smbc_dirent *)dirp)->name, - ((struct smbc_dirent *)dirp)->comment); - - dirp += dsize; - (char *)dirc -= dsize; - - } - - dirp = (char *)dirbuf; - - if ((dirc = smbc_getdents(dh2, (struct smbc_dirent *)dirp, - sizeof(dirbuf))) < 0) { - - fprintf(stderr, "Problems getting directory entries: %s\n", - strerror(errno)); - - exit(1); - - } - - /* Now, process the list of names ... */ - - fprintf(stdout, "\nDirectory listing, size = %u\n", dirc); - - while (dirc > 0) { - - dsize = ((struct smbc_dirent *)dirp)->dirlen; - fprintf(stdout, "Dir Ent, Type: %u, Name: %s, Comment: %s\n", - ((struct smbc_dirent *)dirp)->smbc_type, - ((struct smbc_dirent *)dirp)->name, - ((struct smbc_dirent *)dirp)->comment); - - dirp += dsize; - (char *)dirc -= dsize; - - } - - dirp = (char *)dirbuf; - - if ((dirc = smbc_getdents(dh3, (struct smbc_dirent *)dirp, - sizeof(dirbuf))) < 0) { - - fprintf(stderr, "Problems getting directory entries: %s\n", - strerror(errno)); - - exit(1); - - } - - /* Now, process the list of names ... */ - - fprintf(stdout, "Directory listing, size = %u\n", dirc); - - while (dirc > 0) { - - dsize = ((struct smbc_dirent *)dirp)->dirlen; - fprintf(stdout, "\nDir Ent, Type: %u, Name: %s, Comment: %s\n", - ((struct smbc_dirent *)dirp)->smbc_type, - ((struct smbc_dirent *)dirp)->name, - ((struct smbc_dirent *)dirp)->comment); - - (char *)dirp += dsize; - (char *)dirc -= dsize; - - } - - exit(1); - - } - - /* For now, open a file on a server that is hard coded ... later will - * read from the command line ... - */ - - fd = smbc_open(file, O_RDWR | O_CREAT | O_TRUNC, 0666); - - if (fd < 0) { - - fprintf(stderr, "Creating file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Opened or created file: %s\n", file); - - /* Now, write some date to the file ... */ - - bzero(buff, sizeof(buff)); - strcpy(buff, "Some test data for the moment ..."); - - err = smbc_write(fd, buff, sizeof(buff)); - - if (err < 0) { - - fprintf(stderr, "writing file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Wrote %d bytes to file: %s\n", sizeof(buff), buff); - - /* Now, seek the file back to offset 0 */ - - err = smbc_lseek(fd, SEEK_SET, 0); - - if (err < 0) { - - fprintf(stderr, "Seeking file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Completed lseek on file: %s\n", file); - - /* Now, read the file contents back ... */ - - err = smbc_read(fd, buff, sizeof(buff)); - - if (err < 0) { - - fprintf(stderr, "Reading file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Read file: %s\n", buff); /* Should check the contents */ - - fprintf(stdout, "Now fstat'ing file: %s\n", file); - - err = smbc_fstat(fd, &st1); - - if (err < 0) { - - fprintf(stderr, "Fstat'ing file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - - /* Now, close the file ... */ - - err = smbc_close(fd); - - if (err < 0) { - - fprintf(stderr, "Closing file: %s: %s\n", file, strerror(errno)); - - } - - /* Now, rename the file ... */ - - err = smbc_rename(file, file2); - - if (err < 0) { - - fprintf(stderr, "Renaming file: %s to %s: %s\n", file, file2, strerror(errno)); - - } - - fprintf(stdout, "Renamed file %s to %s\n", file, file2); - - /* Now, create a file and delete it ... */ - - fprintf(stdout, "Now, creating file: %s so we can delete it.\n", file); - - fd = smbc_open(file, O_RDWR | O_CREAT, 0666); - - if (fd < 0) { - - fprintf(stderr, "Creating file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Opened or created file: %s\n", file); - - err = smbc_close(fd); - - if (err < 0) { - - fprintf(stderr, "Closing file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - /* Now, delete the file ... */ - - fprintf(stdout, "File %s created, now deleting ...\n", file); - - err = smbc_unlink(file); - - if (err < 0) { - - fprintf(stderr, "Deleting file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - /* Now, stat the file, file 2 ... */ - - fprintf(stdout, "Now stat'ing file: %s\n", file); - - err = smbc_stat(file2, &st2); - - if (err < 0) { - - fprintf(stderr, "Stat'ing file: %s: %s\n", file, strerror(errno)); - exit(0); - - } - - fprintf(stdout, "Stat'ed file: %s. Size = %d, mode = %04X\n", file2, - (int)st2.st_size, st2.st_mode); - fprintf(stdout, " time: %s\n", ctime(&st2.st_atime)); - fprintf(stdout, "Earlier stat: %s, Size = %d, mode = %04X\n", file, - (int)st1.st_size, st1.st_mode); - fprintf(stdout, " time: %s\n", ctime(&st1.st_atime)); - - /* Now, make a directory ... */ - - fprintf(stdout, "Making directory smb://samba/public/make-dir\n"); - - if (smbc_mkdir("smb://samba/public/make-dir", 0666) < 0) { - - fprintf(stderr, "Error making directory: smb://samba/public/make-dir: %s\n", - strerror(errno)); - - if (errno == EEXIST) { /* Try to delete the directory */ - - fprintf(stdout, "Trying to delete directory: smb://samba/public/make-dir\n"); - - if (smbc_rmdir("smb://samba/public/make-dir") < 0) { /* Error */ - - fprintf(stderr, "Error removing directory: smb://samba/public/make-dir: %s\n", strerror(errno)); - - exit(0); - - } - - fprintf(stdout, "Making directory: smb://samba/public/make-dir\n"); - - if (smbc_mkdir("smb://samba/public/make-dir", 666) < 0) { - - fprintf(stderr, "Error making directory: smb://samba/public/make-dir: %s\n", - strerror(errno)); - - fprintf(stderr, "I give up!\n"); - - exit(1); - - } - - } - - exit(0); - - } - - fprintf(stdout, "Made dir: make-dir\n"); - return 0; -} diff --git a/source/client/tree.c b/source/client/tree.c deleted file mode 100644 index 94fd93c2106..00000000000 --- a/source/client/tree.c +++ /dev/null @@ -1,811 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB client GTK+ tree-based application - Copyright (C) Andrew Tridgell 1998 - Copyright (C) Richard Sharpe 2001 - Copyright (C) John Terpstra 2001 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* example-gtk+ application, ripped off from the gtk+ tree.c sample */ - -#include <stdio.h> -#include <errno.h> -#include <gtk/gtk.h> -#include "libsmbclient.h" - -static GtkWidget *clist; - -struct tree_data { - - guint32 type; /* Type of tree item, an SMBC_TYPE */ - char name[256]; /* May need to change this later */ - -}; - -void error_message(gchar *message) { - - GtkWidget *dialog, *label, *okay_button; - - /* Create the widgets */ - - dialog = gtk_dialog_new(); - gtk_window_set_modal(GTK_WINDOW(dialog), True); - label = gtk_label_new (message); - okay_button = gtk_button_new_with_label("Okay"); - - /* Ensure that the dialog box is destroyed when the user clicks ok. */ - - gtk_signal_connect_object (GTK_OBJECT (okay_button), "clicked", - GTK_SIGNAL_FUNC (gtk_widget_destroy), dialog); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), - okay_button); - - /* Add the label, and show everything we've added to the dialog. */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), - label); - gtk_widget_show_all (dialog); -} - -/* - * We are given a widget, and we want to retrieve its URL so we - * can do a directory listing. - * - * We walk back up the tree, picking up pieces until we hit a server or - * workgroup type and return a path from there - */ - -static char path_string[1024]; - -char *get_path(GtkWidget *item) -{ - GtkWidget *p = item; - struct tree_data *pd; - char *comps[1024]; /* We keep pointers to the components here */ - int i = 0, j, level,type; - - /* Walk back up the tree, getting the private data */ - - level = GTK_TREE(item->parent)->level; - - /* Pick up this item's component info */ - - pd = (struct tree_data *)gtk_object_get_user_data(GTK_OBJECT(item)); - - comps[i++] = pd->name; - type = pd->type; - - while (level > 0 && type != SMBC_SERVER && type != SMBC_WORKGROUP) { - - /* Find the parent and extract the data etc ... */ - - p = GTK_WIDGET(p->parent); - p = GTK_WIDGET(GTK_TREE(p)->tree_owner); - - pd = (struct tree_data *)gtk_object_get_user_data(GTK_OBJECT(p)); - - level = GTK_TREE(item->parent)->level; - - comps[i++] = pd->name; - type = pd->type; - - } - - /* - * Got a list of comps now, should check that we did not hit a workgroup - * when we got other things as well ... Later - * - * Now, build the path - */ - - snprintf(path_string, sizeof(path_string), "smb:/"); - - for (j = i - 1; j >= 0; j--) { - - strncat(path_string, "/", sizeof(path_string) - strlen(path_string)); - strncat(path_string, comps[j], sizeof(path_string) - strlen(path_string)); - - } - - fprintf(stdout, "Path string = %s\n", path_string); - - return path_string; - -} - -struct tree_data *make_tree_data(guint32 type, const char *name) -{ - struct tree_data *p = (struct tree_data *)malloc(sizeof(struct tree_data)); - - if (p) { - - p->type = type; - strncpy(p->name, name, sizeof(p->name)); - - } - - return p; - -} - -/* Note that this is called every time the user clicks on an item, - whether it is already selected or not. */ -static void cb_select_child (GtkWidget *root_tree, GtkWidget *child, - GtkWidget *subtree) -{ - gint dh, err, dirlen; - char dirbuf[512]; - struct smbc_dirent *dirp; - struct stat st1; - char path[1024], path1[1024]; - - g_print ("select_child called for root tree %p, subtree %p, child %p\n", - root_tree, subtree, child); - - /* Now, figure out what it is, and display it in the clist ... */ - - gtk_clist_clear(GTK_CLIST(clist)); /* Clear the CLIST */ - - /* Now, get the private data for the subtree */ - - strncpy(path, get_path(child), 1024); - - if ((dh = smbc_opendir(path)) < 0) { /* Handle error */ - - g_print("cb_select_child: Could not open dir %s, %s\n", path, - strerror(errno)); - - gtk_main_quit(); - - return; - - } - - while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf, - sizeof(dirbuf))) != 0) { - - if (err < 0) { - - g_print("cb_select_child: Could not read dir %s, %s\n", path, - strerror(errno)); - - gtk_main_quit(); - - return; - - } - - dirp = (struct smbc_dirent *)dirbuf; - - while (err > 0) { - gchar col1[128], col2[128], col3[128], col4[128]; - gchar *rowdata[4] = {col1, col2, col3, col4}; - - dirlen = dirp->dirlen; - - /* Format each of the items ... */ - - strncpy(col1, dirp->name, 128); - - col2[0] = col3[0] = col4[0] = (char)0; - - switch (dirp->smbc_type) { - - case SMBC_WORKGROUP: - - break; - - case SMBC_SERVER: - - strncpy(col2, (dirp->comment?dirp->comment:""), 128); - - break; - - case SMBC_FILE_SHARE: - - strncpy(col2, (dirp->comment?dirp->comment:""), 128); - - break; - - case SMBC_PRINTER_SHARE: - - strncpy(col2, (dirp->comment?dirp->comment:""), 128); - break; - - case SMBC_COMMS_SHARE: - - break; - - case SMBC_IPC_SHARE: - - break; - - case SMBC_DIR: - case SMBC_FILE: - - /* Get stats on the file/dir and see what we have */ - - if ((strcmp(dirp->name, ".") != 0) && - (strcmp(dirp->name, "..") != 0)) { - - strncpy(path1, path, sizeof(path1)); - strncat(path1, "/", sizeof(path) - strlen(path)); - strncat(path1, dirp->name, sizeof(path) - strlen(path)); - - if (smbc_stat(path1, &st1) < 0) { - - if (errno != EBUSY) { - - g_print("cb_select_child: Could not stat file %s, %s\n", path1, - strerror(errno)); - - gtk_main_quit(); - - return; - - } - else { - - strncpy(col2, "Device or resource busy", sizeof(col2)); - - } - } - else { - /* Now format each of the relevant things ... */ - - snprintf(col2, sizeof(col2), "%c%c%c%c%c%c%c%c%c(%0X)", - (st1.st_mode&S_IRUSR?'r':'-'), - (st1.st_mode&S_IWUSR?'w':'-'), - (st1.st_mode&S_IXUSR?'x':'-'), - (st1.st_mode&S_IRGRP?'r':'-'), - (st1.st_mode&S_IWGRP?'w':'-'), - (st1.st_mode&S_IXGRP?'x':'-'), - (st1.st_mode&S_IROTH?'r':'-'), - (st1.st_mode&S_IWOTH?'w':'-'), - (st1.st_mode&S_IXOTH?'x':'-'), - st1.st_mode); - snprintf(col3, sizeof(col3), "%u", st1.st_size); - snprintf(col4, sizeof(col4), "%s", ctime(&st1.st_mtime)); - } - } - - break; - - default: - - break; - } - - gtk_clist_append(GTK_CLIST(clist), rowdata); - - (char *)dirp += dirlen; - err -= dirlen; - - } - - } - -} - -/* Note that this is never called */ -static void cb_unselect_child( GtkWidget *root_tree, - GtkWidget *child, - GtkWidget *subtree ) -{ - g_print ("unselect_child called for root tree %p, subtree %p, child %p\n", - root_tree, subtree, child); -} - -/* for all the GtkItem:: and GtkTreeItem:: signals */ -static void cb_itemsignal( GtkWidget *item, - gchar *signame ) -{ - GtkWidget *real_tree, *aitem, *subtree; - gchar *name; - GtkLabel *label; - gint dh, err, dirlen, level; - char dirbuf[512]; - struct smbc_dirent *dirp; - - label = GTK_LABEL (GTK_BIN (item)->child); - /* Get the text of the label */ - gtk_label_get (label, &name); - - level = GTK_TREE(item->parent)->level; - - /* Get the level of the tree which the item is in */ - g_print ("%s called for item %s->%p, level %d\n", signame, name, - item, GTK_TREE (item->parent)->level); - - real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */ - - if (strncmp(signame, "expand", 6) == 0) { /* Expand called */ - char server[128]; - - if ((dh = smbc_opendir(get_path(item))) < 0) { /* Handle error */ - gchar errmsg[256]; - - g_print("cb_itemsignal: Could not open dir %s, %s\n", get_path(item), - strerror(errno)); - - slprintf(errmsg, sizeof(errmsg), "cb_itemsignal: Could not open dir %s, %s\n", get_path(item), strerror(errno)); - - error_message(errmsg); - - /* gtk_main_quit();*/ - - return; - - } - - while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf, - sizeof(dirbuf))) != 0) { - - if (err < 0) { /* An error, report it */ - gchar errmsg[256]; - - g_print("cb_itemsignal: Could not read dir smbc://, %s\n", - strerror(errno)); - - slprintf(errmsg, sizeof(errmsg), "cb_itemsignal: Could not read dir smbc://, %s\n", strerror(errno)); - - error_message(errmsg); - - /* gtk_main_quit();*/ - - return; - - } - - dirp = (struct smbc_dirent *)dirbuf; - - while (err > 0) { - struct tree_data *my_data; - - dirlen = dirp->dirlen; - - my_data = make_tree_data(dirp->smbc_type, dirp->name); - - if (!my_data) { - - g_print("Could not allocate space for tree_data: %s\n", - dirp->name); - - gtk_main_quit(); - return; - - } - - aitem = gtk_tree_item_new_with_label(dirp->name); - - /* Connect all GtkItem:: and GtkTreeItem:: signals */ - gtk_signal_connect (GTK_OBJECT(aitem), "select", - GTK_SIGNAL_FUNC(cb_itemsignal), "select"); - gtk_signal_connect (GTK_OBJECT(aitem), "deselect", - GTK_SIGNAL_FUNC(cb_itemsignal), "deselect"); - gtk_signal_connect (GTK_OBJECT(aitem), "toggle", - GTK_SIGNAL_FUNC(cb_itemsignal), "toggle"); - gtk_signal_connect (GTK_OBJECT(aitem), "expand", - GTK_SIGNAL_FUNC(cb_itemsignal), "expand"); - gtk_signal_connect (GTK_OBJECT(aitem), "collapse", - GTK_SIGNAL_FUNC(cb_itemsignal), "collapse"); - /* Add it to the parent tree */ - gtk_tree_append (GTK_TREE(real_tree), aitem); - - gtk_widget_show (aitem); - - gtk_object_set_user_data(GTK_OBJECT(aitem), (gpointer)my_data); - - fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen); - - if (dirp->smbc_type != SMBC_FILE && - dirp->smbc_type != SMBC_IPC_SHARE && - (strcmp(dirp->name, ".") != 0) && - (strcmp(dirp->name, "..") !=0)){ - - subtree = gtk_tree_new(); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree); - - gtk_signal_connect(GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), real_tree); - gtk_signal_connect(GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), real_tree); - - } - - (char *)dirp += dirlen; - err -= dirlen; - - } - - } - - smbc_closedir(dh); - - } - else if (strncmp(signame, "collapse", 8) == 0) { - GtkWidget *subtree = gtk_tree_new(); - - gtk_tree_remove_items(GTK_TREE(real_tree), GTK_TREE(real_tree)->children); - - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree); - - gtk_signal_connect (GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), real_tree); - gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), real_tree); - - } - -} - -static void cb_selection_changed( GtkWidget *tree ) -{ - GList *i; - - g_print ("selection_change called for tree %p\n", tree); - g_print ("selected objects are:\n"); - - i = GTK_TREE_SELECTION(tree); - while (i){ - gchar *name; - GtkLabel *label; - GtkWidget *item; - - /* Get a GtkWidget pointer from the list node */ - item = GTK_WIDGET (i->data); - label = GTK_LABEL (GTK_BIN (item)->child); - gtk_label_get (label, &name); - g_print ("\t%s on level %d\n", name, GTK_TREE - (item->parent)->level); - i = i->next; - } -} - -/* - * Expand or collapse the whole network ... - */ -static void cb_wholenet(GtkWidget *item, gchar *signame) -{ - GtkWidget *real_tree, *aitem, *subtree; - gchar *name; - GtkLabel *label; - gint dh, err, dirlen; - char dirbuf[512]; - struct smbc_dirent *dirp; - - label = GTK_LABEL (GTK_BIN (item)->child); - gtk_label_get (label, &name); - g_print ("%s called for item %s->%p, level %d\n", signame, name, - item, GTK_TREE (item->parent)->level); - - real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */ - - if (strncmp(signame, "expand", 6) == 0) { /* Expand called */ - - if ((dh = smbc_opendir("smb://")) < 0) { /* Handle error */ - - g_print("cb_wholenet: Could not open dir smbc://, %s\n", - strerror(errno)); - - gtk_main_quit(); - - return; - - } - - while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf, - sizeof(dirbuf))) != 0) { - - if (err < 0) { /* An error, report it */ - - g_print("cb_wholenet: Could not read dir smbc://, %s\n", - strerror(errno)); - - gtk_main_quit(); - - return; - - } - - dirp = (struct smbc_dirent *)dirbuf; - - while (err > 0) { - struct tree_data *my_data; - - dirlen = dirp->dirlen; - - my_data = make_tree_data(dirp->smbc_type, dirp->name); - - aitem = gtk_tree_item_new_with_label(dirp->name); - - /* Connect all GtkItem:: and GtkTreeItem:: signals */ - gtk_signal_connect (GTK_OBJECT(aitem), "select", - GTK_SIGNAL_FUNC(cb_itemsignal), "select"); - gtk_signal_connect (GTK_OBJECT(aitem), "deselect", - GTK_SIGNAL_FUNC(cb_itemsignal), "deselect"); - gtk_signal_connect (GTK_OBJECT(aitem), "toggle", - GTK_SIGNAL_FUNC(cb_itemsignal), "toggle"); - gtk_signal_connect (GTK_OBJECT(aitem), "expand", - GTK_SIGNAL_FUNC(cb_itemsignal), "expand"); - gtk_signal_connect (GTK_OBJECT(aitem), "collapse", - GTK_SIGNAL_FUNC(cb_itemsignal), "collapse"); - - gtk_tree_append (GTK_TREE(real_tree), aitem); - /* Show it - this can be done at any time */ - gtk_widget_show (aitem); - - gtk_object_set_user_data(GTK_OBJECT(aitem), (gpointer)my_data); - - fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen); - - subtree = gtk_tree_new(); - - gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree); - - gtk_signal_connect(GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), real_tree); - gtk_signal_connect(GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), real_tree); - - (char *)dirp += dirlen; - err -= dirlen; - - } - - } - - smbc_closedir(dh); - - } - else { /* Must be collapse ... FIXME ... */ - GtkWidget *subtree = gtk_tree_new(); - - gtk_tree_remove_items(GTK_TREE(real_tree), GTK_TREE(real_tree)->children); - - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree); - - gtk_signal_connect (GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), real_tree); - gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), real_tree); - - - } - -} - -/* Should put up a dialog box to ask the user for username and password */ - -static void -auth_fn(const char *server, const char *share, - char *workgroup, int wgmaxlen, char *username, int unmaxlen, - char *password, int pwmaxlen) -{ - - strncpy(username, "test", unmaxlen); - strncpy(password, "test", pwmaxlen); - -} - -static char *col_titles[] = { - "Name", "Attributes", "Size", "Modification Date", -}; - -int main( int argc, - char *argv[] ) -{ - GtkWidget *window, *scrolled_win, *scrolled_win2, *tree; - GtkWidget *subtree, *item, *main_hbox, *r_pane, *l_pane; - gint err, dh; - gint i; - char dirbuf[512]; - struct smbc_dirent *dirp; - - gtk_init (&argc, &argv); - - /* Init the smbclient library */ - - err = smbc_init(auth_fn, 10); - - /* Print an error response ... */ - - if (err < 0) { - - fprintf(stderr, "smbc_init returned %s (%i)\nDo you have a ~/.smb/smb.conf file?\n", strerror(errno), errno); - exit(1); - - } - - /* a generic toplevel window */ - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_set_name(window, "main browser window"); - gtk_signal_connect (GTK_OBJECT(window), "delete_event", - GTK_SIGNAL_FUNC (gtk_main_quit), NULL); - gtk_window_set_title(GTK_WINDOW(window), "The Linux Windows Network Browser"); - gtk_widget_set_usize(GTK_WIDGET(window), 750, -1); - gtk_container_set_border_width (GTK_CONTAINER(window), 5); - - gtk_widget_show (window); - - /* A container for the two panes ... */ - - main_hbox = gtk_hbox_new(FALSE, 1); - gtk_container_border_width(GTK_CONTAINER(main_hbox), 1); - gtk_container_add(GTK_CONTAINER(window), main_hbox); - - gtk_widget_show(main_hbox); - - l_pane = gtk_hpaned_new(); - gtk_paned_gutter_size(GTK_PANED(l_pane), (GTK_PANED(l_pane))->handle_size); - r_pane = gtk_hpaned_new(); - gtk_paned_gutter_size(GTK_PANED(r_pane), (GTK_PANED(r_pane))->handle_size); - gtk_container_add(GTK_CONTAINER(main_hbox), l_pane); - gtk_widget_show(l_pane); - - /* A generic scrolled window */ - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_usize (scrolled_win, 150, 200); - gtk_container_add (GTK_CONTAINER(l_pane), scrolled_win); - gtk_widget_show (scrolled_win); - - /* Another generic scrolled window */ - scrolled_win2 = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win2), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_usize (scrolled_win2, 150, 200); - gtk_paned_add2 (GTK_PANED(l_pane), scrolled_win2); - gtk_widget_show (scrolled_win2); - - /* Create the root tree */ - tree = gtk_tree_new(); - g_print ("root tree is %p\n", tree); - /* connect all GtkTree:: signals */ - gtk_signal_connect (GTK_OBJECT(tree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), tree); - gtk_signal_connect (GTK_OBJECT(tree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), tree); - gtk_signal_connect (GTK_OBJECT(tree), "selection_changed", - GTK_SIGNAL_FUNC(cb_selection_changed), tree); - /* Add it to the scrolled window */ - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scrolled_win), - tree); - /* Set the selection mode */ - gtk_tree_set_selection_mode (GTK_TREE(tree), - GTK_SELECTION_MULTIPLE); - /* Show it */ - gtk_widget_show (tree); - - /* Now, create a clist and attach it to the second pane */ - - clist = gtk_clist_new_with_titles(4, col_titles); - - gtk_container_add (GTK_CONTAINER(scrolled_win2), clist); - - gtk_widget_show(clist); - - /* Now, build the top level display ... */ - - if ((dh = smbc_opendir("smb:///")) < 0) { - - fprintf(stderr, "Could not list default workgroup: smb:///: %s\n", - strerror(errno)); - - exit(1); - - } - - /* Create a tree item for Whole Network */ - - item = gtk_tree_item_new_with_label ("Whole Network"); - /* Connect all GtkItem:: and GtkTreeItem:: signals */ - gtk_signal_connect (GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(cb_itemsignal), "select"); - gtk_signal_connect (GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(cb_itemsignal), "deselect"); - gtk_signal_connect (GTK_OBJECT(item), "toggle", - GTK_SIGNAL_FUNC(cb_itemsignal), "toggle"); - gtk_signal_connect (GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(cb_wholenet), "expand"); - gtk_signal_connect (GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(cb_wholenet), "collapse"); - /* Add it to the parent tree */ - gtk_tree_append (GTK_TREE(tree), item); - /* Show it - this can be done at any time */ - gtk_widget_show (item); - - subtree = gtk_tree_new(); /* A subtree for Whole Network */ - - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree); - - gtk_signal_connect (GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), tree); - gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), tree); - - /* Now, get the items in smb:/// and add them to the tree */ - - dirp = (struct smbc_dirent *)dirbuf; - - while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf, - sizeof(dirbuf))) != 0) { - - if (err < 0) { /* Handle the error */ - - fprintf(stderr, "Could not read directory for smbc:///: %s\n", - strerror(errno)); - - exit(1); - - } - - fprintf(stdout, "Dir len: %u\n", err); - - while (err > 0) { /* Extract each entry and make a sub-tree */ - struct tree_data *my_data; - int dirlen = dirp->dirlen; - - my_data = make_tree_data(dirp->smbc_type, dirp->name); - - item = gtk_tree_item_new_with_label(dirp->name); - /* Connect all GtkItem:: and GtkTreeItem:: signals */ - gtk_signal_connect (GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(cb_itemsignal), "select"); - gtk_signal_connect (GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(cb_itemsignal), "deselect"); - gtk_signal_connect (GTK_OBJECT(item), "toggle", - GTK_SIGNAL_FUNC(cb_itemsignal), "toggle"); - gtk_signal_connect (GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(cb_itemsignal), "expand"); - gtk_signal_connect (GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(cb_itemsignal), "collapse"); - /* Add it to the parent tree */ - gtk_tree_append (GTK_TREE(tree), item); - /* Show it - this can be done at any time */ - gtk_widget_show (item); - - gtk_object_set_user_data(GTK_OBJECT(item), (gpointer)my_data); - - fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen); - - subtree = gtk_tree_new(); - - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree); - - gtk_signal_connect (GTK_OBJECT(subtree), "select_child", - GTK_SIGNAL_FUNC(cb_select_child), tree); - gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child", - GTK_SIGNAL_FUNC(cb_unselect_child), tree); - - (char *)dirp += dirlen; - err -= dirlen; - - } - - } - - smbc_closedir(dh); /* FIXME, check for error :-) */ - - /* Show the window and loop endlessly */ - gtk_main(); - return 0; -} -/* example-end */ |