torture/torture.c

ソースコードを見る。

データ構造

struct  trunc_open_results

関数

static double create_procs (BOOL(*fn)(int), BOOL *result)
void start_timer (void)
double end_timer (void)
void * shm_setup (int size)
static struct cli_stateopen_nbt_connection (void)
static char * terminate_path_at_separator (char *path)
BOOL smbcli_parse_unc (const char *unc_name, TALLOC_CTX *mem_ctx, char **hostname, char **sharename)
static BOOL torture_open_connection_share (struct cli_state **c, const char *hostname, const char *sharename)
void torture_open_connection_free_unclist (char **unc_list)
BOOL torture_open_connection (struct cli_state **c, int conn_index)
BOOL torture_cli_session_setup2 (struct cli_state *cli, uint16 *new_vuid)
BOOL torture_close_connection (struct cli_state *c)
static BOOL check_error (int line, struct cli_state *c, uint8 eclass, uint32 ecode, NTSTATUS nterr)
static BOOL wait_lock (struct cli_state *c, int fnum, uint32 offset, uint32 len)
static BOOL rw_torture (struct cli_state *c)
static BOOL run_torture (int dummy)
static BOOL rw_torture3 (struct cli_state *c, char *lockfname)
static BOOL rw_torture2 (struct cli_state *c1, struct cli_state *c2)
static BOOL run_readwritetest (int dummy)
static BOOL run_readwritemulti (int dummy)
static BOOL run_readwritelarge (int dummy)
static BOOL run_netbench (int client)
static BOOL run_nbench (int dummy)
static BOOL run_locktest1 (int dummy)
static BOOL run_tcon_test (int dummy)
static BOOL run_tcon2_test (int dummy)
static BOOL tcon_devtest (struct cli_state *cli, const char *myshare, const char *devtype, const char *return_devtype, NTSTATUS expected_error)
static BOOL run_tcon_devtype_test (int dummy)
static BOOL run_locktest2 (int dummy)
static BOOL run_locktest3 (int dummy)
static BOOL run_locktest4 (int dummy)
static BOOL run_locktest5 (int dummy)
static BOOL run_locktest6 (int dummy)
static BOOL run_locktest7 (int dummy)
static BOOL run_fdpasstest (int dummy)
static BOOL run_fdsesstest (int dummy)
static BOOL run_unlinktest (int dummy)
static BOOL run_maxfidtest (int dummy)
static void rand_buf (char *buf, int len)
static BOOL run_negprot_nowait (int dummy)
static BOOL run_randomipc (int dummy)
static void browse_callback (const char *sname, uint32 stype, const char *comment, void *state)
static BOOL run_browsetest (int dummy)
static BOOL run_attrtest (int dummy)
static BOOL run_trans2test (int dummy)
static BOOL new_trans (struct cli_state *pcli, int fnum, int level)
static BOOL run_w2ktest (int dummy)
static BOOL run_oplock1 (int dummy)
static BOOL run_oplock2 (int dummy)
static BOOL oplock3_handler (struct cli_state *cli, int fnum, unsigned char level)
static BOOL run_oplock3 (int dummy)
static BOOL run_deletetest (int dummy)
static BOOL run_properties (int dummy)
static BOOL run_xcopy (int dummy)
static BOOL run_rename (int dummy)
static BOOL run_pipe_number (int dummy)
static BOOL run_opentest (int dummy)
static BOOL run_openattrtest (int dummy)
static void list_fn (const char *mnt, file_info *finfo, const char *name, void *state)
static BOOL run_dirtest (int dummy)
static void del_fn (const char *mnt, file_info *finfo, const char *mask, void *state)
BOOL torture_ioctl_test (int dummy)
BOOL torture_chkpath_test (int dummy)
static BOOL run_eatest (int dummy)
static BOOL run_dirtest1 (int dummy)
static BOOL run_error_map_extract (int dummy)
static BOOL run_sesssetup_bench (int dummy)
static BOOL run_local_substitute (int dummy)
static BOOL run_local_gencache (int dummy)
static BOOL run_test (const char *name)
static void usage (void)
int main (int argc, char *argv[])

変数

char * optarg
int optind
static fstring host
static fstring workgroup
static fstring share
static fstring password
static fstring username
static fstring myname
static int max_protocol = PROTOCOL_NT1
static const char * sockops = "TCP_NODELAY"
static int nprocs = 1
static int port_to_use = 0
int torture_numops = 100
static int procnum
static struct cli_statecurrent_cli
static fstring randomfname
static BOOL use_oplocks
static BOOL use_level_II_oplocks
static const char * client_txt = "client_oplocks.txt"
static BOOL use_kerberos
static fstring multishare_conn_fname
static BOOL use_multishare_conn = False
BOOL torture_showall = False
static struct timeval tp1 tp2
int line_count = 0
int nbio_id
static uint32 open_attrs_table []
static struct trunc_open_results attr_results []
struct {
   const char *   name
   BOOL(*   fn )(int)
   unsigned   flags
torture_ops []


関数

static double create_procs ( BOOL(*)(int)  fn,
BOOL result 
) [static]

torture.c4920 行で定義されています。

参照先 current_cliend_timer()errnofnmynamemypidnprocsprintf()procnumshm_setup()smb_msleep()start_timer()statussys_srandom()torture_open_connection().

04921 {
04922         int i, status;
04923         volatile pid_t *child_status;
04924         volatile BOOL *child_status_out;
04925         int synccount;
04926         int tries = 8;
04927 
04928         synccount = 0;
04929 
04930         child_status = (volatile pid_t *)shm_setup(sizeof(pid_t)*nprocs);
04931         if (!child_status) {
04932                 printf("Failed to setup shared memory\n");
04933                 return -1;
04934         }
04935 
04936         child_status_out = (volatile BOOL *)shm_setup(sizeof(BOOL)*nprocs);
04937         if (!child_status_out) {
04938                 printf("Failed to setup result status shared memory\n");
04939                 return -1;
04940         }
04941 
04942         for (i = 0; i < nprocs; i++) {
04943                 child_status[i] = 0;
04944                 child_status_out[i] = True;
04945         }
04946 
04947         start_timer();
04948 
04949         for (i=0;i<nprocs;i++) {
04950                 procnum = i;
04951                 if (fork() == 0) {
04952                         pid_t mypid = getpid();
04953                         sys_srandom(((int)mypid) ^ ((int)time(NULL)));
04954 
04955                         slprintf(myname,sizeof(myname),"CLIENT%d", i);
04956 
04957                         while (1) {
04958                                 if (torture_open_connection(&current_cli, i)) break;
04959                                 if (tries-- == 0) {
04960                                         printf("pid %d failed to start\n", (int)getpid());
04961                                         _exit(1);
04962                                 }
04963                                 smb_msleep(10); 
04964                         }
04965 
04966                         child_status[i] = getpid();
04967 
04968                         while (child_status[i] && end_timer() < 5) smb_msleep(2);
04969 
04970                         child_status_out[i] = fn(i);
04971                         _exit(0);
04972                 }
04973         }
04974 
04975         do {
04976                 synccount = 0;
04977                 for (i=0;i<nprocs;i++) {
04978                         if (child_status[i]) synccount++;
04979                 }
04980                 if (synccount == nprocs) break;
04981                 smb_msleep(10);
04982         } while (end_timer() < 30);
04983 
04984         if (synccount != nprocs) {
04985                 printf("FAILED TO START %d CLIENTS (started %d)\n", nprocs, synccount);
04986                 *result = False;
04987                 return end_timer();
04988         }
04989 
04990         /* start the client load */
04991         start_timer();
04992 
04993         for (i=0;i<nprocs;i++) {
04994                 child_status[i] = 0;
04995         }
04996 
04997         printf("%d clients started\n", nprocs);
04998 
04999         for (i=0;i<nprocs;i++) {
05000                 while (waitpid(0, &status, 0) == -1 && errno == EINTR) /* noop */ ;
05001         }
05002 
05003         printf("\n");
05004         
05005         for (i=0;i<nprocs;i++) {
05006                 if (!child_status_out[i]) {
05007                         *result = False;
05008                 }
05009         }
05010         return end_timer();
05011 }

void start_timer ( void   ) 

torture.c50 行で定義されています。

参照先 GetTimeOfDay().

参照元 create_procs()nb_setup()run_test().

00051 {
00052         GetTimeOfDay(&tp1);
00053 }

double end_timer ( void   ) 

torture.c55 行で定義されています。

参照先 GetTimeOfDay().

参照元 create_procs()nb_alarm()run_dirtest()run_test().

00056 {
00057         GetTimeOfDay(&tp2);
00058         return((tp2.tv_sec - tp1.tv_sec) + 
00059                (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
00060 }

void* shm_setup ( int  size  ) 

torture.c72 行で定義されています。

参照先 printf().

参照元 create_procs()nbio_shmem()run_oplock2()run_oplock3().

00073 {
00074         int shmid;
00075         void *ret;
00076 
00077         shmid = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
00078         if (shmid == -1) {
00079                 printf("can't get shared memory\n");
00080                 exit(1);
00081         }
00082         ret = (void *)shmat(shmid, 0, 0);
00083         if (!ret || ret == (void *)-1) {
00084                 printf("can't attach to shared memory\n");
00085                 return NULL;
00086         }
00087         /* the following releases the ipc, but note that this process
00088            and all its children will still have access to the memory, its
00089            just that the shmid is no longer valid for other shm calls. This
00090            means we don't leave behind lots of shm segments after we exit 
00091 
00092            See Stevens "advanced programming in unix env" for details
00093            */
00094         shmctl(shmid, IPC_RMID, 0);
00095         
00096         return ret;
00097 }

static struct cli_state* open_nbt_connection ( void   )  [static]

torture.c100 行で定義されています。

参照先 ccli_state::calledcli_state::callingcli_connect()cli_initialise()cli_session_request()cli_shutdown()hostmake_nmb_name()mynament_errstr()cli_state::portport_to_useprintf()statuscli_state::timeoutuse_kerberoscli_state::use_kerberoscli_state::use_level_II_oplocksuse_level_II_oplockscli_state::use_oplocksuse_oplockszero_ip().

参照元 run_error_map_extract()run_negprot_nowait()run_sesssetup_bench().

00101 {
00102         struct nmb_name called, calling;
00103         struct in_addr ip;
00104         struct cli_state *c;
00105         NTSTATUS status;
00106 
00107         make_nmb_name(&calling, myname, 0x0);
00108         make_nmb_name(&called , host, 0x20);
00109 
00110         zero_ip(&ip);
00111 
00112         if (!(c = cli_initialise())) {
00113                 printf("Failed initialize cli_struct to connect with %s\n", host);
00114                 return NULL;
00115         }
00116 
00117         c->port = port_to_use;
00118 
00119         status = cli_connect(c, host, &ip);
00120         if (!NT_STATUS_IS_OK(status)) {
00121                 printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
00122                 return NULL;
00123         }
00124 
00125         c->use_kerberos = use_kerberos;
00126 
00127         c->timeout = 120000; /* set a really long timeout (2 minutes) */
00128         if (use_oplocks) c->use_oplocks = True;
00129         if (use_level_II_oplocks) c->use_level_II_oplocks = True;
00130 
00131         if (!cli_session_request(c, &calling, &called)) {
00132                 /*
00133                  * Well, that failed, try *SMBSERVER ... 
00134                  * However, we must reconnect as well ...
00135                  */
00136                 status = cli_connect(c, host, &ip);
00137                 if (!NT_STATUS_IS_OK(status)) {
00138                         printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
00139                         return NULL;
00140                 }
00141 
00142                 make_nmb_name(&called, "*SMBSERVER", 0x20);
00143                 if (!cli_session_request(c, &calling, &called)) {
00144                         printf("%s rejected the session\n",host);
00145                         printf("We tried with a called name of %s & %s\n",
00146                                 host, "*SMBSERVER");
00147                         cli_shutdown(c);
00148                         return NULL;
00149                 }
00150         }
00151 
00152         return c;
00153 }

static char* terminate_path_at_separator ( char *  path  )  [static]

torture.c159 行で定義されています。

参照先 strchr_m().

参照元 smbcli_parse_unc().

00160 {
00161         char * p;
00162 
00163         if (!path) {
00164                 return NULL;
00165         }
00166 
00167         if ((p = strchr_m(path, '/'))) {
00168                 *p = '\0';
00169                 return p + 1;
00170         }
00171 
00172         if ((p = strchr_m(path, '\\'))) {
00173                 *p = '\0';
00174                 return p + 1;
00175         }
00176         
00177         /* No separator. */
00178         return NULL;
00179 }

BOOL smbcli_parse_unc ( const char *  unc_name,
TALLOC_CTX mem_ctx,
char **  hostname,
char **  sharename 
)

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

参照先 talloc_strdup()terminate_path_at_separator().

参照元 torture_open_connection().

00186 {
00187         char *p;
00188 
00189         *hostname = *sharename = NULL;
00190 
00191         if (strncmp(unc_name, "\\\\", 2) &&
00192             strncmp(unc_name, "//", 2)) {
00193                 return False;
00194         }
00195 
00196         *hostname = talloc_strdup(mem_ctx, &unc_name[2]);
00197         p = terminate_path_at_separator(*hostname);
00198 
00199         if (p && *p) {
00200                 *sharename = talloc_strdup(mem_ctx, p);
00201                 terminate_path_at_separator(*sharename);
00202         }
00203 
00204         if (*hostname && *sharename) {
00205                 return True;
00206         }
00207 
00208         TALLOC_FREE(*hostname);
00209         TALLOC_FREE(*sharename);
00210         return False;
00211 }

static BOOL torture_open_connection_share ( struct cli_state **  c,
const char *  hostname,
const char *  sharename 
) [static]

torture.c213 行で定義されています。

参照先 ccli_full_connection()flagsmynament_errstr()passwordport_to_useprintf()statususe_kerberosuse_level_II_oplocksuse_oplocksusernameworkgroup.

参照元 torture_open_connection().

00216 {
00217         BOOL retry;
00218         int flags = 0;
00219         NTSTATUS status;
00220 
00221         if (use_kerberos)
00222                 flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
00223 
00224         status = cli_full_connection(c, myname,
00225                                      hostname, NULL, port_to_use, 
00226                                      sharename, "?????", 
00227                                      username, workgroup, 
00228                                      password, flags, Undefined, &retry);
00229         if (!NT_STATUS_IS_OK(status)) {
00230                 printf("failed to open share connection: //%s/%s port:%d - %s\n",
00231                         hostname, sharename, port_to_use, nt_errstr(status));
00232                 return False;
00233         }
00234 
00235         if (use_oplocks) (*c)->use_oplocks = True;
00236         if (use_level_II_oplocks) (*c)->use_level_II_oplocks = True;
00237         (*c)->timeout = 120000; /* set a really long timeout (2 minutes) */
00238 
00239         return True;
00240 }

void torture_open_connection_free_unclist ( char **  unc_list  ) 

torture.c242 行で定義されています。

参照元 torture_open_connection().

00243 {
00244         if (unc_list!=NULL)
00245         {
00246                 SAFE_FREE(unc_list[0]);
00247                 SAFE_FREE(unc_list);
00248         }
00249 }

BOOL torture_open_connection ( struct cli_state **  c,
int  conn_index 
)

torture.c251 行で定義されています。

参照先 cfile_lines_load()hostmultishare_conn_fnameprintf()resultsharesmbcli_parse_unc()torture_open_connection_free_unclist()torture_open_connection_share()use_multishare_conn.

参照元 create_procs()run_attrtest()run_browsetest()run_deletetest()run_dirtest()run_dirtest1()run_eatest()run_fdpasstest()run_fdsesstest()run_locktest1()run_locktest2()run_locktest3()run_locktest4()run_locktest5()run_locktest6()run_locktest7()run_openattrtest()run_opentest()run_oplock1()run_oplock2()run_oplock3()run_pipe_number()run_properties()run_randomipc()run_readwritelarge()run_readwritetest()run_rename()run_tcon2_test()run_tcon_test()run_trans2test()run_unlinktest()run_w2ktest()run_xcopy()torture_casetable()torture_chkpath_test()torture_denytest1()torture_denytest2()torture_ioctl_test()torture_mangle()torture_nttrans_scan()torture_trans2_scan()torture_utable().

00252 {
00253         char **unc_list = NULL;
00254         int num_unc_names = 0;
00255         BOOL result;
00256 
00257         if (use_multishare_conn==True) {
00258                 char *h, *s;
00259                 unc_list = file_lines_load(multishare_conn_fname, &num_unc_names, 0);
00260                 if (!unc_list || num_unc_names <= 0) {
00261                         printf("Failed to load unc names list from '%s'\n", multishare_conn_fname);
00262                         exit(1);
00263                 }
00264 
00265                 if (!smbcli_parse_unc(unc_list[conn_index % num_unc_names],
00266                                       NULL, &h, &s)) {
00267                         printf("Failed to parse UNC name %s\n",
00268                                unc_list[conn_index % num_unc_names]);
00269                         torture_open_connection_free_unclist(unc_list);
00270                         exit(1);
00271                 }
00272 
00273                 result = torture_open_connection_share(c, h, s);
00274 
00275                 /* h, s were copied earlier */
00276                 torture_open_connection_free_unclist(unc_list);
00277                 return result;
00278         }
00279 
00280         return torture_open_connection_share(c, host, share);
00281 }

BOOL torture_cli_session_setup2 ( struct cli_state cli,
uint16 *  new_vuid 
)

torture.c283 行で定義されています。

参照先 clicli_session_setup()passwordcli_state::user_nameusernamecli_state::vuidworkgroup.

参照元 run_fdsesstest().

00284 {
00285         uint16 old_vuid = cli->vuid;
00286         fstring old_user_name;
00287         size_t passlen = strlen(password);
00288         BOOL ret;
00289 
00290         fstrcpy(old_user_name, cli->user_name);
00291         cli->vuid = 0;
00292         ret = NT_STATUS_IS_OK(cli_session_setup(cli, username,
00293                                                 password, passlen,
00294                                                 password, passlen,
00295                                                 workgroup));
00296         *new_vuid = cli->vuid;
00297         cli->vuid = old_vuid;
00298         fstrcpy(cli->user_name, old_user_name);
00299         return ret;
00300 }

BOOL torture_close_connection ( struct cli_state c  ) 

torture.c303 行で定義されています。

参照先 ccli_errstr()cli_shutdown()cli_tdis()printf().

参照元 run_attrtest()run_browsetest()run_deletetest()run_dirtest()run_dirtest1()run_eatest()run_fdpasstest()run_fdsesstest()run_locktest1()run_locktest2()run_locktest3()run_locktest4()run_locktest5()run_locktest6()run_locktest7()run_maxfidtest()run_negprot_nowait()run_netbench()run_openattrtest()run_opentest()run_oplock1()run_oplock2()run_pipe_number()run_properties()run_randomipc()run_readwritelarge()run_readwritemulti()run_readwritetest()run_rename()run_tcon2_test()run_tcon_test()run_torture()run_trans2test()run_unlinktest()run_w2ktest()run_xcopy()torture_chkpath_test()torture_denytest1()torture_denytest2()torture_ioctl_test()torture_mangle()torture_nttrans_scan()torture_trans2_scan().

00304 {
00305         BOOL ret = True;
00306         if (!cli_tdis(c)) {
00307                 printf("tdis failed (%s)\n", cli_errstr(c));
00308                 ret = False;
00309         }
00310 
00311         cli_shutdown(c);
00312 
00313         return ret;
00314 }

static BOOL check_error ( int  line,
struct cli_state c,
uint8  eclass,
uint32  ecode,
NTSTATUS  nterr 
) [static]

torture.c318 行で定義されています。

参照先 ccli_dos_error()cli_is_dos_error()cli_nt_error()nt_errstr()printf()status.

参照元 run_locktest1()run_locktest2()run_opentest()run_unlinktest()torture_chkpath_test()wait_lock().

00320 {
00321         if (cli_is_dos_error(c)) {
00322                 uint8 cclass;
00323                 uint32 num;
00324 
00325                 /* Check DOS error */
00326 
00327                 cli_dos_error(c, &cclass, &num);
00328 
00329                 if (eclass != cclass || ecode != num) {
00330                         printf("unexpected error code class=%d code=%d\n", 
00331                                (int)cclass, (int)num);
00332                         printf(" expected %d/%d %s (line=%d)\n", 
00333                                (int)eclass, (int)ecode, nt_errstr(nterr), line);
00334                         return False;
00335                 }
00336 
00337         } else {
00338                 NTSTATUS status;
00339 
00340                 /* Check NT error */
00341 
00342                 status = cli_nt_error(c);
00343 
00344                 if (NT_STATUS_V(nterr) != NT_STATUS_V(status)) {
00345                         printf("unexpected error code %s\n", nt_errstr(status));
00346                         printf(" expected %s (line=%d)\n", nt_errstr(nterr), line);
00347                         return False;
00348                 }
00349         }
00350 
00351         return True;
00352 }

static BOOL wait_lock ( struct cli_state c,
int  fnum,
uint32  offset,
uint32  len 
) [static]

torture.c355 行で定義されています。

参照先 ccheck_error()cli_lock()WRITE_LOCK.

参照元 rw_torture().

00356 {
00357         while (!cli_lock(c, fnum, offset, len, -1, WRITE_LOCK)) {
00358                 if (!check_error(__LINE__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
00359         }
00360         return True;
00361 }

static BOOL rw_torture ( struct cli_state c  )  [static]

torture.c364 行で定義されています。

参照先 bufccli_close()cli_errstr()cli_open()cli_read()cli_unlink()cli_unlock()cli_write()cli_state::pidprintf()sys_random()torture_numopswait_lock().

参照元 run_torture().

00365 {
00366         const char *lockfname = "\\torture.lck";
00367         fstring fname;
00368         int fnum;
00369         int fnum2;
00370         pid_t pid2, pid = getpid();
00371         int i, j;
00372         char buf[1024];
00373         BOOL correct = True;
00374 
00375         memset(buf, '\0', sizeof(buf));
00376 
00377         fnum2 = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL, 
00378                          DENY_NONE);
00379         if (fnum2 == -1)
00380                 fnum2 = cli_open(c, lockfname, O_RDWR, DENY_NONE);
00381         if (fnum2 == -1) {
00382                 printf("open of %s failed (%s)\n", lockfname, cli_errstr(c));
00383                 return False;
00384         }
00385 
00386 
00387         for (i=0;i<torture_numops;i++) {
00388                 unsigned n = (unsigned)sys_random()%10;
00389                 if (i % 10 == 0) {
00390                         printf("%d\r", i); fflush(stdout);
00391                 }
00392                 slprintf(fname, sizeof(fstring) - 1, "\\torture.%u", n);
00393 
00394                 if (!wait_lock(c, fnum2, n*sizeof(int), sizeof(int))) {
00395                         return False;
00396                 }
00397 
00398                 fnum = cli_open(c, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL);
00399                 if (fnum == -1) {
00400                         printf("open failed (%s)\n", cli_errstr(c));
00401                         correct = False;
00402                         break;
00403                 }
00404 
00405                 if (cli_write(c, fnum, 0, (char *)&pid, 0, sizeof(pid)) != sizeof(pid)) {
00406                         printf("write failed (%s)\n", cli_errstr(c));
00407                         correct = False;
00408                 }
00409 
00410                 for (j=0;j<50;j++) {
00411                         if (cli_write(c, fnum, 0, (char *)buf, 
00412                                       sizeof(pid)+(j*sizeof(buf)), 
00413                                       sizeof(buf)) != sizeof(buf)) {
00414                                 printf("write failed (%s)\n", cli_errstr(c));
00415                                 correct = False;
00416                         }
00417                 }
00418 
00419                 pid2 = 0;
00420 
00421                 if (cli_read(c, fnum, (char *)&pid2, 0, sizeof(pid)) != sizeof(pid)) {
00422                         printf("read failed (%s)\n", cli_errstr(c));
00423                         correct = False;
00424                 }
00425 
00426                 if (pid2 != pid) {
00427                         printf("data corruption!\n");
00428                         correct = False;
00429                 }
00430 
00431                 if (!cli_close(c, fnum)) {
00432                         printf("close failed (%s)\n", cli_errstr(c));
00433                         correct = False;
00434                 }
00435 
00436                 if (!cli_unlink(c, fname)) {
00437                         printf("unlink failed (%s)\n", cli_errstr(c));
00438                         correct = False;
00439                 }
00440 
00441                 if (!cli_unlock(c, fnum2, n*sizeof(int), sizeof(int))) {
00442                         printf("unlock failed (%s)\n", cli_errstr(c));
00443                         correct = False;
00444                 }
00445         }
00446 
00447         cli_close(c, fnum2);
00448         cli_unlink(c, lockfname);
00449 
00450         printf("%d\n", i);
00451 
00452         return correct;
00453 }

static BOOL run_torture ( int  dummy  )  [static]

torture.c455 行で定義されています。

参照先 clicli_sockopt()current_clirw_torture()sockopstorture_close_connection().

00456 {
00457         struct cli_state *cli;
00458         BOOL ret;
00459 
00460         cli = current_cli;
00461 
00462         cli_sockopt(cli, sockops);
00463 
00464         ret = rw_torture(cli);
00465         
00466         if (!torture_close_connection(cli)) {
00467                 ret = False;
00468         }
00469 
00470         return ret;
00471 }

static BOOL rw_torture3 ( struct cli_state c,
char *  lockfname 
) [static]

torture.c473 行で定義されています。

参照先 bufccli_close()cli_errstr()cli_open()cli_read()cli_write()printf()procnumsmb_msleep()sys_random().

参照元 run_readwritemulti().

00474 {
00475         int fnum = -1;
00476         unsigned int i = 0;
00477         char buf[131072];
00478         char buf_rd[131072];
00479         unsigned count;
00480         unsigned countprev = 0;
00481         ssize_t sent = 0;
00482         BOOL correct = True;
00483 
00484         srandom(1);
00485         for (i = 0; i < sizeof(buf); i += sizeof(uint32))
00486         {
00487                 SIVAL(buf, i, sys_random());
00488         }
00489 
00490         if (procnum == 0)
00491         {
00492                 fnum = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL, 
00493                                  DENY_NONE);
00494                 if (fnum == -1) {
00495                         printf("first open read/write of %s failed (%s)\n",
00496                                         lockfname, cli_errstr(c));
00497                         return False;
00498                 }
00499         }
00500         else
00501         {
00502                 for (i = 0; i < 500 && fnum == -1; i++)
00503                 {
00504                         fnum = cli_open(c, lockfname, O_RDONLY, 
00505                                          DENY_NONE);
00506                         smb_msleep(10);
00507                 }
00508                 if (fnum == -1) {
00509                         printf("second open read-only of %s failed (%s)\n",
00510                                         lockfname, cli_errstr(c));
00511                         return False;
00512                 }
00513         }
00514 
00515         i = 0;
00516         for (count = 0; count < sizeof(buf); count += sent)
00517         {
00518                 if (count >= countprev) {
00519                         printf("%d %8d\r", i, count);
00520                         fflush(stdout);
00521                         i++;
00522                         countprev += (sizeof(buf) / 20);
00523                 }
00524 
00525                 if (procnum == 0)
00526                 {
00527                         sent = ((unsigned)sys_random()%(20))+ 1;
00528                         if (sent > sizeof(buf) - count)
00529                         {
00530                                 sent = sizeof(buf) - count;
00531                         }
00532 
00533                         if (cli_write(c, fnum, 0, buf+count, count, (size_t)sent) != sent) {
00534                                 printf("write failed (%s)\n", cli_errstr(c));
00535                                 correct = False;
00536                         }
00537                 }
00538                 else
00539                 {
00540                         sent = cli_read(c, fnum, buf_rd+count, count,
00541                                                   sizeof(buf)-count);
00542                         if (sent < 0)
00543                         {
00544                                 printf("read failed offset:%d size:%ld (%s)\n",
00545                                        count, (unsigned long)sizeof(buf)-count,
00546                                        cli_errstr(c));
00547                                 correct = False;
00548                                 sent = 0;
00549                         }
00550                         if (sent > 0)
00551                         {
00552                                 if (memcmp(buf_rd+count, buf+count, sent) != 0)
00553                                 {
00554                                         printf("read/write compare failed\n");
00555                                         printf("offset: %d req %ld recvd %ld\n", count, (unsigned long)sizeof(buf)-count, (unsigned long)sent);
00556                                         correct = False;
00557                                         break;
00558                                 }
00559                         }
00560                 }
00561 
00562         }
00563 
00564         if (!cli_close(c, fnum)) {
00565                 printf("close failed (%s)\n", cli_errstr(c));
00566                 correct = False;
00567         }
00568 
00569         return correct;
00570 }

static BOOL rw_torture2 ( struct cli_state c1,
struct cli_state c2 
) [static]

torture.c572 行で定義されています。

参照先 bufcli_close()cli_errstr()cli_open()cli_read()cli_unlink()cli_write()generate_random_buffer()printf()sys_random()torture_numops.

参照元 run_readwritetest().

00573 {
00574         const char *lockfname = "\\torture2.lck";
00575         int fnum1;
00576         int fnum2;
00577         int i;
00578         char buf[131072];
00579         char buf_rd[131072];
00580         BOOL correct = True;
00581         ssize_t bytes_read;
00582 
00583         if (!cli_unlink(c1, lockfname)) {
00584                 printf("unlink failed (%s) (normal, this file should not exist)\n", cli_errstr(c1));
00585         }
00586 
00587         fnum1 = cli_open(c1, lockfname, O_RDWR | O_CREAT | O_EXCL, 
00588                          DENY_NONE);
00589         if (fnum1 == -1) {
00590                 printf("first open read/write of %s failed (%s)\n",
00591                                 lockfname, cli_errstr(c1));
00592                 return False;
00593         }
00594         fnum2 = cli_open(c2, lockfname, O_RDONLY, 
00595                          DENY_NONE);
00596         if (fnum2 == -1) {
00597                 printf("second open read-only of %s failed (%s)\n",
00598                                 lockfname, cli_errstr(c2));
00599                 cli_close(c1, fnum1);
00600                 return False;
00601         }
00602 
00603         for (i=0;i<torture_numops;i++)
00604         {
00605                 size_t buf_size = ((unsigned)sys_random()%(sizeof(buf)-1))+ 1;
00606                 if (i % 10 == 0) {
00607                         printf("%d\r", i); fflush(stdout);
00608                 }
00609 
00610                 generate_random_buffer((unsigned char *)buf, buf_size);
00611 
00612                 if (cli_write(c1, fnum1, 0, buf, 0, buf_size) != buf_size) {
00613                         printf("write failed (%s)\n", cli_errstr(c1));
00614                         correct = False;
00615                         break;
00616                 }
00617 
00618                 if ((bytes_read = cli_read(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
00619                         printf("read failed (%s)\n", cli_errstr(c2));
00620                         printf("read %d, expected %ld\n", (int)bytes_read, 
00621                                (unsigned long)buf_size); 
00622                         correct = False;
00623                         break;
00624                 }
00625 
00626                 if (memcmp(buf_rd, buf, buf_size) != 0)
00627                 {
00628                         printf("read/write compare failed\n");
00629                         correct = False;
00630                         break;
00631                 }
00632         }
00633 
00634         if (!cli_close(c2, fnum2)) {
00635                 printf("close failed (%s)\n", cli_errstr(c2));
00636                 correct = False;
00637         }
00638         if (!cli_close(c1, fnum1)) {
00639                 printf("close failed (%s)\n", cli_errstr(c1));
00640                 correct = False;
00641         }
00642 
00643         if (!cli_unlink(c1, lockfname)) {
00644                 printf("unlink failed (%s)\n", cli_errstr(c1));
00645                 correct = False;
00646         }
00647 
00648         return correct;
00649 }

static BOOL run_readwritetest ( int  dummy  )  [static]

torture.c651 行で定義されています。

参照先 cli_sockopt()printf()rw_torture2()sockopstorture_close_connection()torture_open_connection().

00652 {
00653         static struct cli_state *cli1, *cli2;
00654         BOOL test1, test2 = False;
00655 
00656         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
00657                 return False;
00658         }
00659         cli_sockopt(cli1, sockops);
00660         cli_sockopt(cli2, sockops);
00661 
00662         printf("starting readwritetest\n");
00663 
00664         test1 = rw_torture2(cli1, cli2);
00665         printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));
00666 
00667         if (test1) {
00668                 test2 = rw_torture2(cli1, cli1);
00669                 printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
00670         }
00671 
00672         if (!torture_close_connection(cli1)) {
00673                 test1 = False;
00674         }
00675 
00676         if (!torture_close_connection(cli2)) {
00677                 test2 = False;
00678         }
00679 
00680         return (test1 && test2);
00681 }

static BOOL run_readwritemulti ( int  dummy  )  [static]

torture.c683 行で定義されています。

参照先 clicli_sockopt()current_cliprintf()randomfnamerw_torture3()sockopstorture_close_connection().

00684 {
00685         struct cli_state *cli;
00686         BOOL test;
00687 
00688         cli = current_cli;
00689 
00690         cli_sockopt(cli, sockops);
00691 
00692         printf("run_readwritemulti: fname %s\n", randomfname);
00693         test = rw_torture3(cli, randomfname);
00694 
00695         if (!torture_close_connection(cli)) {
00696                 test = False;
00697         }
00698         
00699         return test;
00700 }

static BOOL run_readwritelarge ( int  dummy  )  [static]

torture.c702 行で定義されています。

参照先 bufcli_close()cli_errstr()cli_open()cli_qfileinfo()cli_smbwrite()cli_sockopt()cli_unlink()cli_write()cli_state::max_xmitprintf()sockopstorture_close_connection()torture_open_connection().

00703 {
00704         static struct cli_state *cli1;
00705         int fnum1;
00706         const char *lockfname = "\\large.dat";
00707         SMB_OFF_T fsize;
00708         char buf[126*1024];
00709         BOOL correct = True;
00710  
00711         if (!torture_open_connection(&cli1, 0)) {
00712                 return False;
00713         }
00714         cli_sockopt(cli1, sockops);
00715         memset(buf,'\0',sizeof(buf));
00716         
00717         cli1->max_xmit = 128*1024;
00718         
00719         printf("starting readwritelarge\n");
00720  
00721         cli_unlink(cli1, lockfname);
00722 
00723         fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
00724         if (fnum1 == -1) {
00725                 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
00726                 return False;
00727         }
00728    
00729         cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf));
00730 
00731         if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
00732                 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
00733                 correct = False;
00734         }
00735 
00736         if (fsize == sizeof(buf))
00737                 printf("readwritelarge test 1 succeeded (size = %lx)\n", 
00738                        (unsigned long)fsize);
00739         else {
00740                 printf("readwritelarge test 1 failed (size = %lx)\n", 
00741                        (unsigned long)fsize);
00742                 correct = False;
00743         }
00744 
00745         if (!cli_close(cli1, fnum1)) {
00746                 printf("close failed (%s)\n", cli_errstr(cli1));
00747                 correct = False;
00748         }
00749 
00750         if (!cli_unlink(cli1, lockfname)) {
00751                 printf("unlink failed (%s)\n", cli_errstr(cli1));
00752                 correct = False;
00753         }
00754 
00755         fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
00756         if (fnum1 == -1) {
00757                 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
00758                 return False;
00759         }
00760         
00761         cli1->max_xmit = 4*1024;
00762         
00763         cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf));
00764         
00765         if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
00766                 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
00767                 correct = False;
00768         }
00769 
00770         if (fsize == sizeof(buf))
00771                 printf("readwritelarge test 2 succeeded (size = %lx)\n", 
00772                        (unsigned long)fsize);
00773         else {
00774                 printf("readwritelarge test 2 failed (size = %lx)\n", 
00775                        (unsigned long)fsize);
00776                 correct = False;
00777         }
00778 
00779 #if 0
00780         /* ToDo - set allocation. JRA */
00781         if(!cli_set_allocation_size(cli1, fnum1, 0)) {
00782                 printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
00783                 return False;
00784         }
00785         if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
00786                 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
00787                 correct = False;
00788         }
00789         if (fsize != 0)
00790                 printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);
00791 #endif
00792 
00793         if (!cli_close(cli1, fnum1)) {
00794                 printf("close failed (%s)\n", cli_errstr(cli1));
00795                 correct = False;
00796         }
00797         
00798         if (!torture_close_connection(cli1)) {
00799                 correct = False;
00800         }
00801         return correct;
00802 }

