libads/ldap_printer.c

ソースコードを見る。

データ構造

struct  valmap_to_ads

関数

ADS_STATUS ads_find_printer_on_server (ADS_STRUCT *ads, LDAPMessage **res, const char *printer, const char *servername)
ADS_STATUS ads_find_printers (ADS_STRUCT *ads, LDAPMessage **res)
ADS_STATUS ads_mod_printer_entry (ADS_STRUCT *ads, char *prt_dn, TALLOC_CTX *ctx, const ADS_MODLIST *mods)
ADS_STATUS ads_add_printer_entry (ADS_STRUCT *ads, char *prt_dn, TALLOC_CTX *ctx, ADS_MODLIST *mods)
static BOOL map_sz (TALLOC_CTX *ctx, ADS_MODLIST *mods, const REGISTRY_VALUE *value)
static BOOL map_dword (TALLOC_CTX *ctx, ADS_MODLIST *mods, const REGISTRY_VALUE *value)
static BOOL map_bool (TALLOC_CTX *ctx, ADS_MODLIST *mods, const REGISTRY_VALUE *value)
static BOOL map_multi_sz (TALLOC_CTX *ctx, ADS_MODLIST *mods, const REGISTRY_VALUE *value)
static void map_regval_to_ads (TALLOC_CTX *ctx, ADS_MODLIST *mods, REGISTRY_VALUE *value)
WERROR get_remote_printer_publishing_data (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, ADS_MODLIST *mods, const char *printer)
BOOL get_local_printer_publishing_data (TALLOC_CTX *mem_ctx, ADS_MODLIST *mods, NT_PRINTER_DATA *data)


関数

ADS_STATUS ads_find_printer_on_server ( ADS_STRUCT ads,
LDAPMessage **  res,
const char *  printer,
const char *  servername 
)

ldap_printer.c30 行で定義されています。

参照先 ads_count_replies()ads_find_machine_acct()ads_msgfree()ads_search()asprintf()ADS_STRUCT::ldstatus.

参照元 net_ads_printer_info()net_ads_printer_remove()nt_printer_unpublish_ads().

00033 {
00034         ADS_STATUS status;
00035         char *srv_dn, **srv_cn, *s;
00036         const char *attrs[] = {"*", "nTSecurityDescriptor", NULL};
00037 
00038         status = ads_find_machine_acct(ads, res, servername);
00039         if (!ADS_ERR_OK(status)) {
00040                 DEBUG(1, ("ads_find_printer_on_server: cannot find host %s in ads\n",
00041                           servername));
00042                 return status;
00043         }
00044         if (ads_count_replies(ads, *res) != 1) {
00045                 return ADS_ERROR(LDAP_NO_SUCH_OBJECT);
00046         }
00047         srv_dn = ldap_get_dn(ads->ld, *res);
00048         if (srv_dn == NULL) {
00049                 return ADS_ERROR(LDAP_NO_MEMORY);
00050         }
00051         srv_cn = ldap_explode_dn(srv_dn, 1);
00052         if (srv_cn == NULL) {
00053                 ldap_memfree(srv_dn);
00054                 return ADS_ERROR(LDAP_INVALID_DN_SYNTAX);
00055         }
00056         ads_msgfree(ads, *res);
00057 
00058         asprintf(&s, "(cn=%s-%s)", srv_cn[0], printer);
00059         status = ads_search(ads, res, s, attrs);
00060 
00061         ldap_memfree(srv_dn);
00062         ldap_value_free(srv_cn);
00063         free(s);
00064         return status;  
00065 }

ADS_STATUS ads_find_printers ( ADS_STRUCT ads,
LDAPMessage **  res 
)

ldap_printer.c67 行で定義されています。

参照先 ads_search().

参照元 net_ads_printer_search().

00068 {
00069         const char *ldap_expr;
00070         const char *attrs[] = { "objectClass", "printerName", "location", "driverName",
00071                                 "serverName", "description", NULL };
00072 
00073         /* For the moment only display all printers */
00074 
00075         ldap_expr = "(&(!(showInAdvancedViewOnly=TRUE))(uncName=*)"
00076                 "(objectCategory=printQueue))";
00077 
00078         return ads_search(ads, res, ldap_expr, attrs);
00079 }

ADS_STATUS ads_mod_printer_entry ( ADS_STRUCT ads,
char *  prt_dn,
TALLOC_CTX ctx,
const ADS_MODLIST mods 
)

ldap_printer.c84 行で定義されています。

参照先 ads_gen_mod().

参照元 nt_printer_publish_ads().

00086 {
00087         return ads_gen_mod(ads, prt_dn, *mods);
00088 }

ADS_STATUS ads_add_printer_entry ( ADS_STRUCT ads,
char *  prt_dn,
TALLOC_CTX ctx,
ADS_MODLIST mods 
)

