home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2602 < prev    next >
Internet Message Format  |  1991-01-23  |  51KB

  1. From: ml@brumuc.bru.sub.org (Marc Laukien)
  2. Newsgroups: alt.sources
  3. Subject: UnixChat Part 1/2
  4. Message-ID: <1109@brumuc.bru.sub.org>
  5. Date: 22 Jan 91 15:24:14 GMT
  6.  
  7. This is another chat utility for Unix. It's tested with XENIX 2.3.2
  8. and Interactive Unix 2.2.
  9.  
  10. The source is Public Domain, so you can copy or modify it, or do with
  11. it whatever you want.
  12.  
  13. #!/bin/sh
  14. # This is UnixChat, a shell archive (shar 3.32)
  15. # made 01/22/1991 15:13 UTC by local@brumuc
  16. # Source directory /usr2/local/chat/XChat_V2.9
  17. #
  18. # existing files WILL be overwritten
  19. #
  20. # This is part 1 of a multipart archive                                    
  21. # do not concatenate these parts, unpack them in order with /bin/sh        
  22. #
  23. # This shar contains:
  24. # length  mode       name
  25. # ------ ---------- ------------------------------------------
  26. #   5964 -rw------- ch/init.c
  27. #   5543 -rw------- ch/input.c
  28. #   3277 -rw------- ch/main.c
  29. #   5685 -rw------- ch/comm.c
  30. #   5572 -rw------- ch/utility.c
  31. #   2887 -rw------- ch/output.c
  32. #   3358 -rw------- ch/menu.c
  33. #   3234 -rw------- ch/invite.c
  34. #   1792 -rw------- ch/grep.c
  35. #   2912 -rw------- cm/init.c
  36. #   5033 -rw------- cm/int.c
  37. #   2689 -rw------- cm/main.c
  38. #   2311 -rw------- cm/comm.c
  39. #   3456 -rw------- ch/lex.l
  40. #   3789 -rw------- ch/ch.h
  41. #   1318 -rw------- cm/cm.h
  42. #    745 -rw------- hdrs/ipc.h
  43. #    889 -rw------- hdrs/std.h
  44. #   1269 -rw------- def.german
  45. #   1212 -rw------- def.english
  46. #    885 -rw------- help.german
  47. #    835 -rw------- help.english
  48. #    231 -rw------- menu.german
  49. #    231 -rw------- menu.english
  50. #     27 -rw------- super.user
  51. #     38 -rw------- name.list
  52. #     11 -rw------- guest.list
  53. #    633 -rw------- README.ger
  54. #    610 -rw------- README.eng
  55. #   6399 -rw------- Makefile
  56. #
  57. if touch 2>&1 | fgrep 'amc' > /dev/null
  58.  then TOUCH=touch
  59.  else TOUCH=true
  60. fi
  61. if test -r shar3_seq_.tmp; then
  62.     echo "Must unpack archives in sequence!"
  63.     next=`cat shar3_seq_.tmp`; echo "Please unpack part $next next"
  64.     exit 1
  65. fi
  66. # ============= ch/init.c ==============
  67. if test ! -d 'ch'; then
  68.     echo "x - creating directory ch"
  69.     mkdir 'ch'
  70. fi
  71. echo "x - extracting ch/init.c (Text)"
  72. sed 's/^X//' << 'SHAR_EOF' > ch/init.c &&
  73. X/*----------------------------------------------------------------------*/
  74. X/*                                    */
  75. X/*    Name:            Chatter V2.9                */
  76. X/*                                                                    */
  77. X/*    Programmteil:        Initialisierungen            */
  78. X/*                                    */
  79. X/*    Library:        UNIX V                    */
  80. X/*                                    */
  81. X/*    Autor:            Marc Laukien                */
  82. X/*                                    */
  83. X/*----------------------------------------------------------------------*/
  84. X
  85. X#include <sys/types.h>
  86. X#include <sys/stat.h>
  87. X#include <malloc.h>
  88. X#include <termio.h>
  89. X#include <curses.h>
  90. X#include <term.h>
  91. X#include <stdio.h>
  92. X#include <fcntl.h>
  93. X#include <errno.h>
  94. X#include "ch.h"
  95. X
  96. X/*----------------------------------------------------------------------*/
  97. X/*     Initialisierungen                        */
  98. X/*----------------------------------------------------------------------*/
  99. X
  100. Xvoid    init()
  101. X{
  102. X    char     str[STRLEN];
  103. X    FILE     *fp;            /* fdriptor     */
  104. X    int    i;
  105. X
  106. X    if(grep(getlogin(),"super.user"))        /* super-user ?    */
  107. X        superuser=1;
  108. X
  109. X    if(grep(getlogin(),"guest.list"))        /* gast ?    */
  110. X    {
  111. X        superuser=0;
  112. X        guest=1;
  113. X    }
  114. X
  115. X    for(i=0;i<10;i++)        /* Funktionstasten loeschen    */
  116. X        fkey[i]=(char *)0;
  117. X
  118. X    strcpy(cname,getlogin());    /* Chatname holen    */
  119. X
  120. X    if(!guest)                /* Kein Gast ?        */
  121. X    {
  122. X        sprintf(str,"userdir/%s",getlogin());
  123. X
  124. X        if((fp=fopen(str,"r"))!=(FILE *)0) /* Userdaten einlesen ? */
  125. X        {
  126. X            while(!feof(fp))
  127. X            {
  128. X                i= -1;
  129. X                do
  130. X                    str[++i]=fgetc(fp);    /* einlesen */
  131. X                while(str[i]!='\n' && !feof(fp));
  132. X                str[i]='\0';
  133. X            
  134. X                if(!strncmp("fkey",str,4))/* Funktionstaste ? */
  135. X                    chat_pr_fkey(str+4);
  136. X
  137. X                else if(!strncmp("mode",str,4))    /* Modus ? */
  138. X                    sscanf(str+4,"%d",&mode);
  139. X
  140. X                else if(!strncmp("name",str,4))    /* Modus ? */
  141. X                    sscanf(str+4,"%s",cname);
  142. X            }
  143. X
  144. X            fclose(fp);
  145. X        }
  146. X    }
  147. X
  148. X    if(lang[0]!=0)            /* eigene Sprache ?     */
  149. X        lex();            /* Strings einlesen     */
  150. X
  151. X    if(strlen(prompt)<2)        /* Prompt zu kurz ?     */
  152. X    {
  153. X        fprintf(stderr,"%s: prompt too short in def.%s\n",pname,lang);
  154. X        deinit();
  155. X        exit(2);
  156. X    }
  157. X
  158. X    /* Terminal initialisieren        */
  159. X
  160. X    setupterm((char *)0,1,(int *)0);    /* Terminfo ein    */
  161. X
  162. X    ioctl(1,TCGETA,&oterm);        /* termio retten     */
  163. X    ioctl(1,TCGETA,&term);        /* termio holen     */
  164. X    term.c_cc[VEOF]=1;        /* veraendern         */
  165. X    term.c_cc[VEOL]=1;
  166. X    term.c_cc[VINTR]=0;
  167. X    term.c_lflag &= ~(ICANON | ECHO);
  168. X    term.c_iflag &= ~(IXON | IXOFF);
  169. X    ioctl(1,TCSETA,&term);
  170. X
  171. X    terminfo=1;
  172. X}
  173. X
  174. X/*----------------------------------------------------------------------*/
  175. X/*     Konferenz Initialisierungen                    */
  176. X/*----------------------------------------------------------------------*/
  177. X/*    Return:    1-alles ok    0-Fehler                */
  178. X/*----------------------------------------------------------------------*/
  179. X
  180. Xint    conf_init()
  181. X
  182. X{
  183. X    char    pass[STRLEN];        /* Password        */
  184. X    char     str[STRLEN];
  185. X    FILE     *fp;            /* Filedeskriptor     */
  186. X
  187. X    /* Conf suchen ----------------------------- */
  188. X
  189. X    sprintf(str,"confdir/%s",conf);        /* Konferenz-File    */
  190. X
  191. X    fp=fopen(str,"r");            /* oeffnen         */
  192. X    if(fp == (FILE *)0)            /* Fehler ?         */
  193. X    {
  194. X        if(errno==ENOENT)
  195. X        {
  196. X            fprintf(stderr,"%s: no such conference\n",pname);
  197. X            return(0);
  198. X        }
  199. X        else                /* Anderer Fehler     */
  200. X            fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  201. X
  202. X        deinit();
  203. X        exit(2);
  204. X    }
  205. X
  206. X    fscanf(fp,"%ld",&key);            /* Messagekey holen     */
  207. X    fscanf(fp,"%s",pass);            /* Messagekey holen     */
  208. X
  209. X    if(strcmp(pass,pw)!=0 && strcmp(pass,STDPASS)!=0)
  210. X    {                /* Passwort nicht bekannt ?    */
  211. X        if(superuser)
  212. X            fprintf(stderr,"%s: super-user: password is '%s'\n"
  213. X            ,pname,pass);
  214. X
  215. X        if(strcmp(read_string(password),pass))
  216. X        {
  217. X            fprintf(stderr,"%s: wrong password\n",pname,lang);
  218. X            return(0);
  219. X        }
  220. X    }
  221. X    fclose(fp);                /* schliessen         */
  222. X
  223. X    /* Ende Conf suchen ---------------------- */
  224. X
  225. X    /* Manager FIFO eroeffnen ---------------- */
  226. X
  227. X    sprintf(str,"fifodir/%ld",key);        /* Pfad fuer FIFO    */
  228. X
  229. X    fifofd=open(str,O_WRONLY);        /* FIFO oeffnen     */
  230. X    if(fifofd== -1)                /* Fehler ?         */
  231. X    {
  232. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  233. X        deinit();
  234. X        exit(2);
  235. X    }
  236. X
  237. X    /* Ende FIFO eroeffnen ------------------- */
  238. X
  239. X    /* eigene FIFO anlegen ------------------------------- */
  240. X
  241. X     pkey=getpid();                /* Messagekey holen    */
  242. X    if(pkey== -1)                /* Fehler ?        */
  243. X    {
  244. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  245. X        deinit();
  246. X        exit(2);
  247. X    }
  248. X    
  249. X    sprintf(str,"fifodir/%ld",pkey);    /* Pfad fuer FIFO    */
  250. X
  251. X    if(mknod(str,S_IFIFO | MODE,0)==-1)    /* Anlegen        */
  252. X    {
  253. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  254. X        deinit();
  255. X        exit(2);
  256. X    }
  257. X
  258. X    pfifofd=open(str,O_RDONLY | O_NDELAY);    /* FIFO oeffnen     */
  259. X    if(pfifofd== -1)            /* Fehler ?         */
  260. X    {
  261. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  262. X        deinit();
  263. X        exit(2);
  264. X    }
  265. X
  266. X    /* Ende eigene FIFO anlegen -------------------------- */
  267. X
  268. X    return(1);
  269. X}
  270. X
  271. X/*----------------------------------------------------------------------*/
  272. X/*     Deinitialisierungen                        */
  273. X/*----------------------------------------------------------------------*/
  274. X
  275. Xvoid    deinit()
  276. X{
  277. X    char     str[STRLEN];
  278. X    FILE    *fp;
  279. X    int    i;
  280. X
  281. X    if(terminfo==1)    /* Terminfo an ?    */
  282. X    {
  283. X        vidattr(0);
  284. X        ioctl(1,TCSETA,&oterm);    /* termio herstellen    */
  285. X        fflush(stdout);
  286. X        resetterm();
  287. X    }
  288. X
  289. X    conf_deinit();    /* private FIFO loeschen     */
  290. X
  291. X    if(!guest)        /* Kein Gast ?    */
  292. X    {
  293. X        sprintf(str,"userdir/%s",getlogin());
  294. X
  295. X        if((fp=fopen(str,"w"))!=(FILE *)0) /* Userdaten schreiben ? */
  296. X        {
  297. X            if(mode != STDMODE)    /* Mode schreiben    */
  298. X                fprintf(fp,"mode %d\n",mode);
  299. X        
  300. X            if(strcmp(cname,getlogin()))/* Namen schreiben    */
  301. X                fprintf(fp,"name %s\n",cname);
  302. X        
  303. X            for(i=0;i<10;i++) /* Funktionstasten schreiben    */
  304. X                if(fkey[i]!=(char *)0)
  305. X                    fprintf(fp,"fkey%d %s\n",i,fkey[i]);
  306. X
  307. X            fclose(fp);
  308. X        }
  309. X    }
  310. X
  311. X    chdir(cwd);        /* Directory einstellen    */
  312. X}
  313. X
  314. X/*----------------------------------------------------------------------*/
  315. X/*     Konferenz Deinitialisierungen                    */
  316. X/*----------------------------------------------------------------------*/
  317. X
  318. Xvoid    conf_deinit()
  319. X{
  320. X    char     str[STRLEN];
  321. X    FILE    *fp;
  322. X
  323. X    if(fifofd != -1)
  324. X        give_notice();    /* Abmelden        */
  325. X
  326. X    /* private FIFO loeschen -------------------- */
  327. X
  328. X    if(pfifofd != -1)
  329. X    {
  330. X        sprintf(str,"fifodir/%ld",pkey);
  331. X        unlink(str);
  332. X
  333. X        close(pfifofd);
  334. X
  335. X        pfifofd= -1;
  336. X    }
  337. X}
  338. SHAR_EOF
  339. $TOUCH -am 0806104890 ch/init.c &&
  340. chmod 0600 ch/init.c ||
  341. echo "restore of ch/init.c failed"
  342. set `wc -c ch/init.c`;Wc_c=$1
  343. if test "$Wc_c" != "5964"; then
  344.     echo original size 5964, current size $Wc_c
  345. fi
  346. # ============= ch/input.c ==============
  347. echo "x - extracting ch/input.c (Text)"
  348. sed 's/^X//' << 'SHAR_EOF' > ch/input.c &&
  349. X/*----------------------------------------------------------------------*/
  350. X/*                                    */
  351. X/*    Name:            Chatter V2.9                */
  352. X/*                                                                    */
  353. X/*    Programmteil:        Input                    */
  354. X/*                                    */
  355. X/*    Library:        UNIX V                    */
  356. X/*                                    */
  357. X/*    Autor:            Marc Laukien                */
  358. X/*                                    */
  359. X/*----------------------------------------------------------------------*/
  360. X
  361. X#include <sys/types.h>
  362. X#include <stdio.h>
  363. X#include <signal.h>
  364. X#include <setjmp.h>
  365. X#include <curses.h>
  366. X#include <ctype.h>
  367. X#include <term.h>
  368. X#include "ch.h"
  369. X
  370. X/* globale Variablen */
  371. X
  372. Xjmp_buf env;        /* Environment */
  373. X
  374. X/*----------------------------------------------------------------------*/
  375. X/*     Eingabe                                */
  376. X/*----------------------------------------------------------------------*/
  377. X
  378. Xvoid    input()
  379. X{
  380. X    char     text[STRLEN];
  381. X    char    c;
  382. X
  383. X    if(!conf_init())        /* Konfer. init.    */
  384. X    {
  385. X        if(menu)
  386. X            menu_key();
  387. X
  388. X        return;
  389. X    }
  390. X
  391. X    announce();            /* Anmelden         */
  392. X
  393. X    CLEAR                /* clear screen        */
  394. X    fflush(stdout);
  395. X
  396. X    puts(start);            /* Hilfe anzeigen    */
  397. X    puts("");
  398. X    sleep(2);
  399. X    conf_members(conf,'p');
  400. X    puts("");
  401. X
  402. X    do
  403. X    {
  404. X        do
  405. X            input_str(text);    /* einlesen     */
  406. X        while(text[0]==0);
  407. X
  408. X        vidattr(0);        /* normale Schrift    */
  409. X        fflush(stdout);
  410. X
  411. X        c=text[1];        /* Kommando holen    */
  412. X        if(isupper(c))
  413. X            c=tolower(c);
  414. X
  415. X        if(text[0]!=':')    /* kein Kommando ?    */
  416. X            pub_msg(text);    /* an den Manager senden*/
  417. X        else if(c==cmds[1])    /* Hilfe ?        */
  418. X            chat_help();
  419. X        else if(c==cmds[2])    /* wer ist im System ?    */
  420. X            system(who);
  421. X        else if(c==cmds[3])    /* wer ist in der Konf ?*/
  422. X            conf_members(conf,'p');
  423. X        else if(c==cmds[4])    /* clear    */
  424. X            CLEAR
  425. X        else if(c==cmds[5])    /* Blitzmeldung    */
  426. X            message(text+2);
  427. X        else if(c==cmds[6])    /* Einladung        */
  428. X            invite(text+2);
  429. X        else if(c==cmds[7])    /* Namensaenderung    */
  430. X            change_name(text+2);
  431. X        else if(c==cmds[8])    /* User rauswerfen    */
  432. X            kill_user(text+2);
  433. X        else if(c==cmds[9])    /* Nachricht ohne Prompt*/
  434. X            noprompt_msg(text+2);
  435. X        else if(c==cmds[10])    /* Modi     */
  436. X            chat_mode(text+2);
  437. X        else if(c==cmds[11])    /* F-Key Programmieren     */
  438. X            chat_pr_fkey(text+2);
  439. X        else if(c==cmds[12])    /* F-Key abfragen     */
  440. X            chat_fkey(text+2);
  441. X        else if(c!=cmds[0])    /* Fehler    */
  442. X            printf("%s\n",nocmd);    
  443. X    }
  444. X    while(!(text[0]==':' && c==cmds[0]));    /* Ende ?    */
  445. X
  446. X    conf_deinit();        /* deinitialisieren    */
  447. X}
  448. X
  449. X/*----------------------------------------------------------------------*/
  450. X/*    String eingeben                            */
  451. X/*----------------------------------------------------------------------*/
  452. X
  453. Xvoid    input_str(str)
  454. X
  455. Xchar     *str;        /* Einzugebender String    */
  456. X{
  457. X    static    char    bsp[] = {BS,' ',BS};    /* Backspace    */
  458. X
  459. X    char     c=' ';                /* Kommando    */
  460. X    char     prstr[STRLEN];            /* Prompt    */
  461. X    int     pos=0;
  462. X    int     anz=0,an;            /* Anzahl der Messages    */
  463. X
  464. X    str[0]='\0';        /* loeschen    */
  465. X
  466. X    sprintf(prstr,"%s%s",cname,prompt);
  467. X
  468. X    if(mode & REVERSE)            /* Revers ?    */
  469. X        vidattr(A_REVERSE);
  470. X    else
  471. X        vidattr(A_BOLD);
  472. X
  473. X    fputs(prstr,stdout);            /* prstr ausgeben    */
  474. X    fflush(stdout);
  475. X
  476. X    do
  477. X    {
  478. X        /* ----- Ausgabe -------------------------------------- */
  479. X
  480. X        if(an=output(anz))    /* Messages ausgeben        */
  481. X        {
  482. X            anz += an;    /* Anzahl der Zeilen gesamt    */
  483. X
  484. X            if(anz>=lines    /* Zeilenzahl ueberschritten    */
  485. X                    /* Bei keiner Emu: lines=0    */
  486. X            || !(mode&JUMP))    /* Jump ein        */
  487. X            {
  488. X                putchar('\n');    /* 1 Zeile runter    */
  489. X                anz=0;
  490. X
  491. X                if(mode & REVERSE)    /* Revers ?    */
  492. X                    vidattr(A_REVERSE);
  493. X                else
  494. X                    vidattr(A_BOLD);
  495. X
  496. X                fputs(prstr,stdout);    /* prstr ausgeben*/
  497. X                fputs(str,stdout);    /* str ausgeben  */
  498. X                fflush(stdout);
  499. X            }
  500. X            else                /* hochfahren    */
  501. X            {
  502. X                int    i,len2;
  503. X
  504. X                if(parm_up_cursor!=(char *)0) /* hoch */
  505. X                    putp(tparm(parm_up_cursor,anz));
  506. X                else        /* einzeln hoch    */
  507. X                for(i=0;i<anz;i++)
  508. X                    putp(cursor_up);
  509. X
  510. X                len2=strlen(prstr)+strlen(str);
  511. X
  512. X                /* kuerzeren Weg suchen    */
  513. X                if(2*len2<len)
  514. X                {
  515. X                    putchar(RET);    /* Zeilenanfang    */
  516. X                    len=0;
  517. X                }
  518. X
  519. X                if(len<len2)
  520. X                {
  521. X                if(parm_right_cursor!=(char *)0) /* rechts */
  522. X                    putp(tparm(parm_right_cursor,len2-len));
  523. X
  524. X                else        /* einzeln rechts    */
  525. X                for(i=0;i<len2-len;i++)
  526. X                    putp(cursor_right);
  527. X                }
  528. X                else if(len>len2)
  529. X                {
  530. X                if(parm_left_cursor!=(char *)0) /* rechts */
  531. X                    putp(tparm(parm_left_cursor,len-len2));
  532. X
  533. X                else        /* einzeln rechts    */
  534. X                for(i=0;i<len-len2;i++)
  535. X                    putp(cursor_left);
  536. X                }
  537. X
  538. X                fflush(stdout);
  539. X            }
  540. X        }
  541. X
  542. X        if(an)                /* Messages bekommen ?    */
  543. X        {
  544. X            if(mode & REVERSE)        /* Revers ?    */
  545. X                vidattr(A_REVERSE);
  546. X            else
  547. X                vidattr(A_BOLD);
  548. X        }
  549. X
  550. X        /* ----- Eingabe -------------------------------------- */
  551. X
  552. X        if(setjmp(env)==0)        /* Environment sichern    */
  553. X        {
  554. X            signal(SIGUSR1,interrupt);    /* Int. set.    */
  555. X            read(0,&c,1);        /* Kommandoabk. einl.    */
  556. X        }
  557. X        else
  558. X            c=0;
  559. X
  560. X        signal(SIGUSR1,SIG_IGN);    /* Interrupt aus    */
  561. X
  562. X        if(c==NL || c==RET)        /* Ende der Eingabe    */
  563. X            break;
  564. X
  565. X        if(c<' ' && c!=BS)
  566. X            c=0;
  567. X
  568. X        if(c)
  569. X        {
  570. X            if(c==BS)        /* loeschen    */
  571. X            {
  572. X                if(pos>0)
  573. X                {
  574. X                    str[--pos]=0;        
  575. X                    fputs(bsp,stdout);
  576. X                    fflush(stdout);
  577. X                }
  578. X            }
  579. X            else if(c==DEL)    /* alles loeschen    */
  580. X            {
  581. X                while(pos>0)
  582. X                {
  583. X                    str[--pos]=0;        
  584. X                    fputs(bsp,stdout);
  585. X                }
  586. X                fflush(stdout);
  587. X            }
  588. X            else if(pos<80-strlen(prstr)-1)/* eingeben    */
  589. X            {
  590. X                str[pos++]=c;
  591. X                str[pos]=0;    
  592. X                putchar(c);        /* ausgeben    */
  593. X                fflush(stdout);
  594. X            }
  595. X        }
  596. X
  597. X        if(pos>=80-strlen(prstr)-1)    /* Linewrap    */
  598. X            break;
  599. X    }
  600. X    FOREVER;
  601. X
  602. X    if(anz)
  603. X    {
  604. X        int    i;
  605. X
  606. X        if(parm_down_cursor!=(char *)0) /* runter */
  607. X            putp(tparm(parm_down_cursor,anz));
  608. X        else        /* einzeln runter    */
  609. X        for(i=0;i<anz;i++)
  610. X            putp(cursor_down);
  611. X    }
  612. X
  613. X    putchar('\n');
  614. X
  615. X}
  616. X
  617. Xstatic    void    interrupt()
  618. X
  619. X{
  620. X    longjmp(env,1);
  621. X}
  622. SHAR_EOF
  623. $TOUCH -am 0106163691 ch/input.c &&
  624. chmod 0600 ch/input.c ||
  625. echo "restore of ch/input.c failed"
  626. set `wc -c ch/input.c`;Wc_c=$1
  627. if test "$Wc_c" != "5543"; then
  628.     echo original size 5543, current size $Wc_c
  629. fi
  630. # ============= ch/main.c ==============
  631. echo "x - extracting ch/main.c (Text)"
  632. sed 's/^X//' << 'SHAR_EOF' > ch/main.c &&
  633. X/*----------------------------------------------------------------------*/
  634. X/*                                    */
  635. X/*    Name:            Chatter V2.9                */
  636. X/*                                                                    */
  637. X/*    Programmteil:        Hauptprogramm                */
  638. X/*                                    */
  639. X/*    Library:        UNIX V                    */
  640. X/*                                    */
  641. X/*    Autor:            Marc Laukien                */
  642. X/*                                    */
  643. X/*----------------------------------------------------------------------*/
  644. X
  645. X#include <sys/types.h>
  646. X#include <termio.h>
  647. X#include <string.h>
  648. X#include <stdio.h>
  649. X#include <signal.h>
  650. X#include "ch.h"
  651. X
  652. X/* globale Variablen */
  653. X
  654. Xchar    *pname;                /* Programmname: argv[0]    */
  655. Xchar    *cwd;                /* Working Directory         */
  656. Xchar    conf[STRLEN]="sysconf";        /* Konferenzname         */
  657. Xchar    lang[STRLEN]=STDLANG;        /* Sprache             */
  658. Xchar    cname[STRLEN];            /* Chatname            */
  659. X
  660. Xint    len;            /* Laenge der letzten Zeile        */
  661. X
  662. Xint    mode=STDMODE;        /* Modus                */
  663. Xint    superuser=0;        /* falls 1: Super-User            */
  664. Xint    guest=0;        /* falls 1: Gast            */
  665. Xint    menu=0;            /* falls 1: Menue aufrufen        */
  666. Xchar    pw[STRLEN]=STDPASS;    /* Passwort                */
  667. Xchar    *fkey[10];        /* Funktionstasten            */
  668. X
  669. Xint    terminfo=0;        /* Falls 1: Terminfo ist an        */
  670. Xstruct    termio    term,oterm;    /* Terminaldaten             */
  671. X
  672. Xlong    key= -1;        /* Key der Manager-FIFO     */
  673. Xint    fifofd= -1;        /* Manager FIFO fd         */
  674. Xlong    pkey= -1;        /* Key der privaten FIFO     */
  675. Xint    pfifofd= -1;        /* private FIFO fd         */
  676. X
  677. X/*----------------------------------------------------------------------*/
  678. X/*     Hauptprogramm                            */
  679. X/*----------------------------------------------------------------------*/
  680. X
  681. Xint    main(argc,argv,envp)
  682. X
  683. Xint    argc;
  684. Xchar    *argv[];
  685. Xchar    *envp[];
  686. X{
  687. X    extern char *optarg;
  688. X    extern int  optind,opterr;
  689. X    char ch;
  690. X
  691. X    pname=argv[0];        /* Programmname        */
  692. X
  693. X    umask(077);        /* Creation-Mask    */
  694. X
  695. X    cwd=getcwd((char *)0,STRLEN);    /* Directory retten     */
  696. X    if(chdir(LIBDIR)== -1)        /* Directory einstellen */
  697. X    {
  698. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  699. X        exit(2);
  700. X    }
  701. X
  702. X    signal(SIGHUP,interrupt);    /* Interrupt einstellen    */
  703. X    signal(SIGTERM,interrupt);
  704. X    signal(SIGINT,SIG_IGN);
  705. X    signal(SIGQUIT,SIG_IGN);
  706. X    signal(SIGUSR1,SIG_IGN);    /* Interrupt loeschen    */
  707. X
  708. X    /* Optionen einlesen *******************************************/
  709. X
  710. X    opterr=1;
  711. X    while((ch=getopt(argc,argv,"mc:l:"))!=EOF)
  712. X        switch(ch)
  713. X        {
  714. X        case 'm':        /* Menue        */
  715. X            menu=1;
  716. X            break;
  717. X
  718. X        case 'c':        /* andere Konferenz    */
  719. X            strcpy(conf,optarg);
  720. X            break;
  721. X
  722. X        case 'l':        /* andere Sprache    */
  723. X            strcpy(lang,optarg);
  724. X            break;
  725. X
  726. X        case '?':        /* Fehler        */
  727. X            opterr++;
  728. X            break;
  729. X        }
  730. X
  731. X    if(opterr>1)            /* falsche Optionen    */
  732. X    {
  733. X        fprintf(stderr,
  734. X        "usage: %s [-m] [-c conf] [-l language]\n",pname);
  735. X        deinit();
  736. X        exit(2);
  737. X    }
  738. X    
  739. X    /* Ende Optionen einlesen **************************************/
  740. X
  741. X    if(strlen(conf)>10)        /* Name zu lang ?    */
  742. X    {
  743. X        fprintf(stderr,"%s: conference name too long\n",pname);
  744. X        exit(2);
  745. X    }
  746. X
  747. X    init();                /* Initialisierungen    */
  748. X
  749. X    if(menu && !guest)        /* Menue aufrufen ?    */
  750. X        chat_menu();
  751. X    else
  752. X        input();        /* Eingabeschleife    */
  753. X
  754. X    deinit();            /* Deinitialisierungen    */
  755. X    return(0);            /* Tschuess        */
  756. X}
  757. X
  758. X/*----------------------------------------------------------------------*/
  759. X/*     Interruptroutine                        */
  760. X/*----------------------------------------------------------------------*/
  761. X
  762. Xvoid    interrupt()
  763. X
  764. X{
  765. X    give_notice();            /* abmelden    */
  766. X    deinit();
  767. X    puts("");            /* Leerzeile    */
  768. X    exit(0);
  769. X}
  770. SHAR_EOF
  771. $TOUCH -am 0122160791 ch/main.c &&
  772. chmod 0600 ch/main.c ||
  773. echo "restore of ch/main.c failed"
  774. set `wc -c ch/main.c`;Wc_c=$1
  775. if test "$Wc_c" != "3277"; then
  776.     echo original size 3277, current size $Wc_c
  777. fi
  778. # ============= ch/comm.c ==============
  779. echo "x - extracting ch/comm.c (Text)"
  780. sed 's/^X//' << 'SHAR_EOF' > ch/comm.c &&
  781. X/*----------------------------------------------------------------------*/
  782. X/*                                    */
  783. X/*    Name:            Chatter V2.9                */
  784. X/*                                                                    */
  785. X/*    Programmteil:        Kommunikation                */
  786. X/*                                    */
  787. X/*    Library:        UNIX V                    */
  788. X/*                                    */
  789. X/*    Autor:            Marc Laukien                */
  790. X/*                                    */
  791. X/*----------------------------------------------------------------------*/
  792. X
  793. X#include <sys/types.h>
  794. X#include <sys/stat.h>
  795. X#include <memory.h>
  796. X#include <stdio.h>
  797. X#include <ctype.h>
  798. X#include <string.h>
  799. X#include <fcntl.h>
  800. X#include <errno.h>
  801. X#include "ch.h"
  802. X
  803. Xstruct _msgbuf
  804. X{
  805. X    long    mtype;        /* message type */
  806. X    MSG    mtext;        /* message text */
  807. X};
  808. X
  809. Xstruct _umsgbuf
  810. X{
  811. X    long    mtype;        /* message type */
  812. X    UMSG    mtext;        /* message text */
  813. X};
  814. X
  815. X/*----------------------------------------------------------------------*/
  816. X/*     User rauswerfen                            */
  817. X/*----------------------------------------------------------------------*/
  818. X
  819. Xvoid    kill_user(text)
  820. X
  821. Xchar    *text;                /* Messagetext    */
  822. X{
  823. X    MSG    msg;            /* Message    */
  824. X    int    i=0;
  825. X
  826. X    if(!superuser)            /* Kein Super-User ?    */
  827. X        return;
  828. X
  829. X    while(*text==' ' || *text==TAB)
  830. X        text++;
  831. X
  832. X    while(text[i]!=' ' && text[i]!=TAB && text[i]!='\0')
  833. X        i++;
  834. X
  835. X    if(i>20)            /* nicht zu lang    */
  836. X        i=20;
  837. X
  838. X    text[i]='\0';            /* beenden        */
  839. X
  840. X    if(*text!='\0')            /* Text vorhanden ?    */
  841. X    {
  842. X        msg.pid=getpid();        /* Pfd holen    */
  843. X        msg.typ=KILL;            /* Messagetyp    */
  844. X        strcpy(msg.text,text);        /* Messagetext    */
  845. X
  846. X        send_msg(&msg);
  847. X    }
  848. X}
  849. X
  850. X/*----------------------------------------------------------------------*/
  851. X/*     Namen aendern                            */
  852. X/*----------------------------------------------------------------------*/
  853. X
  854. Xvoid    change_name(text)
  855. X
  856. Xchar    *text;                /* Messagetext    */
  857. X{
  858. X    MSG    msg;            /* Message    */
  859. X    int    i=0;
  860. X    char    str[STRLEN],str2[STRLEN];
  861. X
  862. X    while(*text==' ' || *text==TAB)
  863. X        text++;
  864. X
  865. X    while(text[i]!=' ' && text[i]!=TAB && text[i]!='\0')
  866. X        i++;
  867. X
  868. X    if(i>20)            /* nicht zu lang    */
  869. X        i=20;
  870. X
  871. X    text[i]='\0';            /* beenden        */
  872. X
  873. X    if(*text!='\0')            /* Text vorhanden ?    */
  874. X    {
  875. X        strcpy(str,getlogin());    /* eigener Name        */
  876. X        strcpy(str2,text);    /* gewuenschter Name    */
  877. X
  878. X        for(i=0;str[i]!='\0';i++)    /* klein machen    */
  879. X            if(isupper(str[i]))
  880. X                str[i]=tolower(str[i]);
  881. X
  882. X        for(i=0;str2[i]!='\0';i++)    /* klein machen    */
  883. X            if(isupper(str2[i]))
  884. X                str2[i]=tolower(str2[i]);
  885. X
  886. X
  887. X        if(strcmp(str,str2))        /* nicht eigener Name ?    */
  888. X        {
  889. X        if(grep(text,"name.list"))    /* unzulaessiger Name ?    */
  890. X            return;
  891. X
  892. X        sprintf(str,"confdir/%s",conf);
  893. X        if(grep(text,str))        /* unzulaessiger Name ?    */
  894. X            return;
  895. X        }
  896. X
  897. X        msg.pid=getpid();        /* Pfd holen    */
  898. X        msg.typ=CNAME;            /* Messagetyp    */
  899. X        strcpy(msg.text,text);        /* Messagetext    */
  900. X
  901. X        send_msg(&msg);
  902. X
  903. X        strcpy(cname,text);    /* Chatname merken    */
  904. X    }
  905. X}
  906. X
  907. X/*----------------------------------------------------------------------*/
  908. X/*     Anmelden                            */
  909. X/*----------------------------------------------------------------------*/
  910. X
  911. Xvoid    announce()
  912. X
  913. X{
  914. X    MSG msg;    /* Message     */
  915. X
  916. X    msg.pid=getpid();        /* Pfd holen    */
  917. X    msg.typ=ARRIVAL;        /* Messagetyp     */
  918. X    sprintf(msg.text,"%ld %s %s",pkey,getlogin(),cname);
  919. X                    /* Key und Name    */
  920. X    send_msg(&msg);
  921. X}
  922. X
  923. X/*----------------------------------------------------------------------*/
  924. X/*     Abmelden                            */
  925. X/*----------------------------------------------------------------------*/
  926. X
  927. Xvoid    give_notice()
  928. X
  929. X{
  930. X    MSG    msg;            /* Message    */
  931. X
  932. X    msg.pid=getpid();        /* Pfd holen    */
  933. X    msg.typ=DEPARTURE;        /* Messagetyp    */
  934. X    strcpy(msg.text,getlogin());    /* Name        */
  935. X
  936. X    send_msg(&msg);
  937. X}
  938. X
  939. X/*----------------------------------------------------------------------*/
  940. X/*     oeffentliche Message senden                    */
  941. X/*----------------------------------------------------------------------*/
  942. X
  943. Xvoid    pub_msg(text)
  944. X
  945. Xchar    *text;                /* Messagetext    */
  946. X{
  947. X    MSG    msg;            /* Message    */
  948. X    int    i=0;
  949. X
  950. X    while(text[i]==' ' || text[i]==TAB)
  951. X        i++;
  952. X
  953. X    if(text[i]!='\0')        /* Text vorhanden ?    */
  954. X    {
  955. X        msg.pid=getpid();        /* Pfd holen    */
  956. X        msg.typ=MESSAGE;        /* Messagetyp    */
  957. X        strcpy(msg.text,text);        /* Messagetext    */
  958. X
  959. X        send_msg(&msg);
  960. X    }
  961. X}
  962. X
  963. X/*----------------------------------------------------------------------*/
  964. X/*     oeffentliche Message ohne Prompt senden                */
  965. X/*----------------------------------------------------------------------*/
  966. X
  967. Xvoid    noprompt_msg(text)
  968. X
  969. Xchar    *text;                /* Messagetext    */
  970. X{
  971. X    MSG    msg;            /* Message    */
  972. X    int    i=0;
  973. X
  974. X    while(text[i]==' ' || text[i]==TAB)
  975. X        i++;
  976. X
  977. X    if(text[i]!='\0')        /* Text vorhanden ?    */
  978. X    {
  979. X        msg.pid=getpid();        /* Pfd holen    */
  980. X        msg.typ=NOPROMPT;        /* Messagetyp    */
  981. X        strcpy(msg.text,text);        /* Messagetext    */
  982. X
  983. X        send_msg(&msg);
  984. X    }
  985. X}
  986. X
  987. X/*----------------------------------------------------------------------*/
  988. X/*     Message empfangen                        */
  989. X/*----------------------------------------------------------------------*/
  990. X
  991. XUMSG     *recv_msg()
  992. X{
  993. X    static    UMSG    umsg;        /* Message         */
  994. X    int    ret;            /* Return von Read    */
  995. X
  996. X    ret=read(pfifofd,&umsg,sizeof(UMSG));    /* empfangen    */
  997. X
  998. X    if(ret== -1)    /* Fehler ?    */
  999. X    {
  1000. X        fprintf(stderr,"%s: %s (recv_msg)\n",pname,sys_errlist[errno]);
  1001. X        deinit();
  1002. X        exit(2);        /* Fehler     */
  1003. X    }
  1004. X    else if(ret==0)
  1005. X        umsg.typ=EMPTY;        /* leer     */
  1006. X
  1007. X    return(&umsg);            /* Message als Returnwert     */
  1008. X}
  1009. X
  1010. X/*----------------------------------------------------------------------*/
  1011. X/*     Message senden                            */
  1012. X/*----------------------------------------------------------------------*/
  1013. X
  1014. Xvoid    send_msg(msg)
  1015. X
  1016. XMSG    *msg;                /* zu sendende Message     */
  1017. X{
  1018. X    struct    stat    status;        /* Filestatus        */
  1019. X    int    i=0;
  1020. X
  1021. X    FOREVER
  1022. X    {
  1023. X        fstat(fifofd,&status);    /* Status holen        */
  1024. X
  1025. X        if(status.st_size<MAXBYTES)
  1026. X            break;
  1027. X
  1028. X        if(i++ >= MAXTRYS)
  1029. X            return;
  1030. X
  1031. X        sleep(2);
  1032. X    }
  1033. X    
  1034. X    if(write(fifofd,msg,sizeof(MSG)) == -1)    /* empf */
  1035. X    {
  1036. X        fprintf(stderr,"%s: %s (send_msg)\n",pname,sys_errlist[errno]);
  1037. X        fifofd= -1;        /* FIFO sperren */
  1038. X        deinit();
  1039. X        exit(2);        /* Fehler */
  1040. X    }
  1041. X}
  1042. SHAR_EOF
  1043. $TOUCH -am 0806104890 ch/comm.c &&
  1044. chmod 0600 ch/comm.c ||
  1045. echo "restore of ch/comm.c failed"
  1046. set `wc -c ch/comm.c`;Wc_c=$1
  1047. if test "$Wc_c" != "5685"; then
  1048.     echo original size 5685, current size $Wc_c
  1049. fi
  1050. # ============= ch/utility.c ==============
  1051. echo "x - extracting ch/utility.c (Text)"
  1052. sed 's/^X//' << 'SHAR_EOF' > ch/utility.c &&
  1053. X/*----------------------------------------------------------------------*/
  1054. X/*                                    */
  1055. X/*    Name:            Chatter V2.9                */
  1056. X/*                                                                    */
  1057. X/*    Programmteil:        Utilities                */
  1058. X/*                                    */
  1059. X/*    Library:        UNIX V                    */
  1060. X/*                                    */
  1061. X/*    Autor:            Marc Laukien                */
  1062. X/*                                    */
  1063. X/*----------------------------------------------------------------------*/
  1064. X
  1065. X#include <sys/types.h>
  1066. X#include <malloc.h>
  1067. X#include <stdio.h>
  1068. X#include <curses.h>
  1069. X#include <term.h>
  1070. X#include <ctype.h>
  1071. X#include "ch.h"
  1072. X
  1073. X/*----------------------------------------------------------------------*/
  1074. X/*     Tastendruck                            */
  1075. X/*----------------------------------------------------------------------*/
  1076. X
  1077. Xvoid    menu_key()
  1078. X
  1079. X{
  1080. X    char    c;
  1081. X
  1082. X    printf("\n\n%s\n",press_key);
  1083. X    read(0,&c,1);        /* einlesen    */
  1084. X}
  1085. X
  1086. X/*----------------------------------------------------------------------*/
  1087. X/*     String einlesen                            */
  1088. X/*----------------------------------------------------------------------*/
  1089. X
  1090. Xchar    *read_string(pro)
  1091. X
  1092. Xchar    *pro;            /* Prompt    */
  1093. X{
  1094. X    static    char    str[STRLEN];
  1095. X    static    char    bsp[] = {BS,' ',BS};    /* Backspace    */
  1096. X    int     pos=0;
  1097. X    char    c;
  1098. X
  1099. X    str[0]='\0';        /* loeschen    */
  1100. X
  1101. X    fputs(pro,stdout);
  1102. X
  1103. X    if(mode & REVERSE)            /* Revers ?    */
  1104. X        vidattr(A_REVERSE);
  1105. X    else
  1106. X        vidattr(A_BOLD);
  1107. X
  1108. X    fflush(stdout);
  1109. X
  1110. X    FOREVER
  1111. X    {
  1112. X        read(0,&c,1);        /* Kommandoabk. einl.    */
  1113. X
  1114. X        if(c==NL || c==RET)    /* Ende der Eingabe    */
  1115. X            break;
  1116. X
  1117. X        if(isalnum(c) || c==DEL || c==BS)
  1118. X        {
  1119. X            if(c==BS)        /* loeschen    */
  1120. X            {
  1121. X                if(pos>0)
  1122. X                {
  1123. X                    str[--pos]=0;        
  1124. X                    fputs(bsp,stdout);
  1125. X                    fflush(stdout);
  1126. X                }
  1127. X            }
  1128. X            else if(c==DEL)    /* alles loeschen    */
  1129. X            {
  1130. X                while(pos>0)
  1131. X                {
  1132. X                    str[--pos]=0;        
  1133. X                    fputs(bsp,stdout);
  1134. X                }
  1135. X                fflush(stdout);
  1136. X            }
  1137. X            else if(pos<14)        /* eingeben    */
  1138. X            {
  1139. X                str[pos++]=c;
  1140. X                str[pos]=0;    
  1141. X                putchar(c);    /* ausgeben    */
  1142. X                fflush(stdout);
  1143. X            }
  1144. X        }
  1145. X    }
  1146. X
  1147. X    vidattr(A_NORMAL);
  1148. X
  1149. X    putchar('\n');
  1150. X
  1151. X    return(str);
  1152. X}
  1153. X
  1154. X/*----------------------------------------------------------------------*/
  1155. X/*     Funktionstasten programmieren                    */
  1156. X/*----------------------------------------------------------------------*/
  1157. X
  1158. Xvoid    chat_pr_fkey(str)
  1159. X
  1160. Xchar    *str;
  1161. X{
  1162. X    int    num;
  1163. X
  1164. X    if(isdigit(*str))    /* abrufen ?    */
  1165. X    {
  1166. X        num=(int)*str-(int)'0';
  1167. X
  1168. X        if(fkey[num]!=(char *)0)    /* programiert ?    */
  1169. X            free(fkey[num]);
  1170. X
  1171. X        do                /* Anfang suchen    */
  1172. X            str++;
  1173. X        while(*str==' ' || *str==TAB);
  1174. X
  1175. X        if(*str=='\0')            /* loeschen ?        */
  1176. X            fkey[num]=(char *)0;
  1177. X        else
  1178. X        {
  1179. X            fkey[num]=malloc(strlen(str)+1); /* Speichern    */
  1180. X
  1181. X            strcpy(fkey[num],str);
  1182. X        }
  1183. X    }
  1184. X    else
  1185. X        chat_fkey(str);
  1186. X}
  1187. X
  1188. X/*----------------------------------------------------------------------*/
  1189. X/*     Funktionstasten abrufen                        */
  1190. X/*----------------------------------------------------------------------*/
  1191. X
  1192. Xvoid    chat_fkey(str)
  1193. X
  1194. Xchar    *str;
  1195. X{
  1196. X    int    num;
  1197. X
  1198. X    if(isdigit(*str))    /* abrufen ?    */
  1199. X    {
  1200. X        num=(int)*str-(int)'0';
  1201. X
  1202. X        if(fkey[num]!=(char *)0)    /* programiert ?    */
  1203. X        {
  1204. X            char    msg[STRLEN];
  1205. X
  1206. X            str++;
  1207. X            sprintf(msg,"%s%s",fkey[num],str);
  1208. X
  1209. X            if(mode & REVERSE)    /* Revers ?        */
  1210. X                vidattr(A_REVERSE);
  1211. X            else
  1212. X                vidattr(A_BOLD);
  1213. X
  1214. X            printf("%s%s%s\n",cname,prompt,msg);
  1215. X            pub_msg(msg);        /* senden        */
  1216. X        }
  1217. X    }
  1218. X    else            /* alles ausgeben    */
  1219. X        for(num=0;num<10;num++)
  1220. X        {
  1221. X            printf("f%d='",num);
  1222. X            if(fkey[num]!=(char *)0)
  1223. X                printf("%s",fkey[num]);
  1224. X            printf("'\n");
  1225. X        }
  1226. X}
  1227. X
  1228. X/*----------------------------------------------------------------------*/
  1229. X/*     Modi-Parser                            */
  1230. X/*----------------------------------------------------------------------*/
  1231. X
  1232. Xvoid    chat_mode(str)
  1233. X
  1234. Xchar    *str;
  1235. X{
  1236. X    int    i;
  1237. X
  1238. X    for(i=0;str[i]!='\0';i++)    /* klein machen    */
  1239. X        if(isupper(str[i]))
  1240. X            str[i]=tolower(str[i]);
  1241. X
  1242. X    for(i=0;str[i]!='\0';i++)
  1243. X    {
  1244. X        if(str[i]==TAB || str[i]==' ')        /* Space ?    */
  1245. X            continue;
  1246. X        else if(!strncmp(str+i,"beep",4))    /* Beep ein ?    */
  1247. X        {
  1248. X            i+=3;
  1249. X            mode |= BEEPER;
  1250. X        }
  1251. X        else if(!strncmp(str+i,"nobeep",6))    /* Beep aus ?     */
  1252. X        {
  1253. X            i+=5;
  1254. X            mode &= ~BEEPER;
  1255. X        }
  1256. X        else if(!strncmp(str+i,"jump",4))    /* Scrollen ?    */
  1257. X        {
  1258. X            i+=3;
  1259. X            mode |= JUMP;
  1260. X        }
  1261. X        else if(!strncmp(str+i,"nojump",6))    /* Nicht scrollen ? */
  1262. X        {
  1263. X            i+=5;
  1264. X            mode &= ~JUMP;
  1265. X        }
  1266. X        else if(!strncmp(str+i,"reverse",7))    /* Invers ?    */
  1267. X        {
  1268. X            i+=6;
  1269. X            mode |= REVERSE;
  1270. X        }
  1271. X        else if(!strncmp(str+i,"bold",4))    /* Hell ?    */
  1272. X        {
  1273. X            i+=3;
  1274. X            mode &= ~REVERSE;
  1275. X        }
  1276. X        else                    /* Fehler    */
  1277. X        {
  1278. X            puts(nomode);
  1279. X            break;
  1280. X        }
  1281. X    }
  1282. X}
  1283. X
  1284. X/*----------------------------------------------------------------------*/
  1285. X/*     Hilfe                                */
  1286. X/*----------------------------------------------------------------------*/
  1287. X
  1288. Xvoid    chat_help()
  1289. X
  1290. X{
  1291. X    FILE    *fp;
  1292. X    char     c;
  1293. X
  1294. X    if((fp=fopen(help,"r"))==(FILE *)0) /* oeffnen */
  1295. X        printf("can't open %s\n",help);
  1296. X    else
  1297. X    {
  1298. X        while(!feof(fp))    /* Ende ? */
  1299. X        {
  1300. X            c=(char)fgetc(fp);
  1301. X
  1302. X            if(!feof(fp))
  1303. X                putchar(c);
  1304. X        }
  1305. X
  1306. X        fclose(fp);    /* schliessen    */
  1307. X    }
  1308. X}
  1309. X
  1310. X/*----------------------------------------------------------------------*/
  1311. X/*     Wer ist in der Konferenz ?                    */
  1312. X/*----------------------------------------------------------------------*/
  1313. X
  1314. Xvoid    conf_members(co,m)
  1315. X
  1316. Xchar    *co;    /* Konferenz            */
  1317. Xchar    m;    /* Mode: 'p' = Mit Passwort    */
  1318. X{
  1319. X    FILE    *fp;
  1320. X    char     str[STRLEN],str2[STRLEN];
  1321. X
  1322. X    sprintf(str,"confdir/%s",co);    /* Konferenz-File */
  1323. X
  1324. X    if((fp=fopen(str,"r"))==(FILE *)0) /* oeffnen */
  1325. X        printf("can't open %s\n",str);
  1326. X    else
  1327. X    {
  1328. X        fscanf(fp,"%s",str);
  1329. X        printf("%s (%s)\n",members,co);
  1330. X
  1331. X        fscanf(fp,"%s",str);    /* Password    */
  1332. X        if(strcmp(str,STDPASS) && m=='p')
  1333. X            printf("%s%s\n",password,str);
  1334. X
  1335. X        while(!feof(fp))    /* Ende ? */
  1336. X        {
  1337. X            fscanf(fp,"%s %s",str,str2);
  1338. X            if(!feof(fp))
  1339. X                printf("%s%c(%s)\n",
  1340. X                str,TAB,str2);    /* ausg. */
  1341. X        }
  1342. X
  1343. X        fclose(fp);    /* schliessen    */
  1344. X    }
  1345. X}
  1346. SHAR_EOF
  1347. $TOUCH -am 0806102490 ch/utility.c &&
  1348. chmod 0600 ch/utility.c ||
  1349. echo "restore of ch/utility.c failed"
  1350. set `wc -c ch/utility.c`;Wc_c=$1
  1351. if test "$Wc_c" != "5572"; then
  1352.     echo original size 5572, current size $Wc_c
  1353. fi
  1354. # ============= ch/output.c ==============
  1355. echo "x - extracting ch/output.c (Text)"
  1356. sed 's/^X//' << 'SHAR_EOF' > ch/output.c &&
  1357. X/*----------------------------------------------------------------------*/
  1358. X/*                                    */
  1359. X/*    Name:            Chatter V2.9                */
  1360. X/*                                                                    */
  1361. X/*    Programmteil:        Output                    */
  1362. X/*                                    */
  1363. X/*    Library:        UNIX V                    */
  1364. X/*                                    */
  1365. X/*    Autor:            Marc Laukien                */
  1366. X/*                                    */
  1367. X/*----------------------------------------------------------------------*/
  1368. X
  1369. X#include <sys/types.h>
  1370. X#include <stdio.h>
  1371. X#include <signal.h>
  1372. X#include <curses.h>
  1373. X#include <term.h>
  1374. X#include "ch.h"
  1375. X
  1376. X/*----------------------------------------------------------------------*/
  1377. X/*     Ausgabe                                */
  1378. X/*----------------------------------------------------------------------*/
  1379. X/*    Return: Anzahl der empfangenen Messages                */
  1380. X/*----------------------------------------------------------------------*/
  1381. X
  1382. Xint    output(anz)
  1383. X
  1384. Xint    anz;    /* Anzahl der vorzurueckenden Zeilen     */
  1385. X{
  1386. X    UMSG    *msg;
  1387. X    int      ret=0;            /* noch keine Message    */
  1388. X    char    str[STRLEN];
  1389. X    int    i;
  1390. X
  1391. X    signal(SIGUSR1,SIG_IGN);    /* Interrupt loeschen    */
  1392. X
  1393. X    do
  1394. X    {
  1395. X        msg=recv_msg();            /* empfangen    */
  1396. X
  1397. X        if(msg->typ != EMPTY && ret==0)    /* Message da ?    */
  1398. X        {
  1399. X            if(anz)
  1400. X            {
  1401. X            int    i;
  1402. X
  1403. X            if(parm_down_cursor!=(char *)0) /* runter */
  1404. X                putp(tparm(parm_down_cursor,anz));
  1405. X            else        /* einzeln runter    */
  1406. X            for(i=0;i<anz;i++)
  1407. X                putp(cursor_down);
  1408. X            }
  1409. X
  1410. X            vidattr(0);    /* normale Schrift    */
  1411. X        }
  1412. X
  1413. X        switch(msg->typ)
  1414. X        {
  1415. X        case MESSAGE:            /* Nachricht         */
  1416. X            sprintf(str,"\n%s",msg->text);
  1417. X            fputs(str,stdout);
  1418. X            ret++;            /* 1. Message mehr     */
  1419. X            break;
  1420. X
  1421. X        case ARRIVAL:            /* Ankunft         */
  1422. X            if(mode & BEEPER)
  1423. X            sprintf(str,"\n***%c %s %s ***",BELL,msg->text,arr);
  1424. X            else
  1425. X            sprintf(str,"\n*** %s %s ***",msg->text,arr);
  1426. X
  1427. X            fputs(str,stdout);
  1428. X            ret++;            /* 1. Message mehr     */
  1429. X            break;
  1430. X
  1431. X        case DEPARTURE:            /* Verlassen         */
  1432. X            if(mode & BEEPER)
  1433. X            sprintf(str,"\n***%c %s %s ***",BELL,msg->text,dep);
  1434. X            else
  1435. X            sprintf(str,"\n*** %s %s ***",msg->text,dep);
  1436. X
  1437. X            fputs(str,stdout);
  1438. X            ret++;            /* 1. Message mehr     */
  1439. X            break;
  1440. X
  1441. X        case KILL:            /* Rauswurf        */
  1442. X            if(mode & BEEPER)
  1443. X            sprintf(str,"\n***%c %s %s ***",BELL,msg->text,fire);
  1444. X            else
  1445. X            sprintf(str,"\n*** %s %s ***",msg->text,fire);
  1446. X
  1447. X            fputs(str,stdout);
  1448. X            ret++;            /* 1. Message mehr     */
  1449. X            break;
  1450. X
  1451. X        case CNAME:            /* Namensaenderung    */
  1452. X        {
  1453. X            char    s1[STRLEN],s2[STRLEN];
  1454. X
  1455. X                        /* aufbereiten        */
  1456. X            sscanf(msg->text,"%s %s",s1,s2);
  1457. X
  1458. X            if(mode & BEEPER)
  1459. X            sprintf(str,"\n***%c %s --> %s ***",BELL,s1,s2);
  1460. X            else
  1461. X            sprintf(str,"\n*** %s --> %s ***",s1,s2);
  1462. X
  1463. X            fputs(str,stdout);
  1464. X            ret++;            /* 1. Message mehr     */
  1465. X            break;
  1466. X        }
  1467. X
  1468. X        case QUIT:            /* beenden         */
  1469. X            sprintf(str,"\n");
  1470. X            fputs(str,stdout);
  1471. X            give_notice();
  1472. X            deinit();
  1473. X            exit(0);
  1474. X            break;
  1475. X        }    /* Ende switch */
  1476. X
  1477. X    }
  1478. X    while(msg->typ != EMPTY);        /* leer ?     */
  1479. X
  1480. X    i   = -1;
  1481. X    len =  0;
  1482. X    while(str[++i]!='\0')
  1483. X        if(str[i]!='\n' && str[i]!=BELL)
  1484. X            len++;        /* Laenge merken    */
  1485. X    
  1486. X    return(ret);
  1487. X}
  1488. SHAR_EOF
  1489. $TOUCH -am 0806103490 ch/output.c &&
  1490. chmod 0600 ch/output.c ||
  1491. echo "restore of ch/output.c failed"
  1492. set `wc -c ch/output.c`;Wc_c=$1
  1493. if test "$Wc_c" != "2887"; then
  1494.     echo original size 2887, current size $Wc_c
  1495. fi
  1496. # ============= ch/menu.c ==============
  1497. echo "x - extracting ch/menu.c (Text)"
  1498. sed 's/^X//' << 'SHAR_EOF' > ch/menu.c &&
  1499. X/*----------------------------------------------------------------------*/
  1500. X/*                                    */
  1501. X/*    Name:            Chatter V2.9                */
  1502. X/*                                                                    */
  1503. X/*    Programmteil:        Menue                    */
  1504. X/*                                    */
  1505. X/*    Library:        UNIX V                    */
  1506. X/*                                    */
  1507. X/*    Autor:            Marc Laukien                */
  1508. X/*                                    */
  1509. X/*----------------------------------------------------------------------*/
  1510. X
  1511. X#include <sys/types.h>
  1512. X#include <sys/dir.h>
  1513. X#include <stdio.h>
  1514. X#include <curses.h>
  1515. X#include <term.h>
  1516. X#include <ctype.h>
  1517. X#include "ch.h"
  1518. X
  1519. Xstatic    void    menu_out();
  1520. Xstatic    void    conf_out();
  1521. X/*----------------------------------------------------------------------*/
  1522. X/*     Menue                                */
  1523. X/*----------------------------------------------------------------------*/
  1524. X
  1525. Xvoid    chat_menu()
  1526. X
  1527. X{
  1528. X    char     c;
  1529. X    char    str[STRLEN];
  1530. X
  1531. X    menu_out();
  1532. X
  1533. X    FOREVER
  1534. X    {
  1535. X        read(0,&c,1);        /* einlesen    */
  1536. X
  1537. X        if(isupper(c))        /* Klein machen    */
  1538. X            c=tolower(c);
  1539. X
  1540. X        switch(c)
  1541. X        {
  1542. X        case 'x':        /* Ende ?        */
  1543. X            CLEAR;
  1544. X            deinit();
  1545. X            exit(0);
  1546. X            break;
  1547. X
  1548. X        case '1':        /* sysconf        */
  1549. X            puts("\n");
  1550. X            strcpy(conf,"sysconf");
  1551. X
  1552. X            strcpy(pw,STDPASS);    /* Password     */
  1553. X            input();    /* Eingabeschleife    */
  1554. X            menu_out();
  1555. X            break;
  1556. X
  1557. X        case '2':        /* andere Konf.        */
  1558. X            puts("\n");
  1559. X            strcpy(conf,read_string(conf_name));
  1560. X            puts("\n");
  1561. X
  1562. X            strcpy(pw,STDPASS);/* Password         */
  1563. X
  1564. X            if(conf[0]!='\0')
  1565. X                input();    /* Eingabeschleife    */
  1566. X
  1567. X            menu_out();
  1568. X            break;
  1569. X
  1570. X        case '3':        /* Konf. beginnen    */
  1571. X            puts("\n");
  1572. X            strcpy(conf,read_string(conf_name));
  1573. X            puts("\n");
  1574. X
  1575. X            if(conf[0]!='\0')
  1576. X            {
  1577. X                sprintf(str,"%s/chman -c'%s' &",
  1578. X                BINDIR,conf);
  1579. X                system(str);    /* starten        */
  1580. X                sleep(4);
  1581. X
  1582. X                strcpy(pw,STDPASS);/* Password         */
  1583. X                input();    /* Eingabeschleife    */
  1584. X            }
  1585. X            menu_out();
  1586. X            break;
  1587. X
  1588. X        case '4':        /* priv Konf. beginnen    */
  1589. X            puts("\n");
  1590. X            strcpy(conf,read_string(conf_name));
  1591. X            puts("\n");
  1592. X            if(conf[0]!='\0')
  1593. X            {
  1594. X                strcpy(pw,read_string(password));
  1595. X    
  1596. X                sprintf(str,"%s/chman -c'%s' -p'%s' &",
  1597. X                BINDIR,conf,pw);
  1598. X                system(str);    /* starten        */
  1599. X                sleep(4);
  1600. X    
  1601. X                input();    /* Eingabeschleife    */
  1602. X            }
  1603. X            menu_out();
  1604. X            break;
  1605. X
  1606. X        case '5':        /* Konferenzen anzeigen    */
  1607. X            conf_out();
  1608. X            menu_out();
  1609. X            break;
  1610. X
  1611. X        default:
  1612. X            putchar(BELL);
  1613. X            fflush(stdout);
  1614. X            break;
  1615. X        }
  1616. X    }
  1617. X}
  1618. X
  1619. Xstatic    void    menu_out()
  1620. X
  1621. X{
  1622. X    char    str[STRLEN];
  1623. X    FILE    *fp;
  1624. X    char    c;
  1625. X
  1626. X    CLEAR
  1627. X
  1628. X    if((fp=fopen(menufile,"r"))==(FILE *)0) /* oeffnen */
  1629. X        printf("can't open %s\n",menufile);
  1630. X    else
  1631. X    {
  1632. X        while(!feof(fp))    /* Ende ? */
  1633. X        {
  1634. X            c=(char)fgetc(fp);
  1635. X
  1636. X            if(!feof(fp))
  1637. X                putchar(c);
  1638. X        }
  1639. X
  1640. X        fclose(fp);    /* schliessen    */
  1641. X    }
  1642. X}
  1643. X
  1644. Xstatic    void    conf_out()
  1645. X
  1646. X{
  1647. X    FILE    *fp;
  1648. X    struct    direct    dir;    /* Directory - Struktur        */
  1649. X    char    str[STRLEN];    /* String    */
  1650. X
  1651. X    if((fp=fopen("confdir","r"))==(FILE *)0)    /* oeffnen    */
  1652. X    {
  1653. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  1654. X        deinit();
  1655. X        exit(2);
  1656. X    }
  1657. X
  1658. X    while(!feof(fp))        /* Ende ?        */
  1659. X    {
  1660. X        if(!fread((char *)&dir,sizeof(dir),1,fp)) /* einlesen    */
  1661. X            continue;
  1662. X
  1663. X        if(dir.d_ino==(ino_t)0)            /* unused ?    */
  1664. X            continue;
  1665. X
  1666. X        strncpy(str,dir.d_name,DIRSIZ);    /* kopieren        */
  1667. X        str[DIRSIZ]='\0';        /* beenden        */
  1668. X
  1669. X        if(str[0]=='.')
  1670. X            continue;
  1671. X
  1672. X        CLEAR;
  1673. X        fflush(stdout);
  1674. X
  1675. X        if(mode & REVERSE)        /* Revers ?        */
  1676. X            vidattr(A_REVERSE);
  1677. X        else
  1678. X            vidattr(A_BOLD);
  1679. X
  1680. X        puts(str);            /* Konferenznamen    */
  1681. X
  1682. X        vidattr(0);
  1683. X
  1684. X        conf_members(str,'n');        /* Ausgeben ohne Password */
  1685. X
  1686. X        menu_key();
  1687. X    }
  1688. X
  1689. X    fclose(fp);
  1690. X}
  1691. SHAR_EOF
  1692. $TOUCH -am 0806102490 ch/menu.c &&
  1693. chmod 0600 ch/menu.c ||
  1694. echo "restore of ch/menu.c failed"
  1695. set `wc -c ch/menu.c`;Wc_c=$1
  1696. if test "$Wc_c" != "3358"; then
  1697.     echo original size 3358, current size $Wc_c
  1698. fi
  1699. # ============= ch/invite.c ==============
  1700. echo "x - extracting ch/invite.c (Text)"
  1701. sed 's/^X//' << 'SHAR_EOF' > ch/invite.c &&
  1702. X/*----------------------------------------------------------------------*/
  1703. X/*                                    */
  1704. X/*    Name:            Chatter V2.9                */
  1705. X/*                                                                    */
  1706. X/*    Programmteil:        Einladung und Blitzmeldung        */
  1707. X/*                                    */
  1708. X/*    Library:        UNIX V                    */
  1709. X/*                                    */
  1710. X/*    Autor:            Marc Laukien                */
  1711. X/*                                    */
  1712. X/*----------------------------------------------------------------------*/
  1713. X
  1714. X#include <sys/types.h>
  1715. X#include <sys/stat.h>
  1716. X#include <utmp.h>
  1717. X#include <pwd.h>
  1718. X#include <stdio.h>
  1719. X#include "ch.h"
  1720. X
  1721. Xstatic    void    send_to_user();
  1722. X
  1723. X/*----------------------------------------------------------------------*/
  1724. X/*     Einladung                            */
  1725. X/*----------------------------------------------------------------------*/
  1726. X
  1727. Xvoid    invite(text)
  1728. X
  1729. Xchar    *text;                /* Messagetext    */
  1730. X{
  1731. X    int    i;
  1732. X    char    name[STRLEN],str[STRLEN];
  1733. X
  1734. X    FOREVER
  1735. X    {
  1736. X        while(*text==' ' || *text==TAB)
  1737. X            text++;
  1738. X
  1739. X        i=0;
  1740. X        while(*text!=' ' && *text!=TAB && *text!='\0')
  1741. X        {
  1742. X            name[i++] = *text;
  1743. X            text++;
  1744. X        }
  1745. X
  1746. X        if(i==0)        /* Ende ?    */
  1747. X            break;
  1748. X
  1749. X        name[i++]='\0';        /* beenden    */
  1750. X
  1751. X        /* Message an tty senden ----------------- */
  1752. X        
  1753. X        sprintf(str,"%s (%s)",inv,conf);
  1754. X
  1755. X        send_to_user(name,str);
  1756. X
  1757. X        /* Ende an tty senden -------------------- */
  1758. X
  1759. X        if(*text=='\0')        /* text schon zu ende    ?    */
  1760. X            break;
  1761. X    }
  1762. X}
  1763. X
  1764. X/*----------------------------------------------------------------------*/
  1765. X/*     Nachricht                            */
  1766. X/*----------------------------------------------------------------------*/
  1767. X
  1768. Xvoid    message(text)
  1769. X
  1770. Xchar    *text;                /* Messagetext    */
  1771. X{
  1772. X    int    i;
  1773. X    char    name[STRLEN];
  1774. X
  1775. X    while(*text==' ' || *text==TAB)
  1776. X        text++;
  1777. X
  1778. X    i=0;
  1779. X    while(*text!=' ' && *text!=TAB && *text!='\0')
  1780. X    {
  1781. X        name[i++] = *text;
  1782. X        text++;
  1783. X    }
  1784. X
  1785. X    if(i==0)        /* Ende ?    */
  1786. X        return;
  1787. X
  1788. X    name[i++]='\0';        /* beenden    */
  1789. X
  1790. X    while(*text == ' ' || *text == TAB)
  1791. X        text++;
  1792. X
  1793. X    /* Message an tty senden ----------------- */
  1794. X        
  1795. X    send_to_user(name,text);
  1796. X
  1797. X    /* Ende an tty senden -------------------- */
  1798. X}
  1799. X
  1800. Xstatic    void    send_to_user(name,text)
  1801. X
  1802. Xchar    *name;                /* Username    */
  1803. Xchar    *text;                /* Messagetext    */
  1804. X{
  1805. X    char    tty[STRLEN];
  1806. X    char    str[STRLEN];
  1807. X    char    path[STRLEN];
  1808. X    FILE    *fp,*fp2;
  1809. X    struct    utmp    ut;    /* UTMP - Struktur    */
  1810. X    struct    passwd    *pwd;    /* Password-Struct    */
  1811. X    int    count=0;
  1812. X
  1813. X    pwd=getpwnam(name);    /* Password-Struct holen */
  1814. X    if(pwd == (struct passwd *)0)
  1815. X    {
  1816. X        printf(nouser,name);
  1817. X        putchar('\n');
  1818. X        return;        /* Fehler    */
  1819. X    }
  1820. X
  1821. X    if((fp=fopen(UTMP_FILE,"r"))==(FILE *)0)    /* oeffnen    */
  1822. X    {
  1823. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  1824. X        deinit();
  1825. X        exit(2);
  1826. X    }
  1827. X
  1828. X    while(!feof(fp))        /* Ende ?        */
  1829. X    {
  1830. X        if(!fread((char *)&ut,sizeof(ut),1,fp)) /* einlesen    */
  1831. X            continue;
  1832. X
  1833. X        if(ut.ut_type != USER_PROCESS)    /* Kein User-Prozess ?    */
  1834. X            continue;
  1835. X
  1836. X        if(strncmp(ut.ut_user,name,8))    /* Falscher User ?    */
  1837. X            continue;
  1838. X
  1839. X        count++;        /* Einen User mehr gefunden    */
  1840. X
  1841. X        strcpy(tty,ut.ut_line);    /* tty kopieren        */
  1842. X        sprintf(path,"/dev/%s",tty);
  1843. X
  1844. X        if((fp2=fopen(path,"w")) == (FILE *)0)
  1845. X        {
  1846. X            printf(nomsg,name);
  1847. X            putchar('\n');
  1848. X            continue;
  1849. X        }
  1850. X
  1851. X        sprintf(str,msg_from,getlogin());    /* senden    */
  1852. X        fprintf(fp2,"\n*** %s ***\n*** %s ***\n",str,text);
  1853. X
  1854. X        printf("%s [%s]\n",name,tty);        /* bestaetigen    */
  1855. X
  1856. X        fclose(fp2);
  1857. X    }
  1858. X
  1859. X    fclose(fp);
  1860. X
  1861. X    if(!count)        /* Kein User online    */
  1862. X    {
  1863. X        printf(not_online,name);
  1864. X        putchar('\n');
  1865. X    }
  1866. X}
  1867. X
  1868. SHAR_EOF
  1869. $TOUCH -am 0806180390 ch/invite.c &&
  1870. chmod 0600 ch/invite.c ||
  1871. echo "restore of ch/invite.c failed"
  1872. set `wc -c ch/invite.c`;Wc_c=$1
  1873. if test "$Wc_c" != "3234"; then
  1874.     echo original size 3234, current size $Wc_c
  1875. fi
  1876. # ============= ch/grep.c ==============
  1877. echo "x - extracting ch/grep.c (Text)"
  1878. sed 's/^X//' << 'SHAR_EOF' > ch/grep.c &&
  1879. X/*----------------------------------------------------------------------*/
  1880. X/*                                    */
  1881. X/*    Name:            Chatter V2.9                */
  1882. X/*                                                                    */
  1883. X/*    Programmteil:        Grep                    */
  1884. X/*                                    */
  1885. X/*    Library:        UNIX V                    */
  1886. X/*                                    */
  1887. X/*    Autor:            Marc Laukien                */
  1888. X/*                                    */
  1889. X/*----------------------------------------------------------------------*/
  1890. X
  1891. X#include <sys/types.h>
  1892. X#include <sys/dir.h>
  1893. X#include <stdio.h>
  1894. X#include <ctype.h>
  1895. X#include "ch.h"
  1896. X
  1897. Xstatic    int    str_cmp();
  1898. X
  1899. X/*----------------------------------------------------------------------*/
  1900. X/*     Grep                                */
  1901. X/*----------------------------------------------------------------------*/
  1902. X/*    Return:        1-gefunden    0-nicht                */
  1903. X/*----------------------------------------------------------------------*/
  1904. X
  1905. Xint    grep(str,file)
  1906. X
  1907. Xchar    *str;            /* String nach dem gesucht wird        */
  1908. Xchar    *file;            /* Filename, in dem gesucht wird    */
  1909. X{
  1910. X    FILE    *fp;        /* Filepointer        */
  1911. X    int    ret=0;        /* noch nicht gefunden    */
  1912. X    char    str2[STRLEN];    /* String        */
  1913. X
  1914. X    if((fp=fopen(file,"r")) == (FILE *)0)    /* oeffnen        */
  1915. X    {
  1916. X        fprintf(stderr,"%s: can't open \"%s\".\n",pname,file);
  1917. X        deinit();
  1918. X        exit(2);
  1919. X    }
  1920. X
  1921. X    while(!feof(fp))
  1922. X    {
  1923. X        fscanf(fp,"%s",str2);    /* einlesen    */
  1924. X
  1925. X        if(!str_cmp(str,str2))    /* passt ?    */
  1926. X        {
  1927. X            ret=1;
  1928. X            break;
  1929. X        }
  1930. X    }
  1931. X
  1932. X    fclose(fp);
  1933. X
  1934. X    return(ret);
  1935. X}
  1936. X
  1937. Xstatic    int    str_cmp(s1,s2) /* Eigenes strcmp ohne Gross/Kleinschreibung */
  1938. X
  1939. Xchar    *s1,*s2;
  1940. X{
  1941. X    int    i;
  1942. X    char    sc1[STRLEN],sc2[STRLEN];
  1943. X
  1944. X    i = -1;
  1945. X    do    /* kopieren (nur kleinschrift)    */
  1946. X    {
  1947. X        i++;
  1948. X        sc1[i] = s1[i];
  1949. X
  1950. X        if(isupper(sc1[i]))
  1951. X            sc1[i]=tolower(sc1[i]);
  1952. X    }
  1953. X    while(s1[i] != '\0');
  1954. X
  1955. X    i = -1;
  1956. X    do    /* kopieren (nur kleinschrift)    */
  1957. X    {
  1958. X        i++;
  1959. X        sc2[i] = s2[i];
  1960. X
  1961. X        if(isupper(sc2[i]))
  1962. X            sc2[i]=tolower(sc2[i]);
  1963. X    }
  1964. X    while(s2[i] != '\0');
  1965. X
  1966. X    return(strcmp(sc1,sc2));
  1967. X}
  1968. SHAR_EOF
  1969. $TOUCH -am 0806112690 ch/grep.c &&
  1970. chmod 0600 ch/grep.c ||
  1971. echo "restore of ch/grep.c failed"
  1972. set `wc -c ch/grep.c`;Wc_c=$1
  1973. if test "$Wc_c" != "1792"; then
  1974.     echo original size 1792, current size $Wc_c
  1975. fi
  1976. # ============= cm/init.c ==============
  1977. if test ! -d 'cm'; then
  1978.     echo "x - creating directory cm"
  1979.     mkdir 'cm'
  1980. fi
  1981. echo "x - extracting cm/init.c (Text)"
  1982. sed 's/^X//' << 'SHAR_EOF' > cm/init.c &&
  1983. X/*----------------------------------------------------------------------*/
  1984. X/*                                    */
  1985. X/*    Name:            ChatManager V2.9            */
  1986. X/*                                                                    */
  1987. X/*    Programmteil:        Initialisierungen            */
  1988. X/*                                    */
  1989. X/*    Library:        UNIX V                    */
  1990. X/*                                    */
  1991. X/*    Autor:            Marc Laukien                */
  1992. X/*                                    */
  1993. X/*----------------------------------------------------------------------*/
  1994. X
  1995. X#include <sys/types.h>
  1996. X#include <sys/stat.h>
  1997. X#include <stdio.h>
  1998. X#include <fcntl.h>
  1999. X#include <errno.h>
  2000. X#include "cm.h"
  2001. X
  2002. X/*----------------------------------------------------------------------*/
  2003. X/*     Initialisierungen                        */
  2004. X/*----------------------------------------------------------------------*/
  2005. X
  2006. Xvoid    init()
  2007. X{
  2008. X    char    str[STRLEN];
  2009. X    int     fd;                /* Filedeskriptor     */
  2010. X    int     i;
  2011. X    int    flags;
  2012. X
  2013. X    for(i=0;i<MAXUSER;i++)            /* alle User loeschen    */
  2014. X        userlist[i].pid= -1;
  2015. X
  2016. X    /* Conf anlegen ----------------------------- */
  2017. X
  2018. X    sprintf(str,"confdir/%s",conf);        /* Konferenz-File     */
  2019. X
  2020. X    fd=open(str,O_WRONLY | O_CREAT | O_EXCL,MODE);    /* oeffnen     */
  2021. X
  2022. X    if(fd==-1)                /* schon belegt ?    */
  2023. X    {
  2024. X        if(errno==EEXIST)
  2025. X        {
  2026. X            fprintf(stderr,"%s: conference exists\n",pname);
  2027. X            deinit();
  2028. X            exit(2);
  2029. X        }
  2030. X        else                /* Anderer Fehler    */
  2031. X        {
  2032. X            fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  2033. X            deinit();
  2034. X            exit(2);
  2035. X        }
  2036. X    }
  2037. X
  2038. X     key=getpid();                /* Messagekey holen     */
  2039. X    if(key== -1)                /* Fehler ?         */
  2040. X    {
  2041. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  2042. X        deinit();
  2043. X        exit(2);
  2044. X    }
  2045. X    
  2046. X    close(fd);                /* schliessen         */
  2047. X
  2048. X    write_conf();
  2049. X    conf_on=1;                /* Konferenz ist an    */
  2050. X
  2051. X    /* Ende Conf anlegen -------------------------- */
  2052. X
  2053. X    /* FIFO anlegen ------------------------------- */
  2054. X
  2055. X    sprintf(str,"fifodir/%ld",key);        /* Pfad fuer FIFO    */
  2056. X
  2057. X    if(mknod(str,S_IFIFO | MODE,0)==-1)    /* Anlegen        */
  2058. X    {
  2059. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  2060. X        deinit();
  2061. X        exit(2);
  2062. X    }
  2063. X
  2064. X    fifofd=open(str,O_RDWR);        /* FIFO oeffnen     */
  2065. X    if(fifofd== -1)                /* Fehler ?         */
  2066. X    {
  2067. X        fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]);
  2068. X        deinit();
  2069. X        exit(2);
  2070. X    }
  2071. X
  2072. X    /* Ende FIFO anlegen -------------------------- */
  2073. X
  2074. X    setpgrp();                /* eigene Prozessgruppe    */
  2075. X}
  2076. X
  2077. X/*----------------------------------------------------------------------*/
  2078. X/*     Deinitialisierungen                        */
  2079. X/*----------------------------------------------------------------------*/
  2080. X
  2081. Xvoid    deinit()
  2082. X{
  2083. X    char str[STRLEN];    /* String fuer Pfad- und Dateinamen    */
  2084. X    
  2085. X    /* File loeschen ---------------------------- */
  2086. X    
  2087. X    if(conf_on)        /* Konferenz an ?        */
  2088. X    {
  2089. X        sprintf(str,"confdir/%s",conf);
  2090. X        unlink(str);
  2091. X    }
  2092. X
  2093. X    /* FIFO loeschen -------------------- */
  2094. X
  2095. X    if(fifofd != -1)
  2096. X    {
  2097. X        UMSG umsg;
  2098. X        int  i;
  2099. X
  2100. X        umsg.typ=QUIT;        /* Message aufbereiten     */
  2101. X
  2102. X        for(i=0;i<MAXUSER;i++)    /* alle User durchgehen    */
  2103. X            if(userlist[i].pid!= -1)
  2104. X                send_msg(&umsg,&userlist[i]);/* senden     */
  2105. X
  2106. X        sprintf(str,"fifodir/%ld",key);
  2107. X        unlink(str);
  2108. X
  2109. X        close(fifofd);
  2110. X    }
  2111. X
  2112. X    chdir(cwd);        /* Directory einstellen     */
  2113. X}
  2114. SHAR_EOF
  2115. $TOUCH -am 0806102990 cm/init.c &&
  2116. chmod 0600 cm/init.c ||
  2117. echo "restore of cm/init.c failed"
  2118. set `wc -c cm/init.c`;Wc_c=$1
  2119. if test "$Wc_c" != "2912"; then
  2120.     echo original size 2912, current size $Wc_c
  2121. fi
  2122. # ============= cm/int.c ==============
  2123. echo "x - extracting cm/int.c (Text)"
  2124. sed 's/^X//' << 'SHAR_EOF' > cm/int.c &&
  2125. X/*----------------------------------------------------------------------*/
  2126. X/*                                    */
  2127. X/*    Name:            ChatManager V2.9            */
  2128. X/*                                                                    */
  2129. X/*    Programmteil:        Messageinterpreter            */
  2130. X/*                                    */
  2131. X/*    Library:        UNIX V                    */
  2132. X/*                                    */
  2133. X/*    Autor:            Marc Laukien                */
  2134. X/*                                    */
  2135. X/*----------------------------------------------------------------------*/
  2136. X
  2137. X#include <stdio.h>
  2138. X#include "cm.h"
  2139. X
  2140. X/*----------------------------------------------------------------------*/
  2141. X/*     Message-Interpreterschleife                    */
  2142. X/*----------------------------------------------------------------------*/
  2143. X
  2144. Xvoid    msg_int()
  2145. X
  2146. X{
  2147. X    MSG    *msg;
  2148. X    int    i,j;
  2149. X
  2150. X    do
  2151. X    {
  2152. X    msg=recv_msg();            /* Empfangen         */
  2153. X
  2154. X    switch(msg->typ)        /* was fuer ein Typ     */
  2155. X    {
  2156. X    case EMPTY:            /* leer     */
  2157. X        break;
  2158. X
  2159. X    case ARRIVAL:            /* neuer User     */
  2160. X        i=0;
  2161. X        while(userlist[i].pid != -1 && i<MAXUSER)
  2162. X            i++;        /* freien Platz suchen     */
  2163. X
  2164. X        if(i!=MAXUSER)
  2165. X        {
  2166. X            sscanf(msg->text,"%ld %s %s",
  2167. X            &userlist[i].key,userlist[i].name,
  2168. X            userlist[i].cname);
  2169. X
  2170. X            if(userlist[i].key == -1)    /* Fehler ?     */
  2171. X            {
  2172. X                fprintf(stderr,"%s: %s\n",pname
  2173. X                ,sys_errlist[errno]);
  2174. X                userlist[i].pid = -1;
  2175. X            }
  2176. X            else
  2177. X            {
  2178. X            UMSG umsg;
  2179. X
  2180. X            sprintf(umsg.text,"%s",userlist[i].cname);
  2181. X            umsg.typ=ARRIVAL;    /* aufbereiten         */
  2182. X
  2183. X            for(j=0;j<MAXUSER;j++)    /* User durchgehen     */
  2184. X                if(userlist[j].pid!= -1)/* senden     */
  2185. X                    send_msg(&umsg,&userlist[j]);
  2186. X
  2187. X            userlist[i].pid = msg->pid;    /* speichern     */
  2188. X            usernr++;        /* ein User mehr     */
  2189. X
  2190. X            write_conf();    /* Conf-Datei neu anlegen     */
  2191. X            }
  2192. X        }
  2193. X        break;
  2194. X
  2195. X    case DEPARTURE:            /* User geht         */
  2196. X        i=0;
  2197. X        while(userlist[i].pid != msg->pid && i<MAXUSER)
  2198. X            i++;        /* Eintrag suchen     */
  2199. X
  2200. X        if(i!=MAXUSER)
  2201. X        {
  2202. X        UMSG umsg;
  2203. X
  2204. X        sprintf(umsg.text,"%s",userlist[i].cname);
  2205. X        umsg.typ=DEPARTURE;    /* Message aufbereiten    */
  2206. X
  2207. X        userlist[i].pid= -1;    /* Daten loeschen    */
  2208. X        usernr--;        /* ein User weniger    */
  2209. X
  2210. X        for(j=0;j<MAXUSER;j++)    /* alle User durchgehen        */
  2211. X            if(userlist[j].pid!= -1)    /* senden     */
  2212. X                send_msg(&umsg,&userlist[j]);
  2213. X
  2214. X        write_conf();        /* Conf-Datei neu anlegen     */
  2215. X        }
  2216. X        break;
  2217. X
  2218. X    case MESSAGE:            /* oeffentliche Nachricht    */
  2219. X    case NOPROMPT:
  2220. X        i=0;
  2221. X        while(userlist[i].pid != msg->pid && i<MAXUSER)
  2222. X            i++;        /* Eintrag suchen    */
  2223. X
  2224. X        if(i!=MAXUSER)        /* gefunden ?        */
  2225. X        {
  2226. X        UMSG umsg;
  2227. X
  2228. X        if(msg->typ==NOPROMPT)    /* Kein Prompt ?    */
  2229. X            sprintf(umsg.text,"%s%s",userlist[i].cname,msg->text);
  2230. X        else
  2231. X            sprintf(umsg.text,"%s: %s",userlist[i].cname,msg->text);
  2232. X
  2233. X        umsg.typ=MESSAGE;    /* Message aufbereiten    */
  2234. X
  2235. X        for(j=0;j<MAXUSER;j++)    /* alle User durchgehen    */
  2236. SHAR_EOF
  2237. echo "End of UnixChat part 1"
  2238. echo "File cm/int.c is continued in part 2"
  2239. echo "2" > shar3_seq_.tmp
  2240. exit 0
  2241. -- 
  2242.    /              |    -: Marc Laukien :-     |
  2243.   /__             |                           |   _  _           __
  2244.  /   \  /_  /  /  |   ml@brumuc.bru.sub.org   |  / \/ |   /  /  /
  2245. /____/ /   /__/   | sigma@salyko.doit.sub.org | /     |  /__/  /__
  2246.