1 /* Attach to target process.
2 Copyright (C) 1999-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19 #include <stddef.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <version.h>
23
24 #include "thread_dbP.h"
25
26
27 /* Datatype for the list of known thread agents. Normally there will
28 be exactly one so we don't spend much though on making it fast. */
29 LIST_HEAD (__td_agent_list);
30
31
32 td_err_e
td_ta_new(struct ps_prochandle * ps,td_thragent_t ** ta)33 td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
34 {
35 psaddr_t versaddr;
36 char versbuf[sizeof (VERSION)];
37
38 LOG ("td_ta_new");
39
40 /* Check whether the versions match. */
41 if (td_lookup (ps, SYM___nptl_version, &versaddr) != PS_OK)
42 return TD_NOLIBTHREAD;
43 if (ps_pdread (ps, versaddr, versbuf, sizeof (versbuf)) != PS_OK)
44 return TD_ERR;
45
46 if (memcmp (versbuf, VERSION, sizeof VERSION) != 0)
47 /* Not the right version. */
48 return TD_VERSION;
49
50 /* Fill in the appropriate information. */
51 *ta = (td_thragent_t *) calloc (1, sizeof (td_thragent_t));
52 if (*ta == NULL)
53 return TD_MALLOC;
54
55 /* Store the proc handle which we will pass to the callback functions
56 back into the debugger. */
57 (*ta)->ph = ps;
58
59 /* Now add the new agent descriptor to the list. */
60 list_add (&(*ta)->list, &__td_agent_list);
61
62 return TD_OK;
63 }
64