smbd/lanman.c

ソースコードを見る。

データ構造

struct  pack_desc
struct  srv_info_struct

関数

static BOOL api_Unsupported (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_TooSmall (connection_struct *conn, uint16 vuid, char *param, char *data, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static int CopyExpanded (connection_struct *conn, int snum, char **dst, char *src, int *n)
static int CopyAndAdvance (char **dst, char *src, int *n)
static int StrlenExpanded (connection_struct *conn, int snum, char *s)
static char * Expand (connection_struct *conn, int snum, char *s)
static BOOL prefix_ok (const char *str, const char *prefix)
static int get_counter (const char **p)
static int getlen (const char *p)
static BOOL init_package (struct pack_desc *p, int count, int subcount)
static int package (struct pack_desc *p,...)
static void PACKI (struct pack_desc *desc, const char *t, int v)
static void PACKS (struct pack_desc *desc, const char *t, const char *v)
static void PackDriverData (struct pack_desc *desc)
static int check_printq_info (struct pack_desc *desc, unsigned int uLevel, char *id1, char *id2)
static int printj_status (int v)
static int printq_status (int v)
static void fill_printjob_info (connection_struct *conn, int snum, int uLevel, struct pack_desc *desc, print_queue_struct *queue, int n)
static BOOL get_driver_name (int snum, pstring drivername)
static void fill_printq_info_52 (connection_struct *conn, int snum, struct pack_desc *desc, int count)
static void fill_printq_info (connection_struct *conn, int snum, int uLevel, struct pack_desc *desc, int count, print_queue_struct *queue, print_status_struct *status)
static int get_printerdrivernumber (int snum)
static BOOL api_DosPrintQGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_DosPrintQEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL check_server_info (int uLevel, char *id)
static int get_server_info (uint32 servertype, struct srv_info_struct **servers, const char *domain)
static int fill_srv_info (struct srv_info_struct *service, int uLevel, char **buf, int *buflen, char **stringbuf, int *stringspace, char *baseaddr)
static BOOL srv_comp (struct srv_info_struct *s1, struct srv_info_struct *s2)
static BOOL api_RNetServerEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetGroupGetUsers (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL check_share_info (int uLevel, char *id)
static int fill_share_info (connection_struct *conn, int snum, int uLevel, char **buf, int *buflen, char **stringbuf, int *stringspace, char *baseaddr)
static BOOL api_RNetShareGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetShareEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetShareAdd (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetGroupEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_NetUserGetGroups (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetUserEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_NetRemoteTOD (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_SetUserPassword (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_SamOEMChangePassword (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RDosPrintJobDel (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintQueueCtrl (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static int check_printjob_info (struct pack_desc *desc, int uLevel, char *id)
static BOOL api_PrintJobInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetServerGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_NetWkstaGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetUserGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WWkstaUserLogon (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WAccessGetUserPerms (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintJobGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintJobEnumerate (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static int check_printdest_info (struct pack_desc *desc, int uLevel, char *id)
static void fill_printdest_info (connection_struct *conn, int snum, int uLevel, struct pack_desc *desc)
static BOOL api_WPrintDestGetInfo (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintDestEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintDriverEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintQProcEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_WPrintPortEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
static BOOL api_RNetSessionEnum (connection_struct *conn, uint16 vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len)
int api_reply (connection_struct *conn, uint16 vuid, char *outbuf, char *data, char *params, int tdscnt, int tpscnt, int mdrcnt, int mprcnt)

変数

current_user current_user
userdom_struct current_user_info
struct {
   const char *   name
   int   id
   BOOL(*   fn )(connection_struct *, uint16, char *, int, char *, int, int, int, char **, char **, int *, int *)
   BOOL   auth_user
api_commands []


関数

static BOOL api_Unsupported ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c4298 行で定義されています。

04304 {
04305         *rparam_len = 4;
04306         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04307         if (!*rparam) {
04308                 return False;
04309         }
04310 
04311         *rdata_len = 0;
04312 
04313         SSVAL(*rparam,0,NERR_notsupported);
04314         SSVAL(*rparam,2,0);             /* converter word */
04315 
04316         DEBUG(3,("Unsupported API command\n"));
04317 
04318         return True;
04319 }

static BOOL api_TooSmall ( connection_struct conn,
uint16  vuid,
char *  param,
char *  data,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c4274 行で定義されています。

04278 {
04279         *rparam_len = MIN(*rparam_len,mprcnt);
04280         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04281         if (!*rparam) {
04282                 return False;
04283         }
04284 
04285         *rdata_len = 0;
04286 
04287         SSVAL(*rparam,0,NERR_BufTooSmall);
04288 
04289         DEBUG(3,("Supplied buffer too small in API command\n"));
04290 
04291         return True;
04292 }

static int CopyExpanded ( connection_struct conn,
int  snum,
char **  dst,
char *  src,
int *  n 
) [static]

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

参照先 bufcurrent_user::connconnection_struct::connectpathcurrent_user_infouserdom_struct::domainget_current_username()connection_struct::gidpstring_sub()push_ascii()standard_sub_advanced()connection_struct::user.

参照元 fill_share_info().

00069 {
00070         pstring buf;
00071         int l;
00072 
00073         if (!src || !dst || !n || !(*dst)) {
00074                 return 0;
00075         }
00076 
00077         StrnCpy(buf,src,sizeof(buf)/2);
00078         pstring_sub(buf,"%S",lp_servicename(snum));
00079         standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
00080                               conn->connectpath, conn->gid,
00081                               get_current_username(),
00082                               current_user_info.domain,
00083                               buf, sizeof(buf));
00084         l = push_ascii(*dst,buf,*n, STR_TERMINATE);
00085         if (l == -1) {
00086                 return 0;
00087         }
00088         (*dst) += l;
00089         (*n) -= l;
00090         return l;
00091 }

static int CopyAndAdvance ( char **  dst,
char *  src,
int *  n 
) [static]

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

参照先 push_ascii().

参照元 fill_share_info()fill_srv_info().

00094 {
00095         int l;
00096         if (!src || !dst || !n || !(*dst)) {
00097                 return 0;
00098         }
00099         l = push_ascii(*dst,src,*n, STR_TERMINATE);
00100         if (l == -1) {
00101                 return 0;
00102         }
00103         (*dst) += l;
00104         (*n) -= l;
00105         return l;
00106 }

static int StrlenExpanded ( connection_struct conn,
int  snum,
char *  s 
) [static]

lanman.c108 行で定義されています。

参照先 bufcurrent_user::connconnection_struct::connectpathcurrent_user_infouserdom_struct::domainget_current_username()connection_struct::gidpstring_sub()standard_sub_advanced()connection_struct::user.

参照元 fill_share_info().

00109 {
00110         pstring buf;
00111         if (!s) {
00112                 return 0;
00113         }
00114         StrnCpy(buf,s,sizeof(buf)/2);
00115         pstring_sub(buf,"%S",lp_servicename(snum));
00116         standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
00117                               conn->connectpath, conn->gid,
00118                               get_current_username(),
00119                               current_user_info.domain,
00120                               buf, sizeof(buf));
00121         return strlen(buf) + 1;
00122 }

static char* Expand ( connection_struct conn,
int  snum,
char *  s 
) [static]

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

参照先 bufcurrent_user::connconnection_struct::connectpathcurrent_user_infouserdom_struct::domainget_current_username()connection_struct::gidpstring_sub()standard_sub_advanced()connection_struct::user.

参照元 fill_printq_info().

00125 {
00126         static pstring buf;
00127         if (!s) {
00128                 return NULL;
00129         }
00130         StrnCpy(buf,s,sizeof(buf)/2);
00131         pstring_sub(buf,"%S",lp_servicename(snum));
00132         standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
00133                               conn->connectpath, conn->gid,
00134                               get_current_username(),
00135                               current_user_info.domain,
00136                               buf, sizeof(buf));
00137         return &buf[0];
00138 }

static BOOL prefix_ok ( const char *  str,
const char *  prefix 
) [static]

lanman.c144 行で定義されています。

参照元 api_DosPrintQEnum()api_DosPrintQGetInfo()api_RNetGroupGetUsers()api_RNetServerEnum()api_RNetServerGetInfo()api_RNetShareAdd()api_RNetShareEnum()api_RNetShareGetInfo().

00145 {
00146         return(strncmp(str,prefix,strlen(prefix)) == 0);
00147 }

static int get_counter ( const char **  p  )  [static]

lanman.c164 行で定義されています。

参照元 getlen()package().

00165 {
00166         int i, n;
00167         if (!p || !(*p)) {
00168                 return 1;
00169         }
00170         if (!isdigit((int)**p)) {
00171                 return 1;
00172         }
00173         for (n = 0;;) {
00174                 i = **p;
00175                 if (isdigit(i)) {
00176                         n = 10 * n + (i - '0');
00177                 } else {
00178                         return n;
00179                 }
00180                 (*p)++;
00181         }
00182 }

static int getlen ( const char *  p  )  [static]

lanman.c184 行で定義されています。

参照先 get_counter().

参照元 api_DosPrintQGetInfo()api_WPrintDestGetInfo()api_WPrintJobGetInfo()init_package().

00185 {
00186         int n = 0;
00187         if (!p) {
00188                 return 0;
00189         }
00190 
00191         while (*p) {
00192                 switch( *p++ ) {
00193                 case 'W':                       /* word (2 byte) */
00194                         n += 2;
00195                         break;
00196                 case 'K':                       /* status word? (2 byte) */
00197                         n += 2;
00198                         break;
00199                 case 'N':                       /* count of substructures (word) at end */
00200                         n += 2;
00201                         break;
00202                 case 'D':                       /* double word (4 byte) */
00203                 case 'z':                       /* offset to zero terminated string (4 byte) */
00204                 case 'l':                       /* offset to user data (4 byte) */
00205                         n += 4;
00206                         break;
00207                 case 'b':                       /* offset to data (with counter) (4 byte) */
00208                         n += 4;
00209                         get_counter(&p);
00210                         break;
00211                 case 'B':                       /* byte (with optional counter) */
00212                         n += get_counter(&p);
00213                         break;
00214                 }
00215         }
00216         return n;
00217 }

static BOOL init_package ( struct pack_desc p,
int  count,
int  subcount 
) [static]

lanman.c219 行で定義されています。

参照先 pack_desc::basepack_desc::buflenpack_desc::curpospack_desc::errcodepack_desc::formatgetlen()pack_desc::neededlenpack_desc::stringbufpack_desc::stringlenpack_desc::structbufpack_desc::subcountpack_desc::subformatpack_desc::usedlen.

参照元 api_DosPrintQEnum()api_DosPrintQGetInfo()api_RNetSessionEnum()api_WPrintDestEnum()api_WPrintDestGetInfo()api_WPrintDriverEnum()api_WPrintJobEnumerate()api_WPrintJobGetInfo()api_WPrintPortEnum()api_WPrintQProcEnum()api_WWkstaUserLogon().

00220 {
00221         int n = p->buflen;
00222         int i;
00223 
00224         if (!p->format || !p->base) {
00225                 return False;
00226         }
00227 
00228         i = count * getlen(p->format);
00229         if (p->subformat) {
00230                 i += subcount * getlen(p->subformat);
00231         }
00232         p->structbuf = p->base;
00233         p->neededlen = 0;
00234         p->usedlen = 0;
00235         p->subcount = 0;
00236         p->curpos = p->format;
00237         if (i > n) {
00238                 p->neededlen = i;
00239                 i = n = 0;
00240 #if 0
00241                 /*
00242                  * This is the old error code we used. Aparently
00243                  * WinNT/2k systems return ERRbuftoosmall (2123) and
00244                  * OS/2 needs this. I'm leaving this here so we can revert
00245                  * if needed. JRA.
00246                  */
00247                 p->errcode = ERRmoredata;
00248 #else
00249                 p->errcode = ERRbuftoosmall;
00250 #endif
00251         } else {
00252                 p->errcode = NERR_Success;
00253         }
00254         p->buflen = i;
00255         n -= i;
00256         p->stringbuf = p->base + i;
00257         p->stringlen = n;
00258         return (p->errcode == NERR_Success);
00259 }

static int package ( struct pack_desc p,
  ... 
) [static]

lanman.c261 行で定義されています。

参照先 pack_desc::basepack_desc::buflenpack_desc::curpospack_desc::errcodepack_desc::formatget_counter()pack_desc::neededlenpack_desc::stringbufpack_desc::stringlenpack_desc::structbufpack_desc::subcountpack_desc::subformatpack_desc::usedlen.

00262 {
00263         va_list args;
00264         int needed=0, stringneeded;
00265         const char *str=NULL;
00266         int is_string=0, stringused;
00267         int32 temp;
00268 
00269         va_start(args,p);
00270 
00271         if (!*p->curpos) {
00272                 if (!p->subcount) {
00273                         p->curpos = p->format;
00274                 } else {
00275                         p->curpos = p->subformat;
00276                         p->subcount--;
00277                 }
00278         }
00279 #if CHECK_TYPES
00280         str = va_arg(args,char*);
00281         SMB_ASSERT(strncmp(str,p->curpos,strlen(str)) == 0);
00282 #endif
00283         stringneeded = -1;
00284 
00285         if (!p->curpos) {
00286                 va_end(args);
00287                 return 0;
00288         }
00289 
00290         switch( *p->curpos++ ) {
00291                 case 'W':                       /* word (2 byte) */
00292                         needed = 2;
00293                         temp = va_arg(args,int);
00294                         if (p->buflen >= needed) {
00295                                 SSVAL(p->structbuf,0,temp);
00296                         }
00297                         break;
00298                 case 'K':                       /* status word? (2 byte) */
00299                         needed = 2;
00300                         temp = va_arg(args,int);
00301                         if (p->buflen >= needed) {
00302                                 SSVAL(p->structbuf,0,temp);
00303                         }
00304                         break;
00305                 case 'N':                       /* count of substructures (word) at end */
00306                         needed = 2;
00307                         p->subcount = va_arg(args,int);
00308                         if (p->buflen >= needed) {
00309                                 SSVAL(p->structbuf,0,p->subcount);
00310                         }
00311                         break;
00312                 case 'D':                       /* double word (4 byte) */
00313                         needed = 4;
00314                         temp = va_arg(args,int);
00315                         if (p->buflen >= needed) {
00316                                 SIVAL(p->structbuf,0,temp);
00317                         }
00318                         break;
00319                 case 'B':                       /* byte (with optional counter) */
00320                         needed = get_counter(&p->curpos);
00321                         {
00322                                 char *s = va_arg(args,char*);
00323                                 if (p->buflen >= needed) {
00324                                         StrnCpy(p->structbuf,s?s:"",needed-1);
00325                                 }
00326                         }
00327                         break;
00328                 case 'z':                       /* offset to zero terminated string (4 byte) */
00329                         str = va_arg(args,char*);
00330                         stringneeded = (str ? strlen(str)+1 : 0);
00331                         is_string = 1;
00332                         break;
00333                 case 'l':                       /* offset to user data (4 byte) */
00334                         str = va_arg(args,char*);
00335                         stringneeded = va_arg(args,int);
00336                         is_string = 0;
00337                         break;
00338                 case 'b':                       /* offset to data (with counter) (4 byte) */
00339                         str = va_arg(args,char*);
00340                         stringneeded = get_counter(&p->curpos);
00341                         is_string = 0;
00342                         break;
00343         }
00344 
00345         va_end(args);
00346         if (stringneeded >= 0) {
00347                 needed = 4;
00348                 if (p->buflen >= needed) {
00349                         stringused = stringneeded;
00350                         if (stringused > p->stringlen) {
00351                                 stringused = (is_string ? p->stringlen : 0);
00352                                 if (p->errcode == NERR_Success) {
00353                                         p->errcode = ERRmoredata;
00354                                 }
00355                         }
00356                         if (!stringused) {
00357                                 SIVAL(p->structbuf,0,0);
00358                         } else {
00359                                 SIVAL(p->structbuf,0,PTR_DIFF(p->stringbuf,p->base));
00360                                 memcpy(p->stringbuf,str?str:"",stringused);
00361                                 if (is_string) {
00362                                         p->stringbuf[stringused-1] = '\0';
00363                                 }
00364                                 p->stringbuf += stringused;
00365                                 p->stringlen -= stringused;
00366                                 p->usedlen += stringused;
00367                         }
00368                 }
00369                 p->neededlen += stringneeded;
00370         }
00371 
00372         p->neededlen += needed;
00373         if (p->buflen >= needed) {
00374                 p->structbuf += needed;
00375                 p->buflen -= needed;
00376                 p->usedlen += needed;
00377         } else {
00378                 if (p->errcode == NERR_Success) {
00379                         p->errcode = ERRmoredata;
00380                 }
00381         }
00382         return 1;
00383 }

static void PACKI ( struct pack_desc desc,
const char *  t,
int  v 
) [static]

lanman.c393 行で定義されています。

参照元 api_RNetSessionEnum()api_WWkstaUserLogon()fill_printdest_info()fill_printjob_info()fill_printq_info()fill_printq_info_52().

00394 {
00395         PACK(desc,t,v);
00396 }

static void PACKS ( struct pack_desc desc,
const char *  t,
const char *  v 
) [static]

lanman.c398 行で定義されています。

参照元 api_RNetSessionEnum()api_WPrintDriverEnum()api_WPrintPortEnum()api_WPrintQProcEnum()api_WWkstaUserLogon()fill_printdest_info()fill_printjob_info()fill_printq_info()fill_printq_info_52().

00399 {
00400         PACK(desc,t,v);
00401 }

static void PackDriverData ( struct pack_desc desc  )  [static]

lanman.c407 行で定義されています。

参照先 push_ascii().

参照元 fill_printjob_info()fill_printq_info().

00408 {
00409         char drivdata[4+4+32];
00410         SIVAL(drivdata,0,sizeof drivdata); /* cb */
00411         SIVAL(drivdata,4,1000); /* lVersion */
00412         memset(drivdata+8,0,32);        /* szDeviceName */
00413         push_ascii(drivdata+8,"NULL",32, STR_TERMINATE);
00414         PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */
00415 }

static int check_printq_info ( struct pack_desc desc,
unsigned int  uLevel,
char *  id1,
char *  id2 
) [static]

lanman.c417 行で定義されています。

参照先 pack_desc::formatpack_desc::subformat.

参照元 api_DosPrintQEnum()api_DosPrintQGetInfo().

00419 {
00420         desc->subformat = NULL;
00421         switch( uLevel ) {
00422                 case 0:
00423                         desc->format = "B13";
00424                         break;
00425                 case 1:
00426                         desc->format = "B13BWWWzzzzzWW";
00427                         break;
00428                 case 2:
00429                         desc->format = "B13BWWWzzzzzWN";
00430                         desc->subformat = "WB21BB16B10zWWzDDz";
00431                         break;
00432                 case 3:
00433                         desc->format = "zWWWWzzzzWWzzl";
00434                         break;
00435                 case 4:
00436                         desc->format = "zWWWWzzzzWNzzl";
00437                         desc->subformat = "WWzWWDDzz";
00438                         break;
00439                 case 5:
00440                         desc->format = "z";
00441                         break;
00442                 case 51:
00443                         desc->format = "K";
00444                         break;
00445                 case 52:
00446                         desc->format = "WzzzzzzzzN";
00447                         desc->subformat = "z";
00448                         break;
00449                 default:
00450                         DEBUG(0,("check_printq_info: invalid level %d\n",
00451                                 uLevel ));
00452                         return False;
00453         }
00454         if (id1 == NULL || strcmp(desc->format,id1) != 0) {
00455                 DEBUG(0,("check_printq_info: invalid format %s\n",
00456                         id1 ? id1 : "<NULL>" ));
00457                 return False;
00458         }
00459         if (desc->subformat && (id2 == NULL || strcmp(desc->subformat,id2) != 0)) {
00460                 DEBUG(0,("check_printq_info: invalid subformat %s\n",
00461                         id2 ? id2 : "<NULL>" ));
00462                 return False;
00463         }
00464         return True;
00465 }

static int printj_status ( int  v  )  [static]

lanman.c479 行で定義されています。

参照先 LPQ_PAUSEDLPQ_PRINTINGLPQ_QUEUEDLPQ_SPOOLING.

参照元 fill_printjob_info().

00480 {
00481         switch (v) {
00482         case LPQ_QUEUED:
00483                 return RAP_JOB_STATUS_QUEUED;
00484         case LPQ_PAUSED:
00485                 return RAP_JOB_STATUS_PAUSED;
00486         case LPQ_SPOOLING:
00487                 return RAP_JOB_STATUS_SPOOLING;
00488         case LPQ_PRINTING:
00489                 return RAP_JOB_STATUS_PRINTING;
00490         }
00491         return 0;
00492 }

static int printq_status ( int  v  )  [static]

lanman.c496 行で定義されています。

参照先 LPQ_PAUSEDLPQ_QUEUED.

参照元 fill_printq_info().

00497 {
00498         switch (v) {
00499         case LPQ_QUEUED:
00500                 return 0;
00501         case LPQ_PAUSED:
00502                 return RAP_QUEUE_STATUS_PAUSED;
00503         }
00504         return RAP_QUEUE_STATUS_ERROR;
00505 }

static void fill_printjob_info ( connection_struct conn,
int  snum,
int  uLevel,
struct pack_desc desc,
print_queue_struct queue,
int  n 
) [static]

lanman.c507 行で定義されています。

参照先 _print_queue_struct::fs_file_print_queue_struct::fs_userget_time_zone()_print_queue_struct::jobPackDriverData()PACKI()PACKS()pjobid_to_rap()printj_status()_print_queue_struct::priority_print_queue_struct::size_print_queue_struct::statust_print_queue_struct::time.

参照元 api_WPrintJobEnumerate()api_WPrintJobGetInfo()fill_printq_info().

00510 {
00511         time_t t = queue->time;
00512 
00513         /* the client expects localtime */
00514         t -= get_time_zone(t);
00515 
00516         PACKI(desc,"W",pjobid_to_rap(lp_const_servicename(snum),queue->job)); /* uJobId */
00517         if (uLevel == 1) {
00518                 PACKS(desc,"B21",queue->fs_user); /* szUserName */
00519                 PACKS(desc,"B","");             /* pad */
00520                 PACKS(desc,"B16","");   /* szNotifyName */
00521                 PACKS(desc,"B10","PM_Q_RAW"); /* szDataType */
00522                 PACKS(desc,"z","");             /* pszParms */
00523                 PACKI(desc,"W",n+1);            /* uPosition */
00524                 PACKI(desc,"W",printj_status(queue->status)); /* fsStatus */
00525                 PACKS(desc,"z","");             /* pszStatus */
00526                 PACKI(desc,"D",t); /* ulSubmitted */
00527                 PACKI(desc,"D",queue->size); /* ulSize */
00528                 PACKS(desc,"z",queue->fs_file); /* pszComment */
00529         }
00530         if (uLevel == 2 || uLevel == 3 || uLevel == 4) {
00531                 PACKI(desc,"W",queue->priority);                /* uPriority */
00532                 PACKS(desc,"z",queue->fs_user); /* pszUserName */
00533                 PACKI(desc,"W",n+1);            /* uPosition */
00534                 PACKI(desc,"W",printj_status(queue->status)); /* fsStatus */
00535                 PACKI(desc,"D",t); /* ulSubmitted */
00536                 PACKI(desc,"D",queue->size); /* ulSize */
00537                 PACKS(desc,"z","Samba");        /* pszComment */
00538                 PACKS(desc,"z",queue->fs_file); /* pszDocument */
00539                 if (uLevel == 3) {
00540                         PACKS(desc,"z","");     /* pszNotifyName */
00541                         PACKS(desc,"z","PM_Q_RAW"); /* pszDataType */
00542                         PACKS(desc,"z","");     /* pszParms */
00543                         PACKS(desc,"z","");     /* pszStatus */
00544                         PACKS(desc,"z",SERVICE(snum)); /* pszQueue */
00545                         PACKS(desc,"z","lpd");  /* pszQProcName */
00546                         PACKS(desc,"z","");     /* pszQProcParms */
00547                         PACKS(desc,"z","NULL"); /* pszDriverName */
00548                         PackDriverData(desc);   /* pDriverData */
00549                         PACKS(desc,"z","");     /* pszPrinterName */
00550                 } else if (uLevel == 4) {   /* OS2 */
00551                         PACKS(desc,"z","");       /* pszSpoolFileName  */
00552                         PACKS(desc,"z","");       /* pszPortName       */
00553                         PACKS(desc,"z","");       /* pszStatus         */
00554                         PACKI(desc,"D",0);        /* ulPagesSpooled    */
00555                         PACKI(desc,"D",0);        /* ulPagesSent       */
00556                         PACKI(desc,"D",0);        /* ulPagesPrinted    */
00557                         PACKI(desc,"D",0);        /* ulTimePrinted     */
00558                         PACKI(desc,"D",0);        /* ulExtendJobStatus */
00559                         PACKI(desc,"D",0);        /* ulStartPage       */
00560                         PACKI(desc,"D",0);        /* ulEndPage         */
00561                 }
00562         }
00563 }

static BOOL get_driver_name ( int  snum,
pstring  drivername 
) [static]

lanman.c570 行で定義されています。

参照先 nt_printer_info_level_2::drivernamefree_a_printer()get_a_printer()nt_printer_info_level::info_2.

参照元 fill_printq_info().

00571 {
00572         NT_PRINTER_INFO_LEVEL *info = NULL;
00573         BOOL in_tdb = False;
00574 
00575         get_a_printer (NULL, &info, 2, lp_servicename(snum));
00576         if (info != NULL) {
00577                 pstrcpy( drivername, info->info_2->drivername);
00578                 in_tdb = True;
00579                 free_a_printer(&info, 2);
00580         }
00581 
00582         return in_tdb;
00583 }

static void fill_printq_info_52 ( connection_struct conn,
int  snum,
struct pack_desc desc,
int  count 
) [static]

lanman.c589 行で定義されています。

参照先 nt_printer_driver_info_level_3::datafilent_printer_driver_info_level_3::defaultdatatypent_printer_driver_info_level_3::dependentfilesnt_printer_info_level_2::drivernament_printer_driver_info_level_3::driverpatherrpack_desc::errcodefree_a_printer()free_a_printer_driver()get_a_printer()get_a_printer_driver()nt_printer_driver_info_level_3::helpfilent_printer_info_level::info_2nt_printer_driver_info_level::info_3nt_printer_driver_info_level_3::monitornament_printer_driver_info_level_3::namePACKI()PACKS()standard_sub_basic()trim_string().

参照元 fill_printq_info().

00591 {
00592         int                             i;
00593         fstring                         location;
00594         NT_PRINTER_DRIVER_INFO_LEVEL    driver;
00595         NT_PRINTER_INFO_LEVEL           *printer = NULL;
00596 
00597         ZERO_STRUCT(driver);
00598 
00599         if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) {
00600                 DEBUG(3,("fill_printq_info_52: Failed to lookup printer [%s]\n", 
00601                         lp_servicename(snum)));
00602                 goto err;
00603         }
00604 
00605         if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername, 
00606                 "Windows 4.0", 0)) )
00607         {
00608                 DEBUG(3,("fill_printq_info_52: Failed to lookup driver [%s]\n", 
00609                         printer->info_2->drivername));
00610                 goto err;
00611         }
00612 
00613         trim_string(driver.info_3->driverpath, "\\print$\\WIN40\\0\\", 0);
00614         trim_string(driver.info_3->datafile, "\\print$\\WIN40\\0\\", 0);
00615         trim_string(driver.info_3->helpfile, "\\print$\\WIN40\\0\\", 0);
00616 
00617         PACKI(desc, "W", 0x0400);                     /* don't know */
00618         PACKS(desc, "z", driver.info_3->name);        /* long printer name */
00619         PACKS(desc, "z", driver.info_3->driverpath);  /* Driverfile Name */
00620         PACKS(desc, "z", driver.info_3->datafile);    /* Datafile name */
00621         PACKS(desc, "z", driver.info_3->monitorname); /* language monitor */
00622 
00623         fstrcpy(location, "\\\\%L\\print$\\WIN40\\0");
00624         standard_sub_basic( "", "", location, sizeof(location)-1 );
00625         PACKS(desc,"z", location);                          /* share to retrieve files */
00626 
00627         PACKS(desc,"z", driver.info_3->defaultdatatype);    /* default data type */
00628         PACKS(desc,"z", driver.info_3->helpfile);           /* helpfile name */
00629         PACKS(desc,"z", driver.info_3->driverpath);               /* driver name */
00630 
00631         DEBUG(3,("Printer Driver Name: %s:\n",driver.info_3->name));
00632         DEBUG(3,("Driver: %s:\n",driver.info_3->driverpath));
00633         DEBUG(3,("Data File: %s:\n",driver.info_3->datafile));
00634         DEBUG(3,("Language Monitor: %s:\n",driver.info_3->monitorname));
00635         DEBUG(3,("Driver Location: %s:\n",location));
00636         DEBUG(3,("Data Type: %s:\n",driver.info_3->defaultdatatype));
00637         DEBUG(3,("Help File: %s:\n",driver.info_3->helpfile));
00638         PACKI(desc,"N",count);                     /* number of files to copy */
00639 
00640         for ( i=0; i<count && driver.info_3->dependentfiles && *driver.info_3->dependentfiles[i]; i++) 
00641         {
00642                 trim_string(driver.info_3->dependentfiles[i], "\\print$\\WIN40\\0\\", 0);
00643                 PACKS(desc,"z",driver.info_3->dependentfiles[i]);         /* driver files to copy */
00644                 DEBUG(3,("Dependent File: %s:\n",driver.info_3->dependentfiles[i]));
00645         }
00646 
00647         /* sanity check */
00648         if ( i != count )
00649                 DEBUG(3,("fill_printq_info_52: file count specified by client [%d] != number of dependent files [%i]\n",
00650                         count, i));
00651 
00652         DEBUG(3,("fill_printq_info on <%s> gave %d entries\n", SERVICE(snum),i));
00653 
00654         desc->errcode=NERR_Success;
00655         goto done;
00656 
00657 err:
00658         DEBUG(3,("fill_printq_info: Can't supply driver files\n"));
00659         desc->errcode=NERR_notsupported;
00660 
00661 done:
00662         if ( printer )
00663                 free_a_printer( &printer, 2 );
00664 
00665         if ( driver.info_3 )
00666                 free_a_printer_driver( driver, 3 );
00667 }

static void fill_printq_info ( connection_struct conn,
int  snum,
int  uLevel,
struct pack_desc desc,
int  count,
print_queue_struct queue,
print_status_struct status 
) [static]

lanman.c670 行で定義されています。

参照先 Expand()fill_printjob_info()fill_printq_info_52()get_driver_name()LPSTAT_ERRORLPSTAT_OKPackDriverData()PACKI()PACKS()printq_status()status.

参照元 api_DosPrintQEnum()api_DosPrintQGetInfo().

00674 {
00675         switch (uLevel) {
00676         case 1:
00677         case 2:
00678                 PACKS(desc,"B13",SERVICE(snum));
00679                 break;
00680         case 3:
00681         case 4:
00682         case 5:
00683                 PACKS(desc,"z",Expand(conn,snum,SERVICE(snum)));
00684                 break;
00685         case 51:
00686                 PACKI(desc,"K",printq_status(status->status));
00687                 break;
00688         }
00689 
00690         if (uLevel == 1 || uLevel == 2) {
00691                 PACKS(desc,"B","");             /* alignment */
00692                 PACKI(desc,"W",5);              /* priority */
00693                 PACKI(desc,"W",0);              /* start time */
00694                 PACKI(desc,"W",0);              /* until time */
00695                 PACKS(desc,"z","");             /* pSepFile */
00696                 PACKS(desc,"z","lpd");  /* pPrProc */
00697                 PACKS(desc,"z",SERVICE(snum)); /* pDestinations */
00698                 PACKS(desc,"z","");             /* pParms */
00699                 if (snum < 0) {
00700                         PACKS(desc,"z","UNKNOWN PRINTER");
00701                         PACKI(desc,"W",LPSTAT_ERROR);
00702                 }
00703                 else if (!status || !status->message[0]) {
00704                         PACKS(desc,"z",Expand(conn,snum,lp_comment(snum)));
00705                         PACKI(desc,"W",LPSTAT_OK); /* status */
00706                 } else {
00707                         PACKS(desc,"z",status->message);
00708                         PACKI(desc,"W",printq_status(status->status)); /* status */
00709                 }
00710                 PACKI(desc,(uLevel == 1 ? "W" : "N"),count);
00711         }
00712 
00713         if (uLevel == 3 || uLevel == 4) {
00714                 pstring drivername;
00715 
00716                 PACKI(desc,"W",5);              /* uPriority */
00717                 PACKI(desc,"W",0);              /* uStarttime */
00718                 PACKI(desc,"W",0);              /* uUntiltime */
00719                 PACKI(desc,"W",5);              /* pad1 */
00720                 PACKS(desc,"z","");             /* pszSepFile */
00721                 PACKS(desc,"z","WinPrint");     /* pszPrProc */
00722                 PACKS(desc,"z",NULL);           /* pszParms */
00723                 PACKS(desc,"z",NULL);           /* pszComment - don't ask.... JRA */
00724                 /* "don't ask" that it's done this way to fix corrupted 
00725                    Win9X/ME printer comments. */
00726                 if (!status) {
00727                         PACKI(desc,"W",LPSTAT_OK); /* fsStatus */
00728                 } else {
00729                         PACKI(desc,"W",printq_status(status->status)); /* fsStatus */
00730                 }
00731                 PACKI(desc,(uLevel == 3 ? "W" : "N"),count);    /* cJobs */
00732                 PACKS(desc,"z",SERVICE(snum)); /* pszPrinters */
00733                 get_driver_name(snum,drivername);
00734                 PACKS(desc,"z",drivername);             /* pszDriverName */
00735                 PackDriverData(desc);   /* pDriverData */
00736         }
00737 
00738         if (uLevel == 2 || uLevel == 4) {
00739                 int i;
00740                 for (i=0;i<count;i++)
00741                         fill_printjob_info(conn,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);
00742         }
00743 
00744         if (uLevel==52)
00745                 fill_printq_info_52( conn, snum, desc, count );
00746 }

static int get_printerdrivernumber ( int  snum  )  [static]

lanman.c749 行で定義されています。

参照先 nt_printer_driver_info_level_3::dependentfilesnt_printer_info_level_2::drivernamefree_a_printer()free_a_printer_driver()get_a_printer()get_a_printer_driver()nt_printer_info_level::info_2nt_printer_driver_info_level::info_3result.

参照元 api_DosPrintQGetInfo().

00750 {
00751         int                             result = 0;
00752         NT_PRINTER_DRIVER_INFO_LEVEL    driver;
00753         NT_PRINTER_INFO_LEVEL           *printer = NULL;
00754 
00755         ZERO_STRUCT(driver);
00756 
00757         if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) {
00758                 DEBUG(3,("get_printerdrivernumber: Failed to lookup printer [%s]\n", 
00759                         lp_servicename(snum)));
00760                 goto done;
00761         }
00762 
00763         if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername, 
00764                 "Windows 4.0", 0)) )
00765         {
00766                 DEBUG(3,("get_printerdrivernumber: Failed to lookup driver [%s]\n", 
00767                         printer->info_2->drivername));
00768                 goto done;
00769         }
00770 
00771         /* count the number of files */
00772         while ( driver.info_3->dependentfiles && *driver.info_3->dependentfiles[result] )
00773                         result++;
00774                         \
00775  done:
00776         if ( printer )
00777                 free_a_printer( &printer, 2 );
00778 
00779         if ( driver.info_3 )
00780                 free_a_printer_driver( driver, 3 );
00781 
00782         return result;
00783 }

static BOOL api_DosPrintQGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c785 行で定義されています。

参照先 check_printq_info()fill_printq_info()find_service()get_printerdrivernumber()get_safe_str_ptr()get_safe_SVAL()getlen()init_package()lp_snum_ok()prefix_ok()print_queue_status()skip_string()statusstrchr_m().

00791 {
00792         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
00793         char *str2 = skip_string(param,tpscnt,str1);
00794         char *p = skip_string(param,tpscnt,str2);
00795         char *QueueName = p;
00796         unsigned int uLevel;
00797         int count=0;
00798         int snum;
00799         char *str3;
00800         struct pack_desc desc;
00801         print_queue_struct *queue=NULL;
00802         print_status_struct status;
00803         char* tmpdata=NULL;
00804 
00805         if (!str1 || !str2 || !p) {
00806                 return False;
00807         }
00808         memset((char *)&status,'\0',sizeof(status));
00809         memset((char *)&desc,'\0',sizeof(desc));
00810 
00811         p = skip_string(param,tpscnt,p);
00812         if (!p) {
00813                 return False;
00814         }
00815         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
00816         str3 = get_safe_str_ptr(param,tpscnt,p,4);
00817         /* str3 may be null here and is checked in check_printq_info(). */
00818 
00819         /* remove any trailing username */
00820         if ((p = strchr_m(QueueName,'%')))
00821                 *p = 0;
00822  
00823         DEBUG(3,("api_DosPrintQGetInfo uLevel=%d name=%s\n",uLevel,QueueName));
00824  
00825         /* check it's a supported varient */
00826         if (!prefix_ok(str1,"zWrLh"))
00827                 return False;
00828         if (!check_printq_info(&desc,uLevel,str2,str3)) {
00829                 /*
00830                  * Patch from Scott Moomaw <scott@bridgewater.edu>
00831                  * to return the 'invalid info level' error if an
00832                  * unknown level was requested.
00833                  */
00834                 *rdata_len = 0;
00835                 *rparam_len = 6;
00836                 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
00837                 if (!*rparam) {
00838                         return False;
00839                 }
00840                 SSVALS(*rparam,0,ERRunknownlevel);
00841                 SSVAL(*rparam,2,0);
00842                 SSVAL(*rparam,4,0);
00843                 return(True);
00844         }
00845  
00846         snum = find_service(QueueName);
00847         if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) )
00848                 return False;
00849                 
00850         if (uLevel==52) {
00851                 count = get_printerdrivernumber(snum);
00852                 DEBUG(3,("api_DosPrintQGetInfo: Driver files count: %d\n",count));
00853         } else {
00854                 count = print_queue_status(snum, &queue,&status);
00855         }
00856 
00857         if (mdrcnt > 0) {
00858                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
00859                 if (!*rdata) {
00860                         return False;
00861                 }
00862                 desc.base = *rdata;
00863                 desc.buflen = mdrcnt;
00864         } else {
00865                 /*
00866                  * Don't return data but need to get correct length
00867                  * init_package will return wrong size if buflen=0
00868                  */
00869                 desc.buflen = getlen(desc.format);
00870                 desc.base = tmpdata = (char *) SMB_MALLOC (desc.buflen);
00871         }
00872 
00873         if (init_package(&desc,1,count)) {
00874                 desc.subcount = count;
00875                 fill_printq_info(conn,snum,uLevel,&desc,count,queue,&status);
00876         }
00877 
00878         *rdata_len = desc.usedlen;
00879   
00880         /*
00881          * We must set the return code to ERRbuftoosmall
00882          * in order to support lanman style printing with Win NT/2k
00883          * clients       --jerry
00884          */
00885         if (!mdrcnt && lp_disable_spoolss())
00886                 desc.errcode = ERRbuftoosmall;
00887  
00888         *rdata_len = desc.usedlen;
00889         *rparam_len = 6;
00890         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
00891         if (!*rparam) {
00892                 return False;
00893         }
00894         SSVALS(*rparam,0,desc.errcode);
00895         SSVAL(*rparam,2,0);
00896         SSVAL(*rparam,4,desc.neededlen);
00897   
00898         DEBUG(4,("printqgetinfo: errorcode %d\n",desc.errcode));
00899 
00900         SAFE_FREE(queue);
00901         SAFE_FREE(tmpdata);
00902 
00903         return(True);
00904 }

static BOOL api_DosPrintQEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c910 行で定義されています。

参照先 check_printq_info()errfill_printq_info()get_safe_str_ptr()get_safe_SVAL()init_package()lp_snum_ok()prefix_ok()print_queue_status()skip_string()status.

00916 {
00917         char *param_format = get_safe_str_ptr(param,tpscnt,param,2);
00918         char *output_format1 = skip_string(param,tpscnt,param_format);
00919         char *p = skip_string(param,tpscnt,output_format1);
00920         unsigned int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
00921         char *output_format2 = get_safe_str_ptr(param,tpscnt,p,4);
00922         int services = lp_numservices();
00923         int i, n;
00924         struct pack_desc desc;
00925         print_queue_struct **queue = NULL;
00926         print_status_struct *status = NULL;
00927         int *subcntarr = NULL;
00928         int queuecnt = 0, subcnt = 0, succnt = 0;
00929  
00930         if (!param_format || !output_format1 || !p) {
00931                 return False;
00932         }
00933 
00934         memset((char *)&desc,'\0',sizeof(desc));
00935 
00936         DEBUG(3,("DosPrintQEnum uLevel=%d\n",uLevel));
00937  
00938         if (!prefix_ok(param_format,"WrLeh")) {
00939                 return False;
00940         }
00941         if (!check_printq_info(&desc,uLevel,output_format1,output_format2)) {
00942                 /*
00943                  * Patch from Scott Moomaw <scott@bridgewater.edu>
00944                  * to return the 'invalid info level' error if an
00945                  * unknown level was requested.
00946                  */
00947                 *rdata_len = 0;
00948                 *rparam_len = 6;
00949                 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
00950                 if (!*rparam) {
00951                         return False;
00952                 }
00953                 SSVALS(*rparam,0,ERRunknownlevel);
00954                 SSVAL(*rparam,2,0);
00955                 SSVAL(*rparam,4,0);
00956                 return(True);
00957         }
00958 
00959         for (i = 0; i < services; i++) {
00960                 if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
00961                         queuecnt++;
00962                 }
00963         }
00964 
00965         if((queue = SMB_MALLOC_ARRAY(print_queue_struct*, queuecnt)) == NULL) {
00966                 DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
00967                 goto err;
00968         }
00969         memset(queue,0,queuecnt*sizeof(print_queue_struct*));
00970         if((status = SMB_MALLOC_ARRAY(print_status_struct,queuecnt)) == NULL) {
00971                 DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
00972                 goto err;
00973         }
00974         memset(status,0,queuecnt*sizeof(print_status_struct));
00975         if((subcntarr = SMB_MALLOC_ARRAY(int,queuecnt)) == NULL) {
00976                 DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
00977                 goto err;
00978         }
00979 
00980         subcnt = 0;
00981         n = 0;
00982         for (i = 0; i < services; i++) {
00983                 if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
00984                         subcntarr[n] = print_queue_status(i, &queue[n],&status[n]);
00985                         subcnt += subcntarr[n];
00986                         n++;
00987                 }
00988         }
00989 
00990         if (mdrcnt > 0) {
00991                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
00992                 if (!*rdata) {
00993                         goto err;
00994                 }
00995         }
00996         desc.base = *rdata;
00997         desc.buflen = mdrcnt;
00998 
00999         if (init_package(&desc,queuecnt,subcnt)) {
01000                 n = 0;
01001                 succnt = 0;
01002                 for (i = 0; i < services; i++) {
01003                         if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
01004                                 fill_printq_info(conn,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
01005                                 n++;
01006                                 if (desc.errcode == NERR_Success) {
01007                                         succnt = n;
01008                                 }
01009                         }
01010                 }
01011         }
01012 
01013         SAFE_FREE(subcntarr);
01014  
01015         *rdata_len = desc.usedlen;
01016         *rparam_len = 8;
01017         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01018         if (!*rparam) {
01019                 goto err;
01020         }
01021         SSVALS(*rparam,0,desc.errcode);
01022         SSVAL(*rparam,2,0);
01023         SSVAL(*rparam,4,succnt);
01024         SSVAL(*rparam,6,queuecnt);
01025   
01026         for (i = 0; i < queuecnt; i++) {
01027                 if (queue) {
01028                         SAFE_FREE(queue[i]);
01029                 }
01030         }
01031 
01032         SAFE_FREE(queue);
01033         SAFE_FREE(status);
01034   
01035         return True;
01036 
01037   err:
01038 
01039         SAFE_FREE(subcntarr);
01040         for (i = 0; i < queuecnt; i++) {
01041                 if (queue) {
01042                         SAFE_FREE(queue[i]);
01043                 }
01044         }
01045         SAFE_FREE(queue);
01046         SAFE_FREE(status);
01047 
01048         return False;
01049 }

static BOOL check_server_info ( int  uLevel,
char *  id 
) [static]

lanman.c1055 行で定義されています。

参照元 api_RNetServerEnum().

01056 {
01057         switch( uLevel ) {
01058                 case 0:
01059                         if (strcmp(id,"B16") != 0) {
01060                                 return False;
01061                         }
01062                         break;
01063                 case 1:
01064                         if (strcmp(id,"B16BBDz") != 0) {
01065                                 return False;
01066                         }
01067                         break;
01068                 default: 
01069                         return False;
01070         }
01071         return True;
01072 }

static int get_server_info ( uint32  servertype,
struct srv_info_struct **  servers,
const char *  domain 
) [static]

lanman.c1087 行で定義されています。

参照先 srv_info_struct::commentsrv_info_struct::domainerrnofile_lines_free()file_lines_load()lock_path()lp_workgroup()srv_info_struct::namenext_token()srv_info_struct::server_addedserversstrequal()strerror()srv_info_struct::type.

参照元 api_RNetServerEnum()api_RNetServerGetInfo().

01090 {
01091         int count=0;
01092         int alloced=0;
01093         char **lines;
01094         BOOL local_list_only;
01095         int i;
01096 
01097         lines = file_lines_load(lock_path(SERVER_LIST), NULL, 0);
01098         if (!lines) {
01099                 DEBUG(4,("Can't open %s - %s\n",lock_path(SERVER_LIST),strerror(errno)));
01100                 return 0;
01101         }
01102 
01103         /* request for everything is code for request all servers */
01104         if (servertype == SV_TYPE_ALL) {
01105                 servertype &= ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY);
01106         }
01107 
01108         local_list_only = (servertype & SV_TYPE_LOCAL_LIST_ONLY);
01109 
01110         DEBUG(4,("Servertype search: %8x\n",servertype));
01111 
01112         for (i=0;lines[i];i++) {
01113                 fstring stype;
01114                 struct srv_info_struct *s;
01115                 const char *ptr = lines[i];
01116                 BOOL ok = True;
01117 
01118                 if (!*ptr) {
01119                         continue;
01120                 }
01121     
01122                 if (count == alloced) {
01123                         alloced += 10;
01124                         *servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
01125                         if (!*servers) {
01126                                 DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
01127                                 file_lines_free(lines);
01128                                 return 0;
01129                         }
01130                         memset((char *)((*servers)+count),'\0',sizeof(**servers)*(alloced-count));
01131                 }
01132                 s = &(*servers)[count];
01133     
01134                 if (!next_token(&ptr,s->name, NULL, sizeof(s->name))) {
01135                         continue;
01136                 }
01137                 if (!next_token(&ptr,stype, NULL, sizeof(stype))) {
01138                         continue;
01139                 }
01140                 if (!next_token(&ptr,s->comment, NULL, sizeof(s->comment))) {
01141                         continue;
01142                 }
01143                 if (!next_token(&ptr,s->domain, NULL, sizeof(s->domain))) {
01144                         /* this allows us to cope with an old nmbd */
01145                         fstrcpy(s->domain,lp_workgroup()); 
01146                 }
01147     
01148                 if (sscanf(stype,"%X",&s->type) != 1) { 
01149                         DEBUG(4,("r:host file ")); 
01150                         ok = False; 
01151                 }
01152     
01153                 /* Filter the servers/domains we return based on what was asked for. */
01154 
01155                 /* Check to see if we are being asked for a local list only. */
01156                 if(local_list_only && ((s->type & SV_TYPE_LOCAL_LIST_ONLY) == 0)) {
01157                         DEBUG(4,("r: local list only"));
01158                         ok = False;
01159                 }
01160 
01161                 /* doesn't match up: don't want it */
01162                 if (!(servertype & s->type)) { 
01163                         DEBUG(4,("r:serv type ")); 
01164                         ok = False; 
01165                 }
01166     
01167                 if ((servertype & SV_TYPE_DOMAIN_ENUM) != 
01168                                 (s->type & SV_TYPE_DOMAIN_ENUM)) {
01169                         DEBUG(4,("s: dom mismatch "));
01170                         ok = False;
01171                 }
01172     
01173                 if (!strequal(domain, s->domain) && !(servertype & SV_TYPE_DOMAIN_ENUM)) {
01174                         ok = False;
01175                 }
01176     
01177                 /* We should never return a server type with a SV_TYPE_LOCAL_LIST_ONLY set. */
01178                 s->type &= ~SV_TYPE_LOCAL_LIST_ONLY;
01179 
01180                 if (ok) {
01181                         DEBUG(4,("**SV** %20s %8x %25s %15s\n",
01182                                 s->name, s->type, s->comment, s->domain));
01183                         s->server_added = True;
01184                         count++;
01185                 } else {
01186                         DEBUG(4,("%20s %8x %25s %15s\n",
01187                                 s->name, s->type, s->comment, s->domain));
01188                 }
01189         }
01190   
01191         file_lines_free(lines);
01192         return count;
01193 }

