bool torture_casetable(struct torture_context *tctx, struct smbcli_state *cli) { char *fname; int fnum; int c, i; #define MAX_EQUIVALENCE 8 codepoint_t equiv[0x10000][MAX_EQUIVALENCE]; torture_comment(tctx, "Determining upper/lower case table\n"); memset(equiv, 0, sizeof(equiv)); torture_assert(tctx, torture_setup_dir(cli, "\\utable"), "Error setting up dir \\utable"); for (c=1; c < 0x10000; c++) { size_t size; if (c == '.' || c == '\\') continue; torture_comment(tctx, "%04x (%c)\n", c, isprint(c)?c:'.'); fname = form_name(lp_iconv_convenience(tctx->lp_ctx), c); fnum = smbcli_nt_create_full(cli->tree, fname, 0, #if 0 SEC_RIGHT_MAXIMUM_ALLOWED, #else SEC_RIGHTS_FILE_ALL, #endif FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OPEN_IF, 0, 0); torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, "Failed to create file with char %04x\n", c)); size = 0; if (NT_STATUS_IS_ERR(smbcli_qfileinfo(cli->tree, fnum, NULL, &size, NULL, NULL, NULL, NULL, NULL))) continue; if (size > 0) { /* found a character equivalence! */ int c2[MAX_EQUIVALENCE]; if (size/sizeof(int) >= MAX_EQUIVALENCE) { torture_comment(tctx, "too many chars match?? size=%d c=0x%04x\n", (int)size, c); smbcli_close(cli->tree, fnum); return false; } smbcli_read(cli->tree, fnum, c2, 0, size); torture_comment(tctx, "%04x: ", c); equiv[c][0] = c; for (i=0; i<size/sizeof(int); i++) { torture_comment(tctx, "%04x ", c2[i]); equiv[c][i+1] = c2[i]; } torture_comment(tctx, "\n"); } smbcli_write(cli->tree, fnum, 0, &c, size, sizeof(c)); smbcli_close(cli->tree, fnum); } smbcli_unlink(cli->tree, "\\utable\\*"); smbcli_rmdir(cli->tree, "\\utable"); return true; }
static NTSTATUS gp_get_file (struct smbcli_tree *tree, const char *remote_src, const char *local_dst) { int fh_remote, fh_local; uint8_t *buf; size_t nread = 0; size_t buf_size = 1024; size_t file_size; uint16_t attr; /* Open the remote file */ fh_remote = smbcli_open(tree, remote_src, O_RDONLY, DENY_NONE); if (fh_remote == -1) { DEBUG(0, ("Failed to open remote file: %s\n", remote_src)); return NT_STATUS_UNSUCCESSFUL; } /* Open the local file */ fh_local = open(local_dst, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fh_local == -1) { DEBUG(0, ("Failed to open local file: %s\n", local_dst)); return NT_STATUS_UNSUCCESSFUL; } /* Get the remote file size for error checking */ if (NT_STATUS_IS_ERR(smbcli_qfileinfo(tree, fh_remote, &attr, &file_size, NULL, NULL, NULL, NULL, NULL)) && NT_STATUS_IS_ERR(smbcli_getattrE(tree, fh_remote, &attr, &file_size, NULL, NULL, NULL))) { DEBUG(0, ("Failed to get remote file size: %s\n", smbcli_errstr(tree))); return NT_STATUS_UNSUCCESSFUL; } buf = talloc_zero_array(tree, uint8_t, buf_size); NT_STATUS_HAVE_NO_MEMORY(buf); /* Copy the contents of the file */ while (1) { int n = smbcli_read(tree, fh_remote, buf, nread, buf_size); if (n <= 0) { break; } if (write(fh_local, buf, n) != n) { DEBUG(0, ("Short write while copying file.\n")); talloc_free(buf); return NT_STATUS_UNSUCCESSFUL; } nread += n; } /* Bytes read should match the file size, or the copy was incomplete */ if (nread != file_size) { DEBUG(0, ("Remote/local file size mismatch after copying file: " "%s (remote %zu, local %zu).\n", remote_src, file_size, nread)); talloc_free(buf); return NT_STATUS_UNSUCCESSFUL; } /* Close the files */ smbcli_close(tree, fh_remote); close(fh_local); talloc_free(buf); return NT_STATUS_OK; }