static BOOL run_netbench ( int  client  )  [static]

torture.c810 行で定義されています。

参照先 all_string_sub()clicli_sockopt()client_txtcurrent_clilinenb_cleanup()nb_close()nb_createx()nb_deltree()nb_findfirst()nb_flush()nb_qfileinfo()nb_qfsinfo()nb_qpathinfo()nb_readx()nb_rename()nb_rmdir()nb_setup()nb_unlink()nb_writex()printf()sockopstorture_close_connection().

参照元 run_nbench().

00811 {
00812         struct cli_state *cli;
00813         int i;
00814         pstring line;
00815         char cname[20];
00816         FILE *f;
00817         const char *params[20];
00818         BOOL correct = True;
00819 
00820         cli = current_cli;
00821 
00822         nbio_id = client;
00823 
00824         cli_sockopt(cli, sockops);
00825 
00826         nb_setup(cli);
00827 
00828         slprintf(cname,sizeof(cname)-1, "client%d", client);
00829 
00830         f = fopen(client_txt, "r");
00831 
00832         if (!f) {
00833                 perror(client_txt);
00834                 return False;
00835         }
00836 
00837         while (fgets(line, sizeof(line)-1, f)) {
00838                 line_count++;
00839 
00840                 line[strlen(line)-1] = 0;
00841 
00842                 /* printf("[%d] %s\n", line_count, line); */
00843 
00844                 all_string_sub(line,"client1", cname, sizeof(line));
00845                 
00846                 /* parse the command parameters */
00847                 params[0] = strtok(line," ");
00848                 i = 0;
00849                 while (params[i]) params[++i] = strtok(NULL," ");
00850 
00851                 params[i] = "";
00852 
00853                 if (i < 2) continue;
00854 
00855                 if (!strncmp(params[0],"SMB", 3)) {
00856                         printf("ERROR: You are using a dbench 1 load file\n");
00857                         exit(1);
00858                 }
00859 
00860                 if (!strcmp(params[0],"NTCreateX")) {
00861                         nb_createx(params[1], ival(params[2]), ival(params[3]), 
00862                                    ival(params[4]));
00863                 } else if (!strcmp(params[0],"Close")) {
00864                         nb_close(ival(params[1]));
00865                 } else if (!strcmp(params[0],"Rename")) {
00866                         nb_rename(params[1], params[2]);
00867                 } else if (!strcmp(params[0],"Unlink")) {
00868                         nb_unlink(params[1]);
00869                 } else if (!strcmp(params[0],"Deltree")) {
00870                         nb_deltree(params[1]);
00871                 } else if (!strcmp(params[0],"Rmdir")) {
00872                         nb_rmdir(params[1]);
00873                 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
00874                         nb_qpathinfo(params[1]);
00875                 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
00876                         nb_qfileinfo(ival(params[1]));
00877                 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
00878                         nb_qfsinfo(ival(params[1]));
00879                 } else if (!strcmp(params[0],"FIND_FIRST")) {
00880                         nb_findfirst(params[1]);
00881                 } else if (!strcmp(params[0],"WriteX")) {
00882                         nb_writex(ival(params[1]), 
00883                                   ival(params[2]), ival(params[3]), ival(params[4]));
00884                 } else if (!strcmp(params[0],"ReadX")) {
00885                         nb_readx(ival(params[1]), 
00886                                   ival(params[2]), ival(params[3]), ival(params[4]));
00887                 } else if (!strcmp(params[0],"Flush")) {
00888                         nb_flush(ival(params[1]));
00889                 } else {
00890                         printf("Unknown operation %s\n", params[0]);
00891                         exit(1);
00892                 }
00893         }
00894         fclose(f);
00895 
00896         nb_cleanup();
00897 
00898         if (!torture_close_connection(cli)) {
00899                 correct = False;
00900         }
00901         
00902         return correct;
00903 }

static BOOL run_nbench ( int  dummy  )  [static]

torture.c907 行で定義されています。

参照先 create_procs()nb_alarm()nbio_shmem()nbio_total()nprocsprintf()run_netbench()t.

00908 {
00909         double t;
00910         BOOL correct = True;
00911 
00912         nbio_shmem(nprocs);
00913 
00914         nbio_id = -1;
00915 
00916         signal(SIGALRM, nb_alarm);
00917         alarm(1);
00918         t = create_procs(run_netbench, &correct);
00919         alarm(0);
00920 
00921         printf("\nThroughput %g MB/sec\n", 
00922                1.0e-6 * nbio_total() / t);
00923         return correct;
00924 }

static BOOL run_locktest1 ( int  dummy  )  [static]

torture.c934 行で定義されています。

参照先 check_error()cli_close()cli_errstr()cli_lock()cli_open()cli_sockopt()cli_unlink()printf()sockopstorture_close_connection()torture_open_connection()WRITE_LOCK.

00935 {
00936         struct cli_state *cli1, *cli2;
00937         const char *fname = "\\lockt1.lck";
00938         int fnum1, fnum2, fnum3;
00939         time_t t1, t2;
00940         unsigned lock_timeout;
00941 
00942         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
00943                 return False;
00944         }
00945         cli_sockopt(cli1, sockops);
00946         cli_sockopt(cli2, sockops);
00947 
00948         printf("starting locktest1\n");
00949 
00950         cli_unlink(cli1, fname);
00951 
00952         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
00953         if (fnum1 == -1) {
00954                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
00955                 return False;
00956         }
00957         fnum2 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
00958         if (fnum2 == -1) {
00959                 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli1));
00960                 return False;
00961         }
00962         fnum3 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
00963         if (fnum3 == -1) {
00964                 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli2));
00965                 return False;
00966         }
00967 
00968         if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
00969                 printf("lock1 failed (%s)\n", cli_errstr(cli1));
00970                 return False;
00971         }
00972 
00973 
00974         if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
00975                 printf("lock2 succeeded! This is a locking bug\n");
00976                 return False;
00977         } else {
00978                 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 
00979                                  NT_STATUS_LOCK_NOT_GRANTED)) return False;
00980         }
00981 
00982 
00983         lock_timeout = (1 + (random() % 20));
00984         printf("Testing lock timeout with timeout=%u\n", lock_timeout);
00985         t1 = time(NULL);
00986         if (cli_lock(cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {
00987                 printf("lock3 succeeded! This is a locking bug\n");
00988                 return False;
00989         } else {
00990                 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 
00991                                  NT_STATUS_FILE_LOCK_CONFLICT)) return False;
00992         }
00993         t2 = time(NULL);
00994 
00995         if (ABS(t2 - t1) < lock_timeout-1) {
00996                 printf("error: This server appears not to support timed lock requests\n");
00997         }
00998 
00999         printf("server slept for %u seconds for a %u second timeout\n",
01000                (unsigned int)(t2-t1), lock_timeout);
01001 
01002         if (!cli_close(cli1, fnum2)) {
01003                 printf("close1 failed (%s)\n", cli_errstr(cli1));
01004                 return False;
01005         }
01006 
01007         if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
01008                 printf("lock4 succeeded! This is a locking bug\n");
01009                 return False;
01010         } else {
01011                 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 
01012                                  NT_STATUS_FILE_LOCK_CONFLICT)) return False;
01013         }
01014 
01015         if (!cli_close(cli1, fnum1)) {
01016                 printf("close2 failed (%s)\n", cli_errstr(cli1));
01017                 return False;
01018         }
01019 
01020         if (!cli_close(cli2, fnum3)) {
01021                 printf("close3 failed (%s)\n", cli_errstr(cli2));
01022                 return False;
01023         }
01024 
01025         if (!cli_unlink(cli1, fname)) {
01026                 printf("unlink failed (%s)\n", cli_errstr(cli1));
01027                 return False;
01028         }
01029 
01030 
01031         if (!torture_close_connection(cli1)) {
01032                 return False;
01033         }
01034 
01035         if (!torture_close_connection(cli2)) {
01036                 return False;
01037         }
01038 
01039         printf("Passed locktest1\n");
01040         return True;
01041 }

static BOOL run_tcon_test ( int  dummy  )  [static]

torture.c1047 行で定義されています。

参照先 bufclicli_close()cli_errstr()cli_open()cli_send_tconX()cli_shutdown()cli_sockopt()cli_tdis()cli_unlink()cli_write()cli_state::cnumhostpasswordprintf()sharesockopstorture_close_connection()torture_open_connection()cli_state::vuid.

01048 {
01049         static struct cli_state *cli;
01050         const char *fname = "\\tcontest.tmp";
01051         int fnum1;
01052         uint16 cnum1, cnum2, cnum3;
01053         uint16 vuid1, vuid2;
01054         char buf[4];
01055         BOOL ret = True;
01056 
01057         memset(buf, '\0', sizeof(buf));
01058 
01059         if (!torture_open_connection(&cli, 0)) {
01060                 return False;
01061         }
01062         cli_sockopt(cli, sockops);
01063 
01064         printf("starting tcontest\n");
01065 
01066         cli_unlink(cli, fname);
01067 
01068         fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01069         if (fnum1 == -1) {
01070                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
01071                 return False;
01072         }
01073 
01074         cnum1 = cli->cnum;
01075         vuid1 = cli->vuid;
01076 
01077         if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) {
01078                 printf("initial write failed (%s)", cli_errstr(cli));
01079                 return False;
01080         }
01081 
01082         if (!cli_send_tconX(cli, share, "?????",
01083                             password, strlen(password)+1)) {
01084                 printf("%s refused 2nd tree connect (%s)\n", host,
01085                            cli_errstr(cli));
01086                 cli_shutdown(cli);
01087                 return False;
01088         }
01089 
01090         cnum2 = cli->cnum;
01091         cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
01092         vuid2 = cli->vuid + 1;
01093 
01094         /* try a write with the wrong tid */
01095         cli->cnum = cnum2;
01096 
01097         if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
01098                 printf("* server allows write with wrong TID\n");
01099                 ret = False;
01100         } else {
01101                 printf("server fails write with wrong TID : %s\n", cli_errstr(cli));
01102         }
01103 
01104 
01105         /* try a write with an invalid tid */
01106         cli->cnum = cnum3;
01107 
01108         if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
01109                 printf("* server allows write with invalid TID\n");
01110                 ret = False;
01111         } else {
01112                 printf("server fails write with invalid TID : %s\n", cli_errstr(cli));
01113         }
01114 
01115         /* try a write with an invalid vuid */
01116         cli->vuid = vuid2;
01117         cli->cnum = cnum1;
01118 
01119         if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
01120                 printf("* server allows write with invalid VUID\n");
01121                 ret = False;
01122         } else {
01123                 printf("server fails write with invalid VUID : %s\n", cli_errstr(cli));
01124         }
01125 
01126         cli->cnum = cnum1;
01127         cli->vuid = vuid1;
01128 
01129         if (!cli_close(cli, fnum1)) {
01130                 printf("close failed (%s)\n", cli_errstr(cli));
01131                 return False;
01132         }
01133 
01134         cli->cnum = cnum2;
01135 
01136         if (!cli_tdis(cli)) {
01137                 printf("secondary tdis failed (%s)\n", cli_errstr(cli));
01138                 return False;
01139         }
01140 
01141         cli->cnum = cnum1;
01142 
01143         if (!torture_close_connection(cli)) {
01144                 return False;
01145         }
01146 
01147         return ret;
01148 }

static BOOL run_tcon2_test ( int  dummy  )  [static]

