1000 ! LOUSR.BAC 1005 INTEGER : EXTEND 1010 ; '** Force logout on users **' 1020 ; ' Ver X.02, 1985-02-15' 1030 ; ' Copyright 1984 Dataindustrier AB' 1040 ! * 1050 ! * Written by G|ran Nordenborg 1060 ! ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 1070 ! * 1080 ! * Rev date / Rev nr / Sign / Note 1090 ! * 84-09-06 / X.00 / GN / Main 1100 ! * 85-02-08 / X.01 / GN / New 'stop login' talknet code 1110 ! * 85-02-15 / X.02 / BL / Accessible from DOS, FNStartpar$ handling 1120 ! * 1130 ! ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 1140 ! * 1150 ! * Main routine 1160 ! * 1170 IF FNLousr THEN ; 'LOUSR abort' 1180 ; FNExit 1190 ! EJECT 1200 ! ************************************* 1210 ! * 1220 ! * Logout user(s) 1230 ! * 1240 DEF FNLousr 1250 IF FNInitialize THEN RETURN T 1260 Cmd$=FNStartpar$ : IF LEN(Cmd$) Cmd$=Cmd$+"**" : GOTO 1300 1270 ; 'Command : '; 1280 INPUT LINE Cmd$ 1290 ; 1300 Cmd$=FNCapstr$(LEFT$(Cmd$,LEN(Cmd$)-2)) 1310 IF FNCmdscan(Cmd$) THEN RETURN T 1320 OPEN Outfile$ AS FILE Lud 1330 IF INSTR(1,Option$,'?') THEN RETURN FNHelp 1340 IF INSTR(1,Option$,'N') THEN Option=Optnolog 1350 IF INSTR(1,Option$,'L') THEN Option=Optlog 1360 ON ERROR GOTO 1550 1370 Lousr=VAL(Selfile$) 1380 IF Lousr=Ownuser THEN ; 'Can''t log out own user' : RETURN T 1390 IF Lousr>=32 IF FNGetstat(Lousr) RETURN T ELSE IF User=Lousr ; 'Sorry, can''t logout ''' Username$ '''' : RETURN T ELSE ; 'No such user' : RETURN T 1400 IF Lousr=-1 AND Lousr$=SPACE$(8) THEN Error=FNTalknet(14,9,0,0,Option,0) : IF Error THEN ; 'Error' Error 'from net central' : RETURN T ELSE RETURN F 1410 IF Lousr<>-1 THEN Startusr=Lousr : Lastusr=Lousr ELSE Startusr=0 : Lastusr=Maxusr 1420 FOR Usr=Startusr TO Lastusr 1430 IF FNGetstat(Usr) THEN RETURN T 1440 IF ((Option AND Optlogall)=F) AND (User<>Lousr) AND (Lousr$<>Username$) AND (Lousr$<>'* ') OR (User=Ownuser) OR (User=-1) THEN 1520 ! Don't 1450 ! * 1460 ! * Log out user 'Usr' 1470 ! * 1480 Logdone=T 1490 IF FNListusr THEN RETURN T 1500 Error=FNTalknet(14,9,0,0,Option+1,Usr) 1510 IF Error THEN ; #Lud 'Error' Error 'during logout' ELSE ; #Lud 'Logged out' 1520 NEXT Usr 1530 IF Logdone=F THEN ; 'No such user ''' Selfile$ '''' 1540 RETURN F 1550 ! * 1560 ! * User name and no user number given 1570 ! * 1580 Lousr=-1 ! Never log out user number 1590 Lousr$=LEFT$(Selfile$+SPACE$(8),8) 1600 RESUME 1400 1610 FNEND 1620 ! ********************************* 1630 ! * 1640 ! * All initialisations 1650 ! * 1660 DEF FNInitialize 1670 F=0 1680 T=-1 1690 DIM Hmonth.(12) 1700 Maxusr=31 1710 Lud=1 1720 Tbusn=1 1730 Tbuna=Tbusn+5 1740 Tbgnr=Tbuna+9 1750 Tbdir=Tbgnr 1760 Tblpi=Tbgnr+7 1770 Tbltm=Tblpi+7 1780 Tbetm=Tbltm+14 1790 Tbwtm=Tbetm+13 1800 Tbown=Tbwtm+13 1810 Tbend=Tbown+6 1820 Optnolog=128+64 1830 Optlog=64 1840 FOR Month=2 TO 12 1850 READ Days. 1860 Hmonth.(Month)=Hmonth.(Month-1)+Days.*24. 1870 NEXT Month 1880 Month$='JanFebMarAprMayJunJulAugSepOctNovDec' 1890 Maxuser=32 1900 OPEN 'CON:' AS FILE Lud 1910 Buff$='' 1920 POKE VAROOT(Buff$),0,1,0,245,0,1 1930 IF FNGetstat(254) THEN RETURN T 1940 Ownuser=User 1950 Ownpriv=Lpriv 1960 IF (Ownpriv AND 8)=0 THEN ; 'Protection violation' : RETURN T 1970 RETURN F 1980 DATA 31,28,31,30,31,30,31,31,30,31,30,31 1990 FNEND 2000 ! ********************************* 2010 ! * 2020 ! * List user status 2030 ! * 2040 DEF FNListusr 2050 IF Header=F THEN ; #Lud TAB(Tbusn) 'User' TAB(Tbuna) 'Name' TAB(Tbgnr) ' Grp' TAB(Tblpi) 'Priv'; 2060 IF Header=F THEN ; #Lud TAB(Tbltm) 'Login time' TAB(Tbetm) 'Elapsed time' TAB(Tbwtm) 'Acc wait' 2070 Header=T 2080 ; #Lud TAB(Tbusn); 2090 ; #Lud USING '####' User; 2100 ; #Lud TAB(Tbuna) Username$; 2110 ; #Lud TAB(Tbgnr); 2120 ; #Lud USING '######' FNNsgn.(Group); 2130 ; #Lud TAB(Tblpi) Lpriv$; 2140 ; #Lud TAB(Tbltm) Ltime$; 2150 ; #Lud TAB(Tbetm); 2160 IF Ehtime.<>0. THEN ; #Lud NUM$(Ehtime.);':'; 2170 ; #Lud RIGHT$(NUM$(100+Estime/60),2);':';RIGHT$(NUM$(100+MOD(Estime,60)),2); 2180 ; #Lud TAB(Tbwtm); 2190 IF Wstime=-1 THEN ; #Lud '**:**'; : GOTO 2220 2200 IF Whtime.<>0. THEN ; #Lud NUM$(Whtime.);':'; 2210 ; #Lud RIGHT$(NUM$(100+Wstime/60),2);':';RIGHT$(NUM$(100+MOD(Wstime,60)),2); 2220 IF User=Ownuser THEN ; #Lud TAB(Tbown) 'Own '; 2230 ; #Lud TAB(Tbown); 2240 RETURN F 2250 FNEND 2260 ! ****************************************** 2270 ! * 2280 ! * Get status for user 2290 ! * 2300 DEF FNGetstat(Usernr) 2310 IF FNTalknet(14,0,0,0,0,Usernr) THEN RETURN T 2320 Lpriv=ASCII(MID$(Buff$,51,1)) 2330 IF (Lpriv AND 1)=0 THEN User=-1 : RETURN F ! Logged out 2340 Htime.=ASCII(MID$(Buff$,33,1))*8760.+Hmonth.(ASCII(MID$(Buff$,34,1)))+(ASCII(MID$(Buff$,35,1))-1)*24.+ASCII(MID$(Buff$,36,1)) 2350 Stime=ASCII(MID$(Buff$,37,1))*60+ASCII(MID$(Buff$,38,1)) 2360 User=ASCII(MID$(Buff$,39,1)) 2370 Username$=MID$(Buff$,40,8) 2380 Group=CVT$%(MID$(Buff$,48,2)) 2390 Lprot=ASCII(MID$(Buff$,50,1)) 2400 Lpriv=ASCII(MID$(Buff$,51,1)) 2410 Fprot=ASCII(MID$(Buff$,52,1)) 2420 Ltime$=FNTime$(MID$(Buff$,53,6)) 2430 Ehtime.=Htime.-ASCII(MID$(Buff$,53,1))*8760.-Hmonth.(ASCII(MID$(Buff$,54,1)))-(ASCII(MID$(Buff$,55,1))-1)*24.-ASCII(MID$(Buff$,56,1)) 2440 Estime=Stime-ASCII(MID$(Buff$,57,1))*60-ASCII(MID$(Buff$,58,1)) 2450 IF Estime<0 THEN Estime=Estime+3600 : Ehtime.=Ehtime.-1. 2460 Whtime.=Htime.-ASCII(MID$(Buff$,59,1))*8760.-Hmonth.(ASCII(MID$(Buff$,60,1)))-(ASCII(MID$(Buff$,61,1))-1)*24.-ASCII(MID$(Buff$,62,1)) 2470 Wstime=Stime-ASCII(MID$(Buff$,63,1))*60-ASCII(MID$(Buff$,64,1)) 2480 IF Wstime<0 THEN Wstime=Wstime+3600 : Whtime.=Whtime.-1. 2490 IF MID$(Buff$,59,6)=CHR$(0,0,0,0,0,0) THEN Wstime=-1 2500 ! * 2510 ! * convert user privilege to string 2520 ! * 2530 Lpriv$='------' 2540 IF Lpriv AND 32 THEN MID$(Lpriv$,1,1)='C' ! Central login 2550 IF Lpriv AND 16 THEN MID$(Lpriv$,2,1)='X' ! Central task 2560 IF Lpriv AND 8 THEN MID$(Lpriv$,3,1)='D' ! Direct access 2570 IF Lpriv AND 4 THEN MID$(Lpriv$,4,1)='S' ! Super user 2580 IF Lpriv AND 2 THEN MID$(Lpriv$,5,1)='G' ! Group master 2590 IF Lpriv AND 1 THEN MID$(Lpriv$,6,1)='U' ! Logged in user 2600 RETURN F 2610 FNEND 2620 ! ********************************* 2630 ! * 2640 ! * Do communication with net central. 2650 ! * 2660 DEF FNTalknet(Fc,Sfc,B,C,D,E) LOCAL Z 2670 IF PEEK(PEEK2(24616))=201 RETURN -1 ! This is no Lux-net!!! 2680 POKE 64798,255 ! 0FFH -> BSAVE. => TFT. fake (use DOSBUF0). 2690 POKE 64961,Fc ! FC -> MSG.FC (Function code). 2700 POKE 64962,Sfc ! SFC -> MSG.SFC (Subfunction code). 2710 POKE 64963,C,B ! MSG.PDN, MSG.ERRB (BC register to/from central). 2720 POKE 64965,E,D ! Register DE to/from central. 2730 Z=CALL(24615) ! NETCALL. => Talk to the central. 2740 RETURN PEEK(64962) 2750 FNEND 2760 ! ********************************** 2770 ! * 2780 ! * Calculate a time string 2790 ! * 2800 DEF FNTime$(Timebuff$) 2810 Month=ASCII(MID$(Timebuff$,2,1)) 2820 Day=ASCII(MID$(Timebuff$,3,1)) 2830 Year=ASCII(MID$(Timebuff$,1,1)) 2840 Hour=ASCII(MID$(Timebuff$,4,1)) 2850 Minute=ASCII(MID$(Timebuff$,5,1)) 2860 IF Month>12 OR Month=0 OR Day>31 OR Day=0 OR Hour>23 OR Minute>59 THEN RETURN '' 2870 Tm$=MID$(Month$,Month*3-2,3)+' '+RIGHT$(NUM$(100+Day),2) 2880 IF Year<80 THEN Year=Year+100 2890 IF MOD(Year,100)<>PEEK(-17) THEN Tm$=Tm$+' '+NUM$(1900+Year) ELSE Tm$=Tm$+' '+RIGHT$(NUM$(100+Hour),2)+':'+RIGHT$(NUM$(100+Minute),2) 2900 RETURN Tm$ 2910 FNEND 2920 ! ************************************** 2930 ! * 2940 ! * Unsign integer 2950 ! * 2960 DEF FNNsgn.(Intgr) 2970 IF Intgr<0 THEN RETURN Intgr+65536. ELSE RETURN Intgr 2980 FNEND 2990 ! * CMDSCAN.BAC 3000 ! '** Command handler **' 3010 ! ' Ver X.00, 1984-08-09' 3020 ! ' Copyright 1984 Dataindustrier AB' 3030 ! 3040 ! * Written by G|ran Nordenborg 3050 ! ** ** ** ** ** ** ** ** ** ** ** 3060 ! * 3070 ! * Ver date / Ver nb / Sign / Note 3080 ! * 84-08-09 / X.00 / GN / Main 3090 ! * 3100 ! ** ** ** ** ** ** ** ** ** ** ** 3110 ! * 3120 ! EJECT 3130 ! ******************************** 3140 ! * 3150 ! * Main routine 3160 ! * 3170 DEF FNCmdscan(Str$) 3180 Selfile$='' 3190 Infile$='CON:' 3200 Outfile$='CON:' 3210 FOR Pnt=1 TO LEN(Str$) 3220 IF MID$(Str$,Pnt,1)>=CHR$(97) THEN MID$(Str$,Pnt,1)=CHR$(ASCII(MID$(Str$,Pnt,1)) AND 223) 3230 NEXT Pnt 3240 FOR Pnt=1 TO LEN(Str$) 3250 ON INSTR(1,' <>-',MID$(Str$,Pnt,1))+1 GOSUB 3290,3340,3390,3520,3650 3260 NEXT Pnt 3270 GOSUB 3340 3280 RETURN Error 3290 ! * 3300 ! * No special but ascii character cound 3310 ! * 3320 File$=File$+MID$(Str$,Pnt,1) 3330 RETURN 3340 ! * 3350 ! * ' ' found 3360 ! * 3370 IF Termcont=0 THEN IF File$='' THEN RETURN ELSE Selfile$=File$ : RETURN 3380 ON Termcont GOSUB 3450,3580,3700 3390 ! * 3400 ! * '<' found. Infile descriptor 3410 ! * 3420 File$='' 3430 Termcont=1 3440 RETURN 3450 ! * 3460 ! * '<' termination 3470 ! * 3480 IF Infile$<>'CON:' THEN Error=3 : RETURN 3490 Infile$=File$ 3500 Termcont=0 3510 RETURN 3520 ! * 3530 ! * '>' found. Out file descriptor 3540 ! * 3550 File$='' 3560 Termcont=2 3570 RETURN 3580 ! * 3590 ! * '>' termination 3600 ! * 3610 IF Outfile$<>'CON:' THEN Error=4 : RETURN 3620 Outfile$=File$ 3630 Termcont=0 3640 RETURN 3650 ! * 3660 ! * '-' found. Option descriptor 3670 ! * 3680 Termcont=3 3690 RETURN 3700 ! * 3710 ! * '-' termination 3720 ! * 3730 Option$=Option$+File$ 3740 Termcont=0 3750 RETURN 3760 FNEND 3770 ! ************************************** 3780 ! * 3790 ! * Make string block letters 3800 ! * 3810 DEF FNCapstr$(Str$) 3820 FOR Strpnt=1 TO LEN(Str$) 3830 IF MID$(Str$,Strpnt,1)>=CHR$(97) THEN MID$(Str$,Strpnt,1)=CHR$(ASCII(MID$(Str$,Strpnt,1)) AND 223) 3840 NEXT Strpnt 3850 RETURN Str$ 3860 FNEND 3870 ! ************************************** 3880 ! * 3890 ! * Help text 3900 ! * 3910 DEF FNHelp 3920 ; #Lud 'LOUSR is a utility to log out other users. It can also stop futher' 3930 ; #Lud 'logins. Command syntax is: ''USER -OPTION''. User can be ither a' 3940 ; #Lud 'user name, user number or ''*''. ''*'' will log out all users exept' 3950 ; #Lud 'own. Options:' 3960 ; #Lud '-N - stop futher logins' 3970 ; #Lud '-L - allow new logins' 3980 RETURN F 3990 FNEND 4000 ! 4010 ! ********************************* 4020 ! * 4030 ! * Check if user entered from DOS or BASIC 4040 ! * 4050 DEF FNChkdos LOCAL I 4060 I=PEEK2(65302)-160 4070 WHILE I<160 : IF PEEK2(I)=-212 RETURN -1 4080 IF PEEK(I)<>13 I=I+1 : WEND 4090 RETURN 0 4100 FNEND 4110 ! 4120 ! ********************************** 4130 ! * 4140 ! * Get start parameter string (if any) 4150 ! * 4160 DEF FNStartpar$ LOCAL Cmdsp,I,Cmd$=160 4170 Cmdsp=PEEK2(65302)-160 4180 WHILE I<160 : I=I+1 : IF PEEK(Cmdsp+I-1)=44 GOTO 4210 4190 IF PEEK(Cmdsp+I-1)=13 RETURN '' ! No startpar string 4200 WEND : RETURN '' ! No startpar string 4210 IF PEEK(Cmdsp+I)=255 I=I+1 ! Skip DOS-entry flag 4220 WHILE I<160 : IF PEEK(Cmdsp+I)=13 GOTO 4250 4230 IF PEEK(Cmdsp+I)<32 OR PEEK(Cmdsp+I)>127 RETURN '' 4240 Cmd$=Cmd$+CHR$(PEEK(Cmdsp+I)) : I=I+1 : WEND 4250 RETURN Cmd$ 4260 FNEND 4270 ! 4280 ! ************************************* 4290 ! * 4300 ! * Exit to DOS or BASIC 4310 ! * 4320 DEF FNExit LOCAL A$=21,A 4330 IF FNChkdos=0 GOTO 4380 ELSE CLOSE ! We MUST close ALL files!!! 4340 A$='CMDINT SYS'+CHR$(14,255,205,27,96,216,195,3,193) 4350 A=VARPTR(A$) 4360 IF CALL(A+11,A) ; "Can't load CMDINT.SYS, press any key for RESET!"; 4370 GET A$ : IF CALL(0) REM Just a miracle would get through here... 4380 END ! End to get out of a function is ugly but... 4390 FNEND