static int fill_srv_info ( struct srv_info_struct service,
int  uLevel,
char **  buf,
int *  buflen,
char **  stringbuf,
int *  stringspace,
char *  baseaddr 
) [static]

lanman.c1199 行で定義されています。

参照先 CopyAndAdvance()lenpush_ascii()service.

参照元 api_RNetServerEnum().

01202 {
01203         int struct_len;
01204         char* p;
01205         char* p2;
01206         int l2;
01207         int len;
01208  
01209         switch (uLevel) {
01210                 case 0:
01211                         struct_len = 16;
01212                         break;
01213                 case 1:
01214                         struct_len = 26;
01215                         break;
01216                 default:
01217                         return -1;
01218         }
01219  
01220         if (!buf) {
01221                 len = 0;
01222                 switch (uLevel) {
01223                         case 1:
01224                                 len = strlen(service->comment)+1;
01225                                 break;
01226                 }
01227 
01228                 *buflen = struct_len;
01229                 *stringspace = len;
01230                 return struct_len + len;
01231         }
01232   
01233         len = struct_len;
01234         p = *buf;
01235         if (*buflen < struct_len) {
01236                 return -1;
01237         }
01238         if (stringbuf) {
01239                 p2 = *stringbuf;
01240                 l2 = *stringspace;
01241         } else {
01242                 p2 = p + struct_len;
01243                 l2 = *buflen - struct_len;
01244         }
01245         if (!baseaddr) {
01246                 baseaddr = p;
01247         }
01248   
01249         switch (uLevel) {
01250                 case 0:
01251                         push_ascii(p,service->name, MAX_NETBIOSNAME_LEN, STR_TERMINATE);
01252                         break;
01253 
01254                 case 1:
01255                         push_ascii(p,service->name,MAX_NETBIOSNAME_LEN, STR_TERMINATE);
01256                         SIVAL(p,18,service->type);
01257                         SIVAL(p,22,PTR_DIFF(p2,baseaddr));
01258                         len += CopyAndAdvance(&p2,service->comment,&l2);
01259                         break;
01260         }
01261 
01262         if (stringbuf) {
01263                 *buf = p + struct_len;
01264                 *buflen -= struct_len;
01265                 *stringbuf = p2;
01266                 *stringspace = l2;
01267         } else {
01268                 *buf = p2;
01269                 *buflen -= len;
01270         }
01271         return len;
01272 }