torture.c1154 行で定義されています。

参照先 asprintf()clicli_errstr()cli_raw_tcon()cli_sockopt()cli_state::cnumhostcli_state::inbufcli_state::max_xmitpasswordprintf()sharesockopsstatustorture_close_connection()torture_open_connection().

01155 {
01156         static struct cli_state *cli;
01157         uint16 cnum, max_xmit;
01158         char *service;
01159         NTSTATUS status;
01160 
01161         if (!torture_open_connection(&cli, 0)) {
01162                 return False;
01163         }
01164         cli_sockopt(cli, sockops);
01165 
01166         printf("starting tcon2 test\n");
01167 
01168         asprintf(&service, "\\\\%s\\%s", host, share);
01169 
01170         status = cli_raw_tcon(cli, service, password, "?????", &max_xmit, &cnum);
01171 
01172         if (!NT_STATUS_IS_OK(status)) {
01173                 printf("tcon2 failed : %s\n", cli_errstr(cli));
01174         } else {
01175                 printf("tcon OK : max_xmit=%d cnum=%d tid=%d\n", 
01176                        (int)max_xmit, (int)cnum, SVAL(cli->inbuf, smb_tid));
01177         }
01178 
01179         if (!torture_close_connection(cli)) {
01180                 return False;
01181         }
01182 
01183         printf("Passed tcon2 test\n");
01184         return True;
01185 }

static BOOL tcon_devtest ( struct cli_state cli,
const char *  myshare,
const char *  devtype,
const char *  return_devtype,
NTSTATUS  expected_error 
) [static]

torture.c1187 行で定義されています。

参照先 clicli_nt_error()cli_send_tconX()cli_tdis()cli_state::devpasswordprintf()status.

参照元 run_tcon_devtype_test().

01191 {
01192         BOOL status;
01193         BOOL ret;
01194 
01195         status = cli_send_tconX(cli, myshare, devtype,
01196                                 password, strlen(password)+1);
01197 
01198         if (NT_STATUS_IS_OK(expected_error)) {
01199                 if (status) {
01200                         if (strcmp(cli->dev, return_devtype) == 0) {
01201                                 ret = True;
01202                         } else { 
01203                                 printf("tconX to share %s with type %s "
01204                                        "succeeded but returned the wrong "
01205                                        "device type (got [%s] but should have got [%s])\n",
01206                                        myshare, devtype, cli->dev, return_devtype);
01207                                 ret = False;
01208                         }
01209                 } else {
01210                         printf("tconX to share %s with type %s "
01211                                "should have succeeded but failed\n",
01212                                myshare, devtype);
01213                         ret = False;
01214                 }
01215                 cli_tdis(cli);
01216         } else {
01217                 if (status) {
01218                         printf("tconx to share %s with type %s "
01219                                "should have failed but succeeded\n",
01220                                myshare, devtype);
01221                         ret = False;
01222                 } else {
01223                         if (NT_STATUS_EQUAL(cli_nt_error(cli),
01224                                             expected_error)) {
01225                                 ret = True;
01226                         } else {
01227                                 printf("Returned unexpected error\n");
01228                                 ret = False;
01229                         }
01230                 }
01231         }
01232         return ret;
01233 }

static BOOL run_tcon_devtype_test ( int  dummy  )  [static]

torture.c1238 行で定義されています。

参照先 cli_full_connection()cli_shutdown()flagshostmynamepasswordport_to_useprintf()sharestatustcon_devtest()usernameworkgroup.

01239 {
01240         static struct cli_state *cli1 = NULL;
01241         BOOL retry;
01242         int flags = 0;
01243         NTSTATUS status;
01244         BOOL ret = True;
01245 
01246         status = cli_full_connection(&cli1, myname,
01247                                      host, NULL, port_to_use,
01248                                      NULL, NULL,
01249                                      username, workgroup,
01250                                      password, flags, Undefined, &retry);
01251 
01252         if (!NT_STATUS_IS_OK(status)) {
01253                 printf("could not open connection\n");
01254                 return False;
01255         }
01256 
01257         if (!tcon_devtest(cli1, "IPC$", "A:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01258                 ret = False;
01259 
01260         if (!tcon_devtest(cli1, "IPC$", "?????", "IPC", NT_STATUS_OK))
01261                 ret = False;
01262 
01263         if (!tcon_devtest(cli1, "IPC$", "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01264                 ret = False;
01265 
01266         if (!tcon_devtest(cli1, "IPC$", "IPC", "IPC", NT_STATUS_OK))
01267                 ret = False;
01268                         
01269         if (!tcon_devtest(cli1, "IPC$", "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01270                 ret = False;
01271 
01272         if (!tcon_devtest(cli1, share, "A:", "A:", NT_STATUS_OK))
01273                 ret = False;
01274 
01275         if (!tcon_devtest(cli1, share, "?????", "A:", NT_STATUS_OK))
01276                 ret = False;
01277 
01278         if (!tcon_devtest(cli1, share, "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01279                 ret = False;
01280 
01281         if (!tcon_devtest(cli1, share, "IPC", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01282                 ret = False;
01283                         
01284         if (!tcon_devtest(cli1, share, "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
01285                 ret = False;
01286 
01287         cli_shutdown(cli1);
01288 
01289         if (ret)
01290                 printf("Passed tcondevtest\n");
01291 
01292         return ret;
01293 }

static BOOL run_locktest2 ( int  dummy  )  [static]

torture.c1307 行で定義されています。

参照先 check_error()clicli_close()cli_errstr()cli_lock()cli_open()cli_setpid()cli_sockopt()cli_unlink()cli_unlock()printf()READ_LOCKsockopstorture_close_connection()torture_open_connection()WRITE_LOCK.

01308 {
01309         static struct cli_state *cli;
01310         const char *fname = "\\lockt2.lck";
01311         int fnum1, fnum2, fnum3;
01312         BOOL correct = True;
01313 
01314         if (!torture_open_connection(&cli, 0)) {
01315                 return False;
01316         }
01317 
01318         cli_sockopt(cli, sockops);
01319 
01320         printf("starting locktest2\n");
01321 
01322         cli_unlink(cli, fname);
01323 
01324         cli_setpid(cli, 1);
01325 
01326         fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01327         if (fnum1 == -1) {
01328                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
01329                 return False;
01330         }
01331 
01332         fnum2 = cli_open(cli, fname, O_RDWR, DENY_NONE);
01333         if (fnum2 == -1) {
01334                 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli));
01335                 return False;
01336         }
01337 
01338         cli_setpid(cli, 2);
01339 
01340         fnum3 = cli_open(cli, fname, O_RDWR, DENY_NONE);
01341         if (fnum3 == -1) {
01342                 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli));
01343                 return False;
01344         }
01345 
01346         cli_setpid(cli, 1);
01347 
01348         if (!cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
01349                 printf("lock1 failed (%s)\n", cli_errstr(cli));
01350                 return False;
01351         }
01352 
01353         if (cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
01354                 printf("WRITE lock1 succeeded! This is a locking bug\n");
01355                 correct = False;
01356         } else {
01357                 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, 
01358                                  NT_STATUS_LOCK_NOT_GRANTED)) return False;
01359         }
01360 
01361         if (cli_lock(cli, fnum2, 0, 4, 0, WRITE_LOCK)) {
01362                 printf("WRITE lock2 succeeded! This is a locking bug\n");
01363                 correct = False;
01364         } else {
01365                 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, 
01366                                  NT_STATUS_LOCK_NOT_GRANTED)) return False;
01367         }
01368 
01369         if (cli_lock(cli, fnum2, 0, 4, 0, READ_LOCK)) {
01370                 printf("READ lock2 succeeded! This is a locking bug\n");
01371                 correct = False;
01372         } else {
01373                 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, 
01374                                  NT_STATUS_FILE_LOCK_CONFLICT)) return False;
01375         }
01376 
01377         if (!cli_lock(cli, fnum1, 100, 4, 0, WRITE_LOCK)) {
01378                 printf("lock at 100 failed (%s)\n", cli_errstr(cli));
01379         }
01380         cli_setpid(cli, 2);
01381         if (cli_unlock(cli, fnum1, 100, 4)) {
01382                 printf("unlock at 100 succeeded! This is a locking bug\n");
01383                 correct = False;
01384         }
01385 
01386         if (cli_unlock(cli, fnum1, 0, 4)) {
01387                 printf("unlock1 succeeded! This is a locking bug\n");
01388                 correct = False;
01389         } else {
01390                 if (!check_error(__LINE__, cli, 
01391                                  ERRDOS, ERRlock, 
01392                                  NT_STATUS_RANGE_NOT_LOCKED)) return False;
01393         }
01394 
01395         if (cli_unlock(cli, fnum1, 0, 8)) {
01396                 printf("unlock2 succeeded! This is a locking bug\n");
01397                 correct = False;
01398         } else {
01399                 if (!check_error(__LINE__, cli, 
01400                                  ERRDOS, ERRlock, 
01401                                  NT_STATUS_RANGE_NOT_LOCKED)) return False;
01402         }
01403 
01404         if (cli_lock(cli, fnum3, 0, 4, 0, WRITE_LOCK)) {
01405                 printf("lock3 succeeded! This is a locking bug\n");
01406                 correct = False;
01407         } else {
01408                 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
01409         }
01410 
01411         cli_setpid(cli, 1);
01412 
01413         if (!cli_close(cli, fnum1)) {
01414                 printf("close1 failed (%s)\n", cli_errstr(cli));
01415                 return False;
01416         }
01417 
01418         if (!cli_close(cli, fnum2)) {
01419                 printf("close2 failed (%s)\n", cli_errstr(cli));
01420                 return False;
01421         }
01422 
01423         if (!cli_close(cli, fnum3)) {
01424                 printf("close3 failed (%s)\n", cli_errstr(cli));
01425                 return False;
01426         }
01427 
01428         if (!torture_close_connection(cli)) {
01429                 correct = False;
01430         }
01431 
01432         printf("locktest2 finished\n");
01433 
01434         return correct;
01435 }

static BOOL run_locktest3 ( int  dummy  )  [static]

torture.c1443 行で定義されています。

参照先 cli_close()cli_errstr()cli_lock()cli_open()cli_sockopt()cli_unlink()cli_unlock()printf()sockopstorture_close_connection()torture_numopstorture_open_connection()WRITE_LOCK.

01444 {
01445         static struct cli_state *cli1, *cli2;
01446         const char *fname = "\\lockt3.lck";
01447         int fnum1, fnum2, i;
01448         uint32 offset;
01449         BOOL correct = True;
01450 
01451 #define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
01452 
01453         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
01454                 return False;
01455         }
01456         cli_sockopt(cli1, sockops);
01457         cli_sockopt(cli2, sockops);
01458 
01459         printf("starting locktest3\n");
01460 
01461         cli_unlink(cli1, fname);
01462 
01463         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01464         if (fnum1 == -1) {
01465                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
01466                 return False;
01467         }
01468         fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
01469         if (fnum2 == -1) {
01470                 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli2));
01471                 return False;
01472         }
01473 
01474         for (offset=i=0;i<torture_numops;i++) {
01475                 NEXT_OFFSET;
01476                 if (!cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
01477                         printf("lock1 %d failed (%s)\n", 
01478                                i,
01479                                cli_errstr(cli1));
01480                         return False;
01481                 }
01482 
01483                 if (!cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
01484                         printf("lock2 %d failed (%s)\n", 
01485                                i,
01486                                cli_errstr(cli1));
01487                         return False;
01488                 }
01489         }
01490 
01491         for (offset=i=0;i<torture_numops;i++) {
01492                 NEXT_OFFSET;
01493 
01494                 if (cli_lock(cli1, fnum1, offset-2, 1, 0, WRITE_LOCK)) {
01495                         printf("error: lock1 %d succeeded!\n", i);
01496                         return False;
01497                 }
01498 
01499                 if (cli_lock(cli2, fnum2, offset-1, 1, 0, WRITE_LOCK)) {
01500                         printf("error: lock2 %d succeeded!\n", i);
01501                         return False;
01502                 }
01503 
01504                 if (cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
01505                         printf("error: lock3 %d succeeded!\n", i);
01506                         return False;
01507                 }
01508 
01509                 if (cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
01510                         printf("error: lock4 %d succeeded!\n", i);
01511                         return False;
01512                 }
01513         }
01514 
01515         for (offset=i=0;i<torture_numops;i++) {
01516                 NEXT_OFFSET;
01517 
01518                 if (!cli_unlock(cli1, fnum1, offset-1, 1)) {
01519                         printf("unlock1 %d failed (%s)\n", 
01520                                i,
01521                                cli_errstr(cli1));
01522                         return False;
01523                 }
01524 
01525                 if (!cli_unlock(cli2, fnum2, offset-2, 1)) {
01526                         printf("unlock2 %d failed (%s)\n", 
01527                                i,
01528                                cli_errstr(cli1));
01529                         return False;
01530                 }
01531         }
01532 
01533         if (!cli_close(cli1, fnum1)) {
01534                 printf("close1 failed (%s)\n", cli_errstr(cli1));
01535                 return False;
01536         }
01537 
01538         if (!cli_close(cli2, fnum2)) {
01539                 printf("close2 failed (%s)\n", cli_errstr(cli2));
01540                 return False;
01541         }
01542 
01543         if (!cli_unlink(cli1, fname)) {
01544                 printf("unlink failed (%s)\n", cli_errstr(cli1));
01545                 return False;
01546         }
01547 
01548         if (!torture_close_connection(cli1)) {
01549                 correct = False;
01550         }
01551         
01552         if (!torture_close_connection(cli2)) {
01553                 correct = False;
01554         }
01555 
01556         printf("finished locktest3\n");
01557 
01558         return correct;
01559 }

static BOOL run_locktest4 ( int  dummy  )  [static]

torture.c1568 行で定義されています。

参照先 bufcli_close()cli_lock()cli_open()cli_read()cli_setpid()cli_sockopt()cli_unlink()cli_unlock()cli_write()printf()READ_LOCKsockopstorture_close_connection()torture_open_connection()WRITE_LOCK.

01569 {
01570         static struct cli_state *cli1, *cli2;
01571         const char *fname = "\\lockt4.lck";
01572         int fnum1, fnum2, f;
01573         BOOL ret;
01574         char buf[1000];
01575         BOOL correct = True;
01576 
01577         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
01578                 return False;
01579         }
01580 
01581         cli_sockopt(cli1, sockops);
01582         cli_sockopt(cli2, sockops);
01583 
01584         printf("starting locktest4\n");
01585 
01586         cli_unlink(cli1, fname);
01587 
01588         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01589         fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
01590 
01591         memset(buf, 0, sizeof(buf));
01592 
01593         if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
01594                 printf("Failed to create file\n");
01595                 correct = False;
01596                 goto fail;
01597         }
01598 
01599         ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
01600               cli_lock(cli1, fnum1, 2, 4, 0, WRITE_LOCK);
01601         EXPECTED(ret, False);
01602         printf("the same process %s set overlapping write locks\n", ret?"can":"cannot");
01603             
01604         ret = cli_lock(cli1, fnum1, 10, 4, 0, READ_LOCK) &&
01605               cli_lock(cli1, fnum1, 12, 4, 0, READ_LOCK);
01606         EXPECTED(ret, True);
01607         printf("the same process %s set overlapping read locks\n", ret?"can":"cannot");
01608 
01609         ret = cli_lock(cli1, fnum1, 20, 4, 0, WRITE_LOCK) &&
01610               cli_lock(cli2, fnum2, 22, 4, 0, WRITE_LOCK);
01611         EXPECTED(ret, False);
01612         printf("a different connection %s set overlapping write locks\n", ret?"can":"cannot");
01613             
01614         ret = cli_lock(cli1, fnum1, 30, 4, 0, READ_LOCK) &&
01615               cli_lock(cli2, fnum2, 32, 4, 0, READ_LOCK);
01616         EXPECTED(ret, True);
01617         printf("a different connection %s set overlapping read locks\n", ret?"can":"cannot");
01618         
01619         ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 40, 4, 0, WRITE_LOCK)) &&
01620               (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 42, 4, 0, WRITE_LOCK));
01621         EXPECTED(ret, False);
01622         printf("a different pid %s set overlapping write locks\n", ret?"can":"cannot");
01623             
01624         ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 50, 4, 0, READ_LOCK)) &&
01625               (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 52, 4, 0, READ_LOCK));
01626         EXPECTED(ret, True);
01627         printf("a different pid %s set overlapping read locks\n", ret?"can":"cannot");
01628 
01629         ret = cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK) &&
01630               cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK);
01631         EXPECTED(ret, True);
01632         printf("the same process %s set the same read lock twice\n", ret?"can":"cannot");
01633 
01634         ret = cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK) &&
01635               cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK);
01636         EXPECTED(ret, False);
01637         printf("the same process %s set the same write lock twice\n", ret?"can":"cannot");
01638 
01639         ret = cli_lock(cli1, fnum1, 80, 4, 0, READ_LOCK) &&
01640               cli_lock(cli1, fnum1, 80, 4, 0, WRITE_LOCK);
01641         EXPECTED(ret, False);
01642         printf("the same process %s overlay a read lock with a write lock\n", ret?"can":"cannot");
01643 
01644         ret = cli_lock(cli1, fnum1, 90, 4, 0, WRITE_LOCK) &&
01645               cli_lock(cli1, fnum1, 90, 4, 0, READ_LOCK);
01646         EXPECTED(ret, True);
01647         printf("the same process %s overlay a write lock with a read lock\n", ret?"can":"cannot");
01648 
01649         ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 100, 4, 0, WRITE_LOCK)) &&
01650               (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 100, 4, 0, READ_LOCK));
01651         EXPECTED(ret, False);
01652         printf("a different pid %s overlay a write lock with a read lock\n", ret?"can":"cannot");
01653 
01654         ret = cli_lock(cli1, fnum1, 110, 4, 0, READ_LOCK) &&
01655               cli_lock(cli1, fnum1, 112, 4, 0, READ_LOCK) &&
01656               cli_unlock(cli1, fnum1, 110, 6);
01657         EXPECTED(ret, False);
01658         printf("the same process %s coalesce read locks\n", ret?"can":"cannot");
01659 
01660 
01661         ret = cli_lock(cli1, fnum1, 120, 4, 0, WRITE_LOCK) &&
01662               (cli_read(cli2, fnum2, buf, 120, 4) == 4);
01663         EXPECTED(ret, False);
01664         printf("this server %s strict write locking\n", ret?"doesn't do":"does");
01665 
01666         ret = cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK) &&
01667               (cli_write(cli2, fnum2, 0, buf, 130, 4) == 4);
01668         EXPECTED(ret, False);
01669         printf("this server %s strict read locking\n", ret?"doesn't do":"does");
01670 
01671 
01672         ret = cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
01673               cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
01674               cli_unlock(cli1, fnum1, 140, 4) &&
01675               cli_unlock(cli1, fnum1, 140, 4);
01676         EXPECTED(ret, True);
01677         printf("this server %s do recursive read locking\n", ret?"does":"doesn't");
01678 
01679 
01680         ret = cli_lock(cli1, fnum1, 150, 4, 0, WRITE_LOCK) &&
01681               cli_lock(cli1, fnum1, 150, 4, 0, READ_LOCK) &&
01682               cli_unlock(cli1, fnum1, 150, 4) &&
01683               (cli_read(cli2, fnum2, buf, 150, 4) == 4) &&
01684               !(cli_write(cli2, fnum2, 0, buf, 150, 4) == 4) &&
01685               cli_unlock(cli1, fnum1, 150, 4);
01686         EXPECTED(ret, True);
01687         printf("this server %s do recursive lock overlays\n", ret?"does":"doesn't");
01688 
01689         ret = cli_lock(cli1, fnum1, 160, 4, 0, READ_LOCK) &&
01690               cli_unlock(cli1, fnum1, 160, 4) &&
01691               (cli_write(cli2, fnum2, 0, buf, 160, 4) == 4) &&          
01692               (cli_read(cli2, fnum2, buf, 160, 4) == 4);                
01693         EXPECTED(ret, True);
01694         printf("the same process %s remove a read lock using write locking\n", ret?"can":"cannot");
01695 
01696         ret = cli_lock(cli1, fnum1, 170, 4, 0, WRITE_LOCK) &&
01697               cli_unlock(cli1, fnum1, 170, 4) &&
01698               (cli_write(cli2, fnum2, 0, buf, 170, 4) == 4) &&          
01699               (cli_read(cli2, fnum2, buf, 170, 4) == 4);                
01700         EXPECTED(ret, True);
01701         printf("the same process %s remove a write lock using read locking\n", ret?"can":"cannot");
01702 
01703         ret = cli_lock(cli1, fnum1, 190, 4, 0, WRITE_LOCK) &&
01704               cli_lock(cli1, fnum1, 190, 4, 0, READ_LOCK) &&
01705               cli_unlock(cli1, fnum1, 190, 4) &&
01706               !(cli_write(cli2, fnum2, 0, buf, 190, 4) == 4) &&         
01707               (cli_read(cli2, fnum2, buf, 190, 4) == 4);                
01708         EXPECTED(ret, True);
01709         printf("the same process %s remove the first lock first\n", ret?"does":"doesn't");
01710 
01711         cli_close(cli1, fnum1);
01712         cli_close(cli2, fnum2);
01713         fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
01714         f = cli_open(cli1, fname, O_RDWR, DENY_NONE);
01715         ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
01716               cli_lock(cli1, f, 0, 1, 0, READ_LOCK) &&
01717               cli_close(cli1, fnum1) &&
01718               ((fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE)) != -1) &&
01719               cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
01720         cli_close(cli1, f);
01721         cli_close(cli1, fnum1);
01722         EXPECTED(ret, True);
01723         printf("the server %s have the NT byte range lock bug\n", !ret?"does":"doesn't");
01724 
01725  fail:
01726         cli_close(cli1, fnum1);
01727         cli_close(cli2, fnum2);
01728         cli_unlink(cli1, fname);
01729         torture_close_connection(cli1);
01730         torture_close_connection(cli2);
01731 
01732         printf("finished locktest4\n");
01733         return correct;
01734 }

static BOOL run_locktest5 ( int  dummy  )  [static]

torture.c1739 行で定義されています。

参照先 bufcli_close()cli_lock()cli_open()cli_sockopt()cli_unlink()cli_unlock()cli_write()printf()READ_LOCKsockopstorture_close_connection()torture_open_connection()WRITE_LOCK.

