Index: client/client.c =================================================================== --- client/client.c (revision 21918) +++ client/client.c (working copy) @@ -3847,6 +3847,7 @@ char *p; int rc = 0; fstring new_workgroup; + BOOL first_opt = True; struct poptOption long_options[] = { POPT_AUTOHELP @@ -3900,6 +3901,44 @@ in_client = True; /* Make sure that we tell lp_load we are */ while ((opt = poptGetNextOpt(pc)) != -1) { + + /* bad hack to cope with the breackage the -T option would cause + * by eating the wrong arguments. We need to eat arg 0,[1,2] before */ + if (first_opt) { + int argind = 0; + BOOL loop = True; + while (poptPeekArg(pc) && loop) { + switch(argind) { + case 0: /* progname */ + poptGetArg(pc); /* skip */ + break; + + case 1: /* service name */ + pstrcpy(service,poptGetArg(pc)); + /* Convert any '/' characters in the service name to '\' characters */ + string_replace(service, '/','\\'); + + if (count_chars(service,'\\') < 3) { + d_printf("\n%s: Not enough '\\' characters in service\n",service); + poptPrintUsage(pc, stderr, 0); + exit(1); + } + break; + case 2: /* command line provided password */ + cmdline_auth_info.got_pass = True; + pstrcpy(cmdline_auth_info.password,poptGetArg(pc)); + break; + + default: + /* uh? garbage or other options leftovers? ignore */ + loop = False; + break; + } + argind++; + } + first_opt = False; + } + switch (opt) { case 'M': /* Messages are sent to NetBIOS name type 0x3 @@ -3959,7 +3998,7 @@ */ optnum -= i; for (i = 0; i < optnum; i++) - poptGetOptArg(pc); + poptGetArg(pc); } break; case 'D': @@ -3971,8 +4010,43 @@ } } - poptGetArg(pc); + /* if first op is still set, it means there where no option passed on + * the command line, so we still need to retrieve the service name */ + if (first_opt) { + int argind = 0; + while (poptPeekArg(pc)) { + switch(argind) { + case 0: /* progname */ + poptGetArg(pc); /* skip */ + break; + case 1: /* service name */ + pstrcpy(service,poptGetArg(pc)); + /* Convert any '/' characters in the service name to '\' characters */ + string_replace(service, '/','\\'); + + if (count_chars(service,'\\') < 3) { + d_printf("\n%s: Not enough '\\' characters in service\n",service); + poptPrintUsage(pc, stderr, 0); + exit(1); + } + break; + case 2: /* command line provided password */ + cmdline_auth_info.got_pass = True; + pstrcpy(cmdline_auth_info.password,poptGetArg(pc)); + break; + + default: + /* uh? garbage? */ + d_printf("\nUnknown option: [%s]!\n", poptGetArg(pc)); + poptPrintUsage(pc, stderr, 0); + exit(1); + } + argind++; + } + first_opt = False; + } + /* check for the -P option */ if ( port != 0 ) @@ -4011,23 +4085,6 @@ else pstrcpy( calling_name, global_myname() ); - if(poptPeekArg(pc)) { - pstrcpy(service,poptGetArg(pc)); - /* Convert any '/' characters in the service name to '\' characters */ - string_replace(service, '/','\\'); - - if (count_chars(service,'\\') < 3) { - d_printf("\n%s: Not enough '\\' characters in service\n",service); - poptPrintUsage(pc, stderr, 0); - exit(1); - } - } - - if (poptPeekArg(pc) && !cmdline_auth_info.got_pass) { - cmdline_auth_info.got_pass = True; - pstrcpy(cmdline_auth_info.password,poptGetArg(pc)); - } - init_names(); if(new_name_resolve_order)