예제 #1
0
uint_t
la_version(uint_t version)
{
	if (version < LAV_CURRENT) {
		(void) fprintf(stderr,
		    "symbindrep.so: unexpected version: %d\n", version);
		return (0);
	}

	build_env_list(&bindto_list, (const char *)"SYMBINDREP_BINDTO");
	build_env_list(&bindfrom_list, (const char *)"SYMBINDREP_BINDFROM");

#ifdef _LP64
	(void) fprintf(output,
	    "                            Symbol Bindings\n\n"
	    "Referencing                  Defining\n"
	    "Object                       Object                       Symbol\n"
	    "---------------------------------------------------------------"
	    "-------------------\n");
#else
	(void) fprintf(output,
	    "                    Symbol Bindings\n\n"
	    "Referencing          Defining\n"
	    "Object               Object               Symbol\n"
	    "---------------------------------------------------------------"
	    "---\n");
#endif
	return (LAV_CURRENT);
}
예제 #2
0
파일: audit.c 프로젝트: spchal/rtld_solaris
uint_t
la_version(uint_t version)
{
  
	int	fd;
	sigset_t mask;

	if (version < LAV_CURRENT) {
		(void) fprintf(stderr,
		    "audit.so.1: unexpected version: %d\n",
		    version);
		return (0);
	}

	build_env_list(&bindto_list, (const char *)"AUDIT_BINDTO");
	build_env_list(&bindfrom_list, (const char *)"AUDIT_BINDFROM");
        
        if (checkenv((const char *)"AUDIT_PID")) {
		pidout = 1;
		pid = getpid();
	} else {
		char	*str = "LD_AUDIT=";
		/*
		 * This disables truss output in subsequent fork()/exec
		 * processes.
		 */
		(void) putenv(str);
	}
        if (checkenv((const char *)"AUDIT_NOEXIT")) {
		noexit++;
		indent = 0;
	}
        
        
        
        (void) sigfillset(&iset);
        return (LAV_CURRENT);
}
예제 #3
0
t_sh		*create_shell_from(char **environ_tab)
{
	t_sh	*shell;

	if ((shell = (t_sh *)malloc(sizeof(t_sh))))
	{
		shell->env = build_env_list(environ_tab);
		ensure_pwd(shell);
		shell->mock = NULL;
		shell->l_env = NULL;
		shell->l_env = override_last_environ(shell);
		shell->ps1 = ft_strdup(PROMPT);
		shell->len_ps1 = ft_strlen(PROMPT);
		shell->l_ret = 0;
		shell->l_cmd = NULL;
		shell->buf = NULL;
		shell->exit = 0;
		return (shell);
	}
	return (NULL);
}
예제 #4
0
uint_t
la_version(uint_t version)
{
	char		*str;
	FILE		*fp;

	if (version > LAV_CURRENT)
		(void) fprintf(stderr,
				dgettext(TEXT_DOMAIN,
					"apptrace: unexpected version: %u\n"),
				version);

	build_env_list(&bindto_list, "APPTRACE_BINDTO");
	build_env_list(&bindto_excl, "APPTRACE_BINDTO_EXCLUDE");

	build_env_list(&bindfrom_list, "APPTRACE_BINDFROM");
	build_env_list(&bindfrom_excl, "APPTRACE_BINDFROM_EXCLUDE");

	if (checkenv("APPTRACE_PID") != NULL) {
		pidout = 1;
	} else {
		char *str = "LD_AUDIT=";
		char *str2 = "LD_AUDIT64=";
		/*
		 * This disables apptrace output in subsequent exec'ed
		 * processes.
		 */
		(void) putenv(str);
		(void) putenv(str2);
	}

	if ((str = checkenv("APPTRACE_OUTPUT")) != NULL) {
		int fd, newfd, targetfd, lowerlimit;
		struct rlimit rl;

		if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
			(void) fprintf(stderr,
					dgettext(TEXT_DOMAIN,
						"apptrace: getrlimit: %s\n"),
					strerror(errno));
			exit(EXIT_FAILURE);
		}

		fd = open(str, O_WRONLY|O_CREAT|O_TRUNC, 0666);
		if (fd == -1) {
			(void) fprintf(stderr,
					dgettext(TEXT_DOMAIN,
						"apptrace: %s: %s\n"),
					str,
					strerror(errno));
			exit(EXIT_FAILURE);
		}

		/*
		 * Those fans of dup2 should note that dup2 cannot
		 * be used below because dup2 closes the target file
		 * descriptor.  Thus, if we're apptracing say, ksh
		 * we'd have closed the fd it uses for the history
		 * file (63 on my box).
		 *
		 * fcntl with F_DUPFD returns first available >= arg3
		 * so we iterate from the top until we find a available
		 * fd.
		 *
		 * Not finding an fd after 10 tries is a failure.
		 *
		 * Since the _file member of the FILE structure is an
		 * unsigned char, we must clamp our fd request to
		 * UCHAR_MAX
		 */
		lowerlimit = ((rl.rlim_cur >
		    UCHAR_MAX) ? UCHAR_MAX : rl.rlim_cur) - 10;

		for (targetfd = lowerlimit + 10;
		    targetfd > lowerlimit; targetfd--) {
			if ((newfd = fcntl(fd, F_DUPFD, targetfd)) != -1)
				break;
		}

		if (newfd == -1) {
			(void) fprintf(stderr,
					dgettext(TEXT_DOMAIN,
						"apptrace: F_DUPFD: %s\n"),
					strerror(errno));
			exit(EXIT_FAILURE);
		}
		(void) close(fd);

		if (fcntl(newfd, F_SETFD, FD_CLOEXEC) == -1) {
			(void) fprintf(stderr,
					dgettext(TEXT_DOMAIN,
					"apptrace: fcntl FD_CLOEXEC: %s\n"),
					strerror(errno));
			exit(EXIT_FAILURE);
		}

		if ((fp = fdopen(newfd, "wF")) != NULL) {
			ABISTREAM = fp;
		} else {
			(void) fprintf(stderr,
					dgettext(TEXT_DOMAIN,
						"apptrace: fdopen: %s\n"),
					strerror(errno));
			exit(EXIT_FAILURE);
		}
	}

#if defined(_LP64)
	build_env_list1(&intlib_list, &intlib_listend,
	    "APPTRACE_INTERCEPTORS64");
#else
	build_env_list1(&intlib_list, &intlib_listend,
	    "APPTRACE_INTERCEPTORS");
#endif

	/* Set up lists interfaces to trace or ignore */
	env_to_intlist(&trace_list, "APPTRACE_INTERFACES");
	env_to_intlist(&trace_excl, "APPTRACE_INTERFACES_EXCLUDE");
	env_to_intlist(&verbose_list, "APPTRACE_VERBOSE");
	env_to_intlist(&verbose_excl, "APPTRACE_VERBOSE_EXCLUDE");

	return (LAV_CURRENT);
}