execl.c 654 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <stdarg.h>
  4. int execl(__const char *path, __const char *arg, ...)
  5. {
  6. const char *shortargv[16];
  7. const char **argv;
  8. const char *c;
  9. int i;
  10. va_list args;
  11. i = 1;
  12. va_start(args, arg);
  13. do {
  14. c = va_arg(args, const char *);
  15. i++;
  16. } while (c);
  17. va_end(args);
  18. if (i <= 16)
  19. argv = shortargv;
  20. else {
  21. argv = (const char **) alloca(sizeof(char *) * i);
  22. }
  23. argv[0] = arg;
  24. i = 1;
  25. va_start(args, arg);
  26. do {
  27. argv[i] = va_arg(args, const char *);
  28. } while (argv[i++]);
  29. va_end(args);
  30. i = execve(path, (char *const *) argv, __environ);
  31. if (argv != shortargv)
  32. free(argv);
  33. return i;
  34. }