ldap_printer.c93 行で定義されています。

参照先 ads_gen_add()ads_mod_str().

参照元 net_ads_printer_publish()nt_printer_publish_ads().

00095 {
00096         ads_mod_str(ctx, mods, "objectClass", "printQueue");
00097         return ads_gen_add(ads, prt_dn, *mods);
00098 }

static BOOL map_sz ( TALLOC_CTX ctx,
ADS_MODLIST mods,
const REGISTRY_VALUE value 
) [static]

ldap_printer.c103 行で定義されています。

参照先 ads_mod_str()REGISTRY_VALUE::data_ppull_ucs2_talloc()REGISTRY_VALUE::sizestatusREGISTRY_VALUE::typeREGISTRY_VALUE::valuename.

参照元 map_regval_to_ads().

00105 {
00106         char *str_value = NULL;
00107         ADS_STATUS status;
00108 
00109         if (value->type != REG_SZ)
00110                 return False;
00111 
00112         if (value->size && *((smb_ucs2_t *) value->data_p)) {
00113                 pull_ucs2_talloc(ctx, &str_value, (const smb_ucs2_t *) value->data_p);
00114                 status = ads_mod_str(ctx, mods, value->valuename, str_value);
00115                 return ADS_ERR_OK(status);
00116         }
00117         return True;
00118                 
00119 }

static BOOL map_dword ( TALLOC_CTX ctx,
ADS_MODLIST mods,
const REGISTRY_VALUE value 
) [static]

ldap_printer.c124 行で定義されています。

参照先 ads_mod_str()REGISTRY_VALUE::data_pstatustalloc_asprintf()REGISTRY_VALUE::typeREGISTRY_VALUE::valuename.

参照元 map_regval_to_ads().

00126 {
00127         char *str_value = NULL;
00128         ADS_STATUS status;
00129 
00130         if (value->type != REG_DWORD)
00131                 return False;
00132         str_value = talloc_asprintf(ctx, "%d", *((uint32 *) value->data_p));
00133         if (!str_value) {
00134                 return False;
00135         }
00136         status = ads_mod_str(ctx, mods, value->valuename, str_value);
00137         return ADS_ERR_OK(status);
00138 }

static BOOL map_bool ( TALLOC_CTX ctx,
ADS_MODLIST mods,
const REGISTRY_VALUE value 
) [static]

ldap_printer.c143 行で定義されています。

参照先 ads_mod_str()REGISTRY_VALUE::data_pREGISTRY_VALUE::sizestatustalloc_asprintf()REGISTRY_VALUE::typeREGISTRY_VALUE::valuename.

参照元 map_regval_to_ads().

00145 {
00146         char *str_value;
00147         ADS_STATUS status;
00148 
00149         if ((value->type != REG_BINARY) || (value->size != 1))
00150                 return False;
00151         str_value =  talloc_asprintf(ctx, "%s", 
00152                                      *(value->data_p) ? "TRUE" : "FALSE");
00153         if (!str_value) {
00154                 return False;
00155         }
00156         status = ads_mod_str(ctx, mods, value->valuename, str_value);
00157         return ADS_ERR_OK(status);
00158 }

static BOOL map_multi_sz ( TALLOC_CTX ctx,
ADS_MODLIST mods,
const REGISTRY_VALUE value 
) [static]

ldap_printer.c163 行で定義されています。

参照先 ads_mod_strlist()REGISTRY_VALUE::data_ppull_ucs2_talloc()sizestatusstrlen_w()REGISTRY_VALUE::typeREGISTRY_VALUE::valuename.

参照元 map_regval_to_ads().

00165 {
00166         char **str_values = NULL;
00167         smb_ucs2_t *cur_str = (smb_ucs2_t *) value->data_p;
00168         uint32 size = 0, num_vals = 0, i=0;
00169         ADS_STATUS status;
00170 
00171         if (value->type != REG_MULTI_SZ)
00172                 return False;
00173 
00174         while(cur_str && *cur_str && (size < value->size)) {            
00175                 size += 2 * (strlen_w(cur_str) + 1);
00176                 cur_str += strlen_w(cur_str) + 1;
00177                 num_vals++;
00178         };
00179 
00180         if (num_vals) {
00181                 str_values = TALLOC_ARRAY(ctx, char *, num_vals + 1);
00182                 if (!str_values) {
00183                         return False;
00184                 }
00185                 memset(str_values, '\0', 
00186                        (num_vals + 1) * sizeof(char *));
00187 
00188                 cur_str = (smb_ucs2_t *) value->data_p;
00189                 for (i=0; i < num_vals; i++)
00190                         cur_str += pull_ucs2_talloc(ctx, &str_values[i],
00191                                                     cur_str);
00192 
00193                 status = ads_mod_strlist(ctx, mods, value->valuename, 
00194                                          (const char **) str_values);
00195                 return ADS_ERR_OK(status);
00196         } 
00197         return True;
00198 }

