/* Handling of dynamic sring tokens.
   Copyright (C) 1999-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include "trusted-dirs.h"

/* Determine the number of DST elements in the name.  Only if IS_PATH is
   nonzero paths are recognized (i.e., multiple, ':' separated filenames).  */
#define DL_DST_COUNT(name) \
  ({									      \
    size_t __cnt = 0;							      \
    const char *__sf = strchr (name, '$');				      \
									      \
    if (__glibc_unlikely (__sf != NULL))				      \
      __cnt = _dl_dst_count (__sf);					      \
									      \
    __cnt; })


#ifdef SHARED
# define IS_RTLD(l) (l) == &GL(dl_rtld_map)
#else
# define IS_RTLD(l) 0
#endif
/* Guess from the number of DSTs the length of the result string.  */
#define DL_DST_REQUIRED(l, name, len, cnt) \
  ({									      \
    size_t __len = (len);						      \
    size_t __cnt = (cnt);						      \
									      \
    if (__cnt > 0)							      \
      {									      \
	size_t dst_len;							      \
	/* Now we make a guess how many extra characters on top of the	      \
	   length of S we need to represent the result.  We know that	      \
	   we have CNT replacements.  Each at most can use		      \
	     MAX (MAX (strlen (ORIGIN), strlen (_dl_platform)),		      \
		  strlen (DL_DST_LIB))					      \
	   minus 4 (which is the length of "$LIB").			      \
									      \
	   First get the origin string if it is not available yet.	      \
	   This can only happen for the map of the executable or, when	      \
	   auditing, in ld.so.  */					      \
	if ((l)->l_origin == NULL)					      \
	  {								      \
	    assert ((l)->l_name[0] == '\0' || IS_RTLD (l));		      \
	    (l)->l_origin = _dl_get_origin ();				      \
	    dst_len = ((l)->l_origin && (l)->l_origin != (char *) -1	      \
			  ? strlen ((l)->l_origin) : 0);		      \
	  }								      \
	else								      \
	  dst_len = (l)->l_origin == (char *) -1			      \
	    ? 0 : strlen ((l)->l_origin);				      \
                                                                              \
	const char *exec_origin = GLRO(google_exec_origin_dir);		      \
	size_t exec_origin_len =					      \
	  (exec_origin == NULL) ? 0 : strlen (exec_origin);		      \
									      \
	dst_len = MAX (MAX (MAX (dst_len, GLRO(dl_platformlen)),	      \
			    strlen (DL_DST_LIB)), exec_origin_len);	      \
	if (dst_len > 4)						      \
	  __len += __cnt * (dst_len - 4);				      \
      }									      \
									      \
    __len; })