01740 {
01741         static struct cli_state *cli1, *cli2;
01742         const char *fname = "\\lockt5.lck";
01743         int fnum1, fnum2, fnum3;
01744         BOOL ret;
01745         char buf[1000];
01746         BOOL correct = True;
01747 
01748         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
01749                 return False;
01750         }
01751 
01752         cli_sockopt(cli1, sockops);
01753         cli_sockopt(cli2, sockops);
01754 
01755         printf("starting locktest5\n");
01756 
01757         cli_unlink(cli1, fname);
01758 
01759         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01760         fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
01761         fnum3 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
01762 
01763         memset(buf, 0, sizeof(buf));
01764 
01765         if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
01766                 printf("Failed to create file\n");
01767                 correct = False;
01768                 goto fail;
01769         }
01770 
01771         /* Check for NT bug... */
01772         ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
01773                   cli_lock(cli1, fnum3, 0, 1, 0, READ_LOCK);
01774         cli_close(cli1, fnum1);
01775         fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
01776         ret = cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
01777         EXPECTED(ret, True);
01778         printf("this server %s the NT locking bug\n", ret ? "doesn't have" : "has");
01779         cli_close(cli1, fnum1);
01780         fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
01781         cli_unlock(cli1, fnum3, 0, 1);
01782 
01783         ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
01784               cli_lock(cli1, fnum1, 1, 1, 0, READ_LOCK);
01785         EXPECTED(ret, True);
01786         printf("the same process %s overlay a write with a read lock\n", ret?"can":"cannot");
01787 
01788         ret = cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
01789         EXPECTED(ret, False);
01790 
01791         printf("a different processs %s get a read lock on the first process lock stack\n", ret?"can":"cannot");
01792 
01793         /* Unlock the process 2 lock. */
01794         cli_unlock(cli2, fnum2, 0, 4);
01795 
01796         ret = cli_lock(cli1, fnum3, 0, 4, 0, READ_LOCK);
01797         EXPECTED(ret, False);
01798 
01799         printf("the same processs on a different fnum %s get a read lock\n", ret?"can":"cannot");
01800 
01801         /* Unlock the process 1 fnum3 lock. */
01802         cli_unlock(cli1, fnum3, 0, 4);
01803 
01804         /* Stack 2 more locks here. */
01805         ret = cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK) &&
01806                   cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK);
01807 
01808         EXPECTED(ret, True);
01809         printf("the same process %s stack read locks\n", ret?"can":"cannot");
01810 
01811         /* Unlock the first process lock, then check this was the WRITE lock that was
01812                 removed. */
01813 
01814         ret = cli_unlock(cli1, fnum1, 0, 4) &&
01815                         cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
01816 
01817         EXPECTED(ret, True);
01818         printf("the first unlock removes the %s lock\n", ret?"WRITE":"READ");
01819 
01820         /* Unlock the process 2 lock. */
01821         cli_unlock(cli2, fnum2, 0, 4);
01822 
01823         /* We should have 3 stacked locks here. Ensure we need to do 3 unlocks. */
01824 
01825         ret = cli_unlock(cli1, fnum1, 1, 1) &&
01826                   cli_unlock(cli1, fnum1, 0, 4) &&
01827                   cli_unlock(cli1, fnum1, 0, 4);
01828 
01829         EXPECTED(ret, True);
01830         printf("the same process %s unlock the stack of 4 locks\n", ret?"can":"cannot"); 
01831 
01832         /* Ensure the next unlock fails. */
01833         ret = cli_unlock(cli1, fnum1, 0, 4);
01834         EXPECTED(ret, False);
01835         printf("the same process %s count the lock stack\n", !ret?"can":"cannot"); 
01836 
01837         /* Ensure connection 2 can get a write lock. */
01838         ret = cli_lock(cli2, fnum2, 0, 4, 0, WRITE_LOCK);
01839         EXPECTED(ret, True);
01840 
01841         printf("a different processs %s get a write lock on the unlocked stack\n", ret?"can":"cannot");
01842 
01843 
01844  fail:
01845         cli_close(cli1, fnum1);
01846         cli_close(cli2, fnum2);
01847         cli_unlink(cli1, fname);
01848         if (!torture_close_connection(cli1)) {
01849                 correct = False;
01850         }
01851         if (!torture_close_connection(cli2)) {
01852                 correct = False;
01853         }
01854 
01855         printf("finished locktest5\n");
01856        
01857         return correct;
01858 }

static BOOL run_locktest6 ( int  dummy  )  [static]

torture.c1863 行で定義されています。

参照先 clicli_close()cli_locktype()cli_open()cli_sockopt()cli_unlink()nt_errstr()printf()sockopsstatustorture_close_connection()torture_open_connection().

01864 {
01865         static struct cli_state *cli;
01866         const char *fname[1] = { "\\lock6.txt" };
01867         int i;
01868         int fnum;
01869         NTSTATUS status;
01870 
01871         if (!torture_open_connection(&cli, 0)) {
01872                 return False;
01873         }
01874 
01875         cli_sockopt(cli, sockops);
01876 
01877         printf("starting locktest6\n");
01878 
01879         for (i=0;i<1;i++) {
01880                 printf("Testing %s\n", fname[i]);
01881 
01882                 cli_unlink(cli, fname[i]);
01883 
01884                 fnum = cli_open(cli, fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01885                 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CHANGE_LOCKTYPE);
01886                 cli_close(cli, fnum);
01887                 printf("CHANGE_LOCKTYPE gave %s\n", nt_errstr(status));
01888 
01889                 fnum = cli_open(cli, fname[i], O_RDWR, DENY_NONE);
01890                 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CANCEL_LOCK);
01891                 cli_close(cli, fnum);
01892                 printf("CANCEL_LOCK gave %s\n", nt_errstr(status));
01893 
01894                 cli_unlink(cli, fname[i]);
01895         }
01896 
01897         torture_close_connection(cli);
01898 
01899         printf("finished locktest6\n");
01900         return True;
01901 }

static BOOL run_locktest7 ( int  dummy  )  [static]

torture.c1903 行で定義されています。

参照先 bufcli_close()cli_errstr()cli_lock()cli_nt_error()cli_open()cli_read()cli_setpid()cli_sockopt()cli_unlink()cli_unlock()cli_write()printf()READ_LOCKsockopstorture_close_connection()torture_open_connection()WRITE_LOCK.

01904 {
01905         struct cli_state *cli1;
01906         const char *fname = "\\lockt7.lck";
01907         int fnum1;
01908         char buf[200];
01909         BOOL correct = False;
01910 
01911         if (!torture_open_connection(&cli1, 0)) {
01912                 return False;
01913         }
01914 
01915         cli_sockopt(cli1, sockops);
01916 
01917         printf("starting locktest7\n");
01918 
01919         cli_unlink(cli1, fname);
01920 
01921         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
01922 
01923         memset(buf, 0, sizeof(buf));
01924 
01925         if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
01926                 printf("Failed to create file\n");
01927                 goto fail;
01928         }
01929 
01930         cli_setpid(cli1, 1);
01931 
01932         if (!cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK)) {
01933                 printf("Unable to apply read lock on range 130:4, error was %s\n", cli_errstr(cli1));
01934                 goto fail;
01935         } else {
01936                 printf("pid1 successfully locked range 130:4 for READ\n");
01937         }
01938 
01939         if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
01940                 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
01941                 goto fail;
01942         } else {
01943                 printf("pid1 successfully read the range 130:4\n");
01944         }
01945 
01946         if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
01947                 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
01948                 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
01949                         printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
01950                         goto fail;
01951                 }
01952         } else {
01953                 printf("pid1 successfully wrote to the range 130:4 (should be denied)\n");
01954                 goto fail;
01955         }
01956 
01957         cli_setpid(cli1, 2);
01958 
01959         if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
01960                 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
01961         } else {
01962                 printf("pid2 successfully read the range 130:4\n");
01963         }
01964 
01965         if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
01966                 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
01967                 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
01968                         printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
01969                         goto fail;
01970                 }
01971         } else {
01972                 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
01973                 goto fail;
01974         }
01975 
01976         cli_setpid(cli1, 1);
01977         cli_unlock(cli1, fnum1, 130, 4);
01978 
01979         if (!cli_lock(cli1, fnum1, 130, 4, 0, WRITE_LOCK)) {
01980                 printf("Unable to apply write lock on range 130:4, error was %s\n", cli_errstr(cli1));
01981                 goto fail;
01982         } else {
01983                 printf("pid1 successfully locked range 130:4 for WRITE\n");
01984         }
01985 
01986         if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
01987                 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
01988                 goto fail;
01989         } else {
01990                 printf("pid1 successfully read the range 130:4\n");
01991         }
01992 
01993         if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
01994                 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
01995                 goto fail;
01996         } else {
01997                 printf("pid1 successfully wrote to the range 130:4\n");
01998         }
01999 
02000         cli_setpid(cli1, 2);
02001 
02002         if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
02003                 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
02004                 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
02005                         printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
02006                         goto fail;
02007                 }
02008         } else {
02009                 printf("pid2 successfully read the range 130:4 (should be denied)\n");
02010                 goto fail;
02011         }
02012 
02013         if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
02014                 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
02015                 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
02016                         printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
02017                         goto fail;
02018                 }
02019         } else {
02020                 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
02021                 goto fail;
02022         }
02023 
02024         cli_unlock(cli1, fnum1, 130, 0);
02025         correct = True;
02026 
02027 fail:
02028         cli_close(cli1, fnum1);
02029         cli_unlink(cli1, fname);
02030         torture_close_connection(cli1);
02031 
02032         printf("finished locktest7\n");
02033         return correct;
02034 }

static BOOL run_fdpasstest ( int  dummy  )  [static]

torture.c2040 行で定義されています。

参照先 bufcli_close()cli_errstr()cli_open()cli_read()cli_sockopt()cli_unlink()cli_write()cli_state::cnumcli_state::pidprintf()sockopstorture_close_connection()torture_open_connection()cli_state::vuid.

02041 {
02042         struct cli_state *cli1, *cli2;
02043         const char *fname = "\\fdpass.tst";
02044         int fnum1;
02045         pstring buf;
02046 
02047         if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
02048                 return False;
02049         }
02050         cli_sockopt(cli1, sockops);
02051         cli_sockopt(cli2, sockops);
02052 
02053         printf("starting fdpasstest\n");
02054 
02055         cli_unlink(cli1, fname);
02056 
02057         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02058         if (fnum1 == -1) {
02059                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
02060                 return False;
02061         }
02062 
02063         if (cli_write(cli1, fnum1, 0, "hello world\n", 0, 13) != 13) {
02064                 printf("write failed (%s)\n", cli_errstr(cli1));
02065                 return False;
02066         }
02067 
02068         cli2->vuid = cli1->vuid;
02069         cli2->cnum = cli1->cnum;
02070         cli2->pid = cli1->pid;
02071 
02072         if (cli_read(cli2, fnum1, buf, 0, 13) == 13) {
02073                 printf("read succeeded! nasty security hole [%s]\n",
02074                        buf);
02075                 return False;
02076         }
02077 
02078         cli_close(cli1, fnum1);
02079         cli_unlink(cli1, fname);
02080 
02081         torture_close_connection(cli1);
02082         torture_close_connection(cli2);
02083 
02084         printf("finished fdpasstest\n");
02085         return True;
02086 }

static BOOL run_fdsesstest ( int  dummy  )  [static]

torture.c2088 行で定義されています。

参照先 bufclicli_close()cli_errstr()cli_open()cli_read()cli_send_tconX()cli_sockopt()cli_unlink()cli_write()cli_state::cnumprintf()sharesockopstorture_cli_session_setup2()torture_close_connection()torture_open_connection()cli_state::vuid.

02089 {
02090         struct cli_state *cli;
02091         uint16 new_vuid;
02092         uint16 saved_vuid;
02093         uint16 new_cnum;
02094         uint16 saved_cnum;
02095         const char *fname = "\\fdsess.tst";
02096         const char *fname1 = "\\fdsess1.tst";
02097         int fnum1;
02098         int fnum2;
02099         pstring buf;
02100         BOOL ret = True;
02101 
02102         if (!torture_open_connection(&cli, 0))
02103                 return False;
02104         cli_sockopt(cli, sockops);
02105 
02106         if (!torture_cli_session_setup2(cli, &new_vuid))
02107                 return False;
02108 
02109         saved_cnum = cli->cnum;
02110         if (!cli_send_tconX(cli, share, "?????", "", 1))
02111                 return False;
02112         new_cnum = cli->cnum;
02113         cli->cnum = saved_cnum;
02114 
02115         printf("starting fdsesstest\n");
02116 
02117         cli_unlink(cli, fname);
02118         cli_unlink(cli, fname1);
02119 
02120         fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02121         if (fnum1 == -1) {
02122                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
02123                 return False;
02124         }
02125 
02126         if (cli_write(cli, fnum1, 0, "hello world\n", 0, 13) != 13) {
02127                 printf("write failed (%s)\n", cli_errstr(cli));
02128                 return False;
02129         }
02130 
02131         saved_vuid = cli->vuid;
02132         cli->vuid = new_vuid;
02133 
02134         if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
02135                 printf("read succeeded with different vuid! nasty security hole [%s]\n",
02136                        buf);
02137                 ret = False;
02138         }
02139         /* Try to open a file with different vuid, samba cnum. */
02140         fnum2 = cli_open(cli, fname1, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02141         if (fnum2 != -1) {
02142                 printf("create with different vuid, same cnum succeeded.\n");
02143                 cli_close(cli, fnum2);
02144                 cli_unlink(cli, fname1);
02145         } else {
02146                 printf("create with different vuid, same cnum failed.\n");
02147                 printf("This will cause problems with service clients.\n");
02148                 ret = False;
02149         }
02150 
02151         cli->vuid = saved_vuid;
02152 
02153         /* Try with same vuid, different cnum. */
02154         cli->cnum = new_cnum;
02155 
02156         if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
02157                 printf("read succeeded with different cnum![%s]\n",
02158                        buf);
02159                 ret = False;
02160         }
02161 
02162         cli->cnum = saved_cnum;
02163         cli_close(cli, fnum1);
02164         cli_unlink(cli, fname);
02165 
02166         torture_close_connection(cli);
02167 
02168         printf("finished fdsesstest\n");
02169         return ret;
02170 }

static BOOL run_unlinktest ( int  dummy  )  [static]

torture.c2177 行で定義されています。

参照先 check_error()clicli_close()cli_errstr()cli_open()cli_setpid()cli_sockopt()cli_unlink()printf()sockopstorture_close_connection()torture_open_connection().

02178 {
02179         struct cli_state *cli;
02180         const char *fname = "\\unlink.tst";
02181         int fnum;
02182         BOOL correct = True;
02183 
02184         if (!torture_open_connection(&cli, 0)) {
02185                 return False;
02186         }
02187 
02188         cli_sockopt(cli, sockops);
02189 
02190         printf("starting unlink test\n");
02191 
02192         cli_unlink(cli, fname);
02193 
02194         cli_setpid(cli, 1);
02195 
02196         fnum = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02197         if (fnum == -1) {
02198                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
02199                 return False;
02200         }
02201 
02202         if (cli_unlink(cli, fname)) {
02203                 printf("error: server allowed unlink on an open file\n");
02204                 correct = False;
02205         } else {
02206                 correct = check_error(__LINE__, cli, ERRDOS, ERRbadshare, 
02207                                       NT_STATUS_SHARING_VIOLATION);
02208         }
02209 
02210         cli_close(cli, fnum);
02211         cli_unlink(cli, fname);
02212 
02213         if (!torture_close_connection(cli)) {
02214                 correct = False;
02215         }
02216 
02217         printf("unlink test finished\n");
02218         
02219         return correct;
02220 }

static BOOL run_maxfidtest ( int  dummy  )  [static]

torture.c2226 行で定義されています。

参照先 clicli_close()cli_errstr()cli_open()cli_sockopt()cli_unlink()current_cliprintf()sockopstorture_close_connection().

