diff options
Diffstat (limited to 'source/client/client.c')
-rw-r--r-- | source/client/client.c | 1050 |
1 files changed, 418 insertions, 632 deletions
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); } |