smbd: Save a few lines in smbXsrv_client_global_init()
[Samba.git] / source3 / torture / test_posix_append.c
blob3abd448ab7b56e6b02846da466d9e8db6c706d5a
1 /*
2 Unix SMB/CIFS implementation.
3 reproducer for bug 6898
4 Copyright (C) Volker Lendecke 2009
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "includes.h"
21 #include "torture/proto.h"
22 #include "../libcli/security/security.h"
23 #include "libsmb/libsmb.h"
24 #include "libsmb/clirap.h"
27 * Make sure that GENERIC_WRITE does not trigger append. See
28 * https://bugzilla.samba.org/show_bug.cgi?id=6898
31 bool run_posix_append(int dummy)
33 struct cli_state *cli;
34 const char *fname = "append";
35 NTSTATUS status;
36 uint16_t fnum;
37 off_t size;
38 uint8_t c = '\0';
39 bool ret = false;
41 printf("Starting POSIX_APPEND\n");
43 if (!torture_open_connection(&cli, 0)) {
44 return false;
47 status = torture_setup_unix_extensions(cli);
48 if (!NT_STATUS_IS_OK(status)) {
49 printf("torture_setup_unix_extensions failed: %s\n",
50 nt_errstr(status));
51 goto fail;
54 status = cli_ntcreate(
55 cli, fname, 0,
56 GENERIC_WRITE_ACCESS|GENERIC_READ_ACCESS|DELETE_ACCESS,
57 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_POSIX_SEMANTICS,
58 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
59 FILE_OVERWRITE_IF,
60 FILE_NON_DIRECTORY_FILE|FILE_DELETE_ON_CLOSE,
61 0, &fnum, NULL);
63 if (!NT_STATUS_IS_OK(status)) {
64 printf("cli_ntcreate failed: %s\n", nt_errstr(status));
65 goto fail;
69 * Write two bytes at offset 0. With bug 6898 we would end up
70 * with a file of 2 byte length.
73 status = cli_writeall(cli, fnum, 0, &c, 0, sizeof(c), NULL);
74 if (!NT_STATUS_IS_OK(status)) {
75 printf("cli_write failed: %s\n", nt_errstr(status));
76 goto fail;
78 status = cli_writeall(cli, fnum, 0, &c, 0, sizeof(c), NULL);
79 if (!NT_STATUS_IS_OK(status)) {
80 printf("cli_write failed: %s\n", nt_errstr(status));
81 goto fail;
84 status = cli_qfileinfo_basic(
85 cli, fnum, NULL, &size, NULL, NULL, NULL, NULL, NULL);
86 if (!NT_STATUS_IS_OK(status)) {
87 printf("cli_qfileinfo_basic failed: %s\n", nt_errstr(status));
88 goto fail;
91 if (size != sizeof(c)) {
92 printf("BUG: Writing with O_APPEND!!\n");
93 goto fail;
96 ret = true;
97 fail:
98 torture_close_connection(cli);
99 return ret;