1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

More printer publishing code.

- Add published attribute to info2, needed for win clients to work properly
- Return proper info on getprinter 7

This means you can now look at the sharing tab of a printer and get correct
info about whether it is published or not, and change it.
(This used to be commit d57bddc9b2)
This commit is contained in:
Jim McDonough 2002-12-13 19:01:27 +00:00
parent 899b6e6d0f
commit 81a2a30739
4 changed files with 86 additions and 13 deletions

View File

@ -371,6 +371,7 @@ PRINTER_MESSAGE_INFO;
#define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800
#define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000
#define PRINTER_ATTRIBUTE_PUBLISHED 0x00002000
#define NO_PRIORITY 0
#define MAX_PRIORITY 99
@ -991,8 +992,8 @@ PRINTER_INFO_5;
#define SPOOL_DS_PUBLISH 1
#define SPOOL_DS_UPDATE 2
#define SPOOL_DS_UNPUBLISH 3
#define SPOOL_DS_REPUBLISH 4
#define SPOOL_DS_UNPUBLISH 4
#define SPOOL_DS_PENDING 0x80000000
typedef struct printer_info_7
{

View File

@ -1581,6 +1581,32 @@ BOOL ads_pull_uint32(ADS_STRUCT *ads,
return True;
}
/**
* pull a single objectGUID from an ADS result
* @param ads connection to ADS server
* @param msg results of search
* @param guid 37-byte area to receive text guid
* @return boolean indicating success
**/
BOOL ads_pull_guid(ADS_STRUCT *ads,
void *msg, GUID *guid)
{
char **values;
values = ldap_get_values(ads->ld, msg, "objectGUID");
if (!values) return False;
if (values[0]) {
memcpy(guid, values[0], sizeof(GUID));
ldap_value_free(values);
return True;
}
ldap_value_free(values);
return False;
}
/**
* pull a single DOM_SID from a ADS result
* @param ads connection to ads server

View File

@ -2540,7 +2540,8 @@ static BOOL map_nt_printer_info2_to_dsspooler(NT_PRINTER_INFO_LEVEL_2 *info2)
map_dword_into_ctr(ctr, SPOOL_REG_PRIORITY, info2->priority);
map_bool_into_ctr(ctr, SPOOL_REG_PRINTKEEPPRINTEDJOBS,
(info2->attributes & 0x100));
(info2->attributes &
PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS));
switch (info2->attributes & 0x3) {
case 0:
@ -2583,11 +2584,12 @@ WERROR nt_printer_publish(int snum, int action)
if (!W_ERROR_IS_OK(win_rc))
return win_rc;
if ((SPOOL_DS_PUBLISH == action) || (SPOOL_DS_UPDATE == action) ||
(SPOOL_DS_REPUBLISH == action)) {
if ((SPOOL_DS_PUBLISH == action) || (SPOOL_DS_UPDATE == action)) {
if (!(map_nt_printer_info2_to_dsspooler(printer->info_2)))
return WERR_NOMEM;
printer->info_2->attributes |= PRINTER_ATTRIBUTE_PUBLISHED;
win_rc = mod_a_printer(*printer, 2);
if (!W_ERROR_IS_OK(win_rc)) {
DEBUG(3, ("nt_printer_publish: err %d saving data\n",
@ -2600,13 +2602,22 @@ WERROR nt_printer_publish(int snum, int action)
&printer->info_2->data);
ads_mod_str(ctx, &mods, SPOOL_REG_PRINTERNAME,
lp_servicename(snum));
} else {
printer->info_2->attributes ^= PRINTER_ATTRIBUTE_PUBLISHED;
win_rc = mod_a_printer(*printer, 2);
if (!W_ERROR_IS_OK(win_rc)) {
DEBUG(3, ("nt_printer_publish: err %d saving data\n",
W_ERROR_V(win_rc)));
free_a_printer(&printer, 2);
return win_rc;
}
}
ads = ads_init(NULL, NULL, lp_ads_server());
ads_rc = ads_connect(ads);
if ((SPOOL_DS_UNPUBLISH == action) || (SPOOL_DS_REPUBLISH == action)) {
if (SPOOL_DS_UNPUBLISH == action) {
ads_rc = ads_find_printer_on_server(ads, &res,
printer->info_2->sharename, global_myname());
if (ADS_ERR_OK(ads_rc) && ads_count_replies(ads, res)) {
@ -2617,8 +2628,7 @@ WERROR nt_printer_publish(int snum, int action)
}
}
if ((SPOOL_DS_PUBLISH == action) || (SPOOL_DS_UPDATE == action) ||
(SPOOL_DS_REPUBLISH == action)) {
if ((SPOOL_DS_PUBLISH == action) || (SPOOL_DS_UPDATE == action)) {
ads_find_machine_acct(ads, &res, global_myname());
srv_dn = ldap_get_dn(ads->ld, res);
ads_msgfree(ads, res);

View File

@ -4148,14 +4148,50 @@ static BOOL construct_printer_info_5(PRINTER_INFO_5 *printer, int snum)
}
/********************************************************************
* construct_printer_info_5
* fill a printer_info_5 struct
* construct_printer_info_7
* fill a printer_info_7 struct
********************************************************************/
static BOOL construct_printer_info_7(PRINTER_INFO_7 *printer)
static BOOL construct_printer_info_7(PRINTER_INFO_7 *printer, int snum)
{
#ifdef HAVE_ADS
char *guid_str = NULL;
GUID guid;
ADS_STRUCT *ads;
ADS_STATUS ads_rc;
void *res = NULL;
char *prt_dn;
const char *attrs[] = {"objectGUID", NULL};
printer->action = SPOOL_DS_UNPUBLISH;
ads = ads_init(NULL, NULL, lp_ads_server());
ads_rc = ads_connect(ads);
ads_rc = ads_find_printer_on_server(ads, &res, lp_servicename(snum),
global_myname());
if (ADS_ERR_OK(ads_rc) && ads_count_replies(ads, res)) {
prt_dn = ads_get_dn(ads, res);
ads_msgfree(ads, res);
if (prt_dn &&
ADS_ERR_OK(ads_search_dn(ads, &res, prt_dn, attrs))) {
ads_rc = ads_search_dn(ads, &res, prt_dn, attrs);
ads_memfree(ads, prt_dn);
ads_pull_guid(ads, res, &guid);
printer->action = SPOOL_DS_PUBLISH;
}
}
ads_msgfree(ads, res);
asprintf(&guid_str, "{%s}", uuid_string_static(guid));
strupper(guid_str);
init_unistr(&printer->guid, guid_str);
#else
printer->action = SPOOL_DS_UNPUBLISH;
init_unistr(&printer->guid, "");
printer->action = 0;
#endif
return True;
}
@ -4722,7 +4758,7 @@ static WERROR getprinter_level_7(int snum, NEW_BUFFER *buffer, uint32 offered, u
if((printer=(PRINTER_INFO_7*)malloc(sizeof(PRINTER_INFO_7)))==NULL)
return WERR_NOMEM;
if (!construct_printer_info_7(printer))
if (!construct_printer_info_7(printer, snum))
return WERR_NOMEM;
/* check the required size. */