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