|
ssorce |
8626b9f |
Index: source/client/client.c
|
|
ssorce |
8626b9f |
===================================================================
|
|
ssorce |
0804f04 |
--- source/client/client.c (revision 21990)
|
|
ssorce |
8626b9f |
+++ source/client/client.c (working copy)
|
|
ssorce |
fa0bbbc |
@@ -3847,6 +3847,8 @@
|
|
ssorce |
8626b9f |
char *p;
|
|
ssorce |
8626b9f |
int rc = 0;
|
|
ssorce |
8626b9f |
fstring new_workgroup;
|
|
ssorce |
fa0bbbc |
+ BOOL tar_opt = False;
|
|
ssorce |
fa0bbbc |
+ BOOL service_opt = False;
|
|
ssorce |
8626b9f |
struct poptOption long_options[] = {
|
|
ssorce |
8626b9f |
POPT_AUTOHELP
|
|
ssorce |
8626b9f |
|
|
ssorce |
0804f04 |
@@ -3893,13 +3895,43 @@
|
|
ssorce |
0804f04 |
x_setbuf( dbf, NULL );
|
|
ssorce |
0804f04 |
}
|
|
ssorce |
0804f04 |
|
|
ssorce |
0804f04 |
- pc = poptGetContext("smbclient", argc, (const char **) argv, long_options,
|
|
ssorce |
0804f04 |
- POPT_CONTEXT_KEEP_FIRST);
|
|
ssorce |
0804f04 |
+ /* skip argv(0) */
|
|
ssorce |
0804f04 |
+ pc = poptGetContext("smbclient", argc, (const char **) argv, long_options, 0);
|
|
ssorce |
0804f04 |
poptSetOtherOptionHelp(pc, "service <password>");
|
|
ssorce |
fa0bbbc |
|
|
ssorce |
8626b9f |
in_client = True; /* Make sure that we tell lp_load we are */
|
|
ssorce |
8626b9f |
|
|
ssorce |
0804f04 |
while ((opt = poptGetNextOpt(pc)) != -1) {
|
|
ssorce |
8626b9f |
+
|
|
ssorce |
0804f04 |
+ /* if the tar option has been called previouslt, now we need to eat out the leftovers */
|
|
ssorce |
fa0bbbc |
+ /* I see no other way to keep things sane --SSS */
|
|
ssorce |
fa0bbbc |
+ if (tar_opt == True) {
|
|
ssorce |
0804f04 |
+ while (poptPeekArg(pc)) {
|
|
ssorce |
0804f04 |
+ poptGetArg(pc);
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
+ tar_opt = False;
|
|
ssorce |
fa0bbbc |
+ }
|
|
ssorce |
8626b9f |
+
|
|
ssorce |
fa0bbbc |
+ /* if the service has not yet been specified lets see if it is available in the popt stack */
|
|
ssorce |
fa0bbbc |
+ if (!service_opt && poptPeekArg(pc)) {
|
|
ssorce |
fa0bbbc |
+ pstrcpy(service, poptGetArg(pc));
|
|
ssorce |
fa0bbbc |
+ /* Convert any '/' characters in the service name to '\' characters */
|
|
ssorce |
fa0bbbc |
+ string_replace(service, '/','\\');
|
|
ssorce |
8626b9f |
+
|
|
ssorce |
fa0bbbc |
+ if (count_chars(service,'\\') < 3) {
|
|
ssorce |
fa0bbbc |
+ d_printf("\n%s: Not enough '\\' characters in service\n",service);
|
|
ssorce |
fa0bbbc |
+ poptPrintUsage(pc, stderr, 0);
|
|
ssorce |
fa0bbbc |
+ exit(1);
|
|
ssorce |
8626b9f |
+ }
|
|
ssorce |
fa0bbbc |
+ service_opt = True;
|
|
ssorce |
8626b9f |
+ }
|
|
ssorce |
8626b9f |
+
|
|
ssorce |
fa0bbbc |
+ /* if the service has already been retrieved then check if we have also a password */
|
|
ssorce |
fa0bbbc |
+ if (service_opt && (!cmdline_auth_info.got_pass) && poptPeekArg(pc)) {
|
|
ssorce |
fa0bbbc |
+ pstrcpy(cmdline_auth_info.password, poptGetArg(pc));
|
|
ssorce |
fa0bbbc |
+ cmdline_auth_info.got_pass = True;
|
|
ssorce |
fa0bbbc |
+ }
|
|
ssorce |
fa0bbbc |
+
|
|
ssorce |
8626b9f |
switch (opt) {
|
|
ssorce |
8626b9f |
case 'M':
|
|
ssorce |
8626b9f |
/* Messages are sent to NetBIOS name type 0x3
|
|
ssorce |
0804f04 |
@@ -3954,13 +3986,9 @@
|
|
ssorce |
fa0bbbc |
poptPrintUsage(pc, stderr, 0);
|
|
ssorce |
fa0bbbc |
exit(1);
|
|
ssorce |
fa0bbbc |
}
|
|
ssorce |
fa0bbbc |
- /* Now we must eat (optnum - i) options - they have
|
|
ssorce |
fa0bbbc |
- * been processed by tar_parseargs().
|
|
ssorce |
fa0bbbc |
- */
|
|
ssorce |
fa0bbbc |
- optnum -= i;
|
|
ssorce |
fa0bbbc |
- for (i = 0; i < optnum; i++)
|
|
ssorce |
8626b9f |
- poptGetOptArg(pc);
|
|
ssorce |
8626b9f |
}
|
|
ssorce |
fa0bbbc |
+ /* this must be the last option, mark we have parsed it so that we know we have */
|
|
ssorce |
fa0bbbc |
+ tar_opt = True;
|
|
ssorce |
8626b9f |
break;
|
|
ssorce |
8626b9f |
case 'D':
|
|
ssorce |
fa0bbbc |
pstrcpy(base_directory,poptGetOptArg(pc));
|
|
ssorce |
0804f04 |
@@ -3971,8 +3999,34 @@
|
|
ssorce |
8626b9f |
}
|
|
ssorce |
0804f04 |
}
|
|
ssorce |
8626b9f |
|
|
ssorce |
8626b9f |
- poptGetArg(pc);
|
|
ssorce |
0804f04 |
+ /* We may still have some leftovers after the last popt option has been called */
|
|
ssorce |
0804f04 |
+ if (tar_opt == True) {
|
|
ssorce |
0804f04 |
+ while (poptPeekArg(pc)) {
|
|
ssorce |
0804f04 |
+ poptGetArg(pc);
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
+ tar_opt = False;
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
|
|
ssorce |
0804f04 |
+ /* if the service has not yet been specified lets see if it is available in the popt stack */
|
|
ssorce |
0804f04 |
+ if (!service_opt && poptPeekArg(pc)) {
|
|
ssorce |
0804f04 |
+ pstrcpy(service, poptGetArg(pc));
|
|
ssorce |
0804f04 |
+ /* Convert any '/' characters in the service name to '\' characters */
|
|
ssorce |
0804f04 |
+ string_replace(service, '/','\\');
|
|
ssorce |
0804f04 |
+
|
|
ssorce |
0804f04 |
+ if (count_chars(service,'\\') < 3) {
|
|
ssorce |
0804f04 |
+ d_printf("\n%s: Not enough '\\' characters in service\n",service);
|
|
ssorce |
0804f04 |
+ poptPrintUsage(pc, stderr, 0);
|
|
ssorce |
0804f04 |
+ exit(1);
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
+ service_opt = True;
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
+
|
|
ssorce |
0804f04 |
+ /* if the service has already been retrieved then check if we have also a password */
|
|
ssorce |
0804f04 |
+ if (service_opt && (!cmdline_auth_info.got_pass) && poptPeekArg(pc)) {
|
|
ssorce |
0804f04 |
+ pstrcpy(cmdline_auth_info.password, poptGetArg(pc));
|
|
ssorce |
0804f04 |
+ cmdline_auth_info.got_pass = True;
|
|
ssorce |
0804f04 |
+ }
|
|
ssorce |
0804f04 |
+
|
|
ssorce |
8626b9f |
/* check for the -P option */
|
|
ssorce |
8626b9f |
|
|
ssorce |
8626b9f |
if ( port != 0 )
|
|
ssorce |
0804f04 |
@@ -4011,23 +4065,6 @@
|
|
ssorce |
8626b9f |
else
|
|
ssorce |
8626b9f |
pstrcpy( calling_name, global_myname() );
|
|
ssorce |
8626b9f |
|
|
ssorce |
8626b9f |
- if(poptPeekArg(pc)) {
|
|
ssorce |
8626b9f |
- pstrcpy(service,poptGetArg(pc));
|
|
ssorce |
8626b9f |
- /* Convert any '/' characters in the service name to '\' characters */
|
|
ssorce |
8626b9f |
- string_replace(service, '/','\\');
|
|
ssorce |
8626b9f |
-
|
|
ssorce |
8626b9f |
- if (count_chars(service,'\\') < 3) {
|
|
ssorce |
8626b9f |
- d_printf("\n%s: Not enough '\\' characters in service\n",service);
|
|
ssorce |
8626b9f |
- poptPrintUsage(pc, stderr, 0);
|
|
ssorce |
8626b9f |
- exit(1);
|
|
ssorce |
8626b9f |
- }
|
|
ssorce |
8626b9f |
- }
|
|
ssorce |
8626b9f |
-
|
|
ssorce |
8626b9f |
- if (poptPeekArg(pc) && !cmdline_auth_info.got_pass) {
|
|
ssorce |
8626b9f |
- cmdline_auth_info.got_pass = True;
|
|
ssorce |
8626b9f |
- pstrcpy(cmdline_auth_info.password,poptGetArg(pc));
|
|
ssorce |
8626b9f |
- }
|
|
ssorce |
8626b9f |
-
|
|
ssorce |
8626b9f |
init_names();
|
|
ssorce |
8626b9f |
|
|
ssorce |
8626b9f |
if(new_name_resolve_order)
|