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

extern char **environ;

int main (int argc, char *argv[]) {
  
  // find the number of env entries
  int n_env = 0;
  while (environ[n_env] != 0) {
    n_env++;
  }
  printf("%d env entries.\n", n_env);

  char buf[100];
  int size = 0;
  int err = 0;

  // print the /proc/self/exe symlink
  size = readlink("/proc/self/exe", &buf[0], 100);
  if (err != 0) printf("errno = %d\n", errno);
  buf[size]=0;
  printf("readlink %s\n", &buf[0]);

  // Delete our own executable file
  err = unlink(&buf[0]);
  if (err != 0) printf("errno = %d\n", errno);

  // Print the /proc/self/exe symlink again
  size = readlink("/proc/self/exe", &buf[0], 100);
  if (err != 0) printf("errno = %d\n", errno);
  buf[size]=0;
  printf("readlink %s\n", &buf[0]);

  // Print the exe origin file as given us by the kernel. We find this
  // after the environment block (hence having to find its size above)
  //
  // See http://lkml.org/lkml/2008/5/1/181
  // Choice quote:
  //   Those who want to use it dislike the expression
  //     (char *)(1+ strlen(env[-1+ n_env]) + env[-1+ n_env])
  //
  char *origin = (char *)(1+ strlen(environ[-1+ n_env]) + environ[-1+ n_env]);
  printf("origin = %s\n",origin);

  return 0;
}
