root/source3/profile/profile.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. set_profile_level
  2. profile_message
  3. reqprofile_message
  4. init_clock_gettime
  5. profile_setup
  6. profile_value_name

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    store smbd profiling information in shared memory
   4    Copyright (C) Andrew Tridgell 1999
   5    Copyright (C) James Peach 2006
   6 
   7    This program is free software; you can redistribute it and/or modify
   8    it under the terms of the GNU General Public License as published by
   9    the Free Software Foundation; either version 3 of the License, or
  10    (at your option) any later version.
  11    
  12    This program is distributed in the hope that it will be useful,
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15    GNU General Public License for more details.
  16    
  17    You should have received a copy of the GNU General Public License
  18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19 
  20 */
  21 
  22 #include "includes.h"
  23 
  24 #ifdef WITH_PROFILE
  25 #define IPC_PERMS ((S_IRUSR | S_IWUSR) | S_IRGRP | S_IROTH)
  26 #endif /* WITH_PROFILE */
  27 
  28 #ifdef WITH_PROFILE
  29 static int shm_id;
  30 static bool read_only;
  31 #if defined(HAVE_CLOCK_GETTIME)
  32 clockid_t __profile_clock;
  33 bool have_profiling_clock = False;
  34 #endif
  35 #endif
  36 
  37 struct profile_header *profile_h;
  38 struct profile_stats *profile_p;
  39 
  40 bool do_profile_flag = False;
  41 bool do_profile_times = False;
  42 
  43 /****************************************************************************
  44 Set a profiling level.
  45 ****************************************************************************/
  46 void set_profile_level(int level, struct server_id src)
     /* [<][>][^][v][top][bottom][index][help] */
  47 {
  48 #ifdef WITH_PROFILE
  49         switch (level) {
  50         case 0:         /* turn off profiling */
  51                 do_profile_flag = False;
  52                 do_profile_times = False;
  53                 DEBUG(1,("INFO: Profiling turned OFF from pid %d\n",
  54                          (int)procid_to_pid(&src)));
  55                 break;
  56         case 1:         /* turn on counter profiling only */
  57                 do_profile_flag = True;
  58                 do_profile_times = False;
  59                 DEBUG(1,("INFO: Profiling counts turned ON from pid %d\n",
  60                          (int)procid_to_pid(&src)));
  61                 break;
  62         case 2:         /* turn on complete profiling */
  63 
  64 #if defined(HAVE_CLOCK_GETTIME)
  65                 if (!have_profiling_clock) {
  66                         do_profile_flag = True;
  67                         do_profile_times = False;
  68                         DEBUG(1,("INFO: Profiling counts turned ON from "
  69                                 "pid %d\n", (int)procid_to_pid(&src)));
  70                         DEBUGADD(1,("INFO: Profiling times disabled "
  71                                 "due to lack of a suitable clock\n"));
  72                         break;
  73                 }
  74 #endif
  75 
  76                 do_profile_flag = True;
  77                 do_profile_times = True;
  78                 DEBUG(1,("INFO: Full profiling turned ON from pid %d\n",
  79                          (int)procid_to_pid(&src)));
  80                 break;
  81         case 3:         /* reset profile values */
  82                 memset((char *)profile_p, 0, sizeof(*profile_p));
  83                 DEBUG(1,("INFO: Profiling values cleared from pid %d\n",
  84                          (int)procid_to_pid(&src)));
  85                 break;
  86         }
  87 #else /* WITH_PROFILE */
  88         DEBUG(1,("INFO: Profiling support unavailable in this build.\n"));
  89 #endif /* WITH_PROFILE */
  90 }
  91 
  92 #ifdef WITH_PROFILE
  93 
  94 /****************************************************************************
  95 receive a set profile level message
  96 ****************************************************************************/
  97 static void profile_message(struct messaging_context *msg_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  98                             void *private_data,
  99                             uint32_t msg_type,
 100                             struct server_id src,
 101                             DATA_BLOB *data)
 102 {
 103         int level;
 104 
 105         if (data->length != sizeof(level)) {
 106                 DEBUG(0, ("got invalid profile message\n"));
 107                 return;
 108         }
 109 
 110         memcpy(&level, data->data, sizeof(level));
 111         set_profile_level(level, src);
 112 }
 113 
 114 /****************************************************************************
 115 receive a request profile level message
 116 ****************************************************************************/
 117 static void reqprofile_message(struct messaging_context *msg_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
 118                                void *private_data, 
 119                                uint32_t msg_type, 
 120                                struct server_id src,
 121                                DATA_BLOB *data)
 122 {
 123         int level;
 124 
 125 #ifdef WITH_PROFILE
 126         level = 1 + (do_profile_flag?2:0) + (do_profile_times?4:0);
 127 #else
 128         level = 0;
 129 #endif
 130         DEBUG(1,("INFO: Received REQ_PROFILELEVEL message from PID %u\n",
 131                  (unsigned int)procid_to_pid(&src)));
 132         messaging_send_buf(msg_ctx, src, MSG_PROFILELEVEL,
 133                            (uint8 *)&level, sizeof(level));
 134 }
 135 
 136 /*******************************************************************
 137   open the profiling shared memory area
 138   ******************************************************************/
 139 
 140 #ifdef HAVE_CLOCK_GETTIME
 141 
 142 /* Find a clock. Just because the definition for a particular clock ID is
 143  * present doesn't mean the system actually supports it.
 144  */
 145 static void init_clock_gettime(void)
     /* [<][>][^][v][top][bottom][index][help] */
 146 {
 147         struct timespec ts;
 148 
 149         have_profiling_clock = False;
 150 
 151 #ifdef HAVE_CLOCK_PROCESS_CPUTIME_ID
 152         /* CLOCK_PROCESS_CPUTIME_ID is sufficiently fast that the
 153          * always profiling times is plausible. Unfortunately on Linux
 154          * it is only accurate if we can guarantee we will not be scheduled
 155          * scheduled onto a different CPU between samples. Until there is
 156          * some way to set processor affinity, we can only use this on
 157          * uniprocessors.
 158          */
 159         if (!this_is_smp()) {
 160             if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {
 161                     DEBUG(10, ("Using CLOCK_PROCESS_CPUTIME_ID "
 162                                 "for profile_clock\n"));
 163                     __profile_clock = CLOCK_PROCESS_CPUTIME_ID;
 164                     have_profiling_clock = True;
 165             }
 166         }
 167 #endif
 168 
 169 #ifdef HAVE_CLOCK_MONOTONIC
 170         if (!have_profiling_clock &&
 171             clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
 172                 DEBUG(10, ("Using CLOCK_MONOTONIC for profile_clock\n"));
 173                 __profile_clock = CLOCK_MONOTONIC;
 174                 have_profiling_clock = True;
 175         }
 176 #endif
 177 
 178 #ifdef HAVE_CLOCK_REALTIME
 179         /* POSIX says that CLOCK_REALTIME should be defined everywhere
 180          * where we have clock_gettime...
 181          */
 182         if (!have_profiling_clock &&
 183             clock_gettime(CLOCK_REALTIME, &ts) == 0) {
 184                 __profile_clock = CLOCK_REALTIME;
 185                 have_profiling_clock = True;
 186 
 187                 SMB_WARN(__profile_clock != CLOCK_REALTIME,
 188                         ("forced to use a slow profiling clock"));
 189         }
 190 
 191 #endif
 192 
 193         SMB_WARN(have_profiling_clock == True,
 194                 ("could not find a working clock for profiling"));
 195         return;
 196 }
 197 #endif
 198 
 199 bool profile_setup(struct messaging_context *msg_ctx, bool rdonly)
     /* [<][>][^][v][top][bottom][index][help] */
 200 {
 201         struct shmid_ds shm_ds;
 202 
 203         read_only = rdonly;
 204 
 205 #ifdef HAVE_CLOCK_GETTIME
 206         init_clock_gettime();
 207 #endif
 208 
 209  again:
 210         /* try to use an existing key */
 211         shm_id = shmget(PROF_SHMEM_KEY, 0, 0);
 212         
 213         /* if that failed then create one. There is a race condition here
 214            if we are running from inetd. Bad luck. */
 215         if (shm_id == -1) {
 216                 if (read_only) return False;
 217                 shm_id = shmget(PROF_SHMEM_KEY, sizeof(*profile_h), 
 218                                 IPC_CREAT | IPC_EXCL | IPC_PERMS);
 219         }
 220         
 221         if (shm_id == -1) {
 222                 DEBUG(0,("Can't create or use IPC area. Error was %s\n", 
 223                          strerror(errno)));
 224                 return False;
 225         }   
 226         
 227         
 228         profile_h = (struct profile_header *)shmat(shm_id, 0, 
 229                                                    read_only?SHM_RDONLY:0);
 230         if ((long)profile_h == -1) {
 231                 DEBUG(0,("Can't attach to IPC area. Error was %s\n", 
 232                          strerror(errno)));
 233                 return False;
 234         }
 235 
 236         /* find out who created this memory area */
 237         if (shmctl(shm_id, IPC_STAT, &shm_ds) != 0) {
 238                 DEBUG(0,("ERROR shmctl : can't IPC_STAT. Error was %s\n", 
 239                          strerror(errno)));
 240                 return False;
 241         }
 242 
 243         if (shm_ds.shm_perm.cuid != sec_initial_uid() ||
 244             shm_ds.shm_perm.cgid != sec_initial_gid()) {
 245                 DEBUG(0,("ERROR: we did not create the shmem "
 246                          "(owned by another user, uid %u, gid %u)\n",
 247                          shm_ds.shm_perm.cuid,
 248                          shm_ds.shm_perm.cgid));
 249                 return False;
 250         }
 251 
 252         if (shm_ds.shm_segsz != sizeof(*profile_h)) {
 253                 DEBUG(0,("WARNING: profile size is %d (expected %d). Deleting\n",
 254                          (int)shm_ds.shm_segsz, (int)sizeof(*profile_h)));
 255                 if (shmctl(shm_id, IPC_RMID, &shm_ds) == 0) {
 256                         goto again;
 257                 } else {
 258                         return False;
 259                 }
 260         }
 261 
 262         if (!read_only && (shm_ds.shm_nattch == 1)) {
 263                 memset((char *)profile_h, 0, sizeof(*profile_h));
 264                 profile_h->prof_shm_magic = PROF_SHM_MAGIC;
 265                 profile_h->prof_shm_version = PROF_SHM_VERSION;
 266                 DEBUG(3,("Initialised profile area\n"));
 267         }
 268 
 269         profile_p = &profile_h->stats;
 270         if (msg_ctx != NULL) {
 271                 messaging_register(msg_ctx, NULL, MSG_PROFILE,
 272                                    profile_message);
 273                 messaging_register(msg_ctx, NULL, MSG_REQ_PROFILELEVEL,
 274                                    reqprofile_message);
 275         }
 276         return True;
 277 }
 278 
 279  const char * profile_value_name(enum profile_stats_values val)
     /* [<][>][^][v][top][bottom][index][help] */
 280 {
 281         static const char * valnames[PR_VALUE_MAX + 1] =
 282         {
 283             "smbd_idle",                /* PR_VALUE_SMBD_IDLE */
 284             "syscall_opendir",          /* PR_VALUE_SYSCALL_OPENDIR */
 285             "syscall_readdir",          /* PR_VALUE_SYSCALL_READDIR */
 286             "syscall_seekdir",          /* PR_VALUE_SYSCALL_SEEKDIR */
 287             "syscall_telldir",          /* PR_VALUE_SYSCALL_TELLDIR */
 288             "syscall_rewinddir",        /* PR_VALUE_SYSCALL_REWINDDIR */
 289             "syscall_mkdir",            /* PR_VALUE_SYSCALL_MKDIR */
 290             "syscall_rmdir",            /* PR_VALUE_SYSCALL_RMDIR */
 291             "syscall_closedir",         /* PR_VALUE_SYSCALL_CLOSEDIR */
 292             "syscall_open",             /* PR_VALUE_SYSCALL_OPEN */
 293             "syscall_createfile",       /* PR_VALUE_SYSCALL_CREATEFILE */
 294             "syscall_close",            /* PR_VALUE_SYSCALL_CLOSE */
 295             "syscall_read",             /* PR_VALUE_SYSCALL_READ */
 296             "syscall_pread",            /* PR_VALUE_SYSCALL_PREAD */
 297             "syscall_write",            /* PR_VALUE_SYSCALL_WRITE */
 298             "syscall_pwrite",           /* PR_VALUE_SYSCALL_PWRITE */
 299             "syscall_lseek",            /* PR_VALUE_SYSCALL_LSEEK */
 300             "syscall_sendfile",         /* PR_VALUE_SYSCALL_SENDFILE */
 301             "syscall_recvfile",         /* PR_VALUE_SYSCALL_RECVFILE */
 302             "syscall_rename",           /* PR_VALUE_SYSCALL_RENAME */
 303             "syscall_rename_at",        /* PR_VALUE_SYSCALL_RENAME_AT */
 304             "syscall_fsync",            /* PR_VALUE_SYSCALL_FSYNC */
 305             "syscall_stat",             /* PR_VALUE_SYSCALL_STAT */
 306             "syscall_fstat",            /* PR_VALUE_SYSCALL_FSTAT */
 307             "syscall_lstat",            /* PR_VALUE_SYSCALL_LSTAT */
 308             "syscall_unlink",           /* PR_VALUE_SYSCALL_UNLINK */
 309             "syscall_chmod",            /* PR_VALUE_SYSCALL_CHMOD */
 310             "syscall_fchmod",           /* PR_VALUE_SYSCALL_FCHMOD */
 311             "syscall_chown",            /* PR_VALUE_SYSCALL_CHOWN */
 312             "syscall_fchown",           /* PR_VALUE_SYSCALL_FCHOWN */
 313             "syscall_chdir",            /* PR_VALUE_SYSCALL_CHDIR */
 314             "syscall_getwd",            /* PR_VALUE_SYSCALL_GETWD */
 315             "syscall_ntimes",           /* PR_VALUE_SYSCALL_NTIMES */
 316             "syscall_ftruncate",        /* PR_VALUE_SYSCALL_FTRUNCATE */
 317             "syscall_fcntl_lock",       /* PR_VALUE_SYSCALL_FCNTL_LOCK */
 318             "syscall_kernel_flock",     /* PR_VALUE_SYSCALL_KERNEL_FLOCK */
 319             "syscall_linux_setlease",   /* PR_VALUE_SYSCALL_LINUX_SETLEASE */
 320             "syscall_fcntl_getlock",    /* PR_VALUE_SYSCALL_FCNTL_GETLOCK */
 321             "syscall_readlink",         /* PR_VALUE_SYSCALL_READLINK */
 322             "syscall_symlink",          /* PR_VALUE_SYSCALL_SYMLINK */
 323             "syscall_link",             /* PR_VALUE_SYSCALL_LINK */
 324             "syscall_mknod",            /* PR_VALUE_SYSCALL_MKNOD */
 325             "syscall_realpath",         /* PR_VALUE_SYSCALL_REALPATH */
 326             "syscall_get_quota",        /* PR_VALUE_SYSCALL_GET_QUOTA */
 327             "syscall_set_quota",        /* PR_VALUE_SYSCALL_SET_QUOTA */
 328             "syscall_get_sd",           /* PR_VALUE_SYSCALL_GET_SD */
 329             "syscall_set_sd",           /* PR_VALUE_SYSCALL_SET_SD */
 330             "syscall_brl_lock",         /* PR_VALUE_SYSCALL_BRL_LOCK */
 331             "syscall_brl_unlock",       /* PR_VALUE_SYSCALL_BRL_UNLOCK */
 332             "syscall_brl_cancel",       /* PR_VALUE_SYSCALL_BRL_CANCEL */
 333             "SMBmkdir",         /* PR_VALUE_SMBMKDIR */
 334             "SMBrmdir",         /* PR_VALUE_SMBRMDIR */
 335             "SMBopen",          /* PR_VALUE_SMBOPEN */
 336             "SMBcreate",        /* PR_VALUE_SMBCREATE */
 337             "SMBclose",         /* PR_VALUE_SMBCLOSE */
 338             "SMBflush",         /* PR_VALUE_SMBFLUSH */
 339             "SMBunlink",        /* PR_VALUE_SMBUNLINK */
 340             "SMBmv",            /* PR_VALUE_SMBMV */
 341             "SMBgetatr",        /* PR_VALUE_SMBGETATR */
 342             "SMBsetatr",        /* PR_VALUE_SMBSETATR */
 343             "SMBread",          /* PR_VALUE_SMBREAD */
 344             "SMBwrite",         /* PR_VALUE_SMBWRITE */
 345             "SMBlock",          /* PR_VALUE_SMBLOCK */
 346             "SMBunlock",        /* PR_VALUE_SMBUNLOCK */
 347             "SMBctemp",         /* PR_VALUE_SMBCTEMP */
 348             "SMBmknew",         /* PR_VALUE_SMBMKNEW */
 349             "SMBcheckpath",     /* PR_VALUE_SMBCHECKPATH */
 350             "SMBexit",          /* PR_VALUE_SMBEXIT */
 351             "SMBlseek",         /* PR_VALUE_SMBLSEEK */
 352             "SMBlockread",              /* PR_VALUE_SMBLOCKREAD */
 353             "SMBwriteunlock",           /* PR_VALUE_SMBWRITEUNLOCK */
 354             "SMBreadbraw",              /* PR_VALUE_SMBREADBRAW */
 355             "SMBreadBmpx",              /* PR_VALUE_SMBREADBMPX */
 356             "SMBreadBs",                /* PR_VALUE_SMBREADBS */
 357             "SMBwritebraw",             /* PR_VALUE_SMBWRITEBRAW */
 358             "SMBwriteBmpx",             /* PR_VALUE_SMBWRITEBMPX */
 359             "SMBwriteBs",               /* PR_VALUE_SMBWRITEBS */
 360             "SMBwritec",                /* PR_VALUE_SMBWRITEC */
 361             "SMBsetattrE",              /* PR_VALUE_SMBSETATTRE */
 362             "SMBgetattrE",              /* PR_VALUE_SMBGETATTRE */
 363             "SMBlockingX",              /* PR_VALUE_SMBLOCKINGX */
 364             "SMBtrans",         /* PR_VALUE_SMBTRANS */
 365             "SMBtranss",        /* PR_VALUE_SMBTRANSS */
 366             "SMBioctl",         /* PR_VALUE_SMBIOCTL */
 367             "SMBioctls",        /* PR_VALUE_SMBIOCTLS */
 368             "SMBcopy",          /* PR_VALUE_SMBCOPY */
 369             "SMBmove",          /* PR_VALUE_SMBMOVE */
 370             "SMBecho",          /* PR_VALUE_SMBECHO */
 371             "SMBwriteclose",    /* PR_VALUE_SMBWRITECLOSE */
 372             "SMBopenX",         /* PR_VALUE_SMBOPENX */
 373             "SMBreadX",         /* PR_VALUE_SMBREADX */
 374             "SMBwriteX",        /* PR_VALUE_SMBWRITEX */
 375             "SMBtrans2",        /* PR_VALUE_SMBTRANS2 */
 376             "SMBtranss2",       /* PR_VALUE_SMBTRANSS2 */
 377             "SMBfindclose",     /* PR_VALUE_SMBFINDCLOSE */
 378             "SMBfindnclose",    /* PR_VALUE_SMBFINDNCLOSE */
 379             "SMBtcon",          /* PR_VALUE_SMBTCON */
 380             "SMBtdis",          /* PR_VALUE_SMBTDIS */
 381             "SMBnegprot",       /* PR_VALUE_SMBNEGPROT */
 382             "SMBsesssetupX",    /* PR_VALUE_SMBSESSSETUPX */
 383             "SMBulogoffX",      /* PR_VALUE_SMBULOGOFFX */
 384             "SMBtconX",         /* PR_VALUE_SMBTCONX */
 385             "SMBdskattr",               /* PR_VALUE_SMBDSKATTR */
 386             "SMBsearch",                /* PR_VALUE_SMBSEARCH */
 387             "SMBffirst",                /* PR_VALUE_SMBFFIRST */
 388             "SMBfunique",               /* PR_VALUE_SMBFUNIQUE */
 389             "SMBfclose",                /* PR_VALUE_SMBFCLOSE */
 390             "SMBnttrans",               /* PR_VALUE_SMBNTTRANS */
 391             "SMBnttranss",              /* PR_VALUE_SMBNTTRANSS */
 392             "SMBntcreateX",             /* PR_VALUE_SMBNTCREATEX */
 393             "SMBntcancel",              /* PR_VALUE_SMBNTCANCEL */
 394             "SMBntrename",              /* PR_VALUE_SMBNTRENAME */
 395             "SMBsplopen",               /* PR_VALUE_SMBSPLOPEN */
 396             "SMBsplwr",                 /* PR_VALUE_SMBSPLWR */
 397             "SMBsplclose",              /* PR_VALUE_SMBSPLCLOSE */
 398             "SMBsplretq",               /* PR_VALUE_SMBSPLRETQ */
 399             "SMBsends",                 /* PR_VALUE_SMBSENDS */
 400             "SMBsendb",                 /* PR_VALUE_SMBSENDB */
 401             "SMBfwdname",               /* PR_VALUE_SMBFWDNAME */
 402             "SMBcancelf",               /* PR_VALUE_SMBCANCELF */
 403             "SMBgetmac",                /* PR_VALUE_SMBGETMAC */
 404             "SMBsendstrt",              /* PR_VALUE_SMBSENDSTRT */
 405             "SMBsendend",               /* PR_VALUE_SMBSENDEND */
 406             "SMBsendtxt",               /* PR_VALUE_SMBSENDTXT */
 407             "SMBinvalid",               /* PR_VALUE_SMBINVALID */
 408             "pathworks_setdir",         /* PR_VALUE_PATHWORKS_SETDIR */
 409             "Trans2_open",              /* PR_VALUE_TRANS2_OPEN */
 410             "Trans2_findfirst",         /* PR_VALUE_TRANS2_FINDFIRST */
 411             "Trans2_findnext",          /* PR_VALUE_TRANS2_FINDNEXT */
 412             "Trans2_qfsinfo",           /* PR_VALUE_TRANS2_QFSINFO */
 413             "Trans2_setfsinfo",         /* PR_VALUE_TRANS2_SETFSINFO */
 414             "Trans2_qpathinfo",         /* PR_VALUE_TRANS2_QPATHINFO */
 415             "Trans2_setpathinfo",       /* PR_VALUE_TRANS2_SETPATHINFO */
 416             "Trans2_qfileinfo",         /* PR_VALUE_TRANS2_QFILEINFO */
 417             "Trans2_setfileinfo",       /* PR_VALUE_TRANS2_SETFILEINFO */
 418             "Trans2_fsctl",             /* PR_VALUE_TRANS2_FSCTL */
 419             "Trans2_ioctl",             /* PR_VALUE_TRANS2_IOCTL */
 420             "Trans2_findnotifyfirst",   /* PR_VALUE_TRANS2_FINDNOTIFYFIRST */
 421             "Trans2_findnotifynext",    /* PR_VALUE_TRANS2_FINDNOTIFYNEXT */
 422             "Trans2_mkdir",             /* PR_VALUE_TRANS2_MKDIR */
 423             "Trans2_session_setup",     /* PR_VALUE_TRANS2_SESSION_SETUP */
 424             "Trans2_get_dfs_referral",  /* PR_VALUE_TRANS2_GET_DFS_REFERRAL */
 425             "Trans2_report_dfs_inconsistancy",  /* PR_VALUE_TRANS2_REPORT_DFS_INCONSISTANCY */
 426             "NT_transact_create",       /* PR_VALUE_NT_TRANSACT_CREATE */
 427             "NT_transact_ioctl",        /* PR_VALUE_NT_TRANSACT_IOCTL */
 428             "NT_transact_set_security_desc",    /* PR_VALUE_NT_TRANSACT_SET_SECURITY_DESC */
 429             "NT_transact_notify_change",/* PR_VALUE_NT_TRANSACT_NOTIFY_CHANGE */
 430             "NT_transact_rename",       /* PR_VALUE_NT_TRANSACT_RENAME */
 431             "NT_transact_query_security_desc",  /* PR_VALUE_NT_TRANSACT_QUERY_SECURITY_DESC */
 432             "NT_transact_get_user_quota",/* PR_VALUE_NT_TRANSACT_GET_USER_QUOTA */
 433             "NT_transact_set_user_quota",/* PR_VALUE_NT_TRANSACT_SET_USER_QUOTA */
 434             "get_nt_acl",               /* PR_VALUE_GET_NT_ACL */
 435             "fget_nt_acl",              /* PR_VALUE_FGET_NT_ACL */
 436             "fset_nt_acl",              /* PR_VALUE_FSET_NT_ACL */
 437             "chmod_acl",                /* PR_VALUE_CHMOD_ACL */
 438             "fchmod_acl",               /* PR_VALUE_FCHMOD_ACL */
 439             "name_release",             /* PR_VALUE_NAME_RELEASE */
 440             "name_refresh",             /* PR_VALUE_NAME_REFRESH */
 441             "name_registration",        /* PR_VALUE_NAME_REGISTRATION */
 442             "node_status",              /* PR_VALUE_NODE_STATUS */
 443             "name_query",               /* PR_VALUE_NAME_QUERY */
 444             "host_announce",            /* PR_VALUE_HOST_ANNOUNCE */
 445             "workgroup_announce",       /* PR_VALUE_WORKGROUP_ANNOUNCE */
 446             "local_master_announce",    /* PR_VALUE_LOCAL_MASTER_ANNOUNCE */
 447             "master_browser_announce",  /* PR_VALUE_MASTER_BROWSER_ANNOUNCE */
 448             "lm_host_announce",         /* PR_VALUE_LM_HOST_ANNOUNCE */
 449             "get_backup_list",          /* PR_VALUE_GET_BACKUP_LIST */
 450             "reset_browser",            /* PR_VALUE_RESET_BROWSER */
 451             "announce_request",         /* PR_VALUE_ANNOUNCE_REQUEST */
 452             "lm_announce_request",      /* PR_VALUE_LM_ANNOUNCE_REQUEST */
 453             "domain_logon",             /* PR_VALUE_DOMAIN_LOGON */
 454             "sync_browse_lists",        /* PR_VALUE_SYNC_BROWSE_LISTS */
 455             "run_elections",            /* PR_VALUE_RUN_ELECTIONS */
 456             "election",                 /* PR_VALUE_ELECTION */
 457             "" /* PR_VALUE_MAX */
 458         };
 459 
 460         SMB_ASSERT(val >= 0);
 461         SMB_ASSERT(val < PR_VALUE_MAX);
 462         return valnames[val];
 463 }
 464 
 465 #endif /* WITH_PROFILE */

/* [<][>][^][v][top][bottom][index][help] */