02227 {
02228         struct cli_state *cli;
02229         const char *ftemplate = "\\maxfid.%d.%d";
02230         fstring fname;
02231         int fnums[0x11000], i;
02232         int retries=4;
02233         BOOL correct = True;
02234 
02235         cli = current_cli;
02236 
02237         if (retries <= 0) {
02238                 printf("failed to connect\n");
02239                 return False;
02240         }
02241 
02242         cli_sockopt(cli, sockops);
02243 
02244         for (i=0; i<0x11000; i++) {
02245                 slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
02246                 if ((fnums[i] = cli_open(cli, fname, 
02247                                         O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) ==
02248                     -1) {
02249                         printf("open of %s failed (%s)\n", 
02250                                fname, cli_errstr(cli));
02251                         printf("maximum fnum is %d\n", i);
02252                         break;
02253                 }
02254                 printf("%6d\r", i);
02255         }
02256         printf("%6d\n", i);
02257         i--;
02258 
02259         printf("cleaning up\n");
02260         for (;i>=0;i--) {
02261                 slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
02262                 cli_close(cli, fnums[i]);
02263                 if (!cli_unlink(cli, fname)) {
02264                         printf("unlink of %s failed (%s)\n", 
02265                                fname, cli_errstr(cli));
02266                         correct = False;
02267                 }
02268                 printf("%6d\r", i);
02269         }
02270         printf("%6d\n", 0);
02271 
02272         printf("maxfid test finished\n");
02273         if (!torture_close_connection(cli)) {
02274                 correct = False;
02275         }
02276         return correct;
02277 }

static void rand_buf ( char *  buf,
int  len 
) [static]

torture.c2280 行で定義されています。

参照先 sys_random().

参照元 run_randomipc().

02281 {
02282         while (len--) {
02283                 *buf = (char)sys_random();
02284                 buf++;
02285         }
02286 }

static BOOL run_negprot_nowait ( int  dummy  )  [static]

torture.c2289 行で定義されています。

参照先 clicli_negprot_send()open_nbt_connection()printf()torture_close_connection().

02290 {
02291         int i;
02292         static struct cli_state *cli;
02293         BOOL correct = True;
02294 
02295         printf("starting negprot nowait test\n");
02296 
02297         if (!(cli = open_nbt_connection())) {
02298                 return False;
02299         }
02300 
02301         for (i=0;i<50000;i++) {
02302                 cli_negprot_send(cli);
02303         }
02304 
02305         if (!torture_close_connection(cli)) {
02306                 correct = False;
02307         }
02308 
02309         printf("finished negprot nowait test\n");
02310 
02311         return correct;
02312 }

static BOOL run_randomipc ( int  dummy  )  [static]

torture.c2316 行で定義されています。

参照先 clicli_api()printf()rand_buf()sys_random()torture_close_connection()torture_open_connection().

02317 {
02318         char *rparam = NULL;
02319         char *rdata = NULL;
02320         unsigned int rdrcnt,rprcnt;
02321         pstring param;
02322         int api, param_len, i;
02323         struct cli_state *cli;
02324         BOOL correct = True;
02325         int count = 50000;
02326 
02327         printf("starting random ipc test\n");
02328 
02329         if (!torture_open_connection(&cli, 0)) {
02330                 return False;
02331         }
02332 
02333         for (i=0;i<count;i++) {
02334                 api = sys_random() % 500;
02335                 param_len = (sys_random() % 64);
02336 
02337                 rand_buf(param, param_len);
02338   
02339                 SSVAL(param,0,api); 
02340 
02341                 cli_api(cli, 
02342                         param, param_len, 8,  
02343                         NULL, 0, BUFFER_SIZE, 
02344                         &rparam, &rprcnt,     
02345                         &rdata, &rdrcnt);
02346                 if (i % 100 == 0) {
02347                         printf("%d/%d\r", i,count);
02348                 }
02349         }
02350         printf("%d/%d\n", i, count);
02351 
02352         if (!torture_close_connection(cli)) {
02353                 correct = False;
02354         }
02355 
02356         printf("finished random ipc test\n");
02357 
02358         return correct;
02359 }

static void browse_callback ( const char *  sname,
uint32  stype,
const char *  comment,
void *  state 
) [static]

torture.c2363 行で定義されています。

参照先 printf().

参照元 run_browsetest().

02365 {
02366         printf("\t%20.20s %08x %s\n", sname, stype, comment);
02367 }

static BOOL run_browsetest ( int  dummy  )  [static]

torture.c2375 行で定義されています。

参照先 browse_callback()clicli_NetServerEnum()printf()cli_state::server_domaintorture_close_connection()torture_open_connection().

02376 {
02377         static struct cli_state *cli;
02378         BOOL correct = True;
02379 
02380         printf("starting browse test\n");
02381 
02382         if (!torture_open_connection(&cli, 0)) {
02383                 return False;
02384         }
02385 
02386         printf("domain list:\n");
02387         cli_NetServerEnum(cli, cli->server_domain, 
02388                           SV_TYPE_DOMAIN_ENUM,
02389                           browse_callback, NULL);
02390 
02391         printf("machine list:\n");
02392         cli_NetServerEnum(cli, cli->server_domain, 
02393                           SV_TYPE_ALL,
02394                           browse_callback, NULL);
02395 
02396         if (!torture_close_connection(cli)) {
02397                 correct = False;
02398         }
02399 
02400         printf("browse test finished\n");
02401 
02402         return correct;
02403 
02404 }

static BOOL run_attrtest ( int  dummy  )  [static]

torture.c2410 行で定義されています。

参照先 clicli_close()cli_errstr()cli_getatr()cli_open()cli_setatr()cli_unlink()printf()ttorture_close_connection()torture_open_connection().

02411 {
02412         struct cli_state *cli;
02413         int fnum;
02414         time_t t, t2;
02415         const char *fname = "\\attrib123456789.tst";
02416         BOOL correct = True;
02417 
02418         printf("starting attrib test\n");
02419 
02420         if (!torture_open_connection(&cli, 0)) {
02421                 return False;
02422         }
02423 
02424         cli_unlink(cli, fname);
02425         fnum = cli_open(cli, fname, 
02426                         O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
02427         cli_close(cli, fnum);
02428         if (!cli_getatr(cli, fname, NULL, NULL, &t)) {
02429                 printf("getatr failed (%s)\n", cli_errstr(cli));
02430                 correct = False;
02431         }
02432 
02433         if (abs(t - time(NULL)) > 60*60*24*10) {
02434                 printf("ERROR: SMBgetatr bug. time is %s",
02435                        ctime(&t));
02436                 t = time(NULL);
02437                 correct = True;
02438         }
02439 
02440         t2 = t-60*60*24; /* 1 day ago */
02441 
02442         if (!cli_setatr(cli, fname, 0, t2)) {
02443                 printf("setatr failed (%s)\n", cli_errstr(cli));
02444                 correct = True;
02445         }
02446 
02447         if (!cli_getatr(cli, fname, NULL, NULL, &t)) {
02448                 printf("getatr failed (%s)\n", cli_errstr(cli));
02449                 correct = True;
02450         }
02451 
02452         if (t != t2) {
02453                 printf("ERROR: getatr/setatr bug. times are\n%s",
02454                        ctime(&t));
02455                 printf("%s", ctime(&t2));
02456                 correct = True;
02457         }
02458 
02459         cli_unlink(cli, fname);
02460 
02461         if (!torture_close_connection(cli)) {
02462                 correct = False;
02463         }
02464 
02465         printf("attrib test finished\n");
02466 
02467         return correct;
02468 }

static BOOL run_trans2test ( int  dummy  )  [static]

torture.c2474 行で定義されています。

参照先 clicli_close()cli_errstr()cli_mkdir()cli_open()cli_qfileinfo()cli_qfilename()cli_qpathinfo()cli_qpathinfo2()cli_rmdir()cli_unlink()cli_write()printf()sizetorture_close_connection()torture_open_connection().

02475 {
02476         struct cli_state *cli;
02477         int fnum;
02478         SMB_OFF_T size;
02479         time_t c_time, a_time, m_time;
02480         struct timespec c_time_ts, a_time_ts, m_time_ts, w_time_ts, m_time2_ts;
02481         const char *fname = "\\trans2.tst";
02482         const char *dname = "\\trans2";
02483         const char *fname2 = "\\trans2\\trans2.tst";
02484         pstring pname;
02485         BOOL correct = True;
02486 
02487         printf("starting trans2 test\n");
02488 
02489         if (!torture_open_connection(&cli, 0)) {
02490                 return False;
02491         }
02492 
02493         cli_unlink(cli, fname);
02494         fnum = cli_open(cli, fname, 
02495                         O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
02496         if (!cli_qfileinfo(cli, fnum, NULL, &size, &c_time_ts, &a_time_ts, &w_time_ts,
02497                            &m_time_ts, NULL)) {
02498                 printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(cli));
02499                 correct = False;
02500         }
02501 
02502         if (!cli_qfilename(cli, fnum, pname)) {
02503                 printf("ERROR: qfilename failed (%s)\n", cli_errstr(cli));
02504                 correct = False;
02505         }
02506 
02507         if (strcmp(pname, fname)) {
02508                 printf("qfilename gave different name? [%s] [%s]\n",
02509                        fname, pname);
02510                 correct = False;
02511         }
02512 
02513         cli_close(cli, fnum);
02514 
02515         sleep(2);
02516 
02517         cli_unlink(cli, fname);
02518         fnum = cli_open(cli, fname, 
02519                         O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
02520         if (fnum == -1) {
02521                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
02522                 return False;
02523         }
02524         cli_close(cli, fnum);
02525 
02526         if (!cli_qpathinfo(cli, fname, &c_time, &a_time, &m_time, &size, NULL)) {
02527                 printf("ERROR: qpathinfo failed (%s)\n", cli_errstr(cli));
02528                 correct = False;
02529         } else {
02530                 if (c_time != m_time) {
02531                         printf("create time=%s", ctime(&c_time));
02532                         printf("modify time=%s", ctime(&m_time));
02533                         printf("This system appears to have sticky create times\n");
02534                 }
02535                 if (a_time % (60*60) == 0) {
02536                         printf("access time=%s", ctime(&a_time));
02537                         printf("This system appears to set a midnight access time\n");
02538                         correct = False;
02539                 }
02540 
02541                 if (abs(m_time - time(NULL)) > 60*60*24*7) {
02542                         printf("ERROR: totally incorrect times - maybe word reversed? mtime=%s", ctime(&m_time));
02543                         correct = False;
02544                 }
02545         }
02546 
02547 
02548         cli_unlink(cli, fname);
02549         fnum = cli_open(cli, fname, 
02550                         O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
02551         cli_close(cli, fnum);
02552         if (!cli_qpathinfo2(cli, fname, &c_time_ts, &a_time_ts, &w_time_ts, 
02553                             &m_time_ts, &size, NULL, NULL)) {
02554                 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
02555                 correct = False;
02556         } else {
02557                 if (w_time_ts.tv_sec < 60*60*24*2) {
02558                         printf("write time=%s", ctime(&w_time_ts.tv_sec));
02559                         printf("This system appears to set a initial 0 write time\n");
02560                         correct = False;
02561                 }
02562         }
02563 
02564         cli_unlink(cli, fname);
02565 
02566 
02567         /* check if the server updates the directory modification time
02568            when creating a new file */
02569         if (!cli_mkdir(cli, dname)) {
02570                 printf("ERROR: mkdir failed (%s)\n", cli_errstr(cli));
02571                 correct = False;
02572         }
02573         sleep(3);
02574         if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time_ts, &a_time_ts, &w_time_ts, 
02575                             &m_time_ts, &size, NULL, NULL)) {
02576                 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
02577                 correct = False;
02578         }
02579 
02580         fnum = cli_open(cli, fname2, 
02581                         O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
02582         cli_write(cli, fnum,  0, (char *)&fnum, 0, sizeof(fnum));
02583         cli_close(cli, fnum);
02584         if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time_ts, &a_time_ts, &w_time_ts, 
02585                             &m_time2_ts, &size, NULL, NULL)) {
02586                 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
02587                 correct = False;
02588         } else {
02589                 if (memcmp(&m_time_ts, &m_time2_ts, sizeof(struct timespec))
02590                     == 0) {
02591                         printf("This system does not update directory modification times\n");
02592                         correct = False;
02593                 }
02594         }
02595         cli_unlink(cli, fname2);
02596         cli_rmdir(cli, dname);
02597 
02598         if (!torture_close_connection(cli)) {
02599                 correct = False;
02600         }
02601 
02602         printf("trans2 test finished\n");
02603 
02604         return correct;
02605 }

static BOOL new_trans ( struct cli_state pcli,
int  fnum,
int  level 
) [static]

torture.c2611 行で定義されています。

参照先 bufcli_errstr()cli_qfileinfo_test()dump_data()lenprintf().

参照元 run_w2ktest().

02612 {
02613         char *buf = NULL;
02614         uint32 len;
02615         BOOL correct = True;
02616 
02617         if (!cli_qfileinfo_test(pcli, fnum, level, &buf, &len)) {
02618                 printf("ERROR: qfileinfo (%d) failed (%s)\n", level, cli_errstr(pcli));
02619                 correct = False;
02620         } else {
02621                 printf("qfileinfo: level %d, len = %u\n", level, len);
02622                 dump_data(0, buf, len);
02623                 printf("\n");
02624         }
02625         SAFE_FREE(buf);
02626         return correct;
02627 }

static BOOL run_w2ktest ( int  dummy  )  [static]

torture.c2629 行で定義されています。

参照先 clicli_close()cli_open()levelnew_trans()printf()torture_close_connection()torture_open_connection().

02630 {
02631         struct cli_state *cli;
02632         int fnum;
02633         const char *fname = "\\w2ktest\\w2k.tst";
02634         int level;
02635         BOOL correct = True;
02636 
02637         printf("starting w2k test\n");
02638 
02639         if (!torture_open_connection(&cli, 0)) {
02640                 return False;
02641         }
02642 
02643         fnum = cli_open(cli, fname, 
02644                         O_RDWR | O_CREAT , DENY_NONE);
02645 
02646         for (level = 1004; level < 1040; level++) {
02647                 new_trans(cli, fnum, level);
02648         }
02649 
02650         cli_close(cli, fnum);
02651 
02652         if (!torture_close_connection(cli)) {
02653                 correct = False;
02654         }
02655 
02656         printf("w2k test finished\n");
02657         
02658         return correct;
02659 }

static BOOL run_oplock1 ( int  dummy  )  [static]

torture.c2665 行で定義されています。

参照先 cli_close()cli_errstr()cli_open()cli_sockopt()cli_unlink()printf()sockopstorture_close_connection()torture_open_connection()cli_state::use_oplocks.

02666 {
02667         struct cli_state *cli1;
02668         const char *fname = "\\lockt1.lck";
02669         int fnum1;
02670         BOOL correct = True;
02671 
02672         printf("starting oplock test 1\n");
02673 
02674         if (!torture_open_connection(&cli1, 0)) {
02675                 return False;
02676         }
02677 
02678         cli_unlink(cli1, fname);
02679 
02680         cli_sockopt(cli1, sockops);
02681 
02682         cli1->use_oplocks = True;
02683 
02684         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02685         if (fnum1 == -1) {
02686                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
02687                 return False;
02688         }
02689 
02690         cli1->use_oplocks = False;
02691 
02692         cli_unlink(cli1, fname);
02693         cli_unlink(cli1, fname);
02694 
02695         if (!cli_close(cli1, fnum1)) {
02696                 printf("close2 failed (%s)\n", cli_errstr(cli1));
02697                 return False;
02698         }
02699 
02700         if (!cli_unlink(cli1, fname)) {
02701                 printf("unlink failed (%s)\n", cli_errstr(cli1));
02702                 return False;
02703         }
02704 
02705         if (!torture_close_connection(cli1)) {
02706                 correct = False;
02707         }
02708 
02709         printf("finished oplock test 1\n");
02710 
02711         return correct;
02712 }

static BOOL run_oplock2 ( int  dummy  )  [static]

torture.c2714 行で定義されています。

参照先 bufcli_close()cli_errstr()cli_lock()cli_open()cli_read()cli_sockopt()cli_unlink()cli_unlock()cli_write()printf()READ_LOCKshm_setup()sockopstorture_close_connection()torture_open_connection()cli_state::use_level_II_oplocksuse_level_II_oplockscli_state::use_oplocksuse_oplocksWRITE_LOCK.

02715 {
02716         struct cli_state *cli1, *cli2;
02717         const char *fname = "\\lockt2.lck";
02718         int fnum1, fnum2;
02719         int saved_use_oplocks = use_oplocks;
02720         char buf[4];
02721         BOOL correct = True;
02722         volatile BOOL *shared_correct;
02723 
02724         shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
02725         *shared_correct = True;
02726 
02727         use_level_II_oplocks = True;
02728         use_oplocks = True;
02729 
02730         printf("starting oplock test 2\n");
02731 
02732         if (!torture_open_connection(&cli1, 0)) {
02733                 use_level_II_oplocks = False;
02734                 use_oplocks = saved_use_oplocks;
02735                 return False;
02736         }
02737 
02738         cli1->use_oplocks = True;
02739         cli1->use_level_II_oplocks = True;
02740 
02741         if (!torture_open_connection(&cli2, 1)) {
02742                 use_level_II_oplocks = False;
02743                 use_oplocks = saved_use_oplocks;
02744                 return False;
02745         }
02746 
02747         cli2->use_oplocks = True;
02748         cli2->use_level_II_oplocks = True;
02749 
02750         cli_unlink(cli1, fname);
02751 
02752         cli_sockopt(cli1, sockops);
02753         cli_sockopt(cli2, sockops);
02754 
02755         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
02756         if (fnum1 == -1) {
02757                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
02758                 return False;
02759         }
02760 
02761         /* Don't need the globals any more. */
02762         use_level_II_oplocks = False;
02763         use_oplocks = saved_use_oplocks;
02764 
02765         if (fork() == 0) {
02766                 /* Child code */
02767                 fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
02768                 if (fnum2 == -1) {
02769                         printf("second open of %s failed (%s)\n", fname, cli_errstr(cli1));
02770                         *shared_correct = False;
02771                         exit(0);
02772                 }
02773 
02774                 sleep(2);
02775 
02776                 if (!cli_close(cli2, fnum2)) {
02777                         printf("close2 failed (%s)\n", cli_errstr(cli1));
02778                         *shared_correct = False;
02779                 }
02780 
02781                 exit(0);
02782         }
02783 
02784         sleep(2);
02785 
02786         /* Ensure cli1 processes the break. Empty file should always return 0
02787          * bytes.  */
02788 
02789         if (cli_read(cli1, fnum1, buf, 0, 4) != 0) {
02790                 printf("read on fnum1 failed (%s)\n", cli_errstr(cli1));
02791                 correct = False;
02792         }
02793 
02794         /* Should now be at level II. */
02795         /* Test if sending a write locks causes a break to none. */
02796 
02797         if (!cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK)) {
02798                 printf("lock failed (%s)\n", cli_errstr(cli1));
02799                 correct = False;
02800         }
02801 
02802         cli_unlock(cli1, fnum1, 0, 4);
02803 
02804         sleep(2);
02805 
02806         if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
02807                 printf("lock failed (%s)\n", cli_errstr(cli1));
02808                 correct = False;
02809         }
02810 
02811         cli_unlock(cli1, fnum1, 0, 4);
02812 
02813         sleep(2);
02814 
02815         cli_read(cli1, fnum1, buf, 0, 4);
02816 
02817 #if 0
02818         if (cli_write(cli1, fnum1, 0, buf, 0, 4) != 4) {
02819                 printf("write on fnum1 failed (%s)\n", cli_errstr(cli1));
02820                 correct = False;
02821         }
02822 #endif
02823 
02824         if (!cli_close(cli1, fnum1)) {
02825                 printf("close1 failed (%s)\n", cli_errstr(cli1));
02826                 correct = False;
02827         }
02828 
02829         sleep(4);
02830 
02831         if (!cli_unlink(cli1, fname)) {
02832                 printf("unlink failed (%s)\n", cli_errstr(cli1));
02833                 correct = False;
02834         }
02835 
02836         if (!torture_close_connection(cli1)) {
02837                 correct = False;
02838         }
02839 
02840         if (!*shared_correct) {
02841                 correct = False;
02842         }
02843 
02844         printf("finished oplock test 2\n");
02845 
02846         return correct;
02847 }

static BOOL oplock3_handler ( struct cli_state cli,
int  fnum,
unsigned char  level 
) [static]

torture.c2850 行で定義されています。

参照先 clicli_oplock_ack()printf().

参照元 run_oplock3().

02851 {
02852         printf("got oplock break fnum=%d level=%d\n",
02853                fnum, level);
02854         return cli_oplock_ack(cli, fnum, level);
02855 }

static BOOL run_oplock3 ( int  dummy  )  [static]

torture.c2857 行で定義されています。

参照先 bufclicli_close()cli_open()cli_oplock_handler()cli_receive_smb()cli_write()oplock3_handler()printf()shm_setup()cli_state::timeouttorture_open_connection()use_level_II_oplocksuse_oplocks.

02858 {
02859         struct cli_state *cli;
02860         const char *fname = "\\oplockt3.dat";
02861         int fnum;
02862         char buf[4] = "abcd";
02863         BOOL correct = True;
02864         volatile BOOL *shared_correct;
02865 
02866         shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
02867         *shared_correct = True;
02868 
02869         printf("starting oplock test 3\n");
02870 
02871         if (fork() == 0) {
02872                 /* Child code */
02873                 use_oplocks = True;
02874                 use_level_II_oplocks = True;
02875                 if (!torture_open_connection(&cli, 0)) {
02876                         *shared_correct = False;
02877                         exit(0);
02878                 } 
02879                 sleep(2);
02880                 /* try to trigger a oplock break in parent */
02881                 fnum = cli_open(cli, fname, O_RDWR, DENY_NONE);
02882                 cli_write(cli, fnum, 0, buf, 0, 4);
02883                 exit(0);
02884         }
02885 
02886         /* parent code */
02887         use_oplocks = True;
02888         use_level_II_oplocks = True;
02889         if (!torture_open_connection(&cli, 1)) { /* other is forked */
02890                 return False;
02891         }
02892         cli_oplock_handler(cli, oplock3_handler);
02893         fnum = cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE);
02894         cli_write(cli, fnum, 0, buf, 0, 4);
02895         cli_close(cli, fnum);
02896         fnum = cli_open(cli, fname, O_RDWR, DENY_NONE);
02897         cli->timeout = 20000;
02898         cli_receive_smb(cli);
02899         printf("finished oplock test 3\n");
02900 
02901         return (correct && *shared_correct);
02902 
02903 /* What are we looking for here?  What's sucess and what's FAILURE? */
02904 }

static BOOL run_deletetest ( int  dummy  )  [static]

torture.c2911 行で定義されています。

参照先 cli_close()cli_errstr()cli_nt_create_full()cli_nt_delete_on_close()cli_nt_error()cli_open()cli_qfileinfo_test()cli_setatr()cli_sockopt()cli_unlink()lennt_errstr()printf()sockopstorture_close_connection()torture_open_connection().

02912 {
02913         struct cli_state *cli1 = NULL;
02914         struct cli_state *cli2 = NULL;
02915         const char *fname = "\\delete.file";
02916         int fnum1 = -1;
02917         int fnum2 = -1;
02918         BOOL correct = True;
02919         
02920         printf("starting delete test\n");
02921         
02922         if (!torture_open_connection(&cli1, 0)) {
02923                 return False;
02924         }
02925         
02926         cli_sockopt(cli1, sockops);
02927 
02928         /* Test 1 - this should delete the file on close. */
02929         
02930         cli_setatr(cli1, fname, 0, 0);
02931         cli_unlink(cli1, fname);
02932         
02933         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
02934                                    0, FILE_OVERWRITE_IF, 
02935                                    FILE_DELETE_ON_CLOSE, 0);
02936         
02937         if (fnum1 == -1) {
02938                 printf("[1] open of %s failed (%s)\n", fname, cli_errstr(cli1));
02939                 correct = False;
02940                 goto fail;
02941         }
02942 
02943 #if 0 /* JRATEST */
02944         {
02945                 uint32 *accinfo = NULL;
02946                 uint32 len;
02947                 cli_qfileinfo_test(cli1, fnum1, SMB_FILE_ACCESS_INFORMATION, (char **)&accinfo, &len);
02948                 if (accinfo)
02949                         printf("access mode = 0x%lx\n", *accinfo);
02950                 SAFE_FREE(accinfo);
02951         }
02952 #endif
02953 
02954         if (!cli_close(cli1, fnum1)) {
02955                 printf("[1] close failed (%s)\n", cli_errstr(cli1));
02956                 correct = False;
02957                 goto fail;
02958         }
02959 
02960         fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
02961         if (fnum1 != -1) {
02962                 printf("[1] open of %s succeeded (should fail)\n", fname);
02963                 correct = False;
02964                 goto fail;
02965         }
02966         
02967         printf("first delete on close test succeeded.\n");
02968         
02969         /* Test 2 - this should delete the file on close. */
02970         
02971         cli_setatr(cli1, fname, 0, 0);
02972         cli_unlink(cli1, fname);
02973         
02974         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS,
02975                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, 
02976                                    FILE_OVERWRITE_IF, 0, 0);
02977         
02978         if (fnum1 == -1) {
02979                 printf("[2] open of %s failed (%s)\n", fname, cli_errstr(cli1));
02980                 correct = False;
02981                 goto fail;
02982         }
02983         
02984         if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
02985                 printf("[2] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
02986                 correct = False;
02987                 goto fail;
02988         }
02989         
02990         if (!cli_close(cli1, fnum1)) {
02991                 printf("[2] close failed (%s)\n", cli_errstr(cli1));
02992                 correct = False;
02993                 goto fail;
02994         }
02995         
02996         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
02997         if (fnum1 != -1) {
02998                 printf("[2] open of %s succeeded should have been deleted on close !\n", fname);
02999                 if (!cli_close(cli1, fnum1)) {
03000                         printf("[2] close failed (%s)\n", cli_errstr(cli1));
03001                         correct = False;
03002                         goto fail;
03003                 }
03004                 cli_unlink(cli1, fname);
03005         } else
03006                 printf("second delete on close test succeeded.\n");
03007         
03008         /* Test 3 - ... */
03009         cli_setatr(cli1, fname, 0, 0);
03010         cli_unlink(cli1, fname);
03011 
03012         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
03013                                    FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
03014 
03015         if (fnum1 == -1) {
03016                 printf("[3] open - 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03017                 correct = False;
03018                 goto fail;
03019         }
03020 
03021         /* This should fail with a sharing violation - open for delete is only compatible
03022            with SHARE_DELETE. */
03023 
03024         fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03025                         FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, 0);
03026 
03027         if (fnum2 != -1) {
03028                 printf("[3] open  - 2 of %s succeeded - should have failed.\n", fname);
03029                 correct = False;
03030                 goto fail;
03031         }
03032 
03033         /* This should succeed. */
03034 
03035         fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03036                         FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
03037 
03038         if (fnum2 == -1) {
03039                 printf("[3] open  - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
03040                 correct = False;
03041                 goto fail;
03042         }
03043 
03044         if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
03045                 printf("[3] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
03046                 correct = False;
03047                 goto fail;
03048         }
03049         
03050         if (!cli_close(cli1, fnum1)) {
03051                 printf("[3] close 1 failed (%s)\n", cli_errstr(cli1));
03052                 correct = False;
03053                 goto fail;
03054         }
03055         
03056         if (!cli_close(cli1, fnum2)) {
03057                 printf("[3] close 2 failed (%s)\n", cli_errstr(cli1));
03058                 correct = False;
03059                 goto fail;
03060         }
03061         
03062         /* This should fail - file should no longer be there. */
03063 
03064         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
03065         if (fnum1 != -1) {
03066                 printf("[3] open of %s succeeded should have been deleted on close !\n", fname);
03067                 if (!cli_close(cli1, fnum1)) {
03068                         printf("[3] close failed (%s)\n", cli_errstr(cli1));
03069                 }
03070                 cli_unlink(cli1, fname);
03071                 correct = False;
03072                 goto fail;
03073         } else
03074                 printf("third delete on close test succeeded.\n");
03075 
03076         /* Test 4 ... */
03077         cli_setatr(cli1, fname, 0, 0);
03078         cli_unlink(cli1, fname);
03079 
03080         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
03081                         FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
03082                                                                 
03083         if (fnum1 == -1) {
03084                 printf("[4] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03085                 correct = False;
03086                 goto fail;
03087         }
03088 
03089         /* This should succeed. */
03090         fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
03091                         FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
03092         if (fnum2 == -1) {
03093                 printf("[4] open  - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
03094                 correct = False;
03095                 goto fail;
03096         }
03097         
03098         if (!cli_close(cli1, fnum2)) {
03099                 printf("[4] close - 1 failed (%s)\n", cli_errstr(cli1));
03100                 correct = False;
03101                 goto fail;
03102         }
03103         
03104         if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
03105                 printf("[4] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
03106                 correct = False;
03107                 goto fail;
03108         }
03109         
03110         /* This should fail - no more opens once delete on close set. */
03111         fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
03112                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
03113                                    FILE_OPEN, 0, 0);
03114         if (fnum2 != -1) {
03115                 printf("[4] open  - 3 of %s succeeded ! Should have failed.\n", fname );
03116                 correct = False;
03117                 goto fail;
03118         } else
03119                 printf("fourth delete on close test succeeded.\n");
03120         
03121         if (!cli_close(cli1, fnum1)) {
03122                 printf("[4] close - 2 failed (%s)\n", cli_errstr(cli1));
03123                 correct = False;
03124                 goto fail;
03125         }
03126         
03127         /* Test 5 ... */
03128         cli_setatr(cli1, fname, 0, 0);
03129         cli_unlink(cli1, fname);
03130         
03131         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT, DENY_NONE);
03132         if (fnum1 == -1) {
03133                 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03134                 correct = False;
03135                 goto fail;
03136         }
03137 
03138         /* This should fail - only allowed on NT opens with DELETE access. */
03139 
03140         if (cli_nt_delete_on_close(cli1, fnum1, True)) {
03141                 printf("[5] setting delete_on_close on OpenX file succeeded - should fail !\n");
03142                 correct = False;
03143                 goto fail;
03144         }
03145 
03146         if (!cli_close(cli1, fnum1)) {
03147                 printf("[5] close - 2 failed (%s)\n", cli_errstr(cli1));
03148                 correct = False;
03149                 goto fail;
03150         }
03151         
03152         printf("fifth delete on close test succeeded.\n");
03153         
03154         /* Test 6 ... */
03155         cli_setatr(cli1, fname, 0, 0);
03156         cli_unlink(cli1, fname);
03157         
03158         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
03159                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
03160                                    FILE_OVERWRITE_IF, 0, 0);
03161         
03162         if (fnum1 == -1) {
03163                 printf("[6] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03164                 correct = False;
03165                 goto fail;
03166         }
03167         
03168         /* This should fail - only allowed on NT opens with DELETE access. */
03169         
03170         if (cli_nt_delete_on_close(cli1, fnum1, True)) {
03171                 printf("[6] setting delete_on_close on file with no delete access succeeded - should fail !\n");
03172                 correct = False;
03173                 goto fail;
03174         }
03175 
03176         if (!cli_close(cli1, fnum1)) {
03177                 printf("[6] close - 2 failed (%s)\n", cli_errstr(cli1));
03178                 correct = False;
03179                 goto fail;
03180         }
03181 
03182         printf("sixth delete on close test succeeded.\n");
03183         
03184         /* Test 7 ... */
03185         cli_setatr(cli1, fname, 0, 0);
03186         cli_unlink(cli1, fname);
03187         
03188         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
03189                                    FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0);
03190                                                                 
03191         if (fnum1 == -1) {
03192                 printf("[7] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03193                 correct = False;
03194                 goto fail;
03195         }
03196 
03197         if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
03198                 printf("[7] setting delete_on_close on file failed !\n");
03199                 correct = False;
03200                 goto fail;
03201         }
03202         
03203         if (!cli_nt_delete_on_close(cli1, fnum1, False)) {
03204                 printf("[7] unsetting delete_on_close on file failed !\n");
03205                 correct = False;
03206                 goto fail;
03207         }
03208 
03209         if (!cli_close(cli1, fnum1)) {
03210                 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
03211                 correct = False;
03212                 goto fail;
03213         }
03214         
03215         /* This next open should succeed - we reset the flag. */
03216         
03217         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
03218         if (fnum1 == -1) {
03219                 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03220                 correct = False;
03221                 goto fail;
03222         }
03223 
03224         if (!cli_close(cli1, fnum1)) {
03225                 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
03226                 correct = False;
03227                 goto fail;
03228         }
03229 
03230         printf("seventh delete on close test succeeded.\n");
03231         
03232         /* Test 7 ... */
03233         cli_setatr(cli1, fname, 0, 0);
03234         cli_unlink(cli1, fname);
03235         
03236         if (!torture_open_connection(&cli2, 1)) {
03237                 printf("[8] failed to open second connection.\n");
03238                 correct = False;
03239                 goto fail;
03240         }
03241 
03242         cli_sockopt(cli1, sockops);
03243         
03244         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
03245                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
03246                                    FILE_OVERWRITE_IF, 0, 0);
03247         
03248         if (fnum1 == -1) {
03249                 printf("[8] open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03250                 correct = False;
03251                 goto fail;
03252         }
03253 
03254         fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
03255                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
03256                                    FILE_OPEN, 0, 0);
03257         
03258         if (fnum2 == -1) {
03259                 printf("[8] open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03260                 correct = False;
03261                 goto fail;
03262         }
03263 
03264         if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
03265                 printf("[8] setting delete_on_close on file failed !\n");
03266                 correct = False;
03267                 goto fail;
03268         }
03269         
03270         if (!cli_close(cli1, fnum1)) {
03271                 printf("[8] close - 1 failed (%s)\n", cli_errstr(cli1));
03272                 correct = False;
03273                 goto fail;
03274         }
03275 
03276         if (!cli_close(cli2, fnum2)) {
03277                 printf("[8] close - 2 failed (%s)\n", cli_errstr(cli2));
03278                 correct = False;
03279                 goto fail;
03280         }
03281 
03282         /* This should fail.. */
03283         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
03284         if (fnum1 != -1) {
03285                 printf("[8] open of %s succeeded should have been deleted on close !\n", fname);
03286                 goto fail;
03287                 correct = False;
03288         } else
03289                 printf("eighth delete on close test succeeded.\n");
03290 
03291         /* This should fail - we need to set DELETE_ACCESS. */
03292         fnum1 = cli_nt_create_full(cli1, fname, 0,FILE_READ_DATA|FILE_WRITE_DATA,
03293                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
03294         
03295         if (fnum1 != -1) {
03296                 printf("[9] open of %s succeeded should have failed!\n", fname);
03297                 correct = False;
03298                 goto fail;
03299         }
03300 
03301         printf("ninth delete on close test succeeded.\n");
03302 
03303         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
03304                                    FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
03305         if (fnum1 == -1) {
03306                 printf("[10] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03307                 correct = False;
03308                 goto fail;
03309         }
03310 
03311         /* This should delete the file. */
03312         if (!cli_close(cli1, fnum1)) {
03313                 printf("[10] close failed (%s)\n", cli_errstr(cli1));
03314                 correct = False;
03315                 goto fail;
03316         }
03317 
03318         /* This should fail.. */
03319         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
03320         if (fnum1 != -1) {
03321                 printf("[10] open of %s succeeded should have been deleted on close !\n", fname);
03322                 goto fail;
03323                 correct = False;
03324         } else
03325                 printf("tenth delete on close test succeeded.\n");
03326 
03327         cli_setatr(cli1, fname, 0, 0);
03328         cli_unlink(cli1, fname);
03329 
03330         /* What error do we get when attempting to open a read-only file with
03331            delete access ? */
03332 
03333         /* Create a readonly file. */
03334         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
03335                                    FILE_ATTRIBUTE_READONLY, FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03336         if (fnum1 == -1) {
03337                 printf("[11] open of %s failed (%s)\n", fname, cli_errstr(cli1));
03338                 correct = False;
03339                 goto fail;
03340         }
03341 
03342         if (!cli_close(cli1, fnum1)) {
03343                 printf("[11] close failed (%s)\n", cli_errstr(cli1));
03344                 correct = False;
03345                 goto fail;
03346         }
03347 
03348         /* Now try open for delete access. */
03349         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES|DELETE_ACCESS,
03350                                    0, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
03351                                    FILE_OVERWRITE_IF, 0, 0);
03352         
03353         if (fnum1 != -1) {
03354                 printf("[11] open of %s succeeded should have been denied with ACCESS_DENIED!\n", fname);
03355                 cli_close(cli1, fnum1);
03356                 goto fail;
03357                 correct = False;
03358         } else {
03359                 NTSTATUS nterr = cli_nt_error(cli1);
03360                 if (!NT_STATUS_EQUAL(nterr,NT_STATUS_ACCESS_DENIED)) {
03361                         printf("[11] open of %s should have been denied with ACCESS_DENIED! Got error %s\n", fname, nt_errstr(nterr));
03362                         goto fail;
03363                         correct = False;
03364                 } else {
03365                         printf("eleventh delete on close test succeeded.\n");
03366                 }
03367         }
03368         
03369         printf("finished delete test\n");
03370 
03371   fail:
03372         /* FIXME: This will crash if we aborted before cli2 got
03373          * intialized, because these functions don't handle
03374          * uninitialized connections. */
03375                 
03376         if (fnum1 != -1) cli_close(cli1, fnum1);
03377         if (fnum2 != -1) cli_close(cli1, fnum2);
03378         cli_setatr(cli1, fname, 0, 0);
03379         cli_unlink(cli1, fname);
03380 
03381         if (cli1 && !torture_close_connection(cli1)) {
03382                 correct = False;
03383         }
03384         if (cli2 && !torture_close_connection(cli2)) {
03385                 correct = False;
03386         }
03387         return correct;
03388 }