static BOOL srv_comp ( struct srv_info_struct s1,
struct srv_info_struct s2 
) [static]

lanman.c1275 行で定義されています。

参照先 srv_info_struct::name.

参照元 api_RNetServerEnum().

01276 {
01277         return(strcmp(s1->name,s2->name));
01278 }

static BOOL api_RNetServerEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1285 行で定義されています。

参照先 check_server_info()srv_info_struct::domainfill_srv_info()get_safe_IVAL()get_safe_str_ptr()get_safe_SVAL()get_server_info()lp_workgroup()name_list::nameprefix_ok()pull_ascii_fstring()serversskip_string()srv_comp()strequal()total.

01290 {
01291         char *str1 = get_safe_str_ptr(param, tpscnt, param, 2);
01292         char *str2 = skip_string(param,tpscnt,str1);
01293         char *p = skip_string(param,tpscnt,str2);
01294         int uLevel = get_safe_SVAL(param, tpscnt, p, 0, -1);
01295         int buf_len = get_safe_SVAL(param,tpscnt, p, 2, 0);
01296         uint32 servertype = get_safe_IVAL(param,tpscnt,p,4, 0);
01297         char *p2;
01298         int data_len, fixed_len, string_len;
01299         int f_len = 0, s_len = 0;
01300         struct srv_info_struct *servers=NULL;
01301         int counted=0,total=0;
01302         int i,missed;
01303         fstring domain;
01304         BOOL domain_request;
01305         BOOL local_request;
01306 
01307         if (!str1 || !str2 || !p) {
01308                 return False;
01309         }
01310 
01311         /* If someone sets all the bits they don't really mean to set
01312            DOMAIN_ENUM and LOCAL_LIST_ONLY, they just want all the
01313            known servers. */
01314 
01315         if (servertype == SV_TYPE_ALL) {
01316                 servertype &= ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY);
01317         }
01318 
01319         /* If someone sets SV_TYPE_LOCAL_LIST_ONLY but hasn't set
01320            any other bit (they may just set this bit on it's own) they 
01321            want all the locally seen servers. However this bit can be 
01322            set on its own so set the requested servers to be 
01323            ALL - DOMAIN_ENUM. */
01324 
01325         if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) && !(servertype & SV_TYPE_DOMAIN_ENUM)) {
01326                 servertype = SV_TYPE_ALL & ~(SV_TYPE_DOMAIN_ENUM);
01327         }
01328 
01329         domain_request = ((servertype & SV_TYPE_DOMAIN_ENUM) != 0);
01330         local_request = ((servertype & SV_TYPE_LOCAL_LIST_ONLY) != 0);
01331 
01332         p += 8;
01333 
01334         if (!prefix_ok(str1,"WrLehD")) {
01335                 return False;
01336         }
01337         if (!check_server_info(uLevel,str2)) {
01338                 return False;
01339         }
01340   
01341         DEBUG(4, ("server request level: %s %8x ", str2, servertype));
01342         DEBUG(4, ("domains_req:%s ", BOOLSTR(domain_request)));
01343         DEBUG(4, ("local_only:%s\n", BOOLSTR(local_request)));
01344 
01345         if (strcmp(str1, "WrLehDz") == 0) {
01346                 if (skip_string(param,tpscnt,p) == NULL) {
01347                         return False;
01348                 }
01349                 pull_ascii_fstring(domain, p);
01350         } else {
01351                 fstrcpy(domain, lp_workgroup());
01352         }
01353 
01354         if (lp_browse_list()) {
01355                 total = get_server_info(servertype,&servers,domain);
01356         }
01357 
01358         data_len = fixed_len = string_len = 0;
01359         missed = 0;
01360 
01361         if (total > 0) {
01362                 qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
01363         }
01364 
01365         {
01366                 char *lastname=NULL;
01367 
01368                 for (i=0;i<total;i++) {
01369                         struct srv_info_struct *s = &servers[i];
01370 
01371                         if (lastname && strequal(lastname,s->name)) {
01372                                 continue;
01373                         }
01374                         lastname = s->name;
01375                         data_len += fill_srv_info(s,uLevel,0,&f_len,0,&s_len,0);
01376                         DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
01377                                 s->name, s->type, s->comment, s->domain));
01378       
01379                         if (data_len <= buf_len) {
01380                                 counted++;
01381                                 fixed_len += f_len;
01382                                 string_len += s_len;
01383                         } else {
01384                                 missed++;
01385                         }
01386                 }
01387         }
01388 
01389         *rdata_len = fixed_len + string_len;
01390         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
01391         if (!*rdata) {
01392                 return False;
01393         }
01394         memset(*rdata,'\0',*rdata_len);
01395   
01396         p2 = (*rdata) + fixed_len;      /* auxilliary data (strings) will go here */
01397         p = *rdata;
01398         f_len = fixed_len;
01399         s_len = string_len;
01400 
01401         {
01402                 char *lastname=NULL;
01403                 int count2 = counted;
01404 
01405                 for (i = 0; i < total && count2;i++) {
01406                         struct srv_info_struct *s = &servers[i];
01407 
01408                         if (lastname && strequal(lastname,s->name)) {
01409                                 continue;
01410                         }
01411                         lastname = s->name;
01412                         fill_srv_info(s,uLevel,&p,&f_len,&p2,&s_len,*rdata);
01413                         DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
01414                                 s->name, s->type, s->comment, s->domain));
01415                         count2--;
01416                 }
01417         }
01418   
01419         *rparam_len = 8;
01420         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01421         if (!*rparam) {
01422                 return False;
01423         }
01424         SSVAL(*rparam,0,(missed == 0 ? NERR_Success : ERRmoredata));
01425         SSVAL(*rparam,2,0);
01426         SSVAL(*rparam,4,counted);
01427         SSVAL(*rparam,6,counted+missed);
01428 
01429         SAFE_FREE(servers);
01430 
01431         DEBUG(3,("NetServerEnum domain = %s uLevel=%d counted=%d total=%d\n",
01432                 domain,uLevel,counted,counted+missed));
01433 
01434         return True;
01435 }

static BOOL api_RNetGroupGetUsers ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1441 行で定義されています。

参照先 get_safe_str_ptr()get_safe_SVAL()prefix_ok()skip_string().

01446 {
01447         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
01448         char *str2 = skip_string(param,tpscnt,str1);
01449         char *p = skip_string(param,tpscnt,str2);
01450         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
01451         int buf_len = get_safe_SVAL(param,tpscnt,p,2,0);
01452         int counted=0;
01453         int missed=0;
01454 
01455         if (!str1 || !str2 || !p) {
01456                 return False;
01457         }
01458 
01459         DEBUG(5,("RNetGroupGetUsers: %s %s %s %d %d\n",
01460                 str1, str2, p, uLevel, buf_len));
01461 
01462         if (!prefix_ok(str1,"zWrLeh")) {
01463                 return False;
01464         }
01465   
01466         *rdata_len = 0;
01467   
01468         *rparam_len = 8;
01469         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01470         if (!*rparam) {
01471                 return False;
01472         }
01473 
01474         SSVAL(*rparam,0,0x08AC); /* informational warning message */
01475         SSVAL(*rparam,2,0);
01476         SSVAL(*rparam,4,counted);
01477         SSVAL(*rparam,6,counted+missed);
01478 
01479         return True;
01480 }

static BOOL check_share_info ( int  uLevel,
char *  id 
) [static]

lanman.c1486 行で定義されています。

参照元 api_RNetShareAdd()api_RNetShareEnum()api_RNetShareGetInfo().

01487 {
01488         switch( uLevel ) {
01489                 case 0:
01490                         if (strcmp(id,"B13") != 0) {
01491                                 return False;
01492                         }
01493                         break;
01494                 case 1:
01495                         if (strcmp(id,"B13BWz") != 0) {
01496                                 return False;
01497                         }
01498                         break;
01499                 case 2:
01500                         if (strcmp(id,"B13BWzWWWzB9B") != 0) {
01501                                 return False;
01502                         }
01503                         break;
01504                 case 91:
01505                         if (strcmp(id,"B13BWzWWWzB9BB9BWzWWzWW") != 0) {
01506                                 return False;
01507                         }
01508                         break;
01509                 default:
01510                         return False;
01511         }
01512         return True;
01513 }

static int fill_share_info ( connection_struct conn,
int  snum,
int  uLevel,
char **  buf,
int *  buflen,
char **  stringbuf,
int *  stringspace,
char *  baseaddr 
) [static]

lanman.c1515 行で定義されています。

参照先 CopyAndAdvance()CopyExpanded()lenpush_ascii()strequal()StrlenExpanded()STYPE_DISKTREESTYPE_IPCSTYPE_PRINTQtype.

参照元 api_RNetShareEnum()api_RNetShareGetInfo().

01518 {
01519         int struct_len;
01520         char* p;
01521         char* p2;
01522         int l2;
01523         int len;
01524  
01525         switch( uLevel ) {
01526                 case 0:
01527                         struct_len = 13;
01528                         break;
01529                 case 1:
01530                         struct_len = 20;
01531                         break;
01532                 case 2:
01533                         struct_len = 40;
01534                         break;
01535                 case 91:
01536                         struct_len = 68;
01537                         break;
01538                 default:
01539                         return -1;
01540         }
01541   
01542  
01543         if (!buf) {
01544                 len = 0;
01545 
01546                 if (uLevel > 0) {
01547                         len += StrlenExpanded(conn,snum,lp_comment(snum));
01548                 }
01549                 if (uLevel > 1) {
01550                         len += strlen(lp_pathname(snum)) + 1;
01551                 }
01552                 if (buflen) {
01553                         *buflen = struct_len;
01554                 }
01555                 if (stringspace) {
01556                         *stringspace = len;
01557                 }
01558                 return struct_len + len;
01559         }
01560   
01561         len = struct_len;
01562         p = *buf;
01563         if ((*buflen) < struct_len) {
01564                 return -1;
01565         }
01566 
01567         if (stringbuf) {
01568                 p2 = *stringbuf;
01569                 l2 = *stringspace;
01570         } else {
01571                 p2 = p + struct_len;
01572                 l2 = (*buflen) - struct_len;
01573         }
01574 
01575         if (!baseaddr) {
01576                 baseaddr = p;
01577         }
01578   
01579         push_ascii(p,lp_servicename(snum),13, STR_TERMINATE);
01580   
01581         if (uLevel > 0) {
01582                 int type;
01583 
01584                 SCVAL(p,13,0);
01585                 type = STYPE_DISKTREE;
01586                 if (lp_print_ok(snum)) {
01587                         type = STYPE_PRINTQ;
01588                 }
01589                 if (strequal("IPC",lp_fstype(snum))) {
01590                         type = STYPE_IPC;
01591                 }
01592                 SSVAL(p,14,type);               /* device type */
01593                 SIVAL(p,16,PTR_DIFF(p2,baseaddr));
01594                 len += CopyExpanded(conn,snum,&p2,lp_comment(snum),&l2);
01595         }
01596   
01597         if (uLevel > 1) {
01598                 SSVAL(p,20,ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE); /* permissions */
01599                 SSVALS(p,22,-1);                /* max uses */
01600                 SSVAL(p,24,1); /* current uses */
01601                 SIVAL(p,26,PTR_DIFF(p2,baseaddr)); /* local pathname */
01602                 len += CopyAndAdvance(&p2,lp_pathname(snum),&l2);
01603                 memset(p+30,0,SHPWLEN+2); /* passwd (reserved), pad field */
01604         }
01605   
01606         if (uLevel > 2) {
01607                 memset(p+40,0,SHPWLEN+2);
01608                 SSVAL(p,50,0);
01609                 SIVAL(p,52,0);
01610                 SSVAL(p,56,0);
01611                 SSVAL(p,58,0);
01612                 SIVAL(p,60,0);
01613                 SSVAL(p,64,0);
01614                 SSVAL(p,66,0);
01615         }
01616        
01617         if (stringbuf) {
01618                 (*buf) = p + struct_len;
01619                 (*buflen) -= struct_len;
01620                 (*stringbuf) = p2;
01621                 (*stringspace) = l2;
01622         } else {
01623                 (*buf) = p2;
01624                 (*buflen) -= len;
01625         }
01626 
01627         return len;
01628 }

static BOOL api_RNetShareGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1630 行で定義されています。

参照先 check_share_info()fill_share_info()find_service()get_safe_str_ptr()get_safe_SVAL()prefix_ok()skip_string().

01636 {
01637         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
01638         char *str2 = skip_string(param,tpscnt,str1);
01639         char *netname = skip_string(param,tpscnt,str2);
01640         char *p = skip_string(param,tpscnt,netname);
01641         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
01642         int snum;
01643   
01644         if (!str1 || !str2 || !netname || !p) {
01645                 return False;
01646         }
01647 
01648         snum = find_service(netname);
01649         if (snum < 0) {
01650                 return False;
01651         }
01652   
01653         /* check it's a supported varient */
01654         if (!prefix_ok(str1,"zWrLh")) {
01655                 return False;
01656         }
01657         if (!check_share_info(uLevel,str2)) {
01658                 return False;
01659         }
01660  
01661         *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
01662         if (!*rdata) {
01663                 return False;
01664         }
01665         p = *rdata;
01666         *rdata_len = fill_share_info(conn,snum,uLevel,&p,&mdrcnt,0,0,0);
01667         if (*rdata_len < 0) {
01668                 return False;
01669         }
01670  
01671         *rparam_len = 6;
01672         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01673         if (!*rparam) {
01674                 return False;
01675         }
01676         SSVAL(*rparam,0,NERR_Success);
01677         SSVAL(*rparam,2,0);             /* converter word */
01678         SSVAL(*rparam,4,*rdata_len);
01679  
01680         return True;
01681 }

static BOOL api_RNetShareEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1693 行で定義されています。

参照先 become_root()check_share_info()fill_share_info()get_safe_str_ptr()get_safe_SVAL()lp_snum_ok()prefix_ok()push_ascii_fstring()skip_string()totalunbecome_root().

01702 {
01703         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
01704         char *str2 = skip_string(param,tpscnt,str1);
01705         char *p = skip_string(param,tpscnt,str2);
01706         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
01707         int buf_len = get_safe_SVAL(param,tpscnt,p,2,0);
01708         char *p2;
01709         int count = 0;
01710         int total=0,counted=0;
01711         BOOL missed = False;
01712         int i;
01713         int data_len, fixed_len, string_len;
01714         int f_len = 0, s_len = 0;
01715  
01716         if (!str1 || !str2 || !p) {
01717                 return False;
01718         }
01719 
01720         if (!prefix_ok(str1,"WrLeh")) {
01721                 return False;
01722         }
01723         if (!check_share_info(uLevel,str2)) {
01724                 return False;
01725         }
01726   
01727         /* Ensure all the usershares are loaded. */
01728         become_root();
01729         count = load_usershare_shares();
01730         unbecome_root();
01731 
01732         data_len = fixed_len = string_len = 0;
01733         for (i=0;i<count;i++) {
01734                 fstring servicename_dos;
01735                 if (!(lp_browseable(i) && lp_snum_ok(i))) {
01736                         continue;
01737                 }
01738                 push_ascii_fstring(servicename_dos, lp_servicename(i));
01739                 /* Maximum name length = 13. */
01740                 if( lp_browseable( i ) && lp_snum_ok( i ) && (strlen(servicename_dos) < 13)) {
01741                         total++;
01742                         data_len += fill_share_info(conn,i,uLevel,0,&f_len,0,&s_len,0);
01743                         if (data_len <= buf_len) {
01744                                 counted++;
01745                                 fixed_len += f_len;
01746                                 string_len += s_len;
01747                         } else {
01748                                 missed = True;
01749                         }
01750                 }
01751         }
01752 
01753         *rdata_len = fixed_len + string_len;
01754         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
01755         if (!*rdata) {
01756                 return False;
01757         }
01758         memset(*rdata,0,*rdata_len);
01759   
01760         p2 = (*rdata) + fixed_len;      /* auxiliary data (strings) will go here */
01761         p = *rdata;
01762         f_len = fixed_len;
01763         s_len = string_len;
01764 
01765         for( i = 0; i < count; i++ ) {
01766                 fstring servicename_dos;
01767                 if (!(lp_browseable(i) && lp_snum_ok(i))) {
01768                         continue;
01769                 }
01770 
01771                 push_ascii_fstring(servicename_dos, lp_servicename(i));
01772                 if (lp_browseable(i) && lp_snum_ok(i) && (strlen(servicename_dos) < 13)) {
01773                         if (fill_share_info( conn,i,uLevel,&p,&f_len,&p2,&s_len,*rdata ) < 0) {
01774                                 break;
01775                         }
01776                 }
01777         }
01778   
01779         *rparam_len = 8;
01780         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01781         if (!*rparam) {
01782                 return False;
01783         }
01784         SSVAL(*rparam,0,missed ? ERRmoredata : NERR_Success);
01785         SSVAL(*rparam,2,0);
01786         SSVAL(*rparam,4,counted);
01787         SSVAL(*rparam,6,total);
01788   
01789         DEBUG(3,("RNetShareEnum gave %d entries of %d (%d %d %d %d)\n",
01790                 counted,total,uLevel,
01791                 buf_len,*rdata_len,mdrcnt));
01792 
01793         return True;
01794 }

static BOOL api_RNetShareAdd ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1800 行で定義されています。

参照先 asprintf()check_share_info()cmdnamesrv_info_struct::commentconn_tdb_ctx()dyn_CONFIGFILEfind_service()get_safe_str_ptr()get_safe_SVAL()message_send_all()prefix_ok()pull_ascii_fstring()pull_ascii_pstring()skip_string()smbrun()string_replace()STYPE_DISKTREE.

01806 {
01807         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
01808         char *str2 = skip_string(param,tpscnt,str1);
01809         char *p = skip_string(param,tpscnt,str2);
01810         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
01811         fstring sharename;
01812         fstring comment;
01813         pstring pathname;
01814         char *command, *cmdname;
01815         unsigned int offset;
01816         int snum;
01817         int res = ERRunsup;
01818   
01819         if (!str1 || !str2 || !p) {
01820                 return False;
01821         }
01822 
01823         /* check it's a supported varient */
01824         if (!prefix_ok(str1,RAP_WShareAdd_REQ)) {
01825                 return False;
01826         }
01827         if (!check_share_info(uLevel,str2)) {
01828                 return False;
01829         }
01830         if (uLevel != 2) {
01831                 return False;
01832         }
01833 
01834         /* Do we have a string ? */
01835         if (skip_string(data,mdrcnt,data) == NULL) {
01836                 return False;
01837         }
01838         pull_ascii_fstring(sharename,data);
01839         snum = find_service(sharename);
01840         if (snum >= 0) { /* already exists */
01841                 res = ERRfilexists;
01842                 goto error_exit;
01843         }
01844 
01845         if (mdrcnt < 28) {
01846                 return False;
01847         }
01848 
01849         /* only support disk share adds */
01850         if (SVAL(data,14)!=STYPE_DISKTREE) {
01851                 return False;
01852         }
01853 
01854         offset = IVAL(data, 16);
01855         if (offset >= mdrcnt) {
01856                 res = ERRinvalidparam;
01857                 goto error_exit;
01858         }
01859 
01860         /* Do we have a string ? */
01861         if (skip_string(data,mdrcnt,data+offset) == NULL) {
01862                 return False;
01863         }
01864         pull_ascii_fstring(comment, offset? (data+offset) : "");
01865 
01866         offset = IVAL(data, 26);
01867 
01868         if (offset >= mdrcnt) {
01869                 res = ERRinvalidparam;
01870                 goto error_exit;
01871         }
01872 
01873         /* Do we have a string ? */
01874         if (skip_string(data,mdrcnt,data+offset) == NULL) {
01875                 return False;
01876         }
01877         pull_ascii_pstring(pathname, offset? (data+offset) : "");
01878 
01879         string_replace(sharename, '"', ' ');
01880         string_replace(pathname, '"', ' ');
01881         string_replace(comment, '"', ' ');
01882 
01883         cmdname = lp_add_share_cmd();
01884 
01885         if (!cmdname || *cmdname == '\0') {
01886                 return False;
01887         }
01888 
01889         asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
01890                 lp_add_share_cmd(), dyn_CONFIGFILE, sharename, pathname, comment);
01891 
01892         if (command) {
01893                 DEBUG(10,("api_RNetShareAdd: Running [%s]\n", command ));
01894 
01895                 if ((res = smbrun(command, NULL)) != 0) {
01896                         DEBUG(1,("api_RNetShareAdd: Running [%s] returned (%d)\n", command, res ));
01897                         SAFE_FREE(command);
01898                         res = ERRnoaccess;
01899                         goto error_exit;
01900                 } else {
01901                         SAFE_FREE(command);
01902                         message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
01903                 }
01904         } else {
01905                 return False;
01906         }
01907 
01908         *rparam_len = 6;
01909         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01910         if (!*rparam) {
01911                 return False;
01912         }
01913         SSVAL(*rparam,0,NERR_Success);
01914         SSVAL(*rparam,2,0);             /* converter word */
01915         SSVAL(*rparam,4,*rdata_len);
01916         *rdata_len = 0;
01917   
01918         return True;
01919 
01920   error_exit:
01921 
01922         *rparam_len = 4;
01923         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
01924         if (!*rparam) {
01925                 return False;
01926         }
01927         *rdata_len = 0;
01928         SSVAL(*rparam,0,res);
01929         SSVAL(*rparam,2,0);
01930         return True;
01931 }

static BOOL api_RNetGroupEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c1937 行で定義されています。

参照先 samr_displayentry::account_namebecome_root()get_safe_str_ptr()get_safe_SVAL()namepdb_search_destroy()pdb_search_entries()pdb_search_groups()skip_string()unbecome_root().

01943 {
01944         int i;
01945         int errflags=0;
01946         int resume_context, cli_buf_size;
01947         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
01948         char *str2 = skip_string(param,tpscnt,str1);
01949         char *p = skip_string(param,tpscnt,str2);
01950 
01951         struct pdb_search *search;
01952         struct samr_displayentry *entries;
01953 
01954         int num_entries;
01955  
01956         if (!str1 || !str2 || !p) {
01957                 return False;
01958         }
01959 
01960         if (strcmp(str1,"WrLeh") != 0) {
01961                 return False;
01962         }
01963 
01964         /* parameters  
01965          * W-> resume context (number of users to skip)
01966          * r -> return parameter pointer to receive buffer 
01967          * L -> length of receive buffer
01968          * e -> return parameter number of entries
01969          * h -> return parameter total number of users
01970          */
01971 
01972         if (strcmp("B21",str2) != 0) {
01973                 return False;
01974         }
01975 
01976         /* get list of domain groups SID_DOMAIN_GRP=2 */
01977         become_root();
01978         search = pdb_search_groups();
01979         unbecome_root();
01980 
01981         if (search == NULL) {
01982                 DEBUG(3,("api_RNetGroupEnum:failed to get group list"));
01983                 return False;
01984         }
01985 
01986         resume_context = get_safe_SVAL(param,tpscnt,p,0,-1);
01987         cli_buf_size= get_safe_SVAL(param,tpscnt,p,2,0);
01988         DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: "
01989                   "%d\n", resume_context, cli_buf_size));
01990 
01991         become_root();
01992         num_entries = pdb_search_entries(search, resume_context, 0xffffffff,
01993                                          &entries);
01994         unbecome_root();
01995 
01996         *rdata_len = cli_buf_size;
01997         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
01998         if (!*rdata) {
01999                 return False;
02000         }
02001 
02002         p = *rdata;
02003 
02004         for(i=0; i<num_entries; i++) {
02005                 fstring name;
02006                 fstrcpy(name, entries[i].account_name);
02007                 if( ((PTR_DIFF(p,*rdata)+21) <= *rdata_len) ) {
02008                         /* truncate the name at 21 chars. */
02009                         memcpy(p, name, 21); 
02010                         DEBUG(10,("adding entry %d group %s\n", i, p));
02011                         p += 21;
02012                         p += 5; /* Both NT4 and W2k3SP1 do padding here.
02013                                    No idea why... */
02014                 } else {
02015                         /* set overflow error */
02016                         DEBUG(3,("overflow on entry %d group %s\n", i, name));
02017                         errflags=234;
02018                         break;
02019                 }
02020         }
02021 
02022         pdb_search_destroy(search);
02023 
02024         *rdata_len = PTR_DIFF(p,*rdata);
02025 
02026         *rparam_len = 8;
02027         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02028         if (!*rparam) {
02029                 return False;
02030         }
02031         SSVAL(*rparam, 0, errflags);
02032         SSVAL(*rparam, 2, 0);           /* converter word */
02033         SSVAL(*rparam, 4, i);   /* is this right?? */
02034         SSVAL(*rparam, 6, resume_context+num_entries);  /* is this right?? */
02035 
02036         return(True);
02037 }

