Няшная / Говнокод #7522 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
/* gcc -static -Os -W -nostartfiles -fno-stack-protector -U_FORTIFY_SOURCE glibc_preinstall.c */

#include <unistd.h>
#include <signal.h>
#include <sys/utsname.h>

#ifndef MIN_KERNEL_VERSION
# error "MIN_KERNEL_VERSION not defined"
#endif
#define PRINT_MSG(msg) write(2, (msg), sizeof(msg) - 1)
#define FATAL(msg) do {PRINT_MSG(msg); kill_parent(); _exit(1);} while(0)

static void kill_parent(void)
{
	pid_t pid = getppid();
	if (pid < 100)
		return;

	PRINT_MSG("Sending SIGSTOP signal to parent process.\n");
	(void) kill(pid, SIGSTOP);
}

static int is_digit(char c)
{
	return c >= '0' && c <= '9';
}

static int
parse_release(const char *p)
{
	unsigned int i, osversion = 0;

	for (i = 0; i < 3 && *p; i++, ++p)
	{
		unsigned int d = 0;

		for (; is_digit(*p); ++p)
			d = d * 10 + (*p - '0');

		if (d == 0 || d >= 255 || (i < 2 && *p && *p != '.'))
		{
			osversion = 0;
			break;
		}
		osversion |= d << (16 - 8 * i);
	}
	return osversion;
}

static void
check_kernel_version(void)
{
	struct utsname name;

	if (uname(&name) < 0)
		FATAL("kernel version check failed: uname syscall failed.\n");

	if (parse_release(name.release) < parse_release(MIN_KERNEL_VERSION))
		FATAL("kernel version check failed: KERNEL TOO OLD, "
		      "minimal version supported by glibc is " MIN_KERNEL_VERSION
		      ".\n");
}

void
_start(void)
{
	check_kernel_version();
	_exit(0);
}

Скрипт на языке Си, проверяющий, что загружено ядро версии не меньшей чем MIN_KERNEL_VERSION (2.6.18 на момент написания). Очень красиво взрывается на ядре 3.0.

Запостил: raorn raorn, (Updated )

Комментарии (44) RSS

  • >то загружено ядро версии не меньшей чем MIN_KERNEL_VERSION (2.6.18
    (2+6+18) < загружено_ядро ?
    Ответить
  • а всего-то надо числа через точку разбить на массивы, выровнять длину более короткого добавлением нулей и сравнивать попарно.
    2.6.18 < 3(.0.0.0)
    Ответить
  • >Скрипт на языке Си
    Вы пользуетесь интерпретаторами языка Си?
    Ответить
    • Вы каждый трёхстрочник гордо именуете Программой?
      Ответить
      • Из них первая строчка — шебанг, а вторая — указание кодировки для vim-а.
        Ответить
          • Был ещё CINT от церна. Интерпретатор плюсов родом из конца восьмидесятых.
            Ответить
            • Спасибо. На страничке CINT'а написано, что они рекомендуют использовать более новый интерпретатор — Cling:
              https://root.cern.ch/cling

              Да и сам CINT пока ещё можно скачать.
              Ответить
              • Cling, afair, это обвязка к клангу. Ничего принципиально нового.

                А вот CINT (и ROOT, для которого он оригинально был сделан) - это выдающийся образец контента для говнокодика. История такова: в конце восьмидесятых весь церн заебался писать на фортране77 и было решено переписать все нужные либы на новый модный молодой язык - плюсы. Сразу после этого вышел фортран90, потом ещё пара ревизий фортрана, более удобных для церновского применения, но ROOT уже пустил корни и до сих пор является основной софтиной для обработки данных.

                Пользоваться этим ужасом довольно стрёмно. Я где-то в районе второго курса попробовал чего-то уровня лабы на нём написать и могу сравнить этот ад с помесью винапи и матлаба. Собственно, физики из церна тоже уже почти сдались и без обёртки на питоне в рут нынче почти никто не лазает.
                Ответить
  • из строки 40 выкинуть d == 0 и делов то блеать

    unsigned int count;
    ...
    for (count = 0; is_digit(*p); ++p, ++count)
    			d = d * 10 + (*p - '0');
    
    		if (!count || d >= 255 || (i < 2 && *p && *p != '.'))
    		{
    			osversion = 0;
    			break;
    		}
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8