static void map_regval_to_ads ( TALLOC_CTX ctx,
ADS_MODLIST mods,
REGISTRY_VALUE value 
) [static]

ldap_printer.c208 行で定義されています。

参照先 fnmap_bool()map_dword()map_multi_sz()map_sz()StrCaseCmp()valmap_to_ads::valnameREGISTRY_VALUE::valuename.

参照元 get_local_printer_publishing_data()get_remote_printer_publishing_data().

00210 {
00211         const struct valmap_to_ads map[] = {
00212                 {SPOOL_REG_ASSETNUMBER, map_sz},
00213                 {SPOOL_REG_BYTESPERMINUTE, map_dword},
00214                 {SPOOL_REG_DEFAULTPRIORITY, map_dword},
00215                 {SPOOL_REG_DESCRIPTION, map_sz},
00216                 {SPOOL_REG_DRIVERNAME, map_sz},
00217                 {SPOOL_REG_DRIVERVERSION, map_dword},
00218                 {SPOOL_REG_FLAGS, map_dword},
00219                 {SPOOL_REG_LOCATION, map_sz},
00220                 {SPOOL_REG_OPERATINGSYSTEM, map_sz},
00221                 {SPOOL_REG_OPERATINGSYSTEMHOTFIX, map_sz},
00222                 {SPOOL_REG_OPERATINGSYSTEMSERVICEPACK, map_sz},
00223                 {SPOOL_REG_OPERATINGSYSTEMVERSION, map_sz},
00224                 {SPOOL_REG_PORTNAME, map_multi_sz},
00225                 {SPOOL_REG_PRINTATTRIBUTES, map_dword},
00226                 {SPOOL_REG_PRINTBINNAMES, map_multi_sz},
00227                 {SPOOL_REG_PRINTCOLLATE, map_bool},
00228                 {SPOOL_REG_PRINTCOLOR, map_bool},
00229                 {SPOOL_REG_PRINTDUPLEXSUPPORTED, map_bool},
00230                 {SPOOL_REG_PRINTENDTIME, map_dword},
00231                 {SPOOL_REG_PRINTFORMNAME, map_sz},
00232                 {SPOOL_REG_PRINTKEEPPRINTEDJOBS, map_bool},
00233                 {SPOOL_REG_PRINTLANGUAGE, map_multi_sz},
00234                 {SPOOL_REG_PRINTMACADDRESS, map_sz},
00235                 {SPOOL_REG_PRINTMAXCOPIES, map_sz},
00236                 {SPOOL_REG_PRINTMAXRESOLUTIONSUPPORTED, map_dword},
00237                 {SPOOL_REG_PRINTMAXXEXTENT, map_dword},
00238                 {SPOOL_REG_PRINTMAXYEXTENT, map_dword},
00239                 {SPOOL_REG_PRINTMEDIAREADY, map_multi_sz},
00240                 {SPOOL_REG_PRINTMEDIASUPPORTED, map_multi_sz},
00241                 {SPOOL_REG_PRINTMEMORY, map_dword},
00242                 {SPOOL_REG_PRINTMINXEXTENT, map_dword},
00243                 {SPOOL_REG_PRINTMINYEXTENT, map_dword},
00244                 {SPOOL_REG_PRINTNETWORKADDRESS, map_sz},
00245                 {SPOOL_REG_PRINTNOTIFY, map_sz},
00246                 {SPOOL_REG_PRINTNUMBERUP, map_dword},
00247                 {SPOOL_REG_PRINTORIENTATIONSSUPPORTED, map_multi_sz},
00248                 {SPOOL_REG_PRINTOWNER, map_sz},
00249                 {SPOOL_REG_PRINTPAGESPERMINUTE, map_dword},
00250                 {SPOOL_REG_PRINTRATE, map_dword},
00251                 {SPOOL_REG_PRINTRATEUNIT, map_sz},
00252                 {SPOOL_REG_PRINTSEPARATORFILE, map_sz},
00253                 {SPOOL_REG_PRINTSHARENAME, map_sz},
00254                 {SPOOL_REG_PRINTSPOOLING, map_sz},
00255                 {SPOOL_REG_PRINTSTAPLINGSUPPORTED, map_bool},
00256                 {SPOOL_REG_PRINTSTARTTIME, map_dword},
00257                 {SPOOL_REG_PRINTSTATUS, map_sz},
00258                 {SPOOL_REG_PRIORITY, map_dword},
00259                 {SPOOL_REG_SERVERNAME, map_sz},
00260                 {SPOOL_REG_SHORTSERVERNAME, map_sz},
00261                 {SPOOL_REG_UNCNAME, map_sz},
00262                 {SPOOL_REG_URL, map_sz},
00263                 {SPOOL_REG_VERSIONNUMBER, map_dword},
00264                 {NULL, NULL}
00265         };
00266         int i;
00267 
00268         for (i=0; map[i].valname; i++) {
00269                 if (StrCaseCmp(map[i].valname, value->valuename) == 0) {
00270                         if (!map[i].fn(ctx, mods, value)) {
00271                                 DEBUG(5, ("Add of value %s to modlist failed\n", value->valuename));
00272                         } else {
00273                                 DEBUG(7, ("Mapped value %s\n", value->valuename));
00274                         }
00275                         
00276                 }
00277         }
00278 }