static BOOL api_NetUserGetGroups ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2043 行で定義されています。

参照先 become_root()get_safe_str_ptr()get_safe_SVAL()lookup_name()lookup_sid()pdb_enum_group_memberships()pdb_getsampwsid()resultsamu_new()SID_NAME_USERsid_string_static()sid_type_lookup()skip_string()typeunbecome_root()samu::user_sid.

02049 {
02050         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02051         char *str2 = skip_string(param,tpscnt,str1);
02052         char *UserName = skip_string(param,tpscnt,str2);
02053         char *p = skip_string(param,tpscnt,UserName);
02054         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
02055         const char *level_string;
02056         int count=0;
02057         struct samu *sampw = NULL;
02058         BOOL ret = False;
02059         DOM_SID *sids;
02060         gid_t *gids;
02061         size_t num_groups;
02062         size_t i;
02063         NTSTATUS result;
02064         DOM_SID user_sid;
02065         enum lsa_SidType type;
02066         TALLOC_CTX *mem_ctx;
02067 
02068         if (!str1 || !str2 || !UserName || !p) {
02069                 return False;
02070         }
02071 
02072         *rparam_len = 8;
02073         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02074         if (!*rparam) {
02075                 return False;
02076         }
02077   
02078         /* check it's a supported varient */
02079         
02080         if ( strcmp(str1,"zWrLeh") != 0 )
02081                 return False;
02082                 
02083         switch( uLevel ) {
02084                 case 0:
02085                         level_string = "B21";
02086                         break;
02087                 default:
02088                         return False;
02089         }
02090 
02091         if (strcmp(level_string,str2) != 0)
02092                 return False;
02093 
02094         *rdata_len = mdrcnt + 1024;
02095         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
02096         if (!*rdata) {
02097                 return False;
02098         }
02099         SSVAL(*rparam,0,NERR_Success);
02100         SSVAL(*rparam,2,0);             /* converter word */
02101 
02102         p = *rdata;
02103 
02104         mem_ctx = talloc_new(NULL);
02105         if (mem_ctx == NULL) {
02106                 DEBUG(0, ("talloc_new failed\n"));
02107                 return False;
02108         }
02109 
02110         if ( !(sampw = samu_new(mem_ctx)) ) {
02111                 DEBUG(0, ("samu_new() failed!\n"));
02112                 TALLOC_FREE(mem_ctx);
02113                 return False;
02114         }
02115 
02116         /* Lookup the user information; This should only be one of 
02117            our accounts (not remote domains) */
02118 
02119         become_root();                                  /* ROOT BLOCK */
02120 
02121         if (!lookup_name(mem_ctx, UserName, LOOKUP_NAME_ALL,
02122                          NULL, NULL, &user_sid, &type)) {
02123                 DEBUG(10, ("lookup_name(%s) failed\n", UserName));
02124                 goto done;
02125         }
02126 
02127         if (type != SID_NAME_USER) {
02128                 DEBUG(10, ("%s is a %s, not a user\n", UserName,
02129                            sid_type_lookup(type)));
02130                 goto done;
02131         }
02132 
02133         if ( !pdb_getsampwsid(sampw, &user_sid) ) {
02134                 DEBUG(10, ("pdb_getsampwsid(%s) failed for user %s\n",
02135                            sid_string_static(&user_sid), UserName));
02136                 goto done;
02137         }
02138 
02139         gids = NULL;
02140         sids = NULL;
02141         num_groups = 0;
02142 
02143         result = pdb_enum_group_memberships(mem_ctx, sampw,
02144                                             &sids, &gids, &num_groups);
02145 
02146         if (!NT_STATUS_IS_OK(result)) {
02147                 DEBUG(10, ("pdb_enum_group_memberships failed for %s\n",
02148                            UserName));
02149                 goto done;
02150         }
02151 
02152         for (i=0; i<num_groups; i++) {
02153 
02154                 const char *grp_name;
02155         
02156                 if ( lookup_sid(mem_ctx, &sids[i], NULL, &grp_name, NULL) ) {
02157                         pstrcpy(p, grp_name);
02158                         p += 21; 
02159                         count++;
02160                 }
02161         }
02162 
02163         *rdata_len = PTR_DIFF(p,*rdata);
02164 
02165         SSVAL(*rparam,4,count); /* is this right?? */
02166         SSVAL(*rparam,6,count); /* is this right?? */
02167 
02168         ret = True;
02169 
02170 done:
02171         unbecome_root();                                /* END ROOT BLOCK */
02172 
02173         TALLOC_FREE(mem_ctx);
02174 
02175         return ret;
02176 }

static BOOL api_RNetUserEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2182 行で定義されています。

参照先 samr_displayentry::account_namebecome_root()get_safe_str_ptr()get_safe_SVAL()namepdb_search_destroy()pdb_search_entries()pdb_search_users()skip_string()unbecome_root().

02188 {
02189         int count_sent=0;
02190         int num_users=0;
02191         int errflags=0;
02192         int i, resume_context, cli_buf_size;
02193         struct pdb_search *search;
02194         struct samr_displayentry *users;
02195 
02196         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02197         char *str2 = skip_string(param,tpscnt,str1);
02198         char *p = skip_string(param,tpscnt,str2);
02199 
02200         if (!str1 || !str2 || !p) {
02201                 return False;
02202         }
02203 
02204         if (strcmp(str1,"WrLeh") != 0)
02205                 return False;
02206         /* parameters
02207           * W-> resume context (number of users to skip)
02208           * r -> return parameter pointer to receive buffer
02209           * L -> length of receive buffer
02210           * e -> return parameter number of entries
02211           * h -> return parameter total number of users
02212           */
02213   
02214         resume_context = get_safe_SVAL(param,tpscnt,p,0,-1);
02215         cli_buf_size= get_safe_SVAL(param,tpscnt,p,2,0);
02216         DEBUG(10,("api_RNetUserEnum:resume context: %d, client buffer size: %d\n",
02217                         resume_context, cli_buf_size));
02218 
02219         *rparam_len = 8;
02220         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02221         if (!*rparam) {
02222                 return False;
02223         }
02224 
02225         /* check it's a supported varient */
02226         if (strcmp("B21",str2) != 0)
02227                 return False;
02228 
02229         *rdata_len = cli_buf_size;
02230         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
02231         if (!*rdata) {
02232                 return False;
02233         }
02234 
02235         p = *rdata;
02236 
02237         become_root();
02238         search = pdb_search_users(ACB_NORMAL);
02239         unbecome_root();
02240         if (search == NULL) {
02241                 DEBUG(0, ("api_RNetUserEnum:unable to open sam database.\n"));
02242                 return False;
02243         }
02244 
02245         become_root();
02246         num_users = pdb_search_entries(search, resume_context, 0xffffffff,
02247                                        &users);
02248         unbecome_root();
02249 
02250         errflags=NERR_Success;
02251 
02252         for (i=0; i<num_users; i++) {
02253                 const char *name = users[i].account_name;
02254                 
02255                 if(((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)) {
02256                         pstrcpy(p,name); 
02257                         DEBUG(10,("api_RNetUserEnum:adding entry %d username "
02258                                   "%s\n",count_sent,p));
02259                         p += 21; 
02260                         count_sent++; 
02261                 } else {
02262                         /* set overflow error */
02263                         DEBUG(10,("api_RNetUserEnum:overflow on entry %d "
02264                                   "username %s\n",count_sent,name));
02265                         errflags=234;
02266                         break;
02267                 }
02268         }
02269 
02270         pdb_search_destroy(search);
02271 
02272         *rdata_len = PTR_DIFF(p,*rdata);
02273 
02274         SSVAL(*rparam,0,errflags);
02275         SSVAL(*rparam,2,0);           /* converter word */
02276         SSVAL(*rparam,4,count_sent);  /* is this right?? */
02277         SSVAL(*rparam,6,num_users); /* is this right?? */
02278 
02279         return True;
02280 }

static BOOL api_NetRemoteTOD ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2286 行で定義されています。

参照先 get_time_zone()localtime()srv_put_dos_date3()t.

02292 {
02293         struct tm *t;
02294         time_t unixdate = time(NULL);
02295         char *p;
02296 
02297         *rparam_len = 4;
02298         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02299         if (!*rparam) {
02300                 return False;
02301         }
02302 
02303         *rdata_len = 21;
02304         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
02305         if (!*rdata) {
02306                 return False;
02307         }
02308 
02309         SSVAL(*rparam,0,NERR_Success);
02310         SSVAL(*rparam,2,0);             /* converter word */
02311 
02312         p = *rdata;
02313 
02314         srv_put_dos_date3(p,0,unixdate); /* this is the time that is looked at
02315                                             by NT in a "net time" operation,
02316                                             it seems to ignore the one below */
02317 
02318         /* the client expects to get localtime, not GMT, in this bit 
02319                 (I think, this needs testing) */
02320         t = localtime(&unixdate);
02321         if (!t) {
02322                 return False;
02323         }
02324 
02325         SIVAL(p,4,0);           /* msecs ? */
02326         SCVAL(p,8,t->tm_hour);
02327         SCVAL(p,9,t->tm_min);
02328         SCVAL(p,10,t->tm_sec);
02329         SCVAL(p,11,0);          /* hundredths of seconds */
02330         SSVALS(p,12,get_time_zone(unixdate)/60); /* timezone in minutes from GMT */
02331         SSVAL(p,14,10000);              /* timer interval in 0.0001 of sec */
02332         SCVAL(p,16,t->tm_mday);
02333         SCVAL(p,17,t->tm_mon + 1);
02334         SSVAL(p,18,1900+t->tm_year);
02335         SCVAL(p,20,t->tm_wday);
02336 
02337         return True;
02338 }

static BOOL api_SetUserPassword ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2344 行で定義されています。

参照先 become_root()change_lanman_password()change_oem_password()check_lanman_password()check_plaintext_password()data_blob()data_blob_clear_free()get_safe_str_ptr()is_offset_safe()passwordpull_ascii_fstring()auth_serversupplied_info::sam_accountskip_string()unbecome_root().

02350 {
02351         char *np = get_safe_str_ptr(param,tpscnt,param,2);
02352         char *p = NULL;
02353         fstring user;
02354         fstring pass1,pass2;
02355 
02356         /* Skip 2 strings. */
02357         p = skip_string(param,tpscnt,np);
02358         p = skip_string(param,tpscnt,p);
02359 
02360         if (!np || !p) {
02361                 return False;
02362         }
02363 
02364         /* Do we have a string ? */
02365         if (skip_string(param,tpscnt,p) == NULL) {
02366                 return False;
02367         }
02368         pull_ascii_fstring(user,p);
02369 
02370         p = skip_string(param,tpscnt,p);
02371         if (!p) {
02372                 return False;
02373         }
02374 
02375         memset(pass1,'\0',sizeof(pass1));
02376         memset(pass2,'\0',sizeof(pass2));
02377         /*
02378          * We use 31 here not 32 as we're checking
02379          * the last byte we want to access is safe.
02380          */
02381         if (!is_offset_safe(param,tpscnt,p,31)) {
02382                 return False;
02383         }
02384         memcpy(pass1,p,16);
02385         memcpy(pass2,p+16,16);
02386 
02387         *rparam_len = 4;
02388         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02389         if (!*rparam) {
02390                 return False;
02391         }
02392 
02393         *rdata_len = 0;
02394 
02395         SSVAL(*rparam,0,NERR_badpass);
02396         SSVAL(*rparam,2,0);             /* converter word */
02397 
02398         DEBUG(3,("Set password for <%s>\n",user));
02399 
02400         /*
02401          * Attempt to verify the old password against smbpasswd entries
02402          * Win98 clients send old and new password in plaintext for this call.
02403          */
02404 
02405         {
02406                 auth_serversupplied_info *server_info = NULL;
02407                 DATA_BLOB password = data_blob(pass1, strlen(pass1)+1);
02408 
02409                 if (NT_STATUS_IS_OK(check_plaintext_password(user,password,&server_info))) {
02410 
02411                         become_root();
02412                         if (NT_STATUS_IS_OK(change_oem_password(server_info->sam_account, pass1, pass2, False, NULL))) {
02413                                 SSVAL(*rparam,0,NERR_Success);
02414                         }
02415                         unbecome_root();
02416 
02417                         TALLOC_FREE(server_info);
02418                 }
02419                 data_blob_clear_free(&password);
02420         }
02421 
02422         /*
02423          * If the plaintext change failed, attempt
02424          * the old encrypted method. NT will generate this
02425          * after trying the samr method. Note that this
02426          * method is done as a last resort as this
02427          * password change method loses the NT password hash
02428          * and cannot change the UNIX password as no plaintext
02429          * is received.
02430          */
02431 
02432         if(SVAL(*rparam,0) != NERR_Success) {
02433                 struct samu *hnd = NULL;
02434 
02435                 if (check_lanman_password(user,(unsigned char *)pass1,(unsigned char *)pass2, &hnd)) {
02436                         become_root();
02437                         if (change_lanman_password(hnd,(uchar *)pass2)) {
02438                                 SSVAL(*rparam,0,NERR_Success);
02439                         }
02440                         unbecome_root();
02441                         TALLOC_FREE(hnd);
02442                 }
02443         }
02444 
02445         memset((char *)pass1,'\0',sizeof(fstring));
02446         memset((char *)pass2,'\0',sizeof(fstring));      
02447          
02448         return(True);
02449 }

static BOOL api_SamOEMChangePassword ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2455 行で定義されています。

参照先 get_safe_str_ptr()map_username()pass_oem_change()pull_ascii_fstring()skip_string()strequal().

02461 {
02462         fstring user;
02463         char *p = get_safe_str_ptr(param,tpscnt,param,2);
02464         *rparam_len = 2;
02465         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02466         if (!*rparam) {
02467                 return False;
02468         }
02469 
02470         if (!p) {
02471                 return False;
02472         }
02473         *rdata_len = 0;
02474 
02475         SSVAL(*rparam,0,NERR_badpass);
02476 
02477         /*
02478          * Check the parameter definition is correct.
02479          */
02480 
02481         /* Do we have a string ? */
02482         if (skip_string(param,tpscnt,p) == 0) {
02483                 return False;
02484         }
02485         if(!strequal(p, "zsT")) {
02486                 DEBUG(0,("api_SamOEMChangePassword: Invalid parameter string %s\n", p));
02487                 return False;
02488         }
02489         p = skip_string(param, tpscnt, p);
02490         if (!p) {
02491                 return False;
02492         }
02493 
02494         /* Do we have a string ? */
02495         if (skip_string(param,tpscnt,p) == 0) {
02496                 return False;
02497         }
02498         if(!strequal(p, "B516B16")) {
02499                 DEBUG(0,("api_SamOEMChangePassword: Invalid data parameter string %s\n", p));
02500                 return False;
02501         }
02502         p = skip_string(param,tpscnt,p);
02503         if (!p) {
02504                 return False;
02505         }
02506         /* Do we have a string ? */
02507         if (skip_string(param,tpscnt,p) == 0) {
02508                 return False;
02509         }
02510         p += pull_ascii_fstring(user,p);
02511 
02512         DEBUG(3,("api_SamOEMChangePassword: Change password for <%s>\n",user));
02513 
02514         /*
02515          * Pass the user through the NT -> unix user mapping
02516          * function.
02517          */
02518 
02519         (void)map_username(user);
02520 
02521         if (NT_STATUS_IS_OK(pass_oem_change(user, (uchar*) data, (uchar *)&data[516], NULL, NULL, NULL))) {
02522                 SSVAL(*rparam,0,NERR_Success);
02523         }
02524 
02525         return(True);
02526 }

static BOOL api_RDosPrintJobDel ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2533 行で定義されています。

参照先 current_userget_safe_str_ptr()get_safe_SVAL()is_offset_safe()print_job_delete()print_job_exists()print_job_pause()print_job_resume()rap_to_pjobid()skip_string()strcsequal().

02539 {
02540         int function = get_safe_SVAL(param,tpscnt,param,0,0);
02541         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02542         char *str2 = skip_string(param,tpscnt,str1);
02543         char *p = skip_string(param,tpscnt,str2);
02544         uint32 jobid;
02545         int snum;
02546         fstring sharename;
02547         int errcode;
02548         WERROR werr = WERR_OK;
02549 
02550         if (!str1 || !str2 || !p) {
02551                 return False;
02552         }
02553         /*
02554          * We use 1 here not 2 as we're checking
02555          * the last byte we want to access is safe.
02556          */
02557         if (!is_offset_safe(param,tpscnt,p,1)) {
02558                 return False;
02559         }
02560         if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid))
02561                 return False;
02562 
02563         /* check it's a supported varient */
02564         if (!(strcsequal(str1,"W") && strcsequal(str2,"")))
02565                 return(False);
02566 
02567         *rparam_len = 4;
02568         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);       
02569         if (!*rparam) {
02570                 return False;
02571         }
02572         *rdata_len = 0;
02573 
02574         if (!print_job_exists(sharename, jobid)) {
02575                 errcode = NERR_JobNotFound;
02576                 goto out;
02577         }
02578 
02579         snum = lp_servicenumber( sharename);
02580         if (snum == -1) {
02581                 errcode = NERR_DestNotFound;
02582                 goto out;
02583         }
02584 
02585         errcode = NERR_notsupported;
02586         
02587         switch (function) {
02588         case 81:                /* delete */ 
02589                 if (print_job_delete(&current_user, snum, jobid, &werr)) 
02590                         errcode = NERR_Success;
02591                 break;
02592         case 82:                /* pause */
02593                 if (print_job_pause(&current_user, snum, jobid, &werr)) 
02594                         errcode = NERR_Success;
02595                 break;
02596         case 83:                /* resume */
02597                 if (print_job_resume(&current_user, snum, jobid, &werr)) 
02598                         errcode = NERR_Success;
02599                 break;
02600         }
02601 
02602         if (!W_ERROR_IS_OK(werr))
02603                 errcode = W_ERROR_V(werr);
02604         
02605  out:
02606         SSVAL(*rparam,0,errcode);       
02607         SSVAL(*rparam,2,0);             /* converter word */
02608 
02609         return(True);
02610 }

