From patchwork Mon Dec 19 09:09:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 34463 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp2333958wrn; Mon, 19 Dec 2022 03:37:11 -0800 (PST) X-Google-Smtp-Source: AA0mqf63qjXFMj1vqFW/s6Q6sEFRqy8hLFXsW/lRiAdvyFXOcWn8VAzed+0wt/QdrdZ/n05XJ1TI X-Received: by 2002:a17:906:5053:b0:7c1:727f:7c70 with SMTP id e19-20020a170906505300b007c1727f7c70mr26848669ejk.46.1671449830839; Mon, 19 Dec 2022 03:37:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671449830; cv=none; d=google.com; s=arc-20160816; b=aTHYN3VXTZ4C7RrP1sAsTO7mUXoOq0DXziRv6kJYJa26zr3WfzOoPQEsIb2fomJDbJ SfbSi+I2ENgMgRHw1JGRk/uF1Zu1nvTDxqyEPzFPd23mffmudaq2/QkzVIG9oj0FqGn3 UZ1Vmm2tOz3CxGUEnlvHg8aqMIMxSEzM/zlNmUR/F4/BUwGgw3VO+vOhH2va+am97uEi PCQaJwFrYRauL+WYWAEfaSJWnUinopsPvFn1VGq5O2Ml1U9fwtdGB8lpzqaBzC1GB8u3 bXWcs5jxRWrsCHQzBqdX9KrpUjUE8Ia7R6Z2Rrp5TtL4s4bHoAaIe0eV/q2yIB5XeHfx KxBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:from:to :content-language:user-agent:mime-version:date:message-id :ironport-sdr:dmarc-filter:delivered-to; bh=KYXsn3ghuEBr3MitZ+s6Dc6SXVpcdN0OWqioHnUnvPE=; b=urKBgipYKw/Ncb4dHQ/dzd2Ss5ptanDIU8llMWgykTTmDjm33JsW9EFo66m2d0jmDw ZIwBcs5FlVWZHQ192WxdZtm/DfMAvTNlXAZtq73u3AYUXMXvE64d0oDqrWCCfWX+RP2n 4kdzdbqE11E9yuPp/8iMbwyvkABWvKwVXon/DonJoim5AoqPrubJybByHgBaPGpemJYA dIsATr+jwmGyAWRWEfWoz2F7GVG5dQx895RHlkIrfwf5GweEZXsmM42YQeIqSQih98AT FNONAPuwZsveah7VDnISN5Ok6k+Xpxe7OAzRtOsP77AYGeR8M/DcOY9zfa67rlIaScvj ug0g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id j26-20020a17090686da00b007add6be8c86si7177726ejy.762.2022.12.19.03.37.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Dec 2022 03:37:10 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 873513897000 for ; Mon, 19 Dec 2022 10:49:00 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id 568993957496; Mon, 19 Dec 2022 09:09:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 568993957496 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.96,255,1665475200"; d="diff'?scan'208";a="90765021" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 19 Dec 2022 01:09:19 -0800 IronPort-SDR: CtDi5eQFjkjY6PhTpGLaQtU36sVXFB6dIpLLAjSHNXHXp2L2rs3KVjws4gTU0rAmPHviL0JuuY zVarC97mPlH031G6j+p2VEgCXDoQTJWuyFO4QfvYjnxv3dLLltgEPeUjG2vWDlZzJJzRKeM+4b 3CTLqFKDcgGWH5suy+tM2dFBWyiRbPC1kaTA/ChMKthUhaV5GUu6ARMIFIgOYFc1QzervJDJzA lFLelaxMI5uHsY5wxVnHbbMFx/ZqlkTMACfIp51R4LbazmEfM/CsAJ/Ey976eSH1cnl6nUq/6m TuU= Message-ID: Date: Mon, 19 Dec 2022 10:09:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Content-Language: en-US To: gcc-patches , fortran , Jerry D , NightStrike From: Tobias Burnus Subject: [Patch] gfortran.dg/read_dir.f90: Make PASS on Windows X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-13.mgc.mentorg.com (139.181.222.13) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752641326942333316?= X-GMAIL-MSGID: =?utf-8?q?1752642177530496224?= As discussed in #gfortran IRC, on Windows opening a directory fails with EACCESS. (It works under Cygwin - nightstrike was so kind to test this.) Additionally, '[ -d dir ] || mkdir dir' is also not very portable. Hence, I use an auxiliary C file calling the POSIX functions and expect a fail for non-Cygwin windows. Comments? Suggestions? - If there aren't any, I plan to commit it as obvious tomorrow. Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 gfortran.dg/read_dir.f90: Make PASS on Windows Call POSIX's stat/mkdir/rmdir instead of using the shell via 'call system'. Additionally, expect EACCESS on non-Cygwin Windows as documented for trying to open a directory. gcc/testsuite/ChangeLog: * gfortran.dg/read_dir-aux.c: New; provides my_mkdir and my_rmdir. * gfortran.dg/read_dir.f90: Call my_mkdir/my_rmdir; expect error on Windows when opening a directory. gcc/testsuite/gfortran.dg/read_dir-aux.c | 39 +++++++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/read_dir.f90 | 43 ++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/gcc/testsuite/gfortran.dg/read_dir-aux.c b/gcc/testsuite/gfortran.dg/read_dir-aux.c new file mode 100644 index 00000000000..e8404478517 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/read_dir-aux.c @@ -0,0 +1,39 @@ +#include /* For mkdir + permission bits. */ +#include /* For rmdir. */ +#include /* For errno. */ +#include /* For perror. */ +#include /* For abort. */ + + +void +my_mkdir (const char *dir) +{ + int err; + struct stat path_stat; + + /* Check whether 'dir' exists and is a directory. */ + err = stat (dir, &path_stat); + if (err && errno != ENOENT) + { + perror ("my_mkdir: failed to call stat for directory"); + abort (); + } + if (err == 0 && !S_ISDIR (path_stat.st_mode)) + { + printf ("my_mkdir: pathname %s is not a directory\n", dir); + abort (); + } + + err = mkdir (dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); + if (err != 0) + { + perror ("my_mkdir: failed to create directory"); + abort (); + } +} + +void +my_rmdir (const char *dir) +{ + rmdir (dir); +} diff --git a/gcc/testsuite/gfortran.dg/read_dir.f90 b/gcc/testsuite/gfortran.dg/read_dir.f90 index c7ddc51fb90..3a8ff6adbc7 100644 --- a/gcc/testsuite/gfortran.dg/read_dir.f90 +++ b/gcc/testsuite/gfortran.dg/read_dir.f90 @@ -1,18 +1,51 @@ ! { dg-do run } +! { dg-additional-options "-cpp" } +! { dg-additional-sources read_dir-aux.c } +! ! PR67367 + program bug + use iso_c_binding implicit none + + interface + subroutine my_mkdir(s) bind(C) + ! Call POSIX's mkdir - and ignore fails due to + ! existing directories but fail otherwise + import + character(len=1,kind=c_char) :: s(*) + end subroutine + subroutine my_rmdir(s) bind(C) + ! Call POSIX's rmdir - and ignore fails + import + character(len=1,kind=c_char) :: s(*) + end subroutine + end interface + + character(len=*), parameter :: sdir = "junko.dir" + character(len=*,kind=c_char), parameter :: c_sdir = sdir // c_null_char + character(len=1) :: c - character(len=256) :: message integer ios - call system('[ -d junko.dir ] || mkdir junko.dir') - open(unit=10, file='junko.dir',iostat=ios,action='read',access='stream') + + call my_mkdir(c_sdir) + open(unit=10, file=sdir,iostat=ios,action='read',access='stream') + +#if defined(__MINGW32__) + ! Windows is documented to fail with EACCESS when trying to open a directory + ! Note: Testing showed that __CYGWIN__ does permit opening directories + call my_rmdir(c_sdir) + if (ios == 0) & + stop 3 ! Expected EACCESS + stop 0 ! OK +#endif + if (ios.ne.0) then - call system('rmdir junko.dir') + call my_rmdir(c_sdir) STOP 1 end if read(10, iostat=ios) c - if (ios.ne.21.and.ios.ne.0) then + if (ios.ne.21.and.ios.ne.0) then ! EISDIR has often the value 21 close(10, status='delete') STOP 2 end if