@@ -175,7 +175,6 @@ static void _test_fscanf() {
175175 const char wbuf [] = "testfilefscanf" ;
176176 char rbuf [sizeof (wbuf )] = {0 };
177177 FILE * file ;
178- size_t rv ;
179178 _set_contents (& adf , wbuf , sizeof (wbuf ));
180179 assert_nonnull_errno (file = fopen (adf .name , "r" ));
181180 assert_true_errno (fscanf (file , "%s" , rbuf ) != EOF );
@@ -259,6 +258,39 @@ static void _test_tmpfile() {
259258 assert_nonneg_errno (fclose (file ));
260259}
261260
261+ static void _test_dup () {
262+ g_auto (AutoDeleteFile ) adf = _create_auto_file ();
263+ char rbuf [3 ] = {0 };
264+ int fd , fd2 ;
265+ ssize_t rv ;
266+
267+ // write "aa" on original fd
268+ assert_nonneg_errno (fd = open (adf .name , O_RDWR ));
269+ assert_nonneg_errno (rv = write (fd , "aa" , 3 ));
270+ g_assert_cmpint (rv , = = , 3 );
271+
272+ // dup and write "bb" on new fd
273+ assert_nonneg_errno (fd2 = dup (fd ));
274+ assert_nonneg_errno (rv = write (fd2 , "bb" , 3 ));
275+ g_assert_cmpint (rv , = = , 3 );
276+
277+ // reset the file offset for the original fd
278+ lseek (fd , 0 , SEEK_SET );
279+
280+ // read "aa" on new fd
281+ assert_nonneg_errno (rv = read (fd2 , rbuf , sizeof (rbuf )));
282+ g_assert_cmpint (rv , = = , sizeof (rbuf ));
283+ g_assert_cmpstr (rbuf , = = , "aa" );
284+
285+ // read "bb" on original fd
286+ assert_nonneg_errno (rv = read (fd , rbuf , sizeof (rbuf )));
287+ g_assert_cmpint (rv , = = , sizeof (rbuf ));
288+ g_assert_cmpstr (rbuf , = = , "bb" );
289+
290+ assert_nonneg_errno (close (fd ));
291+ assert_nonneg_errno (close (fd2 ));
292+ }
293+
262294static void _test_iov () {
263295 g_auto (AutoDeleteFile ) adf = _create_auto_file ();
264296
@@ -450,6 +482,7 @@ int main(int argc, char* argv[]) {
450482
451483 g_test_add_func ("/file/dir" , _test_dir );
452484 g_test_add_func ("/file/tmpfile" , _test_tmpfile );
485+ g_test_add_func ("/file/dup" , _test_dup );
453486
454487 // TODO: debug and fix iov test
455488 // g_test_add_func("/file/iov", _test_iov);
0 commit comments