static BOOL run_properties ( int  dummy  )  [static]

torture.c3394 行で定義されています。

参照先 cli_state::capabilitiesclicli_sockopt()d_printf()printf()sockopstorture_close_connection()torture_open_connection().

03395 {
03396         static struct cli_state *cli;
03397         BOOL correct = True;
03398         
03399         printf("starting properties test\n");
03400         
03401         ZERO_STRUCT(cli);
03402 
03403         if (!torture_open_connection(&cli, 0)) {
03404                 return False;
03405         }
03406         
03407         cli_sockopt(cli, sockops);
03408 
03409         d_printf("Capabilities 0x%08x\n", cli->capabilities);
03410 
03411         if (!torture_close_connection(cli)) {
03412                 correct = False;
03413         }
03414 
03415         return correct;
03416 }

static BOOL run_xcopy ( int  dummy  )  [static]

torture.c3442 行で定義されています。

参照先 cli_errstr()cli_nt_create_full()printf()torture_close_connection()torture_open_connection().

03443 {
03444         static struct cli_state *cli1;
03445         const char *fname = "\\test.txt";
03446         BOOL correct = True;
03447         int fnum1, fnum2;
03448 
03449         printf("starting xcopy test\n");
03450         
03451         if (!torture_open_connection(&cli1, 0)) {
03452                 return False;
03453         }
03454         
03455         fnum1 = cli_nt_create_full(cli1, fname, 0,
03456                                    FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
03457                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 
03458                                    0x4044, 0);
03459 
03460         if (fnum1 == -1) {
03461                 printf("First open failed - %s\n", cli_errstr(cli1));
03462                 return False;
03463         }
03464 
03465         fnum2 = cli_nt_create_full(cli1, fname, 0,
03466                                    SECOND_DESIRED_ACCESS, 0,
03467                                    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 
03468                                    0x200000, 0);
03469         if (fnum2 == -1) {
03470                 printf("second open failed - %s\n", cli_errstr(cli1));
03471                 return False;
03472         }
03473         
03474         if (!torture_close_connection(cli1)) {
03475                 correct = False;
03476         }
03477         
03478         return correct;
03479 }

static BOOL run_rename ( int  dummy  )  [static]

torture.c3484 行で定義されています。

参照先 cli_close()cli_errstr()cli_nt_create_full()cli_nt_delete_on_close()cli_rename()cli_unlink()printf()torture_close_connection()torture_open_connection().

