From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70073.outbound.protection.outlook.com [40.107.7.73]) by sourceware.org (Postfix) with ESMTPS id 7F5763853815; Fri, 2 Jul 2021 09:11:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7F5763853815 Received: from PR0P264CA0226.FRAP264.PROD.OUTLOOK.COM (2603:10a6:100:1e::22) by VE1PR08MB5760.eurprd08.prod.outlook.com (2603:10a6:800:1af::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.23; Fri, 2 Jul 2021 09:11:53 +0000 Received: from VE1EUR03FT031.eop-EUR03.prod.protection.outlook.com (2603:10a6:100:1e:cafe::48) by PR0P264CA0226.outlook.office365.com (2603:10a6:100:1e::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22 via Frontend Transport; Fri, 2 Jul 2021 09:11:53 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; sourceware.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;sourceware.org; dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VE1EUR03FT031.mail.protection.outlook.com (10.152.18.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22 via Frontend Transport; Fri, 2 Jul 2021 09:11:53 +0000 Received: ("Tessian outbound c836dc7aad98:v97"); Fri, 02 Jul 2021 09:11:52 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: ac82f9e5dc98bedf X-CR-MTA-TID: 64aa7808 Received: from 9901b3cde633.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 2E907865-9181-492C-AAA5-8109251FD514.1; Fri, 02 Jul 2021 09:11:13 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 9901b3cde633.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 02 Jul 2021 09:11:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MJ30BvXxFjAzFFhhlsIXRCCxepm0MXdx/tkPbuhCi8pAObMOv7vtFPvm1oERBa7GSe1cSmRUicboOG+9/4QL5Q3uqlDMBY9mHuho9++yYgV7Xsx3GIWB+GFxJbqEurUfF6BlYjfmkQFAKRrU+Uu/W0YquMI6O2CwRRp+JHgMsifayLDIvynyXHzVviGWm8DAw29NYd/5z+WDl30V9AQsCptGQwiY7tv1z+gK8UmIgNDRrOxzrjBEXVMx0jivJyltxiv5y2jLc0ryvtn7xkO6aERjEHVBbqZvWKqScmvR0YluQlrgmGgqFdSNSbIlJPPsqk6gLMej4r5T3iSAFZ9zuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=icjecNPH+g9gao0KHc/tP8aGYoYnKS/kTFzc7+reW84=; b=PQ8lh+2VwK2hBbHnnzQK+NyvXsrXB8oVHY0Ml/eNrtKMvDxVMLPSvGsHnIlwDQript77Sa7/LBv/5FiBoWJjsUKjJfOUEdp+MnpZr6fOPkH5DbFaqoAo0cnT6WUQc6qdI5M0aFR41yp27d6SdaTZfe9qP8dDgyA8O4cRMbekz+ejStdZEO08BrHR3TKgbEknwfd4X78eH5B+5xTFfsfnKRt5l5c07UJUuQezchBA7iGu89XL8ZYa4Bxcl5KxrboSqHkCp8cBefIrEvMLIYidsVX4Q8yM/eUs7b3WQmWIUrr7gKCwxyzSJPwWdTwsEIfOi4yuDcU3oLnKvQZdKwiu+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: sourceware.org; dkim=none (message not signed) header.d=none;sourceware.org; dmarc=none action=none header.from=arm.com; Received: from PA4PR08MB6320.eurprd08.prod.outlook.com (2603:10a6:102:e5::9) by PA4PR08MB6141.eurprd08.prod.outlook.com (2603:10a6:102:f2::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.21; Fri, 2 Jul 2021 09:11:12 +0000 Received: from PA4PR08MB6320.eurprd08.prod.outlook.com ([fe80::ac83:9f8b:1a5:2c33]) by PA4PR08MB6320.eurprd08.prod.outlook.com ([fe80::ac83:9f8b:1a5:2c33%5]) with mapi id 15.20.4287.027; Fri, 2 Jul 2021 09:11:12 +0000 Date: Fri, 2 Jul 2021 10:11:11 +0100 From: Szabolcs Nagy To: Siddhesh Poyarekar Cc: libc-alpha@sourceware.org, schwab@linux-m68k.org Subject: Re: [PATCH 4/6] iconvconfig: Use common gconv module parsing function Message-ID: <20210702091109.GG14854@arm.com> References: <20210610111853.2286873-1-siddhesh@sourceware.org> <20210610111853.2286873-5-siddhesh@sourceware.org> Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20210610111853.2286873-5-siddhesh@sourceware.org> User-Agent: Mutt/1.9.4 (2018-02-28) X-Originating-IP: [217.140.106.55] X-ClientProxiedBy: LO4P123CA0210.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1a5::17) To PA4PR08MB6320.eurprd08.prod.outlook.com (2603:10a6:102:e5::9) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from arm.com (217.140.106.55) by LO4P123CA0210.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1a5::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.23 via Frontend Transport; Fri, 2 Jul 2021 09:11:12 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: cb075e9b-f2a2-46cb-433a-08d93d396edb X-MS-TrafficTypeDiagnostic: PA4PR08MB6141:|VE1PR08MB5760: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:1728;OLM:1728; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: aho+wn+tP0uol0QUELsZLstKcFIn9GD5DZ6GaJBgLNHB682ieE/db8m3k4Bar5dC5YtMbMlQJU4DeRmObp1rEdFzC5sxljEi5b9jNhraiHu74Khejd8wDp5gFLpbz1+RUEbbb7e9wEVxaeVG+5p6Fuiff0/R9xPNL8LITxerMJUn8bksc8CNBH6E5G6QEriEPdhDxotdinznr4dGB1/hQ4VttffmlGKgOT3lnBmQ7DAddsJW2hfoZ0W+rqkH4y517O4WTMdL+6Mp2wqgBMtEMXFBLxbnka9JBYbF1JJdNzYDRKuNDV/RgB8FpghEBZ/4jPyV4rcUxSxJ5l/ss2Gti7ePtSqZWIqUji9+R1ld/VFSiTu3p0lDWY0kWleBgplHUNePLOSKxTufBBgjlwefQB19hD2FvUECywYt6Y6AjPfmbVRu9PKXv3sEIHHczqp8w44Hm52Hw8MuD5N4FMqDqPyPjoty9d4xG9aFY5Xsmz5A14A5+eT93LB/ekXb8CJm2toIo68/xdgAuL0dxWb72Gsnp3qARkiiRQuu6DqN93DmqSQHKDLkDz9hZRGZZbeOIiZ583q8pOimXAp/aKsQNiPZG57rXOrW3JiL/J93SWQKowRMQROnDmlykset2KL86fUGU8JCLNI6ToCvbzXVFEHe9YGFoo1qG6xq+LcIMh4rOnxIkiidZi5coX7n1I9sknuuREnhVfIescALgaqLHg== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PA4PR08MB6320.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(346002)(366004)(396003)(136003)(376002)(39850400004)(2906002)(55016002)(316002)(478600001)(7696005)(38100700002)(38350700002)(33656002)(52116002)(86362001)(8886007)(26005)(44832011)(8676002)(83380400001)(8936002)(186003)(16526019)(66556008)(4326008)(66476007)(1076003)(6916009)(956004)(66946007)(36756003)(2616005)(5660300002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?T1BUUGh4SVEyWXpIdTlJVzBLdUN0MXRmMTdaZXhoV3FLbWVtaytXNjdrWEZB?= =?utf-8?B?cUNnV08vOTRvaUQyRWpVMUVoYzJ0Tm9vRXJKb0VJTGFkQ0FrUVBwNTJnN1BR?= =?utf-8?B?MGpxZ3ZCaHk3VDlRVm5KQ1o0dk9LU2tLQlZtK282UFhibjBEYlVWdFBFNVJl?= =?utf-8?B?ZVZTSnYwdEJENGJlMUt6QldvUVFjWjhES3F1dmtqQ25jNDRmdGU0M0o1N1pi?= =?utf-8?B?TEh1T09BRXpjRHE4R1IwWFpkaWlYMVpOYVBIZFQyNUYwckc0aDgxUXVyL24w?= =?utf-8?B?S3pqRzU3VmNSK3lqRDUwNXV0NytLMFNZdUVMZldUN3JhN0FoazlLa3A1WDdC?= =?utf-8?B?Mm56MDMwb2hLcEFmZFVIYTlwanhhQ1VCRExMQkFzYW5NNVRlZXBpMmJlbXZM?= =?utf-8?B?alJkZ1RrdFRkY2ozSndTT2ZPbHhDM01NYm1pNUdwOEpjMEdGek9LYktTVHdW?= =?utf-8?B?NXBMNkJoM2Q0QmNiMVlBSUhVVGRNcWs4YXJOb29rZi85d0ZQNXh1SSs4dDh0?= =?utf-8?B?Szg2RjNHYWlSMUNmdXNwZjJUcW1WWHltTkVjaEF0MHNrUkVnV090ZE16dUw1?= =?utf-8?B?Qy9ubThiNm9PNTNhZXFyZU9rS3BUQWg3OWNabFZJa012L25TUFdRYm9iR2Rl?= =?utf-8?B?NURwb3ZQK3ZVZEpKcFlydEw3LzlmVzlCQWhmR1FqQzdWK3paWldzMTFtU2Rj?= =?utf-8?B?UVRQMVZBSldiamdxSFpVem1OTldYL3o4VUt4RU0yN0hXYjFjbEpqWTk4dEZk?= =?utf-8?B?ZkM0M2YxYkt3UjRYSW83TU5yeWhkZERFWGtsUU9jSjdsQnZ1QXIwbm4yTm8r?= =?utf-8?B?NFdMQjduMzZwMHN2alFmSkVjNjV4TGFDWGk2L3RMRjJ1TlNFVnF5c3dGSHdD?= =?utf-8?B?OFB1ZzVIbjBVL0FYMU1CSE9RdFB3MDRhdis4WnFvRkd6S3lWbHA5VTg3Vy9V?= =?utf-8?B?SXQ3OUJDUVVydUFPNnFuY0w1UWRnK2ZXSHVXSEpWTkd5QXFZVVVqL2N6SVZp?= =?utf-8?B?a0J0Mm1Md3NZalRhUm51R2t1MkZzOCtML3g5NUFDVUphRE1IVCtsZHZ3Tll0?= =?utf-8?B?czBZS2dPRGM3VHZFN2w4UXY3VS9pQ2c3ZEMrcG1FV1NGNGJ3UEZBMFJuRVJB?= =?utf-8?B?dUtEbVpYeDlJT3NXOXoyUHJEeE1tLzgxbmpGVEZUVGo2SUdhanhURlduMm9H?= =?utf-8?B?MENBc2JSSTlycUhiNEovN0RVUUhvNDQwMkF4eWR1dFg4V2IxM2xRbVlBMmw4?= =?utf-8?B?SzI2b1BFRTF6QUdudnE4eDUyYVBiRkpHTkliUFRpNGJ4OFBaeWpVemxIdWxC?= =?utf-8?B?UGJuZndZU1lSSHFJYnA2cTdmRVI4SVQ0YUMxUTdTcjl1aTh4YlpHYmFZQnBk?= =?utf-8?B?L0ltOEttYnhBMGdhZnpzUFpCQnV6ZTZyQitRQ2dLVHMwUmk5QW9LSDlPWHJo?= =?utf-8?B?SzhIclZQTVF2ZmZnS01EMXNjd1dyQjBvTTdCMVRKQnNBQ2lMV01mTmMvTE1O?= =?utf-8?B?ME5PVVNvemkzK3prNlJuUTR5UFlyMG93RjByZUgyai9IWGRweWV0ZzdwVFR4?= =?utf-8?B?aEJtRHBocjdYMWx0OGplY3BxQzlSY25wRFF5eC9PbDNkVWVydExvZ09Vb3kr?= =?utf-8?B?VW9SUjkrMExzMEgwaHEwbjRmeEV5WFJvRW11UllHd2Fndk5JUmxtd01uVG56?= =?utf-8?B?QnUrelRMYUVoVmM0TGFNUFV1MS9TbndSZ0NLdG54YWFUZVBTM1hzQVkxdmww?= =?utf-8?Q?oZKPm0eHw19YXoBeUatIrew7zWOjH2OgAySyc3t?= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB6141 Original-Authentication-Results: sourceware.org; dkim=none (message not signed) header.d=none; sourceware.org; dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: VE1EUR03FT031.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 88c8e194-5e95-40c0-994f-08d93d3956a5 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0mTwTwAVSyNwif3cPSZsguE7ZzlqJ82Utqd/I9gUwl5dKnbd+dm+SHjMoE6LaPP4J1KX67s7gCOhHB8Vsp37Rn1OEIz4HYH+7BPwTPgQ9GnvQjPWZGVO7CpYN7bx5Y5e7d/ZcGP6eq2rclERqgsqM5sbURlGa+CB5j+VvqBSlUn1QjbB2qMl2tIz37U9Zz96za7f52K6Qe1uuNLMKi+hm+gRXaaG1h+Kdj4L1fRDDT8TdBPYUPpHVgkITEfEYa8ZMyJ2NXZbWZX7JBBd46QISoHY+t7ycrnFpHYepGFzK3g+n+8k/HsrjfcT5BD5Kbcip8tOGckCK+REnF3jtoaAXxgIVMwT+lEvgRSgACC8C5Qex7QJKsqMs86AmGB6Ch1iWqjZtorNECFRb8tmPfOyxzb6tWojFhypwOmgNVKBgbrOuEDbBdYoZEjt+xb+CW2jnV4V9fvWDam7+euqdoMcjDJVnR5i/ho00ztDdPEoj8gj+9UkqR3tJpop0kNB1iKE8wOHlipAIyiZ5+4ravKKZ/VttJFYk5iks7LVybbxvSB+5x7Ezk6hpk580YT8gltiRlnXI1S6YPXOL4BoA//71V9PO5hRAk5stZSV0oDmdWAmdb2FvKtcoRNiuovxj2xouDRrL6rLjjrTeh2k1LDbO/rciurWgzlySX3Ec+a/YJWFuUzbYl8Hj2T8TrxnZkKNOGRCQxGTgNjMbmxuGnqvNg== X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(4636009)(396003)(136003)(39860400002)(346002)(376002)(36840700001)(46966006)(26005)(2616005)(956004)(336012)(55016002)(36860700001)(83380400001)(186003)(70586007)(7696005)(70206006)(44832011)(8676002)(2906002)(8886007)(47076005)(5660300002)(16526019)(478600001)(450100002)(4326008)(82740400003)(1076003)(81166007)(8936002)(107886003)(33656002)(36756003)(6916009)(82310400003)(86362001)(316002)(356005); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jul 2021 09:11:53.0270 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: cb075e9b-f2a2-46cb-433a-08d93d396edb X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: VE1EUR03FT031.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR08MB5760 X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, MSGID_FROM_MTA_HEADER, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Jul 2021 09:11:59 -0000 The 06/10/2021 16:48, Siddhesh Poyarekar via Libc-alpha wrote: > Drop local copy of gconv file parsing and use the one in > gconv_parseconfdir.h instead. Now there is a single implementation of > configuration file parsing. build fails for me after this with iconvconfig.c:(.text+0x7ec): undefined reference to `__feof_unlocked' if i configure with -Os --disable-werror i.e. the patch relies on __USE_EXTERN_INLINES to inline __feof_unlocked (which is not a public symbol so should not be referenced from iconv binaries) > --- > iconv/iconvconfig.c | 126 ++++---------------------------------------- > 1 file changed, 11 insertions(+), 115 deletions(-) > > diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c > index c9607fb645..53e5c5c6f4 100644 > --- a/iconv/iconvconfig.c > +++ b/iconv/iconvconfig.c > @@ -18,7 +18,6 @@ > > #include > #include > -#include > #include > #include > #include > @@ -34,10 +33,10 @@ > #include > #include > #include > -#include > #include > > #include "iconvconfig.h" > +#include > > /* Get libc version number. */ > #include "../version.h" > @@ -568,7 +567,7 @@ new_module (const char *fromname, size_t fromlen, const char *toname, > > /* Add new module. */ > static void > -add_module (char *rp, const char *directory) > +add_module (char *rp, const char *directory, size_t dirlen, int modcount) > { > /* We expect now > 1. `from' name > @@ -646,131 +645,28 @@ add_module (char *rp, const char *directory) > cost, need_ext); > } > > -/* Read a gconv-modules configuration file. */ > -static bool > -handle_file (const char *dir, const char *infile) > -{ > - FILE *fp; > - char *line = NULL; > - size_t linelen = 0; > - > - fp = fopen (infile, "r"); > - if (fp == NULL) > - return false; > - > - /* No threads present. */ > - __fsetlocking (fp, FSETLOCKING_BYCALLER); > - > - while (!feof_unlocked (fp)) > - { > - char *rp, *endp, *word; > - ssize_t n = __getdelim (&line, &linelen, '\n', fp); > - > - if (n < 0) > - /* An error occurred. */ > - break; > - > - rp = line; > - /* Terminate the line (excluding comments or newline) with a NUL > - byte to simplify the following code. */ > - endp = strchr (rp, '#'); > - if (endp != NULL) > - *endp = '\0'; > - else > - if (rp[n - 1] == '\n') > - rp[n - 1] = '\0'; > - > - while (isspace (*rp)) > - ++rp; > - > - /* If this is an empty line go on with the next one. */ > - if (rp == endp) > - continue; > - > - word = rp; > - while (*rp != '\0' && !isspace (*rp)) > - ++rp; > - > - if (rp - word == sizeof ("alias") - 1 > - && memcmp (word, "alias", sizeof ("alias") - 1) == 0) > - add_alias (rp); > - else if (rp - word == sizeof ("module") - 1 > - && memcmp (word, "module", sizeof ("module") - 1) == 0) > - add_module (rp, dir); > - /* else */ > - /* Otherwise ignore the line. */ > - } > - > - free (line); > - > - fclose (fp); > - > - return true; > -} > - > /* Read config files and add the data for this directory to cache. */ > static int > handle_dir (const char *dir) > { > - char *cp; > size_t dirlen = strlen (dir); > bool found = false; > > + /* Add the prefix before sending it off to the parser. */ > + char *fulldir = xmalloc (prefix_len + dirlen + 2); > + char *cp = mempcpy (mempcpy (fulldir, prefix, prefix_len), dir, dirlen); > + > if (dir[dirlen - 1] != '/') > { > - char *newp = (char *) xmalloc (dirlen + 2); > - dir = memcpy (newp, dir, dirlen); > - newp[dirlen++] = '/'; > - newp[dirlen] = '\0'; > + *cp++ = '/'; > + *cp = '\0'; > + dirlen += 2; > } > > - /* First, look for a gconv-modules file. */ > - char *buf = malloc (prefix_len + dirlen + sizeof "gconv-modules.d"); > - if (buf == NULL) > - goto out; > - > - cp = buf; > - if (dir[0] == '/') > - cp = mempcpy (cp, prefix, prefix_len); > - cp = mempcpy (cp, dir, dirlen); > - cp = stpcpy (cp, "gconv-modules"); > - > - found |= handle_file (dir, buf); > - > - /* Next, see if there is a gconv-modules.d directory containing configuration > - files and if it is non-empty. */ > - cp[0] = '.'; > - cp[1] = 'd'; > - cp[2] = '\0'; > - > - DIR *confdir = opendir (buf); > - if (confdir != NULL) > - { > - struct dirent *ent; > - while ((ent = readdir (confdir)) != NULL) > - { > - if (ent->d_type != DT_REG) > - continue; > - > - size_t len = strlen (ent->d_name); > - const char *suffix = ".conf"; > - > - if (len > strlen (suffix) > - && strcmp (ent->d_name + len - strlen (suffix), suffix) == 0) > - { > - char *conf; > - if (asprintf (&conf, "%s/%s", buf, ent->d_name) < 0) > - continue; > - found |= handle_file (dir, conf); > - free (conf); > - } > - } > - closedir (confdir); > - } > + found = gconv_parseconfdir (fulldir, dirlen + prefix_len); > > - free (buf); > + free (fulldir); > > -out: > if (!found) > { > error (0, errno, "failed to open gconv configuration files in `%s'", > -- > 2.31.1 > --