From patchwork Tue Sep 10 19:14:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Terekhov, Mikhail via Gdb-patches" X-Patchwork-Id: 34490 Received: (qmail 51261 invoked by alias); 10 Sep 2019 19:14:55 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 51193 invoked by uid 89); 10 Sep 2019 19:14:54 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=H*r:sk:mail-pl, HX-HELO:sk:mail-pl, HX-Spam-Relays-External:sk:mail-pl, H*RU:sk:mail-pl X-HELO: mail-pl1-f202.google.com Received: from mail-pl1-f202.google.com (HELO mail-pl1-f202.google.com) (209.85.214.202) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Sep 2019 19:14:52 +0000 Received: by mail-pl1-f202.google.com with SMTP id h17so8919324plr.11 for ; Tue, 10 Sep 2019 12:14:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=LyoG1BgQN4gKyntEC2lLB1tulrrHw8kWYoU7B1jNnr0=; b=DeqWxrIIKtWeA2PIEPnAyqdiDWrYYRD4/iXiWxw8OrJ29x0nwztYNAMypMq4XgyzK6 fNMhMXNZF4wViy9P1LUeLJJuLLuYAiRx7Co3DDp3KzNOAWcz466q2Uab4Gcb94d+1B15 Uuw5prpej2N2c/cDDxCxh48hejodcJYGybTinh9bbzIYk/l287apVOYP2X96MOqw/NU7 QISCgfpT2E21MumHUDK2C+9nU2sOuCdpy7N2hzuuy91TaMH4yq4VEAWHrDd3ajOtT2QF bES3P1ljeDwg1eFtezFb2apMoYIYGeo1bfhFDuvzkaxHI7Ld+xtVfpZktH891q5u2v7O EWvg== Date: Tue, 10 Sep 2019 14:14:48 -0500 In-Reply-To: Message-Id: <20190910191448.163722-1-cbiesinger@google.com> Mime-Version: 1.0 References: Subject: [PATCH 2/3 v2] Factor out the code to do the datadir-relocation for gdbinit X-Patchwork-Original-From: "Christian Biesinger via gdb-patches" From: "Terekhov, Mikhail via Gdb-patches" Reply-To: Christian Biesinger To: gdb-patches@sourceware.org Cc: Christian Biesinger X-IsSubscribed: yes This simplifies get_init_files and makes it possible to reuse this code in an upcoming patch for SYSTEM_GDBINIT_DIR. gdb/ChangeLog: 2019-09-10 Christian Biesinger * main.c (relocate_gdbinit_path_maybe_in_datadir): Factor this code out of get_init_files. (get_init_files): Update. --- gdb/main.c | 74 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/gdb/main.c b/gdb/main.c index e32ed62270..9e22889590 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -191,6 +191,47 @@ relocate_gdb_directory (const char *initial, bool relocatable) return dir; } +/* Given a gdbinit path in FILE, adjusts it according to the gdb_datadir + parameter if it is in the data dir, or passes it through relocate_path + otherwise. */ + +static std::string +relocate_gdbinit_path_maybe_in_datadir (const std::string& file) +{ + size_t datadir_len = strlen (GDB_DATADIR); + + std::string relocated_path; + + /* If SYSTEM_GDBINIT lives in data-directory, and data-directory + has been provided, search for SYSTEM_GDBINIT there. */ + if (gdb_datadir_provided + && datadir_len < file.length () + && filename_ncmp (file.c_str (), GDB_DATADIR, datadir_len) == 0 + && IS_DIR_SEPARATOR (file[datadir_len])) + { + /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR + to gdb_datadir. */ + + size_t start = datadir_len; + for (; IS_DIR_SEPARATOR (file[start]); ++start) + ; + relocated_path = (std::string (gdb_datadir) + SLASH_STRING + + file.substr (start)); + } + else + { + char *relocated = relocate_path (gdb_program_name, + file.c_str (), + SYSTEM_GDBINIT_RELOCATABLE); + if (relocated != nullptr) + { + relocated_path = relocated; + xfree (relocated); + } + } + return relocated_path; +} + /* Compute the locations of init files that GDB should source and return them in SYSTEM_GDBINIT, HOME_GDBINIT, LOCAL_GDBINIT. If there is no system gdbinit (resp. home gdbinit and local gdbinit) @@ -212,37 +253,8 @@ get_init_files (std::string *system_gdbinit, if (SYSTEM_GDBINIT[0]) { - size_t datadir_len = strlen (GDB_DATADIR); - size_t sys_gdbinit_len = strlen (SYSTEM_GDBINIT); - std::string relocated_sysgdbinit; - - /* If SYSTEM_GDBINIT lives in data-directory, and data-directory - has been provided, search for SYSTEM_GDBINIT there. */ - if (gdb_datadir_provided - && datadir_len < sys_gdbinit_len - && filename_ncmp (SYSTEM_GDBINIT, GDB_DATADIR, datadir_len) == 0 - && IS_DIR_SEPARATOR (SYSTEM_GDBINIT[datadir_len])) - { - /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR - to gdb_datadir. */ - - size_t start = datadir_len; - for (; IS_DIR_SEPARATOR (SYSTEM_GDBINIT[start]); ++start) - ; - relocated_sysgdbinit = (std::string (gdb_datadir) + SLASH_STRING - + &SYSTEM_GDBINIT[start]); - } - else - { - char *relocated = relocate_path (gdb_program_name, - SYSTEM_GDBINIT, - SYSTEM_GDBINIT_RELOCATABLE); - if (relocated != nullptr) - { - relocated_sysgdbinit = relocated; - xfree (relocated); - } - } + std::string relocated_sysgdbinit + = relocate_gdbinit_path_maybe_in_datadir (SYSTEM_GDBINIT); if (!relocated_sysgdbinit.empty () && stat (relocated_sysgdbinit.c_str (), &s) == 0) sysgdbinit = relocated_sysgdbinit;