03485 {
03486         static struct cli_state *cli1;
03487         const char *fname = "\\test.txt";
03488         const char *fname1 = "\\test1.txt";
03489         BOOL correct = True;
03490         int fnum1;
03491 
03492         printf("starting rename test\n");
03493         
03494         if (!torture_open_connection(&cli1, 0)) {
03495                 return False;
03496         }
03497         
03498         cli_unlink(cli1, fname);
03499         cli_unlink(cli1, fname1);
03500         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03501                                    FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
03502 
03503         if (fnum1 == -1) {
03504                 printf("First open failed - %s\n", cli_errstr(cli1));
03505                 return False;
03506         }
03507 
03508         if (!cli_rename(cli1, fname, fname1)) {
03509                 printf("First rename failed (SHARE_READ) (this is correct) - %s\n", cli_errstr(cli1));
03510         } else {
03511                 printf("First rename succeeded (SHARE_READ) - this should have failed !\n");
03512                 correct = False;
03513         }
03514 
03515         if (!cli_close(cli1, fnum1)) {
03516                 printf("close - 1 failed (%s)\n", cli_errstr(cli1));
03517                 return False;
03518         }
03519 
03520         cli_unlink(cli1, fname);
03521         cli_unlink(cli1, fname1);
03522         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03523 #if 0
03524                                    FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03525 #else
03526                                    FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
03527 #endif
03528 
03529         if (fnum1 == -1) {
03530                 printf("Second open failed - %s\n", cli_errstr(cli1));
03531                 return False;
03532         }
03533 
03534         if (!cli_rename(cli1, fname, fname1)) {
03535                 printf("Second rename failed (SHARE_DELETE | SHARE_READ) - this should have succeeded - %s\n", cli_errstr(cli1));
03536                 correct = False;
03537         } else {
03538                 printf("Second rename succeeded (SHARE_DELETE | SHARE_READ)\n");
03539         }
03540 
03541         if (!cli_close(cli1, fnum1)) {
03542                 printf("close - 2 failed (%s)\n", cli_errstr(cli1));
03543                 return False;
03544         }
03545 
03546         cli_unlink(cli1, fname);
03547         cli_unlink(cli1, fname1);
03548 
03549         fnum1 = cli_nt_create_full(cli1, fname, 0, READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
03550                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03551 
03552         if (fnum1 == -1) {
03553                 printf("Third open failed - %s\n", cli_errstr(cli1));
03554                 return False;
03555         }
03556 
03557 
03558 #if 0
03559   {
03560   int fnum2;
03561 
03562         fnum2 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
03563                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03564 
03565         if (fnum2 == -1) {
03566                 printf("Fourth open failed - %s\n", cli_errstr(cli1));
03567                 return False;
03568         }
03569         if (!cli_nt_delete_on_close(cli1, fnum2, True)) {
03570                 printf("[8] setting delete_on_close on file failed !\n");
03571                 return False;
03572         }
03573         
03574         if (!cli_close(cli1, fnum2)) {
03575                 printf("close - 4 failed (%s)\n", cli_errstr(cli1));
03576                 return False;
03577         }
03578   }
03579 #endif
03580 
03581         if (!cli_rename(cli1, fname, fname1)) {
03582                 printf("Third rename failed (SHARE_NONE) - this should have succeeded - %s\n", cli_errstr(cli1));
03583                 correct = False;
03584         } else {
03585                 printf("Third rename succeeded (SHARE_NONE)\n");
03586         }
03587 
03588         if (!cli_close(cli1, fnum1)) {
03589                 printf("close - 3 failed (%s)\n", cli_errstr(cli1));
03590                 return False;
03591         }
03592 
03593         cli_unlink(cli1, fname);
03594         cli_unlink(cli1, fname1);
03595 
03596         /*----*/
03597 
03598         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03599                                    FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
03600 
03601         if (fnum1 == -1) {
03602                 printf("Fourth open failed - %s\n", cli_errstr(cli1));
03603                 return False;
03604         }
03605 
03606         if (!cli_rename(cli1, fname, fname1)) {
03607                 printf("Fourth rename failed (SHARE_READ | SHARE_WRITE) (this is correct) - %s\n", cli_errstr(cli1));
03608         } else {
03609                 printf("Fourth rename succeeded (SHARE_READ | SHARE_WRITE) - this should have failed !\n");
03610                 correct = False;
03611         }
03612 
03613         if (!cli_close(cli1, fnum1)) {
03614                 printf("close - 4 failed (%s)\n", cli_errstr(cli1));
03615                 return False;
03616         }
03617 
03618         cli_unlink(cli1, fname);
03619         cli_unlink(cli1, fname1);
03620 
03621         /*--*/
03622 
03623         fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03624                                    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
03625 
03626         if (fnum1 == -1) {
03627                 printf("Fifth open failed - %s\n", cli_errstr(cli1));
03628                 return False;
03629         }
03630 
03631         if (!cli_rename(cli1, fname, fname1)) {
03632                 printf("Fifth rename failed (SHARE_READ | SHARE_WRITE | SHARE_DELETE) - this should have failed ! \n");
03633                 correct = False;
03634         } else {
03635                 printf("Fifth rename succeeded (SHARE_READ | SHARE_WRITE | SHARE_DELETE) (this is correct) - %s\n", cli_errstr(cli1));
03636         }
03637 
03638         /*
03639          * Now check if the first name still exists ...
03640          */
03641 
03642         /*fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
03643                                    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
03644 
03645         if (fnum2 == -1) {
03646           printf("Opening original file after rename of open file fails: %s\n",
03647               cli_errstr(cli1));
03648         }
03649         else {
03650           printf("Opening original file after rename of open file works ...\n");
03651           (void)cli_close(cli1, fnum2);
03652           } */
03653 
03654         /*--*/
03655 
03656 
03657         if (!cli_close(cli1, fnum1)) {
03658                 printf("close - 5 failed (%s)\n", cli_errstr(cli1));
03659                 return False;
03660         }
03661 
03662         cli_unlink(cli1, fname);
03663         cli_unlink(cli1, fname1);
03664         
03665         if (!torture_close_connection(cli1)) {
03666                 correct = False;
03667         }
03668         
03669         return correct;
03670 }

static BOOL run_pipe_number ( int  dummy  )  [static]

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

参照先 cli_errstr()cli_nt_create_full()cli_sockopt()printf()sockopstorture_close_connection()torture_open_connection().

03673 {
03674         struct cli_state *cli1;
03675         const char *pipe_name = "\\SPOOLSS";
03676         int fnum;
03677         int num_pipes = 0;
03678 
03679         printf("starting pipenumber test\n");
03680         if (!torture_open_connection(&cli1, 0)) {
03681                 return False;
03682         }
03683 
03684         cli_sockopt(cli1, sockops);
03685         while(1) {
03686                 fnum = cli_nt_create_full(cli1, pipe_name, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
03687                                    FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0, 0);
03688 
03689                 if (fnum == -1) {
03690                         printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(cli1));
03691                         break;
03692                 }
03693                 num_pipes++;
03694                 printf("\r%6d", num_pipes);
03695         }
03696 
03697         printf("pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
03698         torture_close_connection(cli1);
03699         return True;
03700 }

static BOOL run_opentest ( int  dummy  )  [static]

torture.c3705 行で定義されています。

参照先 bufcheck_error()cli_close()cli_ctemp()cli_errstr()cli_getatr()cli_nt_create_full()cli_open()cli_setatr()cli_sockopt()cli_unlink()cli_write()printf()sockopstorture_close_connection()torture_open_connection().

03706 {
03707         static struct cli_state *cli1;
03708         static struct cli_state *cli2;
03709         const char *fname = "\\readonly.file";
03710         int fnum1, fnum2;
03711         char buf[20];
03712         SMB_OFF_T fsize;
03713         BOOL correct = True;
03714         char *tmp_path;
03715 
03716         printf("starting open test\n");
03717         
03718         if (!torture_open_connection(&cli1, 0)) {
03719                 return False;
03720         }
03721         
03722         cli_setatr(cli1, fname, 0, 0);
03723         cli_unlink(cli1, fname);
03724         
03725         cli_sockopt(cli1, sockops);
03726         
03727         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
03728         if (fnum1 == -1) {
03729                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
03730                 return False;
03731         }
03732 
03733         if (!cli_close(cli1, fnum1)) {
03734                 printf("close2 failed (%s)\n", cli_errstr(cli1));
03735                 return False;
03736         }
03737         
03738         if (!cli_setatr(cli1, fname, aRONLY, 0)) {
03739                 printf("cli_setatr failed (%s)\n", cli_errstr(cli1));
03740                 return False;
03741         }
03742         
03743         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_WRITE);
03744         if (fnum1 == -1) {
03745                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
03746                 return False;
03747         }
03748         
03749         /* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
03750         fnum2 = cli_open(cli1, fname, O_RDWR, DENY_ALL);
03751         
03752         if (check_error(__LINE__, cli1, ERRDOS, ERRnoaccess, 
03753                         NT_STATUS_ACCESS_DENIED)) {
03754                 printf("correct error code ERRDOS/ERRnoaccess returned\n");
03755         }
03756         
03757         printf("finished open test 1\n");
03758         
03759         cli_close(cli1, fnum1);
03760         
03761         /* Now try not readonly and ensure ERRbadshare is returned. */
03762         
03763         cli_setatr(cli1, fname, 0, 0);
03764         
03765         fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_WRITE);
03766         if (fnum1 == -1) {
03767                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
03768                 return False;
03769         }
03770         
03771         /* This will fail - but the error should be ERRshare. */
03772         fnum2 = cli_open(cli1, fname, O_RDWR, DENY_ALL);
03773         
03774         if (check_error(__LINE__, cli1, ERRDOS, ERRbadshare, 
03775                         NT_STATUS_SHARING_VIOLATION)) {
03776                 printf("correct error code ERRDOS/ERRbadshare returned\n");
03777         }
03778         
03779         if (!cli_close(cli1, fnum1)) {
03780                 printf("close2 failed (%s)\n", cli_errstr(cli1));
03781                 return False;
03782         }
03783         
03784         cli_unlink(cli1, fname);
03785         
03786         printf("finished open test 2\n");
03787         
03788         /* Test truncate open disposition on file opened for read. */
03789         
03790         fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
03791         if (fnum1 == -1) {
03792                 printf("(3) open (1) of %s failed (%s)\n", fname, cli_errstr(cli1));
03793                 return False;
03794         }
03795         
03796         /* write 20 bytes. */
03797         
03798         memset(buf, '\0', 20);
03799 
03800         if (cli_write(cli1, fnum1, 0, buf, 0, 20) != 20) {
03801                 printf("write failed (%s)\n", cli_errstr(cli1));
03802                 correct = False;
03803         }
03804 
03805         if (!cli_close(cli1, fnum1)) {
03806                 printf("(3) close1 failed (%s)\n", cli_errstr(cli1));
03807                 return False;
03808         }
03809         
03810         /* Ensure size == 20. */
03811         if (!cli_getatr(cli1, fname, NULL, &fsize, NULL)) {
03812                 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
03813                 return False;
03814         }
03815         
03816         if (fsize != 20) {
03817                 printf("(3) file size != 20\n");
03818                 return False;
03819         }
03820 
03821         /* Now test if we can truncate a file opened for readonly. */
03822         
03823         fnum1 = cli_open(cli1, fname, O_RDONLY|O_TRUNC, DENY_NONE);
03824         if (fnum1 == -1) {
03825                 printf("(3) open (2) of %s failed (%s)\n", fname, cli_errstr(cli1));
03826                 return False;
03827         }
03828         
03829         if (!cli_close(cli1, fnum1)) {
03830                 printf("close2 failed (%s)\n", cli_errstr(cli1));
03831                 return False;
03832         }
03833 
03834         /* Ensure size == 0. */
03835         if (!cli_getatr(cli1, fname, NULL, &fsize, NULL)) {
03836                 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
03837                 return False;
03838         }
03839 
03840         if (fsize != 0) {
03841                 printf("(3) file size != 0\n");
03842                 return False;
03843         }
03844         printf("finished open test 3\n");
03845         
03846         cli_unlink(cli1, fname);
03847 
03848 
03849         printf("testing ctemp\n");
03850         fnum1 = cli_ctemp(cli1, "\\", &tmp_path);
03851         if (fnum1 == -1) {
03852                 printf("ctemp failed (%s)\n", cli_errstr(cli1));
03853                 return False;
03854         }
03855         printf("ctemp gave path %s\n", tmp_path);
03856         if (!cli_close(cli1, fnum1)) {
03857                 printf("close of temp failed (%s)\n", cli_errstr(cli1));
03858         }
03859         if (!cli_unlink(cli1, tmp_path)) {
03860                 printf("unlink of temp failed (%s)\n", cli_errstr(cli1));
03861         }
03862         
03863         /* Test the non-io opens... */
03864 
03865         if (!torture_open_connection(&cli2, 1)) {
03866                 return False;
03867         }
03868         
03869         cli_setatr(cli2, fname, 0, 0);
03870         cli_unlink(cli2, fname);
03871         
03872         cli_sockopt(cli2, sockops);
03873 
03874         printf("TEST #1 testing 2 non-io opens (no delete)\n");
03875         
03876         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03877                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03878 
03879         if (fnum1 == -1) {
03880                 printf("test 1 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03881                 return False;
03882         }
03883 
03884         fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03885                                    FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
03886 
03887         if (fnum2 == -1) {
03888                 printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03889                 return False;
03890         }
03891 
03892         if (!cli_close(cli1, fnum1)) {
03893                 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03894                 return False;
03895         }
03896         if (!cli_close(cli2, fnum2)) {
03897                 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03898                 return False;
03899         }
03900 
03901         printf("non-io open test #1 passed.\n");
03902 
03903         cli_unlink(cli1, fname);
03904 
03905         printf("TEST #2 testing 2 non-io opens (first with delete)\n");
03906         
03907         fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03908                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03909 
03910         if (fnum1 == -1) {
03911                 printf("test 2 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03912                 return False;
03913         }
03914 
03915         fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03916                                    FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
03917 
03918         if (fnum2 == -1) {
03919                 printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03920                 return False;
03921         }
03922 
03923         if (!cli_close(cli1, fnum1)) {
03924                 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03925                 return False;
03926         }
03927         if (!cli_close(cli2, fnum2)) {
03928                 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
03929                 return False;
03930         }
03931 
03932         printf("non-io open test #2 passed.\n");
03933 
03934         cli_unlink(cli1, fname);
03935 
03936         printf("TEST #3 testing 2 non-io opens (second with delete)\n");
03937         
03938         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03939                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03940 
03941         if (fnum1 == -1) {
03942                 printf("test 3 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03943                 return False;
03944         }
03945 
03946         fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03947                                    FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
03948 
03949         if (fnum2 == -1) {
03950                 printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03951                 return False;
03952         }
03953 
03954         if (!cli_close(cli1, fnum1)) {
03955                 printf("test 3 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03956                 return False;
03957         }
03958         if (!cli_close(cli2, fnum2)) {
03959                 printf("test 3 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
03960                 return False;
03961         }
03962 
03963         printf("non-io open test #3 passed.\n");
03964 
03965         cli_unlink(cli1, fname);
03966 
03967         printf("TEST #4 testing 2 non-io opens (both with delete)\n");
03968         
03969         fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03970                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
03971 
03972         if (fnum1 == -1) {
03973                 printf("test 4 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03974                 return False;
03975         }
03976 
03977         fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03978                                    FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
03979 
03980         if (fnum2 != -1) {
03981                 printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
03982                 return False;
03983         }
03984 
03985         printf("test 3 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
03986 
03987         if (!cli_close(cli1, fnum1)) {
03988                 printf("test 4 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
03989                 return False;
03990         }
03991 
03992         printf("non-io open test #4 passed.\n");
03993 
03994         cli_unlink(cli1, fname);
03995 
03996         printf("TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n");
03997         
03998         fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
03999                                    FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
04000 
04001         if (fnum1 == -1) {
04002                 printf("test 5 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04003                 return False;
04004         }
04005 
04006         fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
04007                                    FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
04008 
04009         if (fnum2 == -1) {
04010                 printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
04011                 return False;
04012         }
04013 
04014         if (!cli_close(cli1, fnum1)) {
04015                 printf("test 5 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04016                 return False;
04017         }
04018 
04019         if (!cli_close(cli2, fnum2)) {
04020                 printf("test 5 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
04021                 return False;
04022         }
04023 
04024         printf("non-io open test #5 passed.\n");
04025 
04026         printf("TEST #6 testing 1 non-io open, one io open\n");
04027         
04028         cli_unlink(cli1, fname);
04029 
04030         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
04031                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
04032 
04033         if (fnum1 == -1) {
04034                 printf("test 6 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04035                 return False;
04036         }
04037 
04038         fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
04039                                    FILE_SHARE_READ, FILE_OPEN_IF, 0, 0);
04040 
04041         if (fnum2 == -1) {
04042                 printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
04043                 return False;
04044         }
04045 
04046         if (!cli_close(cli1, fnum1)) {
04047                 printf("test 6 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04048                 return False;
04049         }
04050 
04051         if (!cli_close(cli2, fnum2)) {
04052                 printf("test 6 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
04053                 return False;
04054         }
04055 
04056         printf("non-io open test #6 passed.\n");
04057 
04058         printf("TEST #7 testing 1 non-io open, one io open with delete\n");
04059 
04060         cli_unlink(cli1, fname);
04061 
04062         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
04063                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
04064 
04065         if (fnum1 == -1) {
04066                 printf("test 7 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04067                 return False;
04068         }
04069 
04070         fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
04071                                    FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
04072 
04073         if (fnum2 != -1) {
04074                 printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
04075                 return False;
04076         }
04077 
04078         printf("test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
04079 
04080         if (!cli_close(cli1, fnum1)) {
04081                 printf("test 7 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
04082                 return False;
04083         }
04084 
04085         printf("non-io open test #7 passed.\n");
04086 
04087         cli_unlink(cli1, fname);
04088 
04089         if (!torture_close_connection(cli1)) {
04090                 correct = False;
04091         }
04092         if (!torture_close_connection(cli2)) {
04093                 correct = False;
04094         }
04095         
04096         return correct;
04097 }

static BOOL run_openattrtest ( int  dummy  )  [static]

torture.c4155 行で定義されています。

参照先 attr_resultscli_close()cli_errstr()cli_getatr()cli_nt_create_full()cli_nt_error()cli_setatr()cli_sockopt()cli_unlink()printf()sockopstorture_close_connection()torture_open_connection().

04156 {
04157         static struct cli_state *cli1;
04158         const char *fname = "\\openattr.file";
04159         int fnum1;
04160         BOOL correct = True;
04161         uint16 attr;
04162         unsigned int i, j, k, l;
04163 
04164         printf("starting open attr test\n");
04165         
04166         if (!torture_open_connection(&cli1, 0)) {
04167                 return False;
04168         }
04169         
04170         cli_sockopt(cli1, sockops);
04171 
04172         for (k = 0, i = 0; i < sizeof(open_attrs_table)/sizeof(uint32); i++) {
04173                 cli_setatr(cli1, fname, 0, 0);
04174                 cli_unlink(cli1, fname);
04175                 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_WRITE_DATA, open_attrs_table[i],
04176                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
04177 
04178                 if (fnum1 == -1) {
04179                         printf("open %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
04180                         return False;
04181                 }
04182 
04183                 if (!cli_close(cli1, fnum1)) {
04184                         printf("close %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
04185                         return False;
04186                 }
04187 
04188                 for (j = 0; j < sizeof(open_attrs_table)/sizeof(uint32); j++) {
04189                         fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA, open_attrs_table[j],
04190                                            FILE_SHARE_NONE, FILE_OVERWRITE, 0, 0);
04191 
04192                         if (fnum1 == -1) {
04193                                 for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
04194                                         if (attr_results[l].num == k) {
04195                                                 printf("[%d] trunc open 0x%x -> 0x%x of %s failed - should have succeeded !(0x%x:%s)\n",
04196                                                                 k, open_attrs_table[i],
04197                                                                 open_attrs_table[j],
04198                                                                 fname, NT_STATUS_V(cli_nt_error(cli1)), cli_errstr(cli1));
04199                                                 correct = False;
04200                                         }
04201                                 }
04202                                 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_ACCESS_DENIED)) {
04203                                         printf("[%d] trunc open 0x%x -> 0x%x failed with wrong error code %s\n",
04204                                                         k, open_attrs_table[i], open_attrs_table[j],
04205                                                         cli_errstr(cli1));
04206                                         correct = False;
04207                                 }
04208 #if 0
04209                                 printf("[%d] trunc open 0x%x -> 0x%x failed\n", k, open_attrs_table[i], open_attrs_table[j]);
04210 #endif
04211                                 k++;
04212                                 continue;
04213                         }
04214 
04215                         if (!cli_close(cli1, fnum1)) {
04216                                 printf("close %d (2) of %s failed (%s)\n", j, fname, cli_errstr(cli1));
04217                                 return False;
04218                         }
04219 
04220                         if (!cli_getatr(cli1, fname, &attr, NULL, NULL)) {
04221                                 printf("getatr(2) failed (%s)\n", cli_errstr(cli1));
04222                                 return False;
04223                         }
04224 
04225 #if 0
04226                         printf("[%d] getatr check [0x%x] trunc [0x%x] got attr 0x%x\n",
04227                                         k,  open_attrs_table[i],  open_attrs_table[j], attr );
04228 #endif
04229 
04230                         for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
04231                                 if (attr_results[l].num == k) {
04232                                         if (attr != attr_results[l].result_attr ||
04233                                                         open_attrs_table[i] != attr_results[l].init_attr ||
04234                                                         open_attrs_table[j] != attr_results[l].trunc_attr) {
04235                                                 printf("getatr check failed. [0x%x] trunc [0x%x] got attr 0x%x, should be 0x%x\n",
04236                                                 open_attrs_table[i],
04237                                                 open_attrs_table[j],
04238                                                 (unsigned int)attr,
04239                                                 attr_results[l].result_attr);
04240                                                 correct = False;
04241                                         }
04242                                         break;
04243                                 }
04244                         }
04245                         k++;
04246                 }
04247         }
04248 
04249         cli_setatr(cli1, fname, 0, 0);
04250         cli_unlink(cli1, fname);
04251 
04252         printf("open attr test %s.\n", correct ? "passed" : "failed");
04253 
04254         if (!torture_close_connection(cli1)) {
04255                 correct = False;
04256         }
04257         return correct;
04258 }

static void list_fn ( const char *  mnt,
file_info finfo,
const char *  name,
void *  state 
) [static]

torture.c4260 行で定義されています。

04261 {
04262         
04263 }

static BOOL run_dirtest ( int  dummy  )  [static]

torture.c4268 行で定義されています。

参照先 clicli_close()cli_list()cli_open()cli_sockopt()cli_unlink()end_timer()fprintf()list_fn()printf()sockopstorture_close_connection()torture_numopstorture_open_connection().

04269 {
04270         int i;
04271         static struct cli_state *cli;
04272         int fnum;
04273         double t1;
04274         BOOL correct = True;
04275 
04276         printf("starting directory test\n");
04277 
04278         if (!torture_open_connection(&cli, 0)) {
04279                 return False;
04280         }
04281 
04282         cli_sockopt(cli, sockops);
04283 
04284         srandom(0);
04285         for (i=0;i<torture_numops;i++) {
04286                 fstring fname;
04287                 slprintf(fname, sizeof(fname), "\\%x", (int)random());
04288                 fnum = cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE);
04289                 if (fnum == -1) {
04290                         fprintf(stderr,"Failed to open %s\n", fname);
04291                         return False;
04292                 }
04293                 cli_close(cli, fnum);
04294         }
04295 
04296         t1 = end_timer();
04297 
04298         printf("Matched %d\n", cli_list(cli, "a*.*", 0, list_fn, NULL));
04299         printf("Matched %d\n", cli_list(cli, "b*.*", 0, list_fn, NULL));
04300         printf("Matched %d\n", cli_list(cli, "xyzabc", 0, list_fn, NULL));
04301 
04302         printf("dirtest core %g seconds\n", end_timer() - t1);
04303 
04304         srandom(0);
04305         for (i=0;i<torture_numops;i++) {
04306                 fstring fname;
04307                 slprintf(fname, sizeof(fname), "\\%x", (int)random());
04308                 cli_unlink(cli, fname);
04309         }
04310 
04311         if (!torture_close_connection(cli)) {
04312                 correct = False;
04313         }
04314 
04315         printf("finished dirtest\n");
04316 
04317         return correct;
04318 }

static void del_fn ( const char *  mnt,
file_info finfo,
const char *  mask,
void *  state 
) [static]

torture.c4320 行で定義されています。

参照先 cli_rmdir()cli_unlink()file_info::modefile_info::nameprintf().

参照元 run_dirtest1().

04321 {
04322         struct cli_state *pcli = (struct cli_state *)state;
04323         fstring fname;
04324         slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
04325 
04326         if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
04327                 return;
04328 
04329         if (finfo->mode & aDIR) {
04330                 if (!cli_rmdir(pcli, fname))
04331                         printf("del_fn: failed to rmdir %s\n,", fname );
04332         } else {
04333                 if (!cli_unlink(pcli, fname))
04334                         printf("del_fn: failed to unlink %s\n,", fname );
04335         }
04336 }

BOOL torture_ioctl_test ( int  dummy  ) 

torture.c4342 行で定義されています。

参照先 clicli_errstr()cli_open()cli_raw_ioctl()cli_unlink()codedata_blob_free()data_blob_::lengthprintf()statustorture_close_connection()torture_open_connection().

04343 {
04344         static struct cli_state *cli;
04345         uint16 device, function;
04346         int fnum;
04347         const char *fname = "\\ioctl.dat";
04348         DATA_BLOB blob;
04349         NTSTATUS status;
04350 
04351         if (!torture_open_connection(&cli, 0)) {
04352                 return False;
04353         }
04354 
04355         printf("starting ioctl test\n");
04356 
04357         cli_unlink(cli, fname);
04358 
04359         fnum = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
04360         if (fnum == -1) {
04361                 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
04362                 return False;
04363         }
04364 
04365         status = cli_raw_ioctl(cli, fnum, 0x2d0000 | (0x0420<<2), &blob);
04366         printf("ioctl device info: %s\n", cli_errstr(cli));
04367 
04368         status = cli_raw_ioctl(cli, fnum, IOCTL_QUERY_JOB_INFO, &blob);
04369         printf("ioctl job info: %s\n", cli_errstr(cli));
04370 
04371         for (device=0;device<0x100;device++) {
04372                 printf("testing device=0x%x\n", device);
04373                 for (function=0;function<0x100;function++) {
04374                         uint32 code = (device<<16) | function;
04375 
04376                         status = cli_raw_ioctl(cli, fnum, code, &blob);
04377 
04378                         if (NT_STATUS_IS_OK(status)) {
04379                                 printf("ioctl 0x%x OK : %d bytes\n", (int)code,
04380                                        (int)blob.length);
04381                                 data_blob_free(&blob);
04382                         }
04383                 }
04384         }
04385 
04386         if (!torture_close_connection(cli)) {
04387                 return False;
04388         }
04389 
04390         return True;
04391 }

BOOL torture_chkpath_test ( int  dummy  ) 

torture.c4397 行で定義されています。

参照先 check_error()clicli_chkpath()cli_close()cli_errstr()cli_mkdir()cli_open()cli_rmdir()cli_unlink()printf()torture_close_connection()torture_open_connection().

04398 {
04399         static struct cli_state *cli;
04400         int fnum;
04401         BOOL ret;
04402 
04403         if (!torture_open_connection(&cli, 0)) {
04404                 return False;
04405         }
04406 
04407         printf("starting chkpath test\n");
04408 
04409         /* cleanup from an old run */
04410         cli_rmdir(cli, "\\chkpath.dir\\dir2");
04411         cli_unlink(cli, "\\chkpath.dir\\*");
04412         cli_rmdir(cli, "\\chkpath.dir");
04413 
04414         if (!cli_mkdir(cli, "\\chkpath.dir")) {
04415                 printf("mkdir1 failed : %s\n", cli_errstr(cli));
04416                 return False;
04417         }
04418 
04419         if (!cli_mkdir(cli, "\\chkpath.dir\\dir2")) {
04420                 printf("mkdir2 failed : %s\n", cli_errstr(cli));
04421                 return False;
04422         }
04423 
04424         fnum = cli_open(cli, "\\chkpath.dir\\foo.txt", O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
04425         if (fnum == -1) {
04426                 printf("open1 failed (%s)\n", cli_errstr(cli));
04427                 return False;
04428         }
04429         cli_close(cli, fnum);
04430 
04431         if (!cli_chkpath(cli, "\\chkpath.dir")) {
04432                 printf("chkpath1 failed: %s\n", cli_errstr(cli));
04433                 ret = False;
04434         }
04435 
04436         if (!cli_chkpath(cli, "\\chkpath.dir\\dir2")) {
04437                 printf("chkpath2 failed: %s\n", cli_errstr(cli));
04438                 ret = False;
04439         }
04440 
04441         if (!cli_chkpath(cli, "\\chkpath.dir\\foo.txt")) {
04442                 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath, 
04443                                   NT_STATUS_NOT_A_DIRECTORY);
04444         } else {
04445                 printf("* chkpath on a file should fail\n");
04446                 ret = False;
04447         }
04448 
04449         if (!cli_chkpath(cli, "\\chkpath.dir\\bar.txt")) {
04450                 ret = check_error(__LINE__, cli, ERRDOS, ERRbadfile, 
04451                                   NT_STATUS_OBJECT_NAME_NOT_FOUND);
04452         } else {
04453                 printf("* chkpath on a non existant file should fail\n");
04454                 ret = False;
04455         }
04456 
04457         if (!cli_chkpath(cli, "\\chkpath.dir\\dirxx\\bar.txt")) {
04458                 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath, 
04459                                   NT_STATUS_OBJECT_PATH_NOT_FOUND);
04460         } else {
04461                 printf("* chkpath on a non existent component should fail\n");
04462                 ret = False;
04463         }
04464 
04465         cli_rmdir(cli, "\\chkpath.dir\\dir2");
04466         cli_unlink(cli, "\\chkpath.dir\\*");
04467         cli_rmdir(cli, "\\chkpath.dir");
04468 
04469         if (!torture_close_connection(cli)) {
04470                 return False;
04471         }
04472 
04473         return ret;
04474 }

static BOOL run_eatest ( int  dummy  )  [static]

torture.c4476 行で定義されています。

参照先 clicli_close()cli_errstr()cli_get_ea_list_path()cli_nt_create_full()cli_set_ea_fnum()cli_set_ea_path()cli_unlink()data_blob_::datadump_data()data_blob_::lengthnameprintf()talloc_init()torture_close_connection()torture_open_connection()ea_struct::value.

04477 {
04478         static struct cli_state *cli;
04479         const char *fname = "\\eatest.txt";
04480         BOOL correct = True;
04481         int fnum, i;
04482         size_t num_eas;
04483         struct ea_struct *ea_list = NULL;
04484         TALLOC_CTX *mem_ctx = talloc_init("eatest");
04485 
04486         printf("starting eatest\n");
04487         
04488         if (!torture_open_connection(&cli, 0)) {
04489                 talloc_destroy(mem_ctx);
04490                 return False;
04491         }
04492         
04493         cli_unlink(cli, fname);
04494         fnum = cli_nt_create_full(cli, fname, 0,
04495                                    FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
04496                                    FILE_SHARE_NONE, FILE_OVERWRITE_IF, 
04497                                    0x4044, 0);
04498 
04499         if (fnum == -1) {
04500                 printf("open failed - %s\n", cli_errstr(cli));
04501                 talloc_destroy(mem_ctx);
04502                 return False;
04503         }
04504 
04505         for (i = 0; i < 10; i++) {
04506                 fstring ea_name, ea_val;
04507 
04508                 slprintf(ea_name, sizeof(ea_name), "EA_%d", i);
04509                 memset(ea_val, (char)i+1, i+1);
04510                 if (!cli_set_ea_fnum(cli, fnum, ea_name, ea_val, i+1)) {
04511                         printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
04512                         talloc_destroy(mem_ctx);
04513                         return False;
04514                 }
04515         }
04516         
04517         cli_close(cli, fnum);
04518         for (i = 0; i < 10; i++) {
04519                 fstring ea_name, ea_val;
04520 
04521                 slprintf(ea_name, sizeof(ea_name), "EA_%d", i+10);
04522                 memset(ea_val, (char)i+1, i+1);
04523                 if (!cli_set_ea_path(cli, fname, ea_name, ea_val, i+1)) {
04524                         printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
04525                         talloc_destroy(mem_ctx);
04526                         return False;
04527                 }
04528         }
04529         
04530         if (!cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list)) {
04531                 printf("ea_get list failed - %s\n", cli_errstr(cli));
04532                 correct = False;
04533         }
04534 
04535         printf("num_eas = %d\n", (int)num_eas);
04536 
04537         if (num_eas != 20) {
04538                 printf("Should be 20 EA's stored... failing.\n");
04539                 correct = False;
04540         }
04541 
04542         for (i = 0; i < num_eas; i++) {
04543                 printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
04544                 dump_data(0, (char *)ea_list[i].value.data,
04545                           ea_list[i].value.length);
04546         }
04547 
04548         /* Setting EA's to zero length deletes them. Test this */
04549         printf("Now deleting all EA's - case indepenent....\n");
04550 
04551 #if 1
04552         cli_set_ea_path(cli, fname, "", "", 0);
04553 #else
04554         for (i = 0; i < 20; i++) {
04555                 fstring ea_name;
04556                 slprintf(ea_name, sizeof(ea_name), "ea_%d", i);
04557                 if (!cli_set_ea_path(cli, fname, ea_name, "", 0)) {
04558                         printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
04559                         talloc_destroy(mem_ctx);
04560                         return False;
04561                 }
04562         }
04563 #endif
04564 
04565         if (!cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list)) {
04566                 printf("ea_get list failed - %s\n", cli_errstr(cli));
04567                 correct = False;
04568         }
04569 
04570         printf("num_eas = %d\n", (int)num_eas);
04571         for (i = 0; i < num_eas; i++) {
04572                 printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
04573                 dump_data(0, (char *)ea_list[i].value.data,
04574                           ea_list[i].value.length);
04575         }
04576 
04577         if (num_eas != 0) {
04578                 printf("deleting EA's failed.\n");
04579                 correct = False;
04580         }
04581 
04582         /* Try and delete a non existant EA. */
04583         if (!cli_set_ea_path(cli, fname, "foo", "", 0)) {
04584                 printf("deleting non-existant EA 'foo' should succeed. %s\n", cli_errstr(cli));
04585                 correct = False;
04586         }
04587 
04588         talloc_destroy(mem_ctx);
04589         if (!torture_close_connection(cli)) {
04590                 correct = False;
04591         }
04592         
04593         return correct;
04594 }

static BOOL run_dirtest1 ( int  dummy  )  [static]

torture.c4596 行で定義されています。

参照先 clicli_close()cli_list()cli_list_old()cli_mkdir()cli_nt_create_full()cli_rmdir()cli_sockopt()del_fn()fprintf()list_fn()printf()sockopstorture_close_connection()torture_open_connection().

04597 {
04598         int i;
04599         static struct cli_state *cli;
04600         int fnum, num_seen;
04601         BOOL correct = True;
04602 
04603         printf("starting directory test\n");
04604 
04605         if (!torture_open_connection(&cli, 0)) {
04606                 return False;
04607         }
04608 
04609         cli_sockopt(cli, sockops);
04610 
04611         cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
04612         cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
04613         cli_rmdir(cli, "\\LISTDIR");
04614         cli_mkdir(cli, "\\LISTDIR");
04615 
04616         /* Create 1000 files and 1000 directories. */
04617         for (i=0;i<1000;i++) {
04618                 fstring fname;
04619                 slprintf(fname, sizeof(fname), "\\LISTDIR\\f%d", i);
04620                 fnum = cli_nt_create_full(cli, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
04621                                    FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
04622                 if (fnum == -1) {
04623                         fprintf(stderr,"Failed to open %s\n", fname);
04624                         return False;
04625                 }
04626                 cli_close(cli, fnum);
04627         }
04628         for (i=0;i<1000;i++) {
04629                 fstring fname;
04630                 slprintf(fname, sizeof(fname), "\\LISTDIR\\d%d", i);
04631                 if (!cli_mkdir(cli, fname)) {
04632                         fprintf(stderr,"Failed to open %s\n", fname);
04633                         return False;
04634                 }
04635         }
04636 
04637         /* Now ensure that doing an old list sees both files and directories. */
04638         num_seen = cli_list_old(cli, "\\LISTDIR\\*", aDIR, list_fn, NULL);
04639         printf("num_seen = %d\n", num_seen );
04640         /* We should see 100 files + 1000 directories + . and .. */
04641         if (num_seen != 2002)
04642                 correct = False;
04643 
04644         /* Ensure if we have the "must have" bits we only see the
04645          * relevent entries.
04646          */
04647         num_seen = cli_list_old(cli, "\\LISTDIR\\*", (aDIR<<8)|aDIR, list_fn, NULL);
04648         printf("num_seen = %d\n", num_seen );
04649         if (num_seen != 1002)
04650                 correct = False;
04651 
04652         num_seen = cli_list_old(cli, "\\LISTDIR\\*", (aARCH<<8)|aDIR, list_fn, NULL);
04653         printf("num_seen = %d\n", num_seen );
04654         if (num_seen != 1000)
04655                 correct = False;
04656 
04657         /* Delete everything. */
04658         cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
04659         cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
04660         cli_rmdir(cli, "\\LISTDIR");
04661 
04662 #if 0
04663         printf("Matched %d\n", cli_list(cli, "a*.*", 0, list_fn, NULL));
04664         printf("Matched %d\n", cli_list(cli, "b*.*", 0, list_fn, NULL));
04665         printf("Matched %d\n", cli_list(cli, "xyzabc", 0, list_fn, NULL));
04666 #endif
04667 
04668         if (!torture_close_connection(cli)) {
04669                 correct = False;
04670         }
04671 
04672         printf("finished dirtest1\n");
04673 
04674         return correct;
04675 }

static BOOL run_error_map_extract ( int  dummy  )  [static]

torture.c4677 行で定義されています。

参照先 cli_dos_error()cli_errstr()cli_negprot()cli_session_setup()cli_shutdown()errorcli_state::force_dos_errorsfstr_sprintf()get_nt_error_c_code()hostcli_state::inbufopen_nbt_connection()passwordprintf()smb_dos_err_class()smb_dos_err_name()cli_state::use_spnegoworkgroup.

04677                                              {
04678         
04679         static struct cli_state *c_dos;
04680         static struct cli_state *c_nt;
04681 
04682         uint32 error;
04683 
04684         uint32 flgs2, errnum;
04685         uint8 errclass;
04686 
04687         NTSTATUS nt_status;
04688 
04689         fstring user;
04690 
04691         /* NT-Error connection */
04692 
04693         if (!(c_nt = open_nbt_connection())) {
04694                 return False;
04695         }
04696 
04697         c_nt->use_spnego = False;
04698 
04699         if (!cli_negprot(c_nt)) {
04700                 printf("%s rejected the NT-error negprot (%s)\n",host, cli_errstr(c_nt));
04701                 cli_shutdown(c_nt);
04702                 return False;
04703         }
04704 
04705         if (!NT_STATUS_IS_OK(cli_session_setup(c_nt, "", "", 0, "", 0,
04706                                                workgroup))) {
04707                 printf("%s rejected the NT-error initial session setup (%s)\n",host, cli_errstr(c_nt));
04708                 return False;
04709         }
04710 
04711         /* DOS-Error connection */
04712 
04713         if (!(c_dos = open_nbt_connection())) {
04714                 return False;
04715         }
04716 
04717         c_dos->use_spnego = False;
04718         c_dos->force_dos_errors = True;
04719 
04720         if (!cli_negprot(c_dos)) {
04721                 printf("%s rejected the DOS-error negprot (%s)\n",host, cli_errstr(c_dos));
04722                 cli_shutdown(c_dos);
04723                 return False;
04724         }
04725 
04726         if (!NT_STATUS_IS_OK(cli_session_setup(c_dos, "", "", 0, "", 0,
04727                                                workgroup))) {
04728                 printf("%s rejected the DOS-error initial session setup (%s)\n",host, cli_errstr(c_dos));
04729                 return False;
04730         }
04731 
04732         for (error=(0xc0000000 | 0x1); error < (0xc0000000| 0xFFF); error++) {
04733                 fstr_sprintf(user, "%X", error);
04734 
04735                 if (NT_STATUS_IS_OK(cli_session_setup(c_nt, user, 
04736                                                       password, strlen(password),
04737                                                       password, strlen(password),
04738                                                       workgroup))) {
04739                         printf("/** Session setup succeeded.  This shouldn't happen...*/\n");
04740                 }
04741                 
04742                 flgs2 = SVAL(c_nt->inbuf,smb_flg2);
04743                 
04744                 /* Case #1: 32-bit NT errors */
04745                 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
04746                         nt_status = NT_STATUS(IVAL(c_nt->inbuf,smb_rcls));
04747                 } else {
04748                         printf("/** Dos error on NT connection! (%s) */\n", 
04749                                cli_errstr(c_nt));
04750                         nt_status = NT_STATUS(0xc0000000);
04751                 }
04752 
04753                 if (NT_STATUS_IS_OK(cli_session_setup(c_dos, user, 
04754                                                       password, strlen(password),
04755                                                       password, strlen(password),
04756                                                       workgroup))) {
04757                         printf("/** Session setup succeeded.  This shouldn't happen...*/\n");
04758                 }
04759                 flgs2 = SVAL(c_dos->inbuf,smb_flg2), errnum;
04760                 
04761                 /* Case #1: 32-bit NT errors */
04762                 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
04763                         printf("/** NT error on DOS connection! (%s) */\n", 
04764                                cli_errstr(c_nt));
04765                         errnum = errclass = 0;
04766                 } else {
04767                         cli_dos_error(c_dos, &errclass, &errnum);
04768                 }
04769 
04770                 if (NT_STATUS_V(nt_status) != error) { 
04771                         printf("/*\t{ This NT error code was 'sqashed'\n\t from %s to %s \n\t during the session setup }\n*/\n", 
04772                                get_nt_error_c_code(NT_STATUS(error)), 
04773                                get_nt_error_c_code(nt_status));
04774                 }
04775                 
04776                 printf("\t{%s,\t%s,\t%s},\n", 
04777                        smb_dos_err_class(errclass), 
04778                        smb_dos_err_name(errclass, errnum), 
04779                        get_nt_error_c_code(NT_STATUS(error)));
04780         }
04781         return True;
04782 }

static BOOL run_sesssetup_bench ( int  dummy  )  [static]

torture.c4784 行で定義されています。

参照先 ccli_errstr()cli_negprot()cli_session_setup()cli_shutdown()cli_ulogoff()d_printf()hostnt_errstr()open_nbt_connection()passwordprintf()statustorture_numopsusernamecli_state::vuidworkgroup.

04785 {
04786         static struct cli_state *c;
04787         NTSTATUS status;
04788         int i;
04789 
04790         if (!(c = open_nbt_connection())) {
04791                 return false;
04792         }
04793 
04794         if (!cli_negprot(c)) {
04795                 printf("%s rejected the NT-error negprot (%s)\n", host,
04796                        cli_errstr(c));
04797                 cli_shutdown(c);
04798                 return false;
04799         }
04800 
04801         for (i=0; i<torture_numops; i++) {
04802                 status = cli_session_setup(
04803                         c, username,
04804                         password, strlen(password),
04805                         password, strlen(password),
04806                         workgroup);
04807                 if (!NT_STATUS_IS_OK(status)) {
04808                         d_printf("(%s) cli_session_setup failed: %s\n",
04809                                  __location__, nt_errstr(status));
04810                         return false;
04811                 }
04812 
04813                 if (!cli_ulogoff(c)) {
04814                         d_printf("(%s) cli_ulogoff failed: %s\n",
04815                                  __location__, cli_errstr(c));
04816                         return false;
04817                 }
04818 
04819                 c->vuid = 0;
04820         }
04821 
04822         return True;
04823 }

static BOOL run_local_substitute ( int  dummy  )  [static]

torture.c4825 行で定義されています。

参照先 gidtoname()cli_state::mem_ctxprintf()talloc_init()talloc_sub_basic()talloc_sub_specified().

04826 {
04827         TALLOC_CTX *mem_ctx;
04828         int diff = 0;
04829 
04830         if ((mem_ctx = talloc_init("run_local_subst")) == NULL) {
04831                 printf("talloc_init failed\n");
04832                 return False;
04833         }
04834 
04835         diff |= strcmp(talloc_sub_specified(mem_ctx, "%U", "bla", "", -1, -1),
04836                        "bla");
04837         diff |= strcmp(talloc_sub_specified(mem_ctx, "%u%U", "bla", "", -1, -1),
04838                        "blabla");
04839         diff |= strcmp(talloc_sub_specified(mem_ctx, "%g", "", "", -1, -1),
04840                        "NO_GROUP");
04841         diff |= strcmp(talloc_sub_specified(mem_ctx, "%G", "", "", -1, -1),
04842                        "NO_GROUP");
04843         diff |= strcmp(talloc_sub_specified(mem_ctx, "%g", "", "", -1, 0),
04844                        gidtoname(0));
04845         diff |= strcmp(talloc_sub_specified(mem_ctx, "%G", "", "", -1, 0),
04846                        gidtoname(0));
04847         diff |= strcmp(talloc_sub_specified(mem_ctx, "%D%u", "u", "dom", -1, 0),
04848                        "domu");
04849         diff |= strcmp(talloc_sub_specified(mem_ctx, "%i %I", "", "", -1, -1),
04850                        "0.0.0.0 0.0.0.0");
04851 
04852         /* Different captialization rules in sub_basic... */
04853 
04854         diff |= strcmp(talloc_sub_basic(mem_ctx, "BLA", "dom", "%U%D"),
04855                        "blaDOM");
04856 
04857         TALLOC_FREE(mem_ctx);
04858         return (diff == 0);
04859 }

static BOOL run_local_gencache ( int  dummy  )  [static]

torture.c4861 行で定義されています。

参照先 d_printf()gencache_del()gencache_get()gencache_init()gencache_set()gencache_shutdown().

04862 {
04863         char *val;
04864         time_t tm;
04865 
04866         if (!gencache_init()) {
04867                 d_printf("%s: gencache_init() failed\n", __location__);
04868                 return False;
04869         }
04870 
04871         if (!gencache_set("foo", "bar", time(NULL) + 1000)) {
04872                 d_printf("%s: gencache_set() failed\n", __location__);
04873                 return False;
04874         }
04875 
04876         if (!gencache_get("foo", &val, &tm)) {
04877                 d_printf("%s: gencache_get() failed\n", __location__);
04878                 return False;
04879         }
04880 
04881         if (strcmp(val, "bar") != 0) {
04882                 d_printf("%s: gencache_get() returned %s, expected %s\n",
04883                          __location__, val, "bar");
04884                 SAFE_FREE(val);
04885                 return False;
04886         }
04887 
04888         SAFE_FREE(val);
04889 
04890         if (!gencache_del("foo")) {
04891                 d_printf("%s: gencache_del() failed\n", __location__);
04892                 return False;
04893         }
04894         if (gencache_del("foo")) {
04895                 d_printf("%s: second gencache_del() succeeded\n",
04896                          __location__);
04897                 return False;
04898         }
04899                         
04900         if (gencache_get("foo", &val, &tm)) {
04901                 d_printf("%s: gencache_get() on deleted entry "
04902                          "succeeded\n", __location__);
04903                 return False;
04904         }
04905 
04906         if (!gencache_shutdown()) {
04907                 d_printf("%s: gencache_shutdown() failed\n", __location__);
04908                 return False;
04909         }
04910 
04911         if (gencache_shutdown()) {
04912                 d_printf("%s: second gencache_shutdown() succeeded\n",
04913                          __location__);
04914                 return False;
04915         }
04916 
04917         return True;
04918 }

static BOOL run_test ( const char *  name  )  [static]

torture.c5080 行で定義されています。

参照先 create_procs()end_timer()flagsfnfstr_sprintf()printf()randomfnameresultstart_timer()strequal()ttorture_ops.

参照元 main().

05081 {
05082         BOOL ret = True;
05083         BOOL result = True;
05084         BOOL found = False;
05085         int i;
05086         double t;
05087         if (strequal(name,"ALL")) {
05088                 for (i=0;torture_ops[i].name;i++) {
05089                         run_test(torture_ops[i].name);
05090                 }
05091                 found = True;
05092         }
05093         
05094         for (i=0;torture_ops[i].name;i++) {
05095                 fstr_sprintf(randomfname, "\\XX%x", 
05096                          (unsigned)random());
05097 
05098                 if (strequal(name, torture_ops[i].name)) {
05099                         found = True;
05100                         printf("Running %s\n", name);
05101                         if (torture_ops[i].flags & FLAG_MULTIPROC) {
05102                                 t = create_procs(torture_ops[i].fn, &result);
05103                                 if (!result) { 
05104                                         ret = False;
05105                                         printf("TEST %s FAILED!\n", name);
05106                                 }
05107                                          
05108                         } else {
05109                                 start_timer();
05110                                 if (!torture_ops[i].fn(0)) {
05111                                         ret = False;
05112                                         printf("TEST %s FAILED!\n", name);
05113                                 }
05114                                 t = end_timer();
05115                         }
05116                         printf("%s took %g secs\n\n", name, t);
05117                 }
05118         }
05119 
05120         if (!found) {
05121                 printf("Did not find a test named %s\n", name);
05122                 ret = False;
05123         }
05124 
05125         return ret;
05126 }

static void usage ( void   )  [static]

torture.c5129 行で定義されています。

参照先 nameprintf()torture_ops.

05130 {
05131         int i;
05132 
05133         printf("WARNING samba4 test suite is much more complete nowadays.\n");
05134         printf("Please use samba4 torture.\n\n");
05135 
05136         printf("Usage: smbtorture //server/share <options> TEST1 TEST2 ...\n");
05137 
05138         printf("\t-d debuglevel\n");
05139         printf("\t-U user%%pass\n");
05140         printf("\t-k               use kerberos\n");
05141         printf("\t-N numprocs\n");
05142         printf("\t-n my_netbios_name\n");
05143         printf("\t-W workgroup\n");
05144         printf("\t-o num_operations\n");
05145         printf("\t-O socket_options\n");
05146         printf("\t-m maximum protocol\n");
05147         printf("\t-L use oplocks\n");
05148         printf("\t-c CLIENT.TXT   specify client load file for NBENCH\n");
05149         printf("\t-A showall\n");
05150         printf("\t-p port\n");
05151         printf("\t-s seed\n");
05152         printf("\t-b unclist_filename   specify multiple shares for multiple connections\n");
05153         printf("\n\n");
05154 
05155         printf("tests are:");
05156         for (i=0;torture_ops[i].name;i++) {
05157                 printf(" %s", torture_ops[i].name);
05158         }
05159         printf("\n");
05160 
05161         printf("default test is ALL\n");
05162         
05163         exit(1);
05164 }

int main ( int  argc,
char *  argv[] 
)

torture.c5169 行で定義されています。

参照先 client_txtd_printf()dbfDEBUGLEVELdyn_CONFIGFILEget_myname()hostinterpret_protocol()load_case_tables()load_interfaces()lp_workgroup()max_protocolmultishare_conn_fnamemynamenprocsoptargoptindpasswordport_to_useprintf()run_test()sharesockopsstrchr_m()torture_numopstorture_showallusage()use_kerberosuse_multishare_connuse_oplocksusernameworkgroupx_stdout.

05170 {
05171         int opt, i;
05172         char *p;
05173         int gotuser = 0;
05174         int gotpass = 0;
05175         BOOL correct = True;
05176 
05177         dbf = x_stdout;
05178 
05179 #ifdef HAVE_SETBUFFER
05180         setbuffer(stdout, NULL, 0);
05181 #endif
05182 
05183         load_case_tables();
05184 
05185         lp_load(dyn_CONFIGFILE,True,False,False,True);
05186         load_interfaces();
05187 
05188         if (argc < 2) {
05189                 usage();
05190         }
05191 
05192         for(p = argv[1]; *p; p++)
05193           if(*p == '\\')
05194             *p = '/';
05195  
05196         if (strncmp(argv[1], "//", 2)) {
05197                 usage();
05198         }
05199 
05200         fstrcpy(host, &argv[1][2]);
05201         p = strchr_m(&host[2],'/');
05202         if (!p) {
05203                 usage();
05204         }
05205         *p = 0;
05206         fstrcpy(share, p+1);
05207 
05208         get_myname(myname);
05209 
05210         if (*username == 0 && getenv("LOGNAME")) {
05211           fstrcpy(username,getenv("LOGNAME"));
05212         }
05213 
05214         argc--;
05215         argv++;
05216 
05217         srandom(time(NULL));
05218 
05219         fstrcpy(workgroup, lp_workgroup());
05220 
05221         while ((opt = getopt(argc, argv, "p:hW:U:n:N:O:o:m:Ld:Ac:ks:b:")) != EOF) {
05222                 switch (opt) {
05223                 case 'p':
05224                         port_to_use = atoi(optarg);
05225                         break;
05226                 case 's':
05227                         srandom(atoi(optarg));
05228                         break;
05229                 case 'W':
05230                         fstrcpy(workgroup,optarg);
05231                         break;
05232                 case 'm':
05233                         max_protocol = interpret_protocol(optarg, max_protocol);
05234                         break;
05235                 case 'N':
05236                         nprocs = atoi(optarg);
05237                         break;
05238                 case 'o':
05239                         torture_numops = atoi(optarg);
05240                         break;
05241                 case 'd':
05242                         DEBUGLEVEL = atoi(optarg);
05243                         break;
05244                 case 'O':
05245                         sockops = optarg;
05246                         break;
05247                 case 'L':
05248                         use_oplocks = True;
05249                         break;
05250                 case 'A':
05251                         torture_showall = True;
05252                         break;
05253                 case 'n':
05254                         fstrcpy(myname, optarg);
05255                         break;
05256                 case 'c':
05257                         client_txt = optarg;
05258                         break;
05259                 case 'k':
05260 #ifdef HAVE_KRB5
05261                         use_kerberos = True;
05262 #else
05263                         d_printf("No kerberos support compiled in\n");
05264                         exit(1);
05265 #endif
05266                         break;
05267                 case 'U':
05268                         gotuser = 1;
05269                         fstrcpy(username,optarg);
05270                         p = strchr_m(username,'%');
05271                         if (p) {
05272                                 *p = 0;
05273                                 fstrcpy(password, p+1);
05274                                 gotpass = 1;
05275                         }
05276                         break;
05277                 case 'b':
05278                         fstrcpy(multishare_conn_fname, optarg);
05279                         use_multishare_conn = True;
05280                         break;
05281                 default:
05282                         printf("Unknown option %c (%d)\n", (char)opt, opt);
05283                         usage();
05284                 }
05285         }
05286 
05287         if(use_kerberos && !gotuser) gotpass = True;
05288 
05289         while (!gotpass) {
05290                 p = getpass("Password:");
05291                 if (p) {
05292                         fstrcpy(password, p);
05293                         gotpass = 1;
05294                 }
05295         }
05296 
05297         printf("host=%s share=%s user=%s myname=%s\n", 
05298                host, share, username, myname);
05299 
05300         if (argc == optind) {
05301                 correct = run_test("ALL");
05302         } else {
05303                 for (i=optind;i<argc;i++) {
05304                         if (!run_test(argv[i])) {
05305                                 correct = False;
05306                         }
05307                 }
05308         }
05309 
05310         if (correct) {
05311                 return(0);
05312         } else {
05313                 return(1);
05314         }
05315 }


変数

char* optarg

int optind

fstring host [static]

torture.c26 行で定義されています。

参照元 ads_leave_realm()chg_passwd()cli_session_setup_spnego()main()nfs_quotas()open_nbt_connection()query_one()run_error_map_extract()run_sesssetup_bench()run_tcon2_test()run_tcon_devtype_test()run_tcon_test()smb_krb5_locator_lookup()smb_ldap_setup_conn()torture_open_connection()validate_group().

fstring workgroup [static]

torture.c26 行で定義されています。

fstring share [static]

torture.c26 行で定義されています。

参照元 check_refresh_gpo()cli_resolve_path()do_connection()main()make_printer_tdbkey()make_printers_secdesc_tdbkey()net_ads_gpo_refresh()parse_quota_set()parse_server()printers_page()reconnect()run_fdsesstest()run_tcon2_test()run_tcon_devtype_test()run_tcon_test()shares_page()smb_change_share_mode_entry()smb_delete_share_mode_entry()smb_get_share_mode_entries()smbc_chmod_ctx()smbc_close_ctx()smbc_fstat_ctx()smbc_getxattr_ctx()smbc_list_print_jobs_ctx()smbc_lseek_ctx()smbc_mkdir_ctx()smbc_open_ctx()smbc_open_print_job_ctx()smbc_opendir_ctx()smbc_read_ctx()smbc_removexattr_ctx()smbc_rmdir_ctx()smbc_setxattr_ctx()smbc_stat_ctx()smbc_unlink_ctx()smbc_unlink_print_job_ctx()smbc_utimes_ctx()smbc_write_ctx()test_locks()torture_open_connection().

fstring password [static]

torture.c26 行で定義されています。

fstring username [static]

torture.c26 行で定義されています。

fstring myname [static]

torture.c26 行で定義されています。

参照元 announce_local_master_browser_to_domain_master_browser()browse_sync_remote()connect_one()create_procs()get_ipc_connect()main()negprot_spnego()open_nbt_connection()run_tcon_devtype_test()send_backup_list_response()smb_connect()torture_open_connection_share().

int max_protocol = PROTOCOL_NT1 [static]

torture.c27 行で定義されています。

const char* sockops = "TCP_NODELAY" [static]

torture.c28 行で定義されています。

参照元 main()run_deletetest()run_dirtest()run_dirtest1()run_fdpasstest()run_fdsesstest()run_locktest1()run_locktest2()run_locktest3()run_locktest4()run_locktest5()run_locktest6()run_locktest7()run_maxfidtest()run_netbench()run_openattrtest()run_opentest()run_oplock1()run_oplock2()run_pipe_number()run_properties()run_readwritelarge()run_readwritemulti()run_readwritetest()run_tcon2_test()run_tcon_test()run_torture()run_unlinktest().

int nprocs = 1 [static]

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

int port_to_use = 0 [static]

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

参照元 main()open_nbt_connection()run_tcon_devtype_test()torture_open_connection_share().

int torture_numops = 100

torture.c31 行で定義されています。

参照元 main()run_dirtest()run_locktest3()run_sesssetup_bench()rw_torture()rw_torture2()torture_mangle().

int procnum [static]

torture.c32 行で定義されています。

参照元 create_procs()rw_torture3().

struct cli_state* current_cli [static]

torture.c33 行で定義されています。

参照元 create_procs()run_maxfidtest()run_netbench()run_readwritemulti()run_torture().

fstring randomfname [static]

torture.c34 行で定義されています。

参照元 run_readwritemulti()run_test().

BOOL use_oplocks [static]

torture.c35 行で定義されています。

BOOL use_level_II_oplocks [static]

torture.c36 行で定義されています。

参照元 open_nbt_connection()run_oplock2()run_oplock3()torture_open_connection_share().

const char* client_txt = "client_oplocks.txt" [static]

torture.c37 行で定義されています。

参照元 main()run_netbench().

BOOL use_kerberos [static]

torture.c38 行で定義されています。

fstring multishare_conn_fname [static]

torture.c39 行で定義されています。

参照元 main()torture_open_connection().

BOOL use_multishare_conn = False [static]

torture.c40 行で定義されています。

参照元 main()torture_open_connection().

BOOL torture_showall = False

torture.c42 行で定義されています。

参照元 main()torture_denytest1()torture_denytest2().

struct timeval tp1 tp2 [static]

torture.c47 行で定義されています。

int line_count = 0

torture.c804 行で定義されています。

参照元 find_handle()nb_close()nb_createx()nb_readx()nb_unlink()nb_writex()ne_find_handle()sigsegv().

int nbio_id

torture.c805 行で定義されています。

参照元 find_handle()nb_alarm()nb_cleanup()nb_readx()nb_setup()nb_writex()ne_find_handle().

uint32 open_attrs_table[] [static]

初期値:

 {
                FILE_ATTRIBUTE_NORMAL,
                FILE_ATTRIBUTE_ARCHIVE,
                FILE_ATTRIBUTE_READONLY,
                FILE_ATTRIBUTE_HIDDEN,
                FILE_ATTRIBUTE_SYSTEM,

                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY,
                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN,
                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,
                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
                FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,

                FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
                FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
                FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
                FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_SYSTEM,
}

torture.c4099 行で定義されています。

struct trunc_open_results attr_results[] [static]

初期値:

 {
        { 0, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
        { 1, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
        { 2, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
        { 16, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
        { 17, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
        { 18, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
        { 51, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 54, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 56, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
        { 68, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 71, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 73, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
        { 99, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 102, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 104, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
        { 116, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 119,  FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,  FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 121, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
        { 170, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN },
        { 173, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM },
        { 227, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 230, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
        { 232, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
        { 244, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 247, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
        { 249, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM }
}

torture.c4126 行で定義されています。

参照元 run_openattrtest().

const char* name

torture.c5016 行で定義されています。

BOOL(* fn)(int)

unsigned flags

torture.c5018 行で定義されています。

参照元 _lsa_lookup_names()_lsa_lookup_names2()_lsa_lookup_names3()_lsa_lookup_names4()_net_logon_ctrl()_net_logon_ctrl2()_spoolss_deleteprinterdriverex()_spoolss_enumprinters()_spoolss_rffpcnex()cac_MakeUserInfoCtr()call_nt_transact_create()call_trans2open()call_trans2qfsinfo()check_auth_crap()cmd_dfs_add()cmd_ds_enum_domain_trusts()cmd_netlogon_dsr_getdcname()cmd_netlogon_dsr_getdcnameex()cmd_netlogon_dsr_getdcnameex2()cmd_open()cmd_samr_delete_dom_user()cmd_samr_lookup_names()do_node_status()do_nt_transact_create_pipe()do_ntcreate_pipe_open()dos_PutUniCode()dump_a_parameter()fetch_account_info_to_ldif()getlmhostsent()init_srv_share_info_1007()interpret_long_filename()lookup()lookup_byname_backend()lp_do_parameter()lsa_lookup_level_to_flags()main()make_safe_fd()manage_ntlm_server_1_request()merge_default_aces()name_resolve_bcast()ndr_pull_string()ndr_push_string()ndr_string_array_size()net_ads_gpo_apply()net_ads_gpo_refresh()net_rpc_join_newstyle()netdom_join_domain()netdom_leave_domain()nmbd_running()nt_to_afs_dir_rights()open_file_ntcreate()parse_dgram()parse_node_status()pipe_schannel_auth_bind()py_smb_open()py_tdb_open()query_one()reply_copy()reply_ntcreate_and_X()resolve_wins()rpc_api_pipe_req()rpc_group_delete_internals()rpc_trustdom_del_internals()rpc_user_add_internals()rpc_user_del_internals()rpc_user_info_internals()rpc_user_password_internals()rpc_user_rename_internals()run_tcon_devtype_test()run_test()show_parameter_list()smb_krb5_renew_ticket()smb_posix_open()smb_posix_unlink()smbc_attr_server()spoolss_enumprinters()switch_message()sys_fgetxattr()sys_fremovexattr()sys_getxattr()sys_lgetxattr()sys_lremovexattr()sys_removexattr()test_lm_ntlm_broken()test_lmv2_ntlmv2_broken()test_ntlm_in_both()test_ntlm_in_lm()test_plaintext()torture_open_connection_share()trusted_domains()wb_aix_attrlist()winbindd_wins_byip()write_negTokenInit().

struct { ... } torture_ops[] [static]

参照元 run_test()usage().


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