static BOOL api_WPrintQueueCtrl ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2616 行で定義されています。

参照先 current_userget_safe_str_ptr()get_safe_SVAL()print_queue_pause()print_queue_purge()print_queue_resume()print_queue_snum()skip_string()strcsequal().

02622 {
02623         int function = get_safe_SVAL(param,tpscnt,param,0,0);
02624         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02625         char *str2 = skip_string(param,tpscnt,str1);
02626         char *QueueName = skip_string(param,tpscnt,str2);
02627         int errcode = NERR_notsupported;
02628         int snum;
02629         WERROR werr = WERR_OK;
02630 
02631         if (!str1 || !str2 || !QueueName) {
02632                 return False;
02633         }
02634 
02635         /* check it's a supported varient */
02636         if (!(strcsequal(str1,"z") && strcsequal(str2,"")))
02637                 return(False);
02638 
02639         *rparam_len = 4;
02640         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02641         if (!*rparam) {
02642                 return False;
02643         }
02644         *rdata_len = 0;
02645 
02646         if (skip_string(param,tpscnt,QueueName) == NULL) {
02647                 return False;
02648         }
02649         snum = print_queue_snum(QueueName);
02650 
02651         if (snum == -1) {
02652                 errcode = NERR_JobNotFound;
02653                 goto out;
02654         }
02655 
02656         switch (function) {
02657         case 74: /* Pause queue */
02658                 if (print_queue_pause(&current_user, snum, &werr)) errcode = NERR_Success;
02659                 break;
02660         case 75: /* Resume queue */
02661                 if (print_queue_resume(&current_user, snum, &werr)) errcode = NERR_Success;
02662                 break;
02663         case 103: /* Purge */
02664                 if (print_queue_purge(&current_user, snum, &werr)) errcode = NERR_Success;
02665                 break;
02666         }
02667 
02668         if (!W_ERROR_IS_OK(werr)) errcode = W_ERROR_V(werr);
02669 
02670  out:
02671         SSVAL(*rparam,0,errcode);
02672         SSVAL(*rparam,2,0);             /* converter word */
02673 
02674         return(True);
02675 }

static int check_printjob_info ( struct pack_desc desc,
int  uLevel,
char *  id 
) [static]

lanman.c2685 行で定義されています。

参照先 pack_desc::formatpack_desc::subformat.

参照元 api_PrintJobInfo()api_WPrintJobEnumerate()api_WPrintJobGetInfo().

02687 {
02688         desc->subformat = NULL;
02689         switch( uLevel ) {
02690         case 0: desc->format = "W"; break;
02691         case 1: desc->format = "WB21BB16B10zWWzDDz"; break;
02692         case 2: desc->format = "WWzWWDDzz"; break;
02693         case 3: desc->format = "WWzWWDDzzzzzzzzzzlz"; break;
02694         case 4: desc->format = "WWzWWDDzzzzzDDDDDDD"; break;
02695         default:
02696                 DEBUG(0,("check_printjob_info: invalid level %d\n",
02697                         uLevel ));
02698                 return False;
02699         }
02700         if (id == NULL || strcmp(desc->format,id) != 0) {
02701                 DEBUG(0,("check_printjob_info: invalid format %s\n",
02702                         id ? id : "<NULL>" ));
02703                 return False;
02704         }
02705         return True;
02706 }

static BOOL api_PrintJobInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2708 行で定義されています。

参照先 check_printjob_info()pack_desc::errcodeget_safe_str_ptr()get_safe_SVAL()is_offset_safe()print_job_exists()print_job_set_name()print_job_set_place()rap_to_pjobid()skip_string().

02714 {
02715         struct pack_desc desc;
02716         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02717         char *str2 = skip_string(param,tpscnt,str1);
02718         char *p = skip_string(param,tpscnt,str2);
02719         uint32 jobid;
02720         fstring sharename;
02721         int uLevel = get_safe_SVAL(param,tpscnt,p,2,-1);
02722         int function = get_safe_SVAL(param,tpscnt,p,4,-1);
02723         int place, errcode;
02724 
02725         if (!str1 || !str2 || !p) {
02726                 return False;
02727         }
02728         /*
02729          * We use 1 here not 2 as we're checking
02730          * the last byte we want to access is safe.
02731          */
02732         if (!is_offset_safe(param,tpscnt,p,1)) {
02733                 return False;
02734         }
02735         if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid))
02736                 return False;
02737         *rparam_len = 4;
02738         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02739         if (!*rparam) {
02740                 return False;
02741         }
02742 
02743         if (!share_defined(sharename)) {
02744                 DEBUG(0,("api_PrintJobInfo: sharen [%s] not defined\n",
02745                          sharename));
02746                 return False;
02747         }
02748   
02749         *rdata_len = 0;
02750         
02751         /* check it's a supported varient */
02752         if ((strcmp(str1,"WWsTP")) || 
02753             (!check_printjob_info(&desc,uLevel,str2)))
02754                 return(False);
02755 
02756         if (!print_job_exists(sharename, jobid)) {
02757                 errcode=NERR_JobNotFound;
02758                 goto out;
02759         }
02760 
02761         errcode = NERR_notsupported;
02762 
02763         switch (function) {
02764         case 0x6:
02765                 /* change job place in the queue, 
02766                    data gives the new place */
02767                 place = SVAL(data,0);
02768                 if (print_job_set_place(sharename, jobid, place)) {
02769                         errcode=NERR_Success;
02770                 }
02771                 break;
02772 
02773         case 0xb:   
02774                 /* change print job name, data gives the name */
02775                 if (print_job_set_name(sharename, jobid, data)) {
02776                         errcode=NERR_Success;
02777                 }
02778                 break;
02779 
02780         default:
02781                 return False;
02782         }
02783 
02784  out:
02785         SSVALS(*rparam,0,errcode);
02786         SSVAL(*rparam,2,0);             /* converter word */
02787         
02788         return(True);
02789 }

static BOOL api_RNetServerGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2796 行で定義されています。

参照先 srv_info_struct::commentconnection_struct::connectpathcurrent_user_infouserdom_struct::domainget_current_username()get_safe_str_ptr()get_safe_SVAL()get_server_info()connection_struct::gidglobal_mynamelp_workgroup()nameprefix_ok()push_ascii()serversskip_string()standard_sub_advanced()strequal()typeconnection_struct::user.

02802 {
02803         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02804         char *str2 = skip_string(param,tpscnt,str1);
02805         char *p = skip_string(param,tpscnt,str2);
02806         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
02807         char *p2;
02808         int struct_len;
02809 
02810         if (!str1 || !str2 || !p) {
02811                 return False;
02812         }
02813 
02814         DEBUG(4,("NetServerGetInfo level %d\n",uLevel));
02815 
02816         /* check it's a supported varient */
02817         if (!prefix_ok(str1,"WrLh")) {
02818                 return False;
02819         }
02820 
02821         switch( uLevel ) {
02822                 case 0:
02823                         if (strcmp(str2,"B16") != 0) {
02824                                 return False;
02825                         }
02826                         struct_len = 16;
02827                         break;
02828                 case 1:
02829                         if (strcmp(str2,"B16BBDz") != 0) {
02830                                 return False;
02831                         }
02832                         struct_len = 26;
02833                         break;
02834                 case 2:
02835                         if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWz")!= 0) {
02836                                 return False;
02837                         }
02838                         struct_len = 134;
02839                         break;
02840                 case 3:
02841                         if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWzDWz") != 0) {
02842                                 return False;
02843                         }
02844                         struct_len = 144;
02845                         break;
02846                 case 20:
02847                         if (strcmp(str2,"DN") != 0) {
02848                                 return False;
02849                         }
02850                         struct_len = 6;
02851                         break;
02852                 case 50:
02853                         if (strcmp(str2,"B16BBDzWWzzz") != 0) {
02854                                 return False;
02855                         }
02856                         struct_len = 42;
02857                         break;
02858                 default:
02859                         return False;
02860         }
02861 
02862         *rdata_len = mdrcnt;
02863         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
02864         if (!*rdata) {
02865                 return False;
02866         }
02867 
02868         p = *rdata;
02869         p2 = p + struct_len;
02870         if (uLevel != 20) {
02871                 srvstr_push(NULL, p,global_myname(),16, 
02872                         STR_ASCII|STR_UPPER|STR_TERMINATE);
02873         }
02874         p += 16;
02875         if (uLevel > 0) {
02876                 struct srv_info_struct *servers=NULL;
02877                 int i,count;
02878                 pstring comment;
02879                 uint32 servertype= lp_default_server_announce();
02880 
02881                 push_ascii(comment,lp_serverstring(), MAX_SERVER_STRING_LENGTH,STR_TERMINATE);
02882 
02883                 if ((count=get_server_info(SV_TYPE_ALL,&servers,lp_workgroup()))>0) {
02884                         for (i=0;i<count;i++) {
02885                                 if (strequal(servers[i].name,global_myname())) {
02886                                         servertype = servers[i].type;
02887                                         push_ascii(comment,servers[i].comment,sizeof(pstring),STR_TERMINATE);
02888                                 }
02889                         }
02890                 }
02891 
02892                 SAFE_FREE(servers);
02893 
02894                 SCVAL(p,0,lp_major_announce_version());
02895                 SCVAL(p,1,lp_minor_announce_version());
02896                 SIVAL(p,2,servertype);
02897 
02898                 if (mdrcnt == struct_len) {
02899                         SIVAL(p,6,0);
02900                 } else {
02901                         SIVAL(p,6,PTR_DIFF(p2,*rdata));
02902                         standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
02903                                               conn->connectpath, conn->gid,
02904                                               get_current_username(),
02905                                               current_user_info.domain,
02906                                               comment, sizeof(comment));
02907                         StrnCpy(p2,comment,MAX(mdrcnt - struct_len,0));
02908                         p2 = skip_string(*rdata,*rdata_len,p2);
02909                         if (!p2) {
02910                                 return False;
02911                         }
02912                 }
02913         }
02914 
02915         if (uLevel > 1) {
02916                 return False;           /* not yet implemented */
02917         }
02918 
02919         *rdata_len = PTR_DIFF(p2,*rdata);
02920 
02921         *rparam_len = 6;
02922         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02923         if (!*rparam) {
02924                 return False;
02925         }
02926         SSVAL(*rparam,0,NERR_Success);
02927         SSVAL(*rparam,2,0);             /* converter word */
02928         SSVAL(*rparam,4,*rdata_len);
02929 
02930         return True;
02931 }

static BOOL api_NetWkstaGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c2937 行で定義されています。

参照先 current_user_infoget_local_machine_name()get_safe_ptr()get_safe_str_ptr()get_safe_SVAL()levellp_workgroup()skip_string()userdom_struct::smb_namestrcsequal()strupper_m().

02943 {
02944         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
02945         char *str2 = skip_string(param,tpscnt,str1);
02946         char *p = skip_string(param,tpscnt,str2);
02947         char *p2;
02948         int level = get_safe_SVAL(param,tpscnt,p,0,-1);
02949 
02950         if (!str1 || !str2 || !p) {
02951                 return False;
02952         }
02953 
02954         DEBUG(4,("NetWkstaGetInfo level %d\n",level));
02955 
02956         *rparam_len = 6;
02957         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
02958         if (!*rparam) {
02959                 return False;
02960         }
02961 
02962         /* check it's a supported varient */
02963         if (!(level==10 && strcsequal(str1,"WrLh") && strcsequal(str2,"zzzBBzz"))) {
02964                 return False;
02965         }
02966 
02967         *rdata_len = mdrcnt + 1024;
02968         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
02969         if (!*rdata) {
02970                 return False;
02971         }
02972 
02973         SSVAL(*rparam,0,NERR_Success);
02974         SSVAL(*rparam,2,0);             /* converter word */
02975 
02976         p = *rdata;
02977         p2 = get_safe_ptr(*rdata,*rdata_len,p,22);
02978         if (!p2) {
02979                 return False;
02980         }
02981 
02982         SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* host name */
02983         pstrcpy(p2,get_local_machine_name());
02984         strupper_m(p2);
02985         p2 = skip_string(*rdata,*rdata_len,p2);
02986         if (!p2) {
02987                 return False;
02988         }
02989         p += 4;
02990 
02991         SIVAL(p,0,PTR_DIFF(p2,*rdata));
02992         pstrcpy(p2,current_user_info.smb_name);
02993         p2 = skip_string(*rdata,*rdata_len,p2);
02994         if (!p2) {
02995                 return False;
02996         }
02997         p += 4;
02998 
02999         SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* login domain */
03000         pstrcpy(p2,lp_workgroup());
03001         strupper_m(p2);
03002         p2 = skip_string(*rdata,*rdata_len,p2);
03003         if (!p2) {
03004                 return False;
03005         }
03006         p += 4;
03007 
03008         SCVAL(p,0,lp_major_announce_version()); /* system version - e.g 4 in 4.1 */
03009         SCVAL(p,1,lp_minor_announce_version()); /* system version - e.g .1 in 4.1 */
03010         p += 2;
03011 
03012         SIVAL(p,0,PTR_DIFF(p2,*rdata));
03013         pstrcpy(p2,lp_workgroup());     /* don't know.  login domain?? */
03014         p2 = skip_string(*rdata,*rdata_len,p2);
03015         if (!p2) {
03016                 return False;
03017         }
03018         p += 4;
03019 
03020         SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* don't know */
03021         pstrcpy(p2,"");
03022         p2 = skip_string(*rdata,*rdata_len,p2);
03023         if (!p2) {
03024                 return False;
03025         }
03026         p += 4;
03027 
03028         *rdata_len = PTR_DIFF(p2,*rdata);
03029 
03030         SSVAL(*rparam,4,*rdata_len);
03031 
03032         return True;
03033 }

static BOOL api_RNetUserGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3205 行で定義されています。

参照先 connection_struct::admin_useruserdom_struct::full_nameget_safe_ptr()get_safe_str_ptr()get_safe_SVAL()get_valid_user_struct()user_struct::homediruser_struct::logon_scriptskip_string()standard_sub_basic()user_struct::uiduserdom_struct::unix_nameuser_struct::user.

