summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
01e0d38)
with PCL drivers. The problem was we were updating the changeid on every
SETPRINTERDATA/DELETEPRINTERDATA call. We should not do this, we should
just update the 'setprinter' called count. We update the changeid on calls
to SETPRINTER/ADDPRINTER/ADDPRINTEREX etc. Also fixed the correct returning
of the create time on printers.
Jeremy.
(This used to be commit
521f09829fd329f87b3d19e8871e2b989c98a58e)
NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode);
void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr);
void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname);
NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode);
void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr);
void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname);
+uint32 mod_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level);
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level);
uint32 get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring sharename);
uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level);
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level);
uint32 get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring sharename);
uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level);
/****************************************************************************
****************************************************************************/
/****************************************************************************
****************************************************************************/
-static uint32 add_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
+static uint32 update_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
{
pstring key;
char *buf;
int buflen, len, ret;
TDB_DATA kbuf, dbuf;
{
pstring key;
char *buf;
int buflen, len, ret;
TDB_DATA kbuf, dbuf;
- NTTIME time_nt;
- time_t time_unix = time(NULL);
/*
* in addprinter: no servername and the printer is the name
/*
* in addprinter: no servername and the printer is the name
* behind a SAMBA share.
*/
* behind a SAMBA share.
*/
- unix_to_nt_time(&time_nt, time_unix);
- info->changeid=time_nt.low;
- info->c_setprinter++;
-
info.untiltime = 0; /* Minutes since 12:00am GMT */
info.priority = 1;
info.default_priority = 1;
info.untiltime = 0; /* Minutes since 12:00am GMT */
info.priority = 1;
info.default_priority = 1;
+ info.setuptime = (uint32)time(NULL);
if ((info.devmode = construct_nt_devicemode(info.printername)) == NULL)
goto fail;
if ((info.devmode = construct_nt_devicemode(info.printername)) == NULL)
goto fail;
kbuf.dsize = strlen(key)+1;
dbuf = tdb_fetch(tdb, kbuf);
kbuf.dsize = strlen(key)+1;
dbuf = tdb_fetch(tdb, kbuf);
if (!dbuf.dptr)
return get_a_printer_2_default(info_ptr, sharename);
if (!dbuf.dptr)
return get_a_printer_2_default(info_ptr, sharename);
-#else
- if (!dbuf.dptr) return 1;
-#endif
len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "dddddddddddfffffPfffff",
&info.attributes,
len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "dddddddddddfffffPfffff",
&info.attributes,
len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len);
len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len);
nt_printing_getsec(sharename, &info.secdesc_buf);
nt_printing_getsec(sharename, &info.secdesc_buf);
safe_free(dbuf.dptr);
*info_ptr=memdup(&info, sizeof(info));
safe_free(dbuf.dptr);
*info_ptr=memdup(&info, sizeof(info));
*/
/****************************************************************************
*/
/****************************************************************************
+ Modify a printer. This is called from SETPRINTERDATA/DELETEPRINTERDATA.
****************************************************************************/
****************************************************************************/
+
+uint32 mod_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
+{
+ uint32 success;
+
+ dump_a_printer(printer, level);
+
+ switch (level)
+ {
+ case 2:
+ {
+ printer.info_2->c_setprinter++;
+ success=update_a_printer_2(printer.info_2);
+ break;
+ }
+ default:
+ success=1;
+ break;
+ }
+
+ return (success);
+}
+
+/****************************************************************************
+ Add a printer. This is called from ADDPRINTER(EX) and also SETPRINTER.
+ We split this out from mod_a_printer as it updates the id's and timestamps.
+****************************************************************************/
+
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
{
uint32 success;
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
{
uint32 success;
- success=add_a_printer_2(printer.info_2);
+ /*
+ * Update the changestamp.
+ * Note we must *not* do this in mod_a_printer().
+ */
+ NTTIME time_nt;
+ time_t time_unix = time(NULL);
+ unix_to_nt_time(&time_nt, time_unix);
+ printer.info_2->changeid=time_nt.low;
+
+ printer.info_2->c_setprinter++;
+ success=update_a_printer_2(printer.info_2);
counter_printer_0 *session_counter;
uint32 global_counter;
struct tm *t;
counter_printer_0 *session_counter;
uint32 global_counter;
struct tm *t;
- time_t setup_time = time(NULL);
print_queue_struct *queue=NULL;
print_status_struct status;
print_queue_struct *queue=NULL;
print_status_struct status;
printer->total_jobs = 0;
printer->total_bytes = 0;
printer->total_jobs = 0;
printer->total_bytes = 0;
- t=gmtime(&setup_time);
- ntprinter->info_2->setuptime = (uint32)setup_time; /* FIXME !! */
+ setuptime = (time_t)ntprinter->info_2->setuptime;
+ t=gmtime(&setuptime);
printer->year = t->tm_year+1900;
printer->month = t->tm_mon+1;
printer->year = t->tm_year+1900;
printer->month = t->tm_mon+1;
return ERROR_NOT_ENOUGH_MEMORY;
}
return ERROR_NOT_ENOUGH_MEMORY;
}
- ZERO_STRUCTP(*data_out);
+ memset(*data_out,'\0',in_data_len);
memcpy(*data_out, data, (size_t)data_len);
*out_data_len=data_len;
memcpy(*data_out, data, (size_t)data_len);
*out_data_len=data_len;
if (!add_a_specific_param(printer->info_2, param))
status = ERROR_INVALID_PARAMETER;
else
if (!add_a_specific_param(printer->info_2, param))
status = ERROR_INVALID_PARAMETER;
else
- status = add_a_printer(*printer, 2);
+ status = mod_a_printer(*printer, 2);
free_a_printer(&printer, 2);
return status;
free_a_printer(&printer, 2);
return status;
if(!unlink_specific_param_if_exist(printer->info_2, ¶m))
status = ERROR_INVALID_PARAMETER;
else
if(!unlink_specific_param_if_exist(printer->info_2, ¶m))
status = ERROR_INVALID_PARAMETER;
else
- status = add_a_printer(*printer, 2);
+ status = mod_a_printer(*printer, 2);
free_a_printer(&printer, 2);
return status;
free_a_printer(&printer, 2);
return status;
ctx_p->ngroups = ngroups;
safe_free(ctx_p->groups);
ctx_p->ngroups = ngroups;
safe_free(ctx_p->groups);
if (token && (token == ctx_p->token))
smb_panic("DUPLICATE_TOKEN");
if (token && (token == ctx_p->token))
smb_panic("DUPLICATE_TOKEN");
delete_nt_token(&ctx_p->token);
delete_nt_token(&ctx_p->token);