WERROR get_remote_printer_publishing_data ( struct rpc_pipe_client cli,
TALLOC_CTX mem_ctx,
ADS_MODLIST mods,
const char *  printer 
)

ldap_printer.c281 行で定義されています。

参照先 ads_mod_str()asprintf()clicli_state::desthostdos_errstr()map_regval_to_ads()polregval_ctr_numvals()resultrpccli_spoolss_close_printer()rpccli_spoolss_enumprinterdataex()rpccli_spoolss_open_printer_ex()cli_state::user_nameREGVAL_CTR::values.

参照元 net_ads_printer_publish().

00285 {
00286         WERROR result;
00287         char *printername, *servername;
00288         REGVAL_CTR *dsdriver_ctr, *dsspooler_ctr;
00289         uint32 i;
00290         POLICY_HND pol;
00291 
00292         asprintf(&servername, "\\\\%s", cli->cli->desthost);
00293         asprintf(&printername, "%s\\%s", servername, printer);
00294         if (!servername || !printername) {
00295                 DEBUG(3, ("Insufficient memory\n"));
00296                 return WERR_NOMEM;
00297         }
00298         
00299         result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, 
00300                                              "", MAXIMUM_ALLOWED_ACCESS, 
00301                                              servername, cli->cli->user_name, &pol);
00302         if (!W_ERROR_IS_OK(result)) {
00303                 DEBUG(3, ("Unable to open printer %s, error is %s.\n",
00304                           printername, dos_errstr(result)));
00305                 return result;
00306         }
00307         
00308         if ( !(dsdriver_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) ) 
00309                 return WERR_NOMEM;
00310 
00311         result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSDRIVER_KEY, dsdriver_ctr);
00312 
00313         if (!W_ERROR_IS_OK(result)) {
00314                 DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
00315                           printername, dos_errstr(result)));
00316         } else {
00317                 uint32 num_values = regval_ctr_numvals( dsdriver_ctr );
00318 
00319                 /* Have the data we need now, so start building */
00320                 for (i=0; i < num_values; i++) {
00321                         map_regval_to_ads(mem_ctx, mods, dsdriver_ctr->values[i]);
00322                 }
00323         }
00324         
00325         if ( !(dsspooler_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) )
00326                 return WERR_NOMEM;
00327 
00328         result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSSPOOLER_KEY, dsspooler_ctr);
00329 
00330         if (!W_ERROR_IS_OK(result)) {
00331                 DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
00332                           printername, dos_errstr(result)));
00333         } else {
00334                 uint32 num_values = regval_ctr_numvals( dsspooler_ctr );
00335 
00336                 for (i=0; i<num_values; i++) {
00337                         map_regval_to_ads(mem_ctx, mods, dsspooler_ctr->values[i]);
00338                 }
00339         }
00340         
00341         ads_mod_str(mem_ctx, mods, SPOOL_REG_PRINTERNAME, printer);
00342 
00343         TALLOC_FREE( dsdriver_ctr );
00344         TALLOC_FREE( dsspooler_ctr );
00345 
00346         rpccli_spoolss_close_printer(cli, mem_ctx, &pol);
00347 
00348         return result;
00349 }

BOOL get_local_printer_publishing_data ( TALLOC_CTX mem_ctx,
ADS_MODLIST mods,
NT_PRINTER_DATA data 
)

ldap_printer.c351 行で定義されています。

参照先 NT_PRINTER_DATA::keysmap_regval_to_ads()NT_PRINTER_DATA::num_keysNT_PRINTER_KEY::values.

参照元 nt_printer_publish_ads().

00354 {
00355         uint32 key,val;
00356 
00357         for (key=0; key < data->num_keys; key++) {
00358                 REGVAL_CTR *ctr = data->keys[key].values;
00359                 for (val=0; val < ctr->num_values; val++)
00360                         map_regval_to_ads(mem_ctx, mods, ctr->values[val]);
00361         }
00362         return True;
00363 }


Sambaに対してSat Aug 29 21:23:42 2009に生成されました。  doxygen 1.4.7