03211 {
03212         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03213         char *str2 = skip_string(param,tpscnt,str1);
03214         char *UserName = skip_string(param,tpscnt,str2);
03215         char *p = skip_string(param,tpscnt,UserName);
03216         int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
03217         char *p2;
03218         const char *level_string;
03219 
03220         /* get NIS home of a previously validated user - simeon */
03221         /* With share level security vuid will always be zero.
03222            Don't depend on vuser being non-null !!. JRA */
03223         user_struct *vuser = get_valid_user_struct(vuid);
03224         if(vuser != NULL) {
03225                 DEBUG(3,("  Username of UID %d is %s\n", (int)vuser->uid, 
03226                         vuser->user.unix_name));
03227         }
03228 
03229         if (!str1 || !str2 || !UserName || !p) {
03230                 return False;
03231         }
03232 
03233         *rparam_len = 6;
03234         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03235         if (!*rparam) {
03236                 return False;
03237         }
03238 
03239         DEBUG(4,("RNetUserGetInfo level=%d\n", uLevel));
03240   
03241         /* check it's a supported variant */
03242         if (strcmp(str1,"zWrLh") != 0) {
03243                 return False;
03244         }
03245         switch( uLevel ) {
03246                 case 0: level_string = "B21"; break;
03247                 case 1: level_string = "B21BB16DWzzWz"; break;
03248                 case 2: level_string = "B21BB16DWzzWzDzzzzDDDDWb21WWzWW"; break;
03249                 case 10: level_string = "B21Bzzz"; break;
03250                 case 11: level_string = "B21BzzzWDDzzDDWWzWzDWb21W"; break;
03251                 default: return False;
03252         }
03253 
03254         if (strcmp(level_string,str2) != 0) {
03255                 return False;
03256         }
03257 
03258         *rdata_len = mdrcnt + 1024;
03259         *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
03260         if (!*rdata) {
03261                 return False;
03262         }
03263 
03264         SSVAL(*rparam,0,NERR_Success);
03265         SSVAL(*rparam,2,0);             /* converter word */
03266 
03267         p = *rdata;
03268         p2 = get_safe_ptr(*rdata,*rdata_len,p,usri11_end);
03269         if (!p2) {
03270                 return False;
03271         }
03272 
03273         memset(p,0,21); 
03274         fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */
03275 
03276         if (uLevel > 0) {
03277                 SCVAL(p,usri11_pad,0); /* padding - 1 byte */
03278                 *p2 = 0;
03279         }
03280 
03281         if (uLevel >= 10) {
03282                 SIVAL(p,usri11_comment,PTR_DIFF(p2,p)); /* comment */
03283                 pstrcpy(p2,"Comment");
03284                 p2 = skip_string(*rdata,*rdata_len,p2);
03285                 if (!p2) {
03286                         return False;
03287                 }
03288 
03289                 SIVAL(p,usri11_usr_comment,PTR_DIFF(p2,p)); /* user_comment */
03290                 pstrcpy(p2,"UserComment");
03291                 p2 = skip_string(*rdata,*rdata_len,p2);
03292                 if (!p2) {
03293                         return False;
03294                 }
03295 
03296                 /* EEK! the cifsrap.txt doesn't have this in!!!! */
03297                 SIVAL(p,usri11_full_name,PTR_DIFF(p2,p)); /* full name */
03298                 pstrcpy(p2,((vuser != NULL) ? vuser->user.full_name : UserName));
03299                 p2 = skip_string(*rdata,*rdata_len,p2);
03300                 if (!p2) {
03301                         return False;
03302                 }
03303         }
03304 
03305         if (uLevel == 11) {
03306                 /* modelled after NTAS 3.51 reply */
03307                 SSVAL(p,usri11_priv,conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER); 
03308                 SIVAL(p,usri11_auth_flags,AF_OP_PRINT);         /* auth flags */
03309                 SIVALS(p,usri11_password_age,-1);               /* password age */
03310                 SIVAL(p,usri11_homedir,PTR_DIFF(p2,p)); /* home dir */
03311                 pstrcpy(p2, vuser && vuser->homedir ? vuser->homedir : "");
03312                 p2 = skip_string(*rdata,*rdata_len,p2);
03313                 if (!p2) {
03314                         return False;
03315                 }
03316                 SIVAL(p,usri11_parms,PTR_DIFF(p2,p)); /* parms */
03317                 pstrcpy(p2,"");
03318                 p2 = skip_string(*rdata,*rdata_len,p2);
03319                 if (!p2) {
03320                         return False;
03321                 }
03322                 SIVAL(p,usri11_last_logon,0);           /* last logon */
03323                 SIVAL(p,usri11_last_logoff,0);          /* last logoff */
03324                 SSVALS(p,usri11_bad_pw_count,-1);       /* bad pw counts */
03325                 SSVALS(p,usri11_num_logons,-1);         /* num logons */
03326                 SIVAL(p,usri11_logon_server,PTR_DIFF(p2,p)); /* logon server */
03327                 pstrcpy(p2,"\\\\*");
03328                 p2 = skip_string(*rdata,*rdata_len,p2);
03329                 if (!p2) {
03330                         return False;
03331                 }
03332                 SSVAL(p,usri11_country_code,0);         /* country code */
03333 
03334                 SIVAL(p,usri11_workstations,PTR_DIFF(p2,p)); /* workstations */
03335                 pstrcpy(p2,"");
03336                 p2 = skip_string(*rdata,*rdata_len,p2);
03337                 if (!p2) {
03338                         return False;
03339                 }
03340 
03341                 SIVALS(p,usri11_max_storage,-1);                /* max storage */
03342                 SSVAL(p,usri11_units_per_week,168);             /* units per week */
03343                 SIVAL(p,usri11_logon_hours,PTR_DIFF(p2,p)); /* logon hours */
03344 
03345                 /* a simple way to get logon hours at all times. */
03346                 memset(p2,0xff,21);
03347                 SCVAL(p2,21,0);           /* fix zero termination */
03348                 p2 = skip_string(*rdata,*rdata_len,p2);
03349                 if (!p2) {
03350                         return False;
03351                 }
03352 
03353                 SSVAL(p,usri11_code_page,0);            /* code page */
03354         }
03355 
03356         if (uLevel == 1 || uLevel == 2) {
03357                 memset(p+22,' ',16);    /* password */
03358                 SIVALS(p,38,-1);                /* password age */
03359                 SSVAL(p,42,
03360                 conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
03361                 SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
03362                 pstrcpy(p2, vuser && vuser->homedir ? vuser->homedir : "");
03363                 p2 = skip_string(*rdata,*rdata_len,p2);
03364                 if (!p2) {
03365                         return False;
03366                 }
03367                 SIVAL(p,48,PTR_DIFF(p2,*rdata)); /* comment */
03368                 *p2++ = 0;
03369                 SSVAL(p,52,0);          /* flags */
03370                 SIVAL(p,54,PTR_DIFF(p2,*rdata));                /* script_path */
03371                 pstrcpy(p2,vuser && vuser->logon_script ? vuser->logon_script : "");
03372                 p2 = skip_string(*rdata,*rdata_len,p2);
03373                 if (!p2) {
03374                         return False;
03375                 }
03376                 if (uLevel == 2) {
03377                         SIVAL(p,60,0);          /* auth_flags */
03378                         SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* full_name */
03379                         pstrcpy(p2,((vuser != NULL) ? vuser->user.full_name : UserName));
03380                         p2 = skip_string(*rdata,*rdata_len,p2);
03381                         if (!p2) {
03382                                 return False;
03383                         }
03384                         SIVAL(p,68,0);          /* urs_comment */
03385                         SIVAL(p,72,PTR_DIFF(p2,*rdata)); /* parms */
03386                         pstrcpy(p2,"");
03387                         p2 = skip_string(*rdata,*rdata_len,p2);
03388                         if (!p2) {
03389                                 return False;
03390                         }
03391                         SIVAL(p,76,0);          /* workstations */
03392                         SIVAL(p,80,0);          /* last_logon */
03393                         SIVAL(p,84,0);          /* last_logoff */
03394                         SIVALS(p,88,-1);                /* acct_expires */
03395                         SIVALS(p,92,-1);                /* max_storage */
03396                         SSVAL(p,96,168);        /* units_per_week */
03397                         SIVAL(p,98,PTR_DIFF(p2,*rdata)); /* logon_hours */
03398                         memset(p2,-1,21);
03399                         p2 += 21;
03400                         SSVALS(p,102,-1);       /* bad_pw_count */
03401                         SSVALS(p,104,-1);       /* num_logons */
03402                         SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
03403                         {
03404                                 pstring tmp;
03405                                 pstrcpy(tmp, "\\\\%L");
03406                                 standard_sub_basic("", "", tmp, sizeof(tmp));
03407                                 pstrcpy(p2, tmp);
03408                         }
03409                         p2 = skip_string(*rdata,*rdata_len,p2);
03410                         if (!p2) {
03411                                 return False;
03412                         }
03413                         SSVAL(p,110,49);        /* country_code */
03414                         SSVAL(p,112,860);       /* code page */
03415                 }
03416         }
03417 
03418         *rdata_len = PTR_DIFF(p2,*rdata);
03419 
03420         SSVAL(*rparam,4,*rdata_len);    /* is this right?? */
03421 
03422         return(True);
03423 }

static BOOL api_WWkstaUserLogon ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3425 行で定義されています。

参照先 connection_struct::admin_userget_local_machine_name()get_safe_str_ptr()get_safe_SVAL()get_valid_user_struct()init_package()user_struct::logon_scriptlp_workgroup()namePACKI()PACKS()skip_string()strupper_m()user_struct::uiduserdom_struct::unix_nameuser_struct::user.

03431 {
03432         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03433         char *str2 = skip_string(param,tpscnt,str1);
03434         char *p = skip_string(param,tpscnt,str2);
03435         int uLevel;
03436         struct pack_desc desc;
03437         char* name;
03438                 /* With share level security vuid will always be zero.
03439                    Don't depend on vuser being non-null !!. JRA */
03440         user_struct *vuser = get_valid_user_struct(vuid);
03441 
03442         if (!str1 || !str2 || !p) {
03443                 return False;
03444         }
03445 
03446         if(vuser != NULL) {
03447                 DEBUG(3,("  Username of UID %d is %s\n", (int)vuser->uid, 
03448                         vuser->user.unix_name));
03449         }
03450 
03451         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
03452         name = get_safe_str_ptr(param,tpscnt,p,2);
03453         if (!name) {
03454                 return False;
03455         }
03456 
03457         memset((char *)&desc,'\0',sizeof(desc));
03458 
03459         DEBUG(3,("WWkstaUserLogon uLevel=%d name=%s\n",uLevel,name));
03460 
03461         /* check it's a supported varient */
03462         if (strcmp(str1,"OOWb54WrLh") != 0) {
03463                 return False;
03464         }
03465         if (uLevel != 1 || strcmp(str2,"WB21BWDWWDDDDDDDzzzD") != 0) {
03466                 return False;
03467         }
03468         if (mdrcnt > 0) {
03469                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
03470                 if (!*rdata) {
03471                         return False;
03472                 }
03473         }
03474 
03475         desc.base = *rdata;
03476         desc.buflen = mdrcnt;
03477         desc.subformat = NULL;
03478         desc.format = str2;
03479   
03480         if (init_package(&desc,1,0)) {
03481                 PACKI(&desc,"W",0);             /* code */
03482                 PACKS(&desc,"B21",name);        /* eff. name */
03483                 PACKS(&desc,"B","");            /* pad */
03484                 PACKI(&desc,"W", conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
03485                 PACKI(&desc,"D",0);             /* auth flags XXX */
03486                 PACKI(&desc,"W",0);             /* num logons */
03487                 PACKI(&desc,"W",0);             /* bad pw count */
03488                 PACKI(&desc,"D",0);             /* last logon */
03489                 PACKI(&desc,"D",-1);            /* last logoff */
03490                 PACKI(&desc,"D",-1);            /* logoff time */
03491                 PACKI(&desc,"D",-1);            /* kickoff time */
03492                 PACKI(&desc,"D",0);             /* password age */
03493                 PACKI(&desc,"D",0);             /* password can change */
03494                 PACKI(&desc,"D",-1);            /* password must change */
03495 
03496                 {
03497                         fstring mypath;
03498                         fstrcpy(mypath,"\\\\");
03499                         fstrcat(mypath,get_local_machine_name());
03500                         strupper_m(mypath);
03501                         PACKS(&desc,"z",mypath); /* computer */
03502                 }
03503 
03504                 PACKS(&desc,"z",lp_workgroup());/* domain */
03505                 PACKS(&desc,"z", vuser && vuser->logon_script ? vuser->logon_script :""); /* script path */
03506                 PACKI(&desc,"D",0x00000000);            /* reserved */
03507         }
03508 
03509         *rdata_len = desc.usedlen;
03510         *rparam_len = 6;
03511         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03512         if (!*rparam) {
03513                 return False;
03514         }
03515         SSVALS(*rparam,0,desc.errcode);
03516         SSVAL(*rparam,2,0);
03517         SSVAL(*rparam,4,desc.neededlen);
03518 
03519         DEBUG(4,("WWkstaUserLogon: errorcode %d\n",desc.errcode));
03520 
03521         return True;
03522 }

static BOOL api_WAccessGetUserPerms ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3528 行で定義されています。

参照先 get_safe_str_ptr()skip_string().

03534 {
03535         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03536         char *str2 = skip_string(param,tpscnt,str1);
03537         char *user = skip_string(param,tpscnt,str2);
03538         char *resource = skip_string(param,tpscnt,user);
03539 
03540         if (!str1 || !str2 || !user || !resource) {
03541                 return False;
03542         }
03543 
03544         if (skip_string(param,tpscnt,resource) == NULL) {
03545                 return False;
03546         }
03547         DEBUG(3,("WAccessGetUserPerms user=%s resource=%s\n",user,resource));
03548 
03549         /* check it's a supported varient */
03550         if (strcmp(str1,"zzh") != 0) {
03551                 return False;
03552         }
03553         if (strcmp(str2,"") != 0) {
03554                 return False;
03555         }
03556 
03557         *rparam_len = 6;
03558         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03559         if (!*rparam) {
03560                 return False;
03561         }
03562         SSVALS(*rparam,0,0);            /* errorcode */
03563         SSVAL(*rparam,2,0);             /* converter word */
03564         SSVAL(*rparam,4,0x7f);  /* permission flags */
03565 
03566         return True;
03567 }

static BOOL api_WPrintJobGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3573 行で定義されています。

参照先 check_printjob_info()fill_printjob_info()get_safe_str_ptr()get_safe_SVAL()getlen()init_package()print_queue_status()rap_to_pjobid()skip_string()status.

03579 {
03580         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03581         char *str2 = skip_string(param,tpscnt,str1);
03582         char *p = skip_string(param,tpscnt,str2);
03583         int uLevel;
03584         int count;
03585         int i;
03586         int snum;
03587         fstring sharename;
03588         uint32 jobid;
03589         struct pack_desc desc;
03590         print_queue_struct *queue=NULL;
03591         print_status_struct status;
03592         char *tmpdata=NULL;
03593 
03594         if (!str1 || !str2 || !p) {
03595                 return False;
03596         }
03597 
03598         uLevel = get_safe_SVAL(param,tpscnt,p,2,-1);
03599 
03600         memset((char *)&desc,'\0',sizeof(desc));
03601         memset((char *)&status,'\0',sizeof(status));
03602 
03603         DEBUG(3,("WPrintJobGetInfo uLevel=%d uJobId=0x%X\n",uLevel,SVAL(p,0)));
03604 
03605         /* check it's a supported varient */
03606         if (strcmp(str1,"WWrLh") != 0) {
03607                 return False;
03608         }
03609         if (!check_printjob_info(&desc,uLevel,str2)) {
03610                 return False;
03611         }
03612 
03613         if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid)) {
03614                 return False;
03615         }
03616 
03617         snum = lp_servicenumber( sharename);
03618         if (snum < 0 || !VALID_SNUM(snum)) {
03619                 return(False);
03620         }
03621 
03622         count = print_queue_status(snum,&queue,&status);
03623         for (i = 0; i < count; i++) {
03624                 if (queue[i].job == jobid) {
03625                         break;
03626                 }
03627         }
03628 
03629         if (mdrcnt > 0) {
03630                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
03631                 if (!*rdata) {
03632                         return False;
03633                 }
03634                 desc.base = *rdata;
03635                 desc.buflen = mdrcnt;
03636         } else {
03637                 /*
03638                  * Don't return data but need to get correct length
03639                  *  init_package will return wrong size if buflen=0
03640                  */
03641                 desc.buflen = getlen(desc.format);
03642                 desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
03643         }
03644 
03645         if (init_package(&desc,1,0)) {
03646                 if (i < count) {
03647                         fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
03648                         *rdata_len = desc.usedlen;
03649                 } else {
03650                         desc.errcode = NERR_JobNotFound;
03651                         *rdata_len = 0;
03652                 }
03653         }
03654 
03655         *rparam_len = 6;
03656         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03657         if (!*rparam) {
03658                 return False;
03659         }
03660         SSVALS(*rparam,0,desc.errcode);
03661         SSVAL(*rparam,2,0);
03662         SSVAL(*rparam,4,desc.neededlen);
03663 
03664         SAFE_FREE(queue);
03665         SAFE_FREE(tmpdata);
03666 
03667         DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode));
03668 
03669         return True;
03670 }

static BOOL api_WPrintJobEnumerate ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3672 行で定義されています。

参照先 check_printjob_info()fill_printjob_info()find_service()get_safe_str_ptr()get_safe_SVAL()init_package()lp_snum_ok()nameprint_queue_status()skip_string()status.

03678 {
03679         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03680         char *str2 = skip_string(param,tpscnt,str1);
03681         char *p = skip_string(param,tpscnt,str2);
03682         char *name = p;
03683         int uLevel;
03684         int count;
03685         int i, succnt=0;
03686         int snum;
03687         struct pack_desc desc;
03688         print_queue_struct *queue=NULL;
03689         print_status_struct status;
03690 
03691         if (!str1 || !str2 || !p) {
03692                 return False;
03693         }
03694 
03695         memset((char *)&desc,'\0',sizeof(desc));
03696         memset((char *)&status,'\0',sizeof(status));
03697 
03698         p = skip_string(param,tpscnt,p);
03699         if (!p) {
03700                 return False;
03701         }
03702         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
03703 
03704         DEBUG(3,("WPrintJobEnumerate uLevel=%d name=%s\n",uLevel,name));
03705 
03706         /* check it's a supported variant */
03707         if (strcmp(str1,"zWrLeh") != 0) {
03708                 return False;
03709         }
03710     
03711         if (uLevel > 2) {
03712                 return False;   /* defined only for uLevel 0,1,2 */
03713         }
03714     
03715         if (!check_printjob_info(&desc,uLevel,str2)) { 
03716                 return False;
03717         }
03718 
03719         snum = find_service(name);
03720         if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
03721                 return False;
03722         }
03723 
03724         count = print_queue_status(snum,&queue,&status);
03725         if (mdrcnt > 0) {
03726                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
03727                 if (!*rdata) {
03728                         return False;
03729                 }
03730         }
03731         desc.base = *rdata;
03732         desc.buflen = mdrcnt;
03733 
03734         if (init_package(&desc,count,0)) {
03735                 succnt = 0;
03736                 for (i = 0; i < count; i++) {
03737                         fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
03738                         if (desc.errcode == NERR_Success) {
03739                                 succnt = i+1;
03740                         }
03741                 }
03742         }
03743 
03744         *rdata_len = desc.usedlen;
03745 
03746         *rparam_len = 8;
03747         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03748         if (!*rparam) {
03749                 return False;
03750         }
03751         SSVALS(*rparam,0,desc.errcode);
03752         SSVAL(*rparam,2,0);
03753         SSVAL(*rparam,4,succnt);
03754         SSVAL(*rparam,6,count);
03755 
03756         SAFE_FREE(queue);
03757 
03758         DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode));
03759 
03760         return True;
03761 }

static int check_printdest_info ( struct pack_desc desc,
int  uLevel,
char *  id 
) [static]

lanman.c3763 行で定義されています。

参照先 pack_desc::formatpack_desc::subformat.

参照元 api_WPrintDestEnum()api_WPrintDestGetInfo().

03765 {
03766         desc->subformat = NULL;
03767         switch( uLevel ) {
03768                 case 0:
03769                         desc->format = "B9";
03770                         break;
03771                 case 1:
03772                         desc->format = "B9B21WWzW";
03773                         break;
03774                 case 2:
03775                         desc->format = "z";
03776                         break;
03777                 case 3:
03778                         desc->format = "zzzWWzzzWW";
03779                         break;
03780                 default:
03781                         DEBUG(0,("check_printdest_info: invalid level %d\n",
03782                                 uLevel));
03783                         return False;
03784         }
03785         if (id == NULL || strcmp(desc->format,id) != 0) {
03786                 DEBUG(0,("check_printdest_info: invalid string %s\n", 
03787                         id ? id : "<NULL>" ));
03788                 return False;
03789         }
03790         return True;
03791 }

static void fill_printdest_info ( connection_struct conn,
int  snum,
int  uLevel,
struct pack_desc desc 
) [static]

lanman.c3793 行で定義されています。

参照先 bufPACKI()PACKS()strupper_m().

参照元 api_WPrintDestEnum()api_WPrintDestGetInfo().

03795 {
03796         char buf[100];
03797 
03798         strncpy(buf,SERVICE(snum),sizeof(buf)-1);
03799         buf[sizeof(buf)-1] = 0;
03800         strupper_m(buf);
03801 
03802         if (uLevel <= 1) {
03803                 PACKS(desc,"B9",buf);   /* szName */
03804                 if (uLevel == 1) {
03805                         PACKS(desc,"B21","");   /* szUserName */
03806                         PACKI(desc,"W",0);              /* uJobId */
03807                         PACKI(desc,"W",0);              /* fsStatus */
03808                         PACKS(desc,"z","");     /* pszStatus */
03809                         PACKI(desc,"W",0);              /* time */
03810                 }
03811         }
03812 
03813         if (uLevel == 2 || uLevel == 3) {
03814                 PACKS(desc,"z",buf);            /* pszPrinterName */
03815                 if (uLevel == 3) {
03816                         PACKS(desc,"z","");     /* pszUserName */
03817                         PACKS(desc,"z","");     /* pszLogAddr */
03818                         PACKI(desc,"W",0);              /* uJobId */
03819                         PACKI(desc,"W",0);              /* fsStatus */
03820                         PACKS(desc,"z","");     /* pszStatus */
03821                         PACKS(desc,"z","");     /* pszComment */
03822                         PACKS(desc,"z","NULL"); /* pszDrivers */
03823                         PACKI(desc,"W",0);              /* time */
03824                         PACKI(desc,"W",0);              /* pad1 */
03825                 }
03826         }
03827 }

static BOOL api_WPrintDestGetInfo ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3829 行で定義されています。

参照先 check_printdest_info()fill_printdest_info()find_service()get_safe_str_ptr()get_safe_SVAL()getlen()init_package()lp_snum_ok()skip_string().

