mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
Merge branch 'master' of ssh://jra@git.samba.org/data/git/samba
This commit is contained in:
commit
ca1653e830
@ -169,6 +169,7 @@ static const struct werror_code_struct dos_errs[] =
|
||||
{ "WERR_SERVICE_NEVER_STARTED", WERR_SERVICE_NEVER_STARTED },
|
||||
{ "WERR_PASSWORD_MUST_CHANGE", WERR_PASSWORD_MUST_CHANGE },
|
||||
{ "WERR_ACCOUNT_LOCKED_OUT", WERR_ACCOUNT_LOCKED_OUT },
|
||||
{ "WERR_UNKNOWN_PRINT_MONITOR", WERR_UNKNOWN_PRINT_MONITOR },
|
||||
{ NULL, W_ERROR(0) }
|
||||
};
|
||||
|
||||
|
@ -5492,9 +5492,6 @@ WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli,
|
||||
uint32 level, const char *env,
|
||||
uint32 *num_drivers,
|
||||
PRINTER_DRIVER_CTR *ctr);
|
||||
WERROR rpccli_spoolss_addprinterdriver (struct rpc_pipe_client *cli,
|
||||
TALLOC_CTX *mem_ctx, uint32 level,
|
||||
PRINTER_DRIVER_CTR *ctr);
|
||||
WERROR rpccli_spoolss_addprinterex (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
|
||||
uint32 level, PRINTER_INFO_CTR*ctr);
|
||||
WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
|
||||
@ -5941,9 +5938,6 @@ bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_I
|
||||
bool make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
|
||||
SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
|
||||
uint32 level, PRINTER_DRIVER_CTR *info);
|
||||
bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
|
||||
SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
|
||||
DRIVER_INFO_3 *info3);
|
||||
bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src);
|
||||
bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
|
||||
bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
|
||||
@ -6239,7 +6233,6 @@ bool init_service_op_table( void );
|
||||
|
||||
/* The following definitions come from rpcclient/cmd_spoolss.c */
|
||||
|
||||
void set_drv_info_3_env (DRIVER_INFO_3 *info, const char *arch);
|
||||
|
||||
/* The following definitions come from rpcclient/cmd_srvsvc.c */
|
||||
|
||||
|
@ -157,7 +157,6 @@ void dump_core_setup(const char *progname)
|
||||
return;
|
||||
}
|
||||
|
||||
SAFE_FREE(corepath);
|
||||
SAFE_FREE(logbase);
|
||||
|
||||
#ifdef HAVE_GETRLIMIT
|
||||
|
@ -886,36 +886,6 @@ WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli,
|
||||
/**********************************************************************
|
||||
**********************************************************************/
|
||||
|
||||
WERROR rpccli_spoolss_addprinterdriver (struct rpc_pipe_client *cli,
|
||||
TALLOC_CTX *mem_ctx, uint32 level,
|
||||
PRINTER_DRIVER_CTR *ctr)
|
||||
{
|
||||
prs_struct qbuf, rbuf;
|
||||
SPOOL_Q_ADDPRINTERDRIVER in;
|
||||
SPOOL_R_ADDPRINTERDRIVER out;
|
||||
fstring server;
|
||||
|
||||
ZERO_STRUCT(in);
|
||||
ZERO_STRUCT(out);
|
||||
|
||||
slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
|
||||
strupper_m(server);
|
||||
|
||||
make_spoolss_q_addprinterdriver( mem_ctx, &in, server, level, ctr );
|
||||
|
||||
CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ADDPRINTERDRIVER,
|
||||
in, out,
|
||||
qbuf, rbuf,
|
||||
spoolss_io_q_addprinterdriver,
|
||||
spoolss_io_r_addprinterdriver,
|
||||
WERR_GENERAL_FAILURE );
|
||||
|
||||
return out.status;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
**********************************************************************/
|
||||
|
||||
WERROR rpccli_spoolss_addprinterex (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
|
||||
uint32 level, PRINTER_INFO_CTR*ctr)
|
||||
{
|
||||
|
@ -3382,109 +3382,6 @@ bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_I
|
||||
return True;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
init a SPOOL_Q_ADDPRINTERDRIVER struct
|
||||
******************************************************************/
|
||||
|
||||
bool make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
|
||||
SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
|
||||
uint32 level, PRINTER_DRIVER_CTR *info)
|
||||
{
|
||||
DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
|
||||
|
||||
if (!srv_name || !info) {
|
||||
return False;
|
||||
}
|
||||
|
||||
q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
|
||||
init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
|
||||
|
||||
q_u->level = level;
|
||||
|
||||
q_u->info.level = level;
|
||||
q_u->info.ptr = 1; /* Info is != NULL, see above */
|
||||
switch (level)
|
||||
{
|
||||
/* info level 3 is supported by Windows 95/98, WinNT and Win2k */
|
||||
case 3 :
|
||||
make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
|
||||
break;
|
||||
|
||||
default:
|
||||
DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
|
||||
break;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
|
||||
SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
|
||||
DRIVER_INFO_3 *info3)
|
||||
{
|
||||
uint32 len = 0;
|
||||
SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
|
||||
|
||||
if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
|
||||
return False;
|
||||
|
||||
inf->cversion = info3->version;
|
||||
inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
|
||||
inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
|
||||
inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
|
||||
inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
|
||||
inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
|
||||
inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
|
||||
inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
|
||||
inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
|
||||
|
||||
init_unistr2_from_unistr(inf, &inf->name, &info3->name);
|
||||
init_unistr2_from_unistr(inf, &inf->environment, &info3->architecture);
|
||||
init_unistr2_from_unistr(inf, &inf->driverpath, &info3->driverpath);
|
||||
init_unistr2_from_unistr(inf, &inf->datafile, &info3->datafile);
|
||||
init_unistr2_from_unistr(inf, &inf->configfile, &info3->configfile);
|
||||
init_unistr2_from_unistr(inf, &inf->helpfile, &info3->helpfile);
|
||||
init_unistr2_from_unistr(inf, &inf->monitorname, &info3->monitorname);
|
||||
init_unistr2_from_unistr(inf, &inf->defaultdatatype, &info3->defaultdatatype);
|
||||
|
||||
if (info3->dependentfiles) {
|
||||
bool done = False;
|
||||
bool null_char = False;
|
||||
uint16 *ptr = info3->dependentfiles;
|
||||
|
||||
while (!done) {
|
||||
switch (*ptr) {
|
||||
case 0:
|
||||
/* the null_char bool is used to help locate
|
||||
two '\0's back to back */
|
||||
if (null_char) {
|
||||
done = True;
|
||||
} else {
|
||||
null_char = True;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
null_char = False;
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
|
||||
inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
|
||||
if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
|
||||
SAFE_FREE(inf);
|
||||
return False;
|
||||
}
|
||||
|
||||
*spool_drv_info = inf;
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
make a BUFFER5 struct from a uint16*
|
||||
******************************************************************/
|
||||
|
@ -1289,7 +1289,9 @@ static WERROR cmd_spoolss_getdriverdir(struct rpc_pipe_client *cli,
|
||||
/****************************************************************************
|
||||
****************************************************************************/
|
||||
|
||||
void set_drv_info_3_env (DRIVER_INFO_3 *info, const char *arch)
|
||||
static void set_drv_info_3_env(TALLOC_CTX *mem_ctx,
|
||||
struct spoolss_AddDriverInfo3 *info,
|
||||
const char *arch)
|
||||
{
|
||||
|
||||
int i;
|
||||
@ -1299,7 +1301,7 @@ void set_drv_info_3_env (DRIVER_INFO_3 *info, const char *arch)
|
||||
if (strcmp(arch, archi_table[i].short_archi) == 0)
|
||||
{
|
||||
info->version = archi_table[i].version;
|
||||
init_unistr (&info->architecture, archi_table[i].long_archi);
|
||||
info->architecture = talloc_strdup(mem_ctx, archi_table[i].long_archi);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1318,8 +1320,9 @@ void set_drv_info_3_env (DRIVER_INFO_3 *info, const char *arch)
|
||||
Needed to handle the empty parameter string denoted by "NULL"
|
||||
*************************************************************************/
|
||||
|
||||
static char* get_driver_3_param (char* str, const char* delim, UNISTR* dest,
|
||||
char **saveptr)
|
||||
static char *get_driver_3_param(TALLOC_CTX *mem_ctx, char *str,
|
||||
const char *delim, const char **dest,
|
||||
char **saveptr)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
@ -1330,71 +1333,81 @@ static char* get_driver_3_param (char* str, const char* delim, UNISTR* dest,
|
||||
parameter because two consecutive delimiters
|
||||
will not return an empty string. See man strtok(3)
|
||||
for details */
|
||||
if (ptr && (StrCaseCmp(ptr, "NULL") == 0))
|
||||
if (ptr && (StrCaseCmp(ptr, "NULL") == 0)) {
|
||||
ptr = NULL;
|
||||
}
|
||||
|
||||
if (dest != NULL)
|
||||
init_unistr(dest, ptr);
|
||||
if (dest != NULL) {
|
||||
*dest = talloc_strdup(mem_ctx, ptr);
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
fill in the members of a DRIVER_INFO_3 struct using a character
|
||||
fill in the members of a spoolss_AddDriverInfo3 struct using a character
|
||||
string in the form of
|
||||
<Long Printer Name>:<Driver File Name>:<Data File Name>:\
|
||||
<Config File Name>:<Help File Name>:<Language Monitor Name>:\
|
||||
<Default Data Type>:<Comma Separated list of Files>
|
||||
*******************************************************************************/
|
||||
static bool init_drv_info_3_members ( TALLOC_CTX *mem_ctx, DRIVER_INFO_3 *info,
|
||||
char *args )
|
||||
|
||||
static bool init_drv_info_3_members(TALLOC_CTX *mem_ctx, struct spoolss_AddDriverInfo3 *r,
|
||||
char *args)
|
||||
{
|
||||
char *str, *str2;
|
||||
uint32 len, i;
|
||||
int count = 0;
|
||||
char *saveptr = NULL;
|
||||
struct spoolss_StringArray *deps;
|
||||
const char **file_array = NULL;
|
||||
int i;
|
||||
|
||||
/* fill in the UNISTR fields */
|
||||
str = get_driver_3_param (args, ":", &info->name, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->driverpath, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->datafile, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->configfile, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->helpfile, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->monitorname, &saveptr);
|
||||
str = get_driver_3_param (NULL, ":", &info->defaultdatatype, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, args, ":", &r->driver_name, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->driver_path, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->data_file, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->config_file, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->help_file, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->monitor_name, &saveptr);
|
||||
str = get_driver_3_param(mem_ctx, NULL, ":", &r->default_datatype, &saveptr);
|
||||
|
||||
/* <Comma Separated List of Dependent Files> */
|
||||
/* save the beginning of the string */
|
||||
str2 = get_driver_3_param (NULL, ":", NULL, &saveptr);
|
||||
str2 = get_driver_3_param(mem_ctx, NULL, ":", NULL, &saveptr);
|
||||
str = str2;
|
||||
|
||||
/* begin to strip out each filename */
|
||||
str = strtok_r(str, ",", &saveptr);
|
||||
len = 0;
|
||||
while (str != NULL)
|
||||
{
|
||||
/* keep a cumlative count of the str lengths */
|
||||
len += strlen(str)+1;
|
||||
|
||||
/* no dependent files, we are done */
|
||||
if (!str) {
|
||||
return true;
|
||||
}
|
||||
|
||||
deps = talloc_zero(mem_ctx, struct spoolss_StringArray);
|
||||
if (!deps) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (str != NULL) {
|
||||
add_string_to_array(deps, str, &file_array, &count);
|
||||
str = strtok_r(NULL, ",", &saveptr);
|
||||
}
|
||||
|
||||
/* allocate the space; add one extra slot for a terminating NULL.
|
||||
Each filename is NULL terminated and the end contains a double
|
||||
NULL */
|
||||
if ((info->dependentfiles=TALLOC_ARRAY(mem_ctx, uint16, len+1)) == NULL)
|
||||
{
|
||||
DEBUG(0,("init_drv_info_3_members: Unable to malloc memory for dependenfiles\n"));
|
||||
return False;
|
||||
deps->string = talloc_zero_array(deps, const char *, count + 1);
|
||||
if (!deps->string) {
|
||||
return false;
|
||||
}
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
SSVAL(&info->dependentfiles[i], 0, str2[i]);
|
||||
}
|
||||
info->dependentfiles[len] = '\0';
|
||||
|
||||
return True;
|
||||
for (i=0; i < count; i++) {
|
||||
deps->string[i] = file_array[i];
|
||||
}
|
||||
|
||||
r->dependent_files = deps;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
****************************************************************************/
|
||||
|
||||
@ -1403,11 +1416,11 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
|
||||
int argc, const char **argv)
|
||||
{
|
||||
WERROR result;
|
||||
NTSTATUS status;
|
||||
uint32 level = 3;
|
||||
PRINTER_DRIVER_CTR ctr;
|
||||
DRIVER_INFO_3 info3;
|
||||
struct spoolss_AddDriverInfoCtr info_ctr;
|
||||
struct spoolss_AddDriverInfo3 info3;
|
||||
const char *arch;
|
||||
fstring driver_name;
|
||||
char *driver_args;
|
||||
|
||||
/* parse the command arguments */
|
||||
@ -1422,15 +1435,16 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
|
||||
return WERR_OK;
|
||||
}
|
||||
|
||||
/* Fill in the DRIVER_INFO_3 struct */
|
||||
/* Fill in the spoolss_AddDriverInfo3 struct */
|
||||
ZERO_STRUCT(info3);
|
||||
if (!(arch = cmd_spoolss_get_short_archi(argv[1])))
|
||||
{
|
||||
|
||||
arch = cmd_spoolss_get_short_archi(argv[1]);
|
||||
if (!arch) {
|
||||
printf ("Error Unknown architechture [%s]\n", argv[1]);
|
||||
return WERR_INVALID_PARAM;
|
||||
}
|
||||
else
|
||||
set_drv_info_3_env(&info3, arch);
|
||||
|
||||
set_drv_info_3_env(mem_ctx, &info3, arch);
|
||||
|
||||
driver_args = talloc_strdup( mem_ctx, argv[2] );
|
||||
if (!init_drv_info_3_members(mem_ctx, &info3, driver_args ))
|
||||
@ -1448,14 +1462,19 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
|
||||
}
|
||||
|
||||
|
||||
ctr.info3 = &info3;
|
||||
result = rpccli_spoolss_addprinterdriver (cli, mem_ctx, level, &ctr);
|
||||
info_ctr.level = level;
|
||||
info_ctr.info.info3 = &info3;
|
||||
|
||||
status = rpccli_spoolss_AddPrinterDriver(cli, mem_ctx,
|
||||
cli->srv_name_slash,
|
||||
&info_ctr,
|
||||
&result);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return ntstatus_to_werror(status);
|
||||
}
|
||||
if (W_ERROR_IS_OK(result)) {
|
||||
rpcstr_pull(driver_name, info3.name.buffer,
|
||||
sizeof(driver_name), -1, STR_TERMINATE);
|
||||
printf ("Printer Driver %s successfully installed.\n",
|
||||
driver_name);
|
||||
info3.driver_name);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
Loading…
x
Reference in New Issue
Block a user