1 /* Copyright (C) 2021-2024 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
24 #include <sys/param.h>
28 #include "Application.h"
33 Application::ProgressFunc
Application::progress_func
= NULL
;
34 Application
*theApplication
;
36 Application::Application (int argc
, char *argv
[], char *fdhome
)
38 theApplication
= this;
40 prog_version
= dbe_strdup (VERSION
);
41 set_name (strchr (argv
[0], '/') ? argv
[0] : NULL
);
42 whoami
= get_basename (get_name ());
44 // set up a queue for comments
45 commentq
= new Emsgqueue (NTXT ("app_commentq"));
47 // Locate where the binaries are installed
51 init_locale (run_dir
);
53 // Initialize licensing data
57 // Initialize worker threads
58 number_of_worker_threads
= 1;
60 char *use_worker_threads
= getenv (NTXT ("SP_USE_WORKER_THREADS"));
61 if ((NULL
!= use_worker_threads
) && (0 == strcasecmp (use_worker_threads
, NTXT ("no"))))
63 number_of_worker_threads
= 0;
66 settings
= new Settings (this);
69 Application::~Application ()
79 // Set the name of the application (for messages)
81 Application::set_name (const char *_name
)
83 prog_name
= get_realpath (_name
);
87 Application::get_realpath (const char *_name
)
90 _name
= "/proc/self/exe";
91 char *exe_name
= realpath (_name
, NULL
);
94 if (strchr (_name
, '/') == NULL
)
96 char *path
= getenv ("PATH");
98 for (char *s
= path
;; s
++)
99 if (*s
== ':' || *s
== 0)
103 char *nm
= dbe_sprintf (NTXT ("%.*s/%s"), (int) (s
- path
),
105 exe_name
= realpath (nm
, NULL
);
115 return strdup (_name
);
118 // Set the directory where all binaries are found
120 Application::set_run_dir (char *fdhome
)
122 run_dir_with_spaces
= NULL
;
125 char *path
= dbe_sprintf ("%s/bin", fdhome
);
127 if (stat (path
, &sbuf
) != -1)
132 run_dir
= dbe_strdup (fdhome
);
137 run_dir
= realpath (prog_name
, NULL
);
140 fprintf (stderr
, // I18N won't work here -- not catopen yet.
141 GTXT ("Can't find location of %s\n"), prog_name
);
142 run_dir
= dbe_strdup (get_cur_dir ());
146 char *d
= strrchr (run_dir
, '/');
149 // Check if the installation path contains spaces
150 if (strchr (run_dir
, ' ') != NULL
)
152 // Create a symbolic link without spaces
153 const char *dir
= NTXT ("/tmp/.gprofngLinks");
154 char *symbolic_link
= dbe_create_symlink_to_path (run_dir
, dir
);
155 if (NULL
!= symbolic_link
)
157 // Save old path to avoid memory leak
158 run_dir_with_spaces
= run_dir
;
159 // Use the path through symbolic link
160 run_dir
= symbolic_link
;
168 Application::get_cur_dir ()
172 char cwd
[MAXPATHLEN
];
173 if (getcwd (cwd
, sizeof (cwd
)) == NULL
)
178 cur_dir
= dbe_strdup (canonical_path (cwd
));
184 * Get number of worker threads
185 * This is used to decide if it is ok to use worker threads for stat()
186 * and other actions that can hang for a long time
187 * @return number_of_worker_threads
190 Application::get_number_of_worker_threads ()
192 return number_of_worker_threads
;
196 Application::check_args (int argc
, char *argv
[])
199 // Parsing the command line
201 while ((opt
= getopt (argc
, argv
, "V")) != EOF
)
206 Application::print_version_info ();
208 printf (NTXT ("GNU %s version %s\n"), get_basename (prog_name), VERSION);
218 Application::fetch_comments ()
220 if (commentq
== NULL
)
222 return commentq
->fetch ();
226 Application::queue_comment (Emsg
*m
)
228 commentq
->append (m
);
232 Application::delete_comments ()
234 if (commentq
!= NULL
)
237 commentq
= new Emsgqueue (NTXT ("app_commentq"));
242 Application::set_progress (int percentage
, const char *proc_str
)
244 if (progress_func
!= NULL
)
245 return progress_func (percentage
, proc_str
);
251 Application::print_version_info ()
254 "GNU %s binutils version %s\n"
255 "Copyright (C) 2024 Free Software Foundation, Inc.\n"
256 "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.\n"
257 "This is free software: you are free to change and redistribute it.\n"
258 "There is NO WARRANTY, to the extent permitted by law.\n"),
259 get_basename (prog_name
), VERSION
);