03835 {
03836         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03837         char *str2 = skip_string(param,tpscnt,str1);
03838         char *p = skip_string(param,tpscnt,str2);
03839         char* PrinterName = p;
03840         int uLevel;
03841         struct pack_desc desc;
03842         int snum;
03843         char *tmpdata=NULL;
03844 
03845         if (!str1 || !str2 || !p) {
03846                 return False;
03847         }
03848 
03849         memset((char *)&desc,'\0',sizeof(desc));
03850 
03851         p = skip_string(param,tpscnt,p);
03852         if (!p) {
03853                 return False;
03854         }
03855         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
03856 
03857         DEBUG(3,("WPrintDestGetInfo uLevel=%d PrinterName=%s\n",uLevel,PrinterName));
03858 
03859         /* check it's a supported varient */
03860         if (strcmp(str1,"zWrLh") != 0) {
03861                 return False;
03862         }
03863         if (!check_printdest_info(&desc,uLevel,str2)) {
03864                 return False;
03865         }
03866 
03867         snum = find_service(PrinterName);
03868         if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
03869                 *rdata_len = 0;
03870                 desc.errcode = NERR_DestNotFound;
03871                 desc.neededlen = 0;
03872         } else {
03873                 if (mdrcnt > 0) {
03874                         *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
03875                         if (!*rdata) {
03876                                 return False;
03877                         }
03878                         desc.base = *rdata;
03879                         desc.buflen = mdrcnt;
03880                 } else {
03881                         /*
03882                          * Don't return data but need to get correct length
03883                          * init_package will return wrong size if buflen=0
03884                          */
03885                         desc.buflen = getlen(desc.format);
03886                         desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
03887                 }
03888                 if (init_package(&desc,1,0)) {
03889                         fill_printdest_info(conn,snum,uLevel,&desc);
03890                 }
03891                 *rdata_len = desc.usedlen;
03892         }
03893 
03894         *rparam_len = 6;
03895         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03896         if (!*rparam) {
03897                 return False;
03898         }
03899         SSVALS(*rparam,0,desc.errcode);
03900         SSVAL(*rparam,2,0);
03901         SSVAL(*rparam,4,desc.neededlen);
03902 
03903         DEBUG(4,("WPrintDestGetInfo: errorcode %d\n",desc.errcode));
03904         SAFE_FREE(tmpdata);
03905 
03906         return True;
03907 }

static BOOL api_WPrintDestEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3909 行で定義されています。

参照先 check_printdest_info()fill_printdest_info()get_safe_str_ptr()get_safe_SVAL()init_package()lp_snum_ok()skip_string().

03915 {
03916         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03917         char *str2 = skip_string(param,tpscnt,str1);
03918         char *p = skip_string(param,tpscnt,str2);
03919         int uLevel;
03920         int queuecnt;
03921         int i, n, succnt=0;
03922         struct pack_desc desc;
03923         int services = lp_numservices();
03924 
03925         if (!str1 || !str2 || !p) {
03926                 return False;
03927         }
03928 
03929         memset((char *)&desc,'\0',sizeof(desc));
03930 
03931         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
03932 
03933         DEBUG(3,("WPrintDestEnum uLevel=%d\n",uLevel));
03934 
03935         /* check it's a supported varient */
03936         if (strcmp(str1,"WrLeh") != 0) {
03937                 return False;
03938         }
03939         if (!check_printdest_info(&desc,uLevel,str2)) {
03940                 return False;
03941         }
03942 
03943         queuecnt = 0;
03944         for (i = 0; i < services; i++) {
03945                 if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
03946                         queuecnt++;
03947                 }
03948         }
03949 
03950         if (mdrcnt > 0) {
03951                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
03952                 if (!*rdata) {
03953                         return False;
03954                 }
03955         }
03956 
03957         desc.base = *rdata;
03958         desc.buflen = mdrcnt;
03959         if (init_package(&desc,queuecnt,0)) {    
03960                 succnt = 0;
03961                 n = 0;
03962                 for (i = 0; i < services; i++) {
03963                         if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
03964                                 fill_printdest_info(conn,i,uLevel,&desc);
03965                                 n++;
03966                                 if (desc.errcode == NERR_Success) {
03967                                         succnt = n;
03968                                 }
03969                         }
03970                 }
03971         }
03972 
03973         *rdata_len = desc.usedlen;
03974 
03975         *rparam_len = 8;
03976         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
03977         if (!*rparam) {
03978                 return False;
03979         }
03980         SSVALS(*rparam,0,desc.errcode);
03981         SSVAL(*rparam,2,0);
03982         SSVAL(*rparam,4,succnt);
03983         SSVAL(*rparam,6,queuecnt);
03984 
03985         DEBUG(4,("WPrintDestEnumerate: errorcode %d\n",desc.errcode));
03986 
03987         return True;
03988 }

static BOOL api_WPrintDriverEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c3990 行で定義されています。

参照先 get_safe_str_ptr()get_safe_SVAL()init_package()PACKS()skip_string().

03996 {
03997         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
03998         char *str2 = skip_string(param,tpscnt,str1);
03999         char *p = skip_string(param,tpscnt,str2);
04000         int uLevel;
04001         int succnt;
04002         struct pack_desc desc;
04003 
04004         if (!str1 || !str2 || !p) {
04005                 return False;
04006         }
04007 
04008         memset((char *)&desc,'\0',sizeof(desc));
04009 
04010         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
04011 
04012         DEBUG(3,("WPrintDriverEnum uLevel=%d\n",uLevel));
04013 
04014         /* check it's a supported varient */
04015         if (strcmp(str1,"WrLeh") != 0) {
04016                 return False;
04017         }
04018         if (uLevel != 0 || strcmp(str2,"B41") != 0) {
04019                 return False;
04020         }
04021 
04022         if (mdrcnt > 0) {
04023                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
04024                 if (!*rdata) {
04025                         return False;
04026                 }
04027         }
04028         desc.base = *rdata;
04029         desc.buflen = mdrcnt;
04030         if (init_package(&desc,1,0)) {
04031                 PACKS(&desc,"B41","NULL");
04032         }
04033 
04034         succnt = (desc.errcode == NERR_Success ? 1 : 0);
04035 
04036         *rdata_len = desc.usedlen;
04037 
04038         *rparam_len = 8;
04039         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04040         if (!*rparam) {
04041                 return False;
04042         }
04043         SSVALS(*rparam,0,desc.errcode);
04044         SSVAL(*rparam,2,0);
04045         SSVAL(*rparam,4,succnt);
04046         SSVAL(*rparam,6,1);
04047 
04048         DEBUG(4,("WPrintDriverEnum: errorcode %d\n",desc.errcode));
04049 
04050         return True;
04051 }

static BOOL api_WPrintQProcEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c4053 行で定義されています。

参照先 get_safe_str_ptr()get_safe_SVAL()init_package()PACKS()skip_string().

04059 {
04060         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
04061         char *str2 = skip_string(param,tpscnt,str1);
04062         char *p = skip_string(param,tpscnt,str2);
04063         int uLevel;
04064         int succnt;
04065         struct pack_desc desc;
04066 
04067         if (!str1 || !str2 || !p) {
04068                 return False;
04069         }
04070         memset((char *)&desc,'\0',sizeof(desc));
04071 
04072         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
04073 
04074         DEBUG(3,("WPrintQProcEnum uLevel=%d\n",uLevel));
04075 
04076         /* check it's a supported varient */
04077         if (strcmp(str1,"WrLeh") != 0) {
04078                 return False;
04079         }
04080         if (uLevel != 0 || strcmp(str2,"B13") != 0) {
04081                 return False;
04082         }
04083 
04084         if (mdrcnt > 0) {
04085                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
04086                 if (!*rdata) {
04087                         return False;
04088                 }
04089         }
04090         desc.base = *rdata;
04091         desc.buflen = mdrcnt;
04092         desc.format = str2;
04093         if (init_package(&desc,1,0)) {
04094                 PACKS(&desc,"B13","lpd");
04095         }
04096 
04097         succnt = (desc.errcode == NERR_Success ? 1 : 0);
04098 
04099         *rdata_len = desc.usedlen;
04100 
04101         *rparam_len = 8;
04102         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04103         if (!*rparam) {
04104                 return False;
04105         }
04106         SSVALS(*rparam,0,desc.errcode);
04107         SSVAL(*rparam,2,0);
04108         SSVAL(*rparam,4,succnt);
04109         SSVAL(*rparam,6,1);
04110 
04111         DEBUG(4,("WPrintQProcEnum: errorcode %d\n",desc.errcode));
04112 
04113         return True;
04114 }

static BOOL api_WPrintPortEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c4116 行で定義されています。

参照先 get_safe_str_ptr()get_safe_SVAL()init_package()PACKS()skip_string().

04122 {
04123         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
04124         char *str2 = skip_string(param,tpscnt,str1);
04125         char *p = skip_string(param,tpscnt,str2);
04126         int uLevel;
04127         int succnt;
04128         struct pack_desc desc;
04129 
04130         if (!str1 || !str2 || !p) {
04131                 return False;
04132         }
04133 
04134         memset((char *)&desc,'\0',sizeof(desc));
04135 
04136         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
04137 
04138         DEBUG(3,("WPrintPortEnum uLevel=%d\n",uLevel));
04139 
04140         /* check it's a supported varient */
04141         if (strcmp(str1,"WrLeh") != 0) {
04142                 return False;
04143         }
04144         if (uLevel != 0 || strcmp(str2,"B9") != 0) {
04145                 return False;
04146         }
04147 
04148         if (mdrcnt > 0) {
04149                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
04150                 if (!*rdata) {
04151                         return False;
04152                 }
04153         }
04154         memset((char *)&desc,'\0',sizeof(desc));
04155         desc.base = *rdata;
04156         desc.buflen = mdrcnt;
04157         desc.format = str2;
04158         if (init_package(&desc,1,0)) {
04159                 PACKS(&desc,"B13","lp0");
04160         }
04161 
04162         succnt = (desc.errcode == NERR_Success ? 1 : 0);
04163 
04164         *rdata_len = desc.usedlen;
04165 
04166         *rparam_len = 8;
04167         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04168         if (!*rparam) {
04169                 return False;
04170         }
04171         SSVALS(*rparam,0,desc.errcode);
04172         SSVAL(*rparam,2,0);
04173         SSVAL(*rparam,4,succnt);
04174         SSVAL(*rparam,6,1);
04175 
04176         DEBUG(4,("WPrintPortEnum: errorcode %d\n",desc.errcode));
04177 
04178         return True;
04179 }

static BOOL api_RNetSessionEnum ( connection_struct conn,
uint16  vuid,
char *  param,
int  tpscnt,
char *  data,
int  tdscnt,
int  mdrcnt,
int  mprcnt,
char **  rdata,
char **  rparam,
int *  rdata_len,
int *  rparam_len 
) [static]

lanman.c4185 行で定義されています。

参照先 get_safe_str_ptr()get_safe_SVAL()init_package()list_sessions()PACKI()PACKS()remote_machineskip_string()username.

04192 {
04193         char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
04194         char *str2 = skip_string(param,tpscnt,str1);
04195         char *p = skip_string(param,tpscnt,str2);
04196         int uLevel;
04197         struct pack_desc desc;
04198         struct sessionid *session_list = NULL;
04199         int i, num_sessions;
04200 
04201         if (!str1 || !str2 || !p) {
04202                 return False;
04203         }
04204 
04205         memset((char *)&desc,'\0',sizeof(desc));
04206 
04207         uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
04208 
04209         DEBUG(3,("RNetSessionEnum uLevel=%d\n",uLevel));
04210         DEBUG(7,("RNetSessionEnum req string=%s\n",str1));
04211         DEBUG(7,("RNetSessionEnum ret string=%s\n",str2));
04212 
04213         /* check it's a supported varient */
04214         if (strcmp(str1,RAP_NetSessionEnum_REQ) != 0) {
04215                 return False;
04216         }
04217         if (uLevel != 2 || strcmp(str2,RAP_SESSION_INFO_L2) != 0) {
04218                 return False;
04219         }
04220 
04221         num_sessions = list_sessions(&session_list);
04222 
04223         if (mdrcnt > 0) {
04224                 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
04225                 if (!*rdata) {
04226                         SAFE_FREE(session_list);
04227                         return False;
04228                 }
04229         }
04230         memset((char *)&desc,'\0',sizeof(desc));
04231         desc.base = *rdata;
04232         desc.buflen = mdrcnt;
04233         desc.format = str2;
04234         if (!init_package(&desc,num_sessions,0)) {
04235                 SAFE_FREE(session_list);
04236                 return False;
04237         }
04238 
04239         for(i=0; i<num_sessions; i++) {
04240                 PACKS(&desc, "z", session_list[i].remote_machine);
04241                 PACKS(&desc, "z", session_list[i].username);
04242                 PACKI(&desc, "W", 1); /* num conns */
04243                 PACKI(&desc, "W", 0); /* num opens */
04244                 PACKI(&desc, "W", 1); /* num users */
04245                 PACKI(&desc, "D", 0); /* session time */
04246                 PACKI(&desc, "D", 0); /* idle time */
04247                 PACKI(&desc, "D", 0); /* flags */
04248                 PACKS(&desc, "z", "Unknown Client"); /* client type string */
04249         }
04250 
04251         *rdata_len = desc.usedlen;
04252 
04253         *rparam_len = 8;
04254         *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
04255         if (!*rparam) {
04256                 SAFE_FREE(session_list);
04257                 return False;
04258         }
04259         SSVALS(*rparam,0,desc.errcode);
04260         SSVAL(*rparam,2,0); /* converter */
04261         SSVAL(*rparam,4,num_sessions); /* count */
04262 
04263         DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
04264 
04265         SAFE_FREE(session_list);
04266         return True;
04267 }

int api_reply ( connection_struct conn,
uint16  vuid,
char *  outbuf,
char *  data,
char *  params,
int  tdscnt,
int  tpscnt,
int  mdrcnt,
int  mprcnt 
)

lanman.c4375 行で定義されています。

参照先 api_commandsauth_userfnget_valid_user_struct()nameskip_string().

参照元 named_pipe().

04377 {
04378         int api_command;
04379         char *rdata = NULL;
04380         char *rparam = NULL;
04381         const char *name1 = NULL;
04382         const char *name2 = NULL;
04383         int rdata_len = 0;
04384         int rparam_len = 0;
04385         BOOL reply=False;
04386         int i;
04387 
04388         if (!params) {
04389                 DEBUG(0,("ERROR: NULL params in api_reply()\n"));
04390                 return 0;
04391         }
04392 
04393         if (tpscnt < 2) {
04394                 return 0;
04395         }
04396         api_command = SVAL(params,0);
04397         /* Is there a string at position params+2 ? */
04398         if (skip_string(params,tpscnt,params+2)) {
04399                 name1 = params + 2;
04400         } else {
04401                 name1 = "";
04402         }
04403         name2 = skip_string(params,tpscnt,params+2);
04404         if (!name2) {
04405                 name2 = "";
04406         }
04407 
04408         DEBUG(3,("Got API command %d of form <%s> <%s> (tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
04409                 api_command,
04410                 name1,
04411                 name2,
04412                 tdscnt,tpscnt,mdrcnt,mprcnt));
04413 
04414         for (i=0;api_commands[i].name;i++) {
04415                 if (api_commands[i].id == api_command && api_commands[i].fn) {
04416                         DEBUG(3,("Doing %s\n",api_commands[i].name));
04417                         break;
04418                 }
04419         }
04420 
04421         /* Check whether this api call can be done anonymously */
04422 
04423         if (api_commands[i].auth_user && lp_restrict_anonymous()) {
04424                 user_struct *user = get_valid_user_struct(vuid);
04425 
04426                 if (!user || user->guest) {
04427                         return ERROR_NT(NT_STATUS_ACCESS_DENIED);
04428                 }
04429         }
04430 
04431         rdata = (char *)SMB_MALLOC(1024);
04432         if (rdata) {
04433                 memset(rdata,'\0',1024);
04434         }
04435 
04436         rparam = (char *)SMB_MALLOC(1024);
04437         if (rparam) {
04438                 memset(rparam,'\0',1024);
04439         }
04440 
04441         if(!rdata || !rparam) {
04442                 DEBUG(0,("api_reply: malloc fail !\n"));
04443                 SAFE_FREE(rdata);
04444                 SAFE_FREE(rparam);
04445                 return -1;
04446         }
04447 
04448         reply = api_commands[i].fn(conn,
04449                                 vuid,
04450                                 params,tpscnt,  /* params + length */
04451                                 data,tdscnt,    /* data + length */
04452                                 mdrcnt,mprcnt,
04453                                 &rdata,&rparam,&rdata_len,&rparam_len);
04454 
04455 
04456         if (rdata_len > mdrcnt || rparam_len > mprcnt) {
04457                 reply = api_TooSmall(conn,vuid,params,data,mdrcnt,mprcnt,
04458                                         &rdata,&rparam,&rdata_len,&rparam_len);
04459         }
04460 
04461         /* if we get False back then it's actually unsupported */
04462         if (!reply) {
04463                 reply = api_Unsupported(conn,vuid,params,tpscnt,data,tdscnt,mdrcnt,mprcnt,
04464                         &rdata,&rparam,&rdata_len,&rparam_len);
04465         }
04466 
04467         /* If api_Unsupported returns false we can't return anything. */
04468         if (reply) {
04469                 send_trans_reply(outbuf, rparam, rparam_len, rdata, rdata_len, False);
04470         }
04471 
04472         SAFE_FREE(rdata);
04473         SAFE_FREE(rparam);
04474         return -1;
04475 }


変数

struct current_user current_user

smbrun.c24 行で定義されています。

userdom_struct current_user_info

substitute.c29 行で定義されています。

const char* name

lanman.c4322 行で定義されています。

int id

lanman.c4323 行で定義されています。

参照元 api_SNPHS()asn1_check_OID()canon_ace_entry_for()cli_NetFileGetInfo()decode_id()decode_user()idmap_cache_build_idkey()idmap_cache_build_sidkey()idmap_cache_fill_map()idmap_cache_set()idmap_ldap_sids_to_unixids()idmap_ldap_unixids_to_sids()idmap_pdb_sids_to_unixids()idmap_set_mapping()init_id_info1()init_id_info2()legacy_sid_to_gid()legacy_sid_to_uid()messaging_callback()net_io_id_info1()net_io_id_info2()printer_notify_info()py_gid_to_sid()py_uid_to_sid()send_notify2_changes()vfs_get_ntquota()vfs_set_ntquota()winbindd_getgrent()winbindd_getgrnam().

BOOL(* fn)(connection_struct *, uint16, char *, int, char *, int, int, int, char **, char **, int *, int *)

BOOL auth_user

lanman.c4328 行で定義されています。

参照元 api_reply().

struct { ... } api_commands[] [static]

参照元 api_reply().


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