[ create a new paste ] login | about

Link: http://codepad.org/aEiDoZ2c    [ raw code | output | fork ]

AaronMiller - C, pasted on Sep 13:
/*
 * THANK YOU: http://predef.sourceforge.net/preos.html
 */
#include <stddef.h> /* size_t */
#include <errno.h>

/* Mac OS X */
#if defined(__APPLE__)
# include <mach-o/dyld.h>
char *getexename(char *buff, size_t n) {
	uint32_t size;

	size = n;

	if (_NSGetExecutablePath(buff, &size)==0) {
		errno = ERANGE;
		return (char *)0;
	}

	return buff;
}
/* Linux */
#elif defined(linux)||defined(__linux)
# include <sys/types.h>
# include <unistd.h>
char *getexename(char *buff, size_t n) {
	pid_t pid;
	char name[256];
	int r;

	pid = getpid();

	snprintf(name, sizeof(name), "/proc/%i/exe", (int)pid);

	if ((r = readlink(name, buff, n))==-1)
		return (char *)0;
	else if(r >= n) {
		errno = ERANGE;
		return (char *)0;
	}

	buff[r] = 0;
	return buff;
}
/* Solaris */
#elif (defined(sun)||defined(__sun))&&(defined(__SVR4)||defined(__svr4__))
# include <stdlib.h>
char *getexename(char *buff, size_t n) {
	strncpy(buff, getexecname(), n-1);
	buff[n-1] = 0;

	return buff;
}
/* FreeBSD */
#elif defined(__FreeBSD__)
# include <sys/sysctl.h>
char *getexename(char *buff, size_t n) {
	size_t size;
	int name[4];

	name[0] = CTL_KERN;
	name[1] = KERN_PROC;
	name[2] = KERN_PROC_PATHNAME;
	name[3] = -1;

	if (sysctl(name, sizeof(name)/sizeof(name[0]), buff, &size, 0, 0)==-1)
		return (char *)0;

	return buff;
}
/* UNIX */
#elif defined(unix)||defined(__unix__)
# include <stdio.h>
# include <stdlib.h>
char *getexename(char *buff, size_t n) {
	char *s;

	if ((s=getenv("_"))!=(char *)0) {
		snprintf(buff, s, n-1);
		buff[n-1] = 0;

		return buff;
	}

	/* out of luck buddy, write a port */
	fprintf(stderr, "getexename: your unix distribution isn't supported.\n");
	fflush(stderr);

	return (char *)0;
}
/* Windows */
#elif defined(_WIN32)
# include <windows.h>
char *getexename(char *buff, size_t n) {
	if (!GetModuleFileNameA(NULL, buff, n))
		return (char *)0;

	return buff;
}
/* wtf? */
#else
# error "No? Write a port."
#endif


#include <stdio.h>
#include <errno.h>

int main() {
  char buff[1024];

  if (!getexename(buff, sizeof(buff))) {
    perror("getexename");
    return errno;
  }

  printf("executable name: %s\n", buff);

  return 0;
}


Output:
1
Disallowed system call: SYS_dup


Create a new paste based on this one


Comments: