/* * * Copyright (c) International Business Machines Corp., 2002 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Test Name: ftruncate03 * * Test Description: * Verify that, * 1) ftruncate(2) returns -1 and sets errno to EINVAL if the specified * socket is invalid. * 2) ftruncate(2) returns -1 and sets errno to EINVAL if the specified * file descriptor has an attempt to write, when open for read only. * 3) ftruncate(2) returns -1 and sets errno to EBADF if the file descriptor * of the specified file is not valid. * * Expected Result: * ftruncate() should fail with return value -1 and set expected errno. * * HISTORY * 02/2002 Written by Jay Huie * 02/2002 Adapted for and included into the LTP by Robbie Williamson * * RESTRICTIONS: * This test should be run by 'non-super-user' only. * */ #include #include #include #include #include #include #include #include #include "test.h" #define TESTFILE "ftruncate03_tst_file" TCID_DEFINE(ftruncate03); int TST_TOTAL = 3; int main(void) { int wjh_ret = -1, wjh_f = -1, count = 0; //used for the 2nd test //make str > trunc_size characters long char str[] = "THIS IS JAYS TEST FILE DATA"; int trunc_size = 4; int flag = O_RDONLY; #ifdef DEBUG printf("Starting test, possible errnos are; EBADF(%d) EINVAL(%d)\n", EBADF, EINVAL); printf("\t\tENOENT(%d) EACCES(%d) EPERM(%d)\n\n", ENOENT, EACCES, EPERM); #endif tst_tmpdir(); //TEST1: ftruncate on a socket is not valid, should fail w/ EINVAL #ifdef DEBUG printf("Starting test1\n"); #endif wjh_f = socket(PF_INET, SOCK_STREAM, 0); wjh_ret = ftruncate(wjh_f, 1); #ifdef DEBUG printf("DEBUG: fd: %d ret: %d errno(%d) %s\n", wjh_f, wjh_ret, errno, strerror(errno)); #endif if (wjh_ret == -1 && errno == EINVAL) { tst_resm(TPASS, "Test Passed"); } else { tst_resm(TFAIL, "ftruncate(socket)=%i (wanted -1), errno=%i (wanted EINVAL %i)", wjh_ret, errno, EINVAL); } close(wjh_f); errno = 0; wjh_ret = 0; wjh_f = -1; //TEST2: ftruncate on fd not open for writing should be EINVAL #ifdef DEBUG printf("\nStarting test2\n"); #endif //create a file and fill it so we can truncate it in ReadOnly mode //delete it first, ignore if it doesn't exist unlink(TESTFILE); errno = 0; wjh_f = open(TESTFILE, O_RDWR | O_CREAT, 0644); if (wjh_f == -1) { tst_brkm(TFAIL | TERRNO, tst_rmdir, "open(%s) failed", TESTFILE); } while (count < strlen(str)) { if ((count += write(wjh_f, str, strlen(str))) == -1) { tst_resm(TFAIL | TERRNO, "write() failed"); close(wjh_f); tst_rmdir(); tst_exit(); } } close(wjh_f); errno = 0; //Uncomment below if you want it to succeed, O_RDWR => success // flag = O_RDWR; #ifdef DEBUG if (flag == O_RDWR) { printf("\tLooks like it should succeed!\n"); } #endif wjh_f = open(TESTFILE, flag); if (wjh_f == -1) { tst_brkm(TFAIL | TERRNO, tst_rmdir, "open(%s) failed", TESTFILE); } wjh_ret = ftruncate(wjh_f, trunc_size); #ifdef DEBUG printf("DEBUG: fd: %d ret: %d @ errno(%d) %s\n", wjh_f, wjh_ret, errno, strerror(errno)); #endif if ((flag == O_RDONLY) && (wjh_ret == -1) && (errno == EINVAL)) { tst_resm(TPASS, "Test Passed"); } else if ((flag == O_RDWR)) { if (wjh_ret == 0) { tst_resm(TPASS, "Test Succeeded!"); } else { tst_resm(TFAIL | TERRNO, "ftruncate(%s) should have succeeded, but didn't! ret=" "%d (wanted 0)", TESTFILE, wjh_ret); } } else //flag was O_RDONLY but return codes wrong { tst_resm(TFAIL, "ftruncate(rd_only_fd)=%i (wanted -1), errno=%i (wanted %i EINVAL)", wjh_ret, errno, EINVAL); } close(wjh_f); errno = 0; wjh_ret = 0; wjh_f = -1; //TEST3: invalid socket descriptor should fail w/ EBADF #ifdef DEBUG printf("\nStarting test3\n"); #endif wjh_f = -999999; //should be a bad file descriptor wjh_ret = ftruncate(wjh_f, trunc_size); #ifdef DEBUG printf("DEBUG: fd: %d ret: %d @ errno(%d) %s\n", wjh_f, wjh_ret, errno, strerror(errno)); #endif if (wjh_ret != -1 || errno != EBADF) { tst_resm(TFAIL | TERRNO, "ftruncate(invalid_fd)=%d (wanted -1 and EBADF)", wjh_ret); } else { tst_resm(TPASS, "Test Passed"); } tst_rmdir(); //Done Testing tst_exit(); }