1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) International Business Machines Corp., 2001 4 * Ported to LTP: Wayne Boyer 5 * Copyright (c) 2018 Cyril Hrubis <chrubis@suse.cz> 6 */ 7/* 8 * Fork a process that creates a file and writes a few bytes, and 9 * calls exit WITHOUT calling close(). The parent then reads the 10 * file. If everything that was written is present in the file, then 11 * the test passes. 12 */ 13 14#include <stdlib.h> 15#include "tst_test.h" 16 17#define FNAME "test_file" 18 19static void child_write(void) 20{ 21 int fd; 22 23 fd = SAFE_CREAT(FNAME, 0666); 24 SAFE_WRITE(SAFE_WRITE_ALL, fd, FNAME, sizeof(FNAME)); 25 exit(0); 26} 27 28static void check_file(void) 29{ 30 int fd, len; 31 char buf[256]; 32 33 fd = SAFE_OPEN(FNAME, O_RDONLY); 34 len = SAFE_READ(0, fd, buf, sizeof(buf)); 35 36 if (len != sizeof(FNAME)) { 37 tst_res(TFAIL, "Wrong length %i expected %zu", len, sizeof(buf)); 38 goto out; 39 } 40 41 if (memcmp(buf, FNAME, sizeof(FNAME))) { 42 tst_res(TFAIL, "Wrong data read back"); 43 goto out; 44 } 45 46 tst_res(TPASS, "File written by child read back correctly"); 47out: 48 SAFE_CLOSE(fd); 49} 50 51static void run(void) 52{ 53 int pid; 54 55 pid = SAFE_FORK(); 56 if (!pid) 57 child_write(); 58 59 tst_reap_children(); 60 61 check_file(); 62 63 SAFE_UNLINK(FNAME); 64} 65 66static struct tst_test test = { 67 .needs_tmpdir = 1, 68 .forks_child = 1, 69 .test_all = run, 70}; 71