/* Program ax25login. (c) Petr Bravenec. * Free software, GPL License * prelozit prikazem: * cc -Wall -o ax25login ax25login.c * chmod 100 ax25login */ #include #include #include #include #include #include #include #include #define PSWDLEN 5 void sigchld (int s) { exit(0); } int main (int argc, char **argv) { char ptyn[20] ; int pty_s, pty_m, f; char buf[1024]; /* Tady je sifrovaci tabulka pro heslo. Na vyzvu opiste pismenko * ze spodniho radku, ktere odpovida pismenku (ve vyzve) z radku * horniho */ char *ps="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; char *pw="Zvoltesi za vlasni HesLo neco UPLNE JINEHO,aby_vam_to_ncmajzli"; int i, ix[PSWDLEN]; srand(time(NULL)); printf ("Heslo "); for (i=0; i 0) break; } if (pty_m < 0) { printf ("Nezdarilo se otevrit terminal\n"); exit(1); } sprintf (ptyn, "/dev/ttys%1c",i); pty_s = open (ptyn,O_RDWR); /* Nastartovani dalsiho programu. Rodicovska cast bude pouze * zprostredkovavat spojeni s ax25d a protistanici. */ f = fork (); if (-1==f) { printf ("Nezdarilo se nastartovat proces\n"); exit(1); } if (f>0) { /* rodicovska cast */ int rc; fd_set rfds; struct timeval tv; signal (SIGCHLD, sigchld); for (;;) { FD_ZERO(&rfds); FD_SET(0,&rfds); FD_SET(pty_m,&rfds); tv.tv_sec = 0; tv.tv_usec=10000; rc = select (pty_m+1, &rfds, NULL, NULL, &tv); if (rc<=0) continue; if (FD_ISSET(0,&rfds)) { i = read (0, buf, 1024); if (i>0) write (pty_m, buf, i); } if (FD_ISSET(pty_m,&rfds)) { i = read (pty_m, buf, 1024); if (i>0) write (0, buf, i); } } } /* V casti potomka nastartujeme shell */ close(0); close(1); close(2); dup2 (pty_s, 0); dup2 (pty_s, 1); dup2 (pty_s, 2); chdir ("/root"); execl ("/bin/bash","-bash",NULL); printf ("Chyba pri startu shellu\n"); exit (1); }