[Coco] I need help with
    Taylor, Phillip L CIV 
    Phillip.L.Taylor at uscg.mil
       
    Wed Jan 24 16:05:37 EST 2018
    
    
  
Hello Coco World
Good afternoon.  It's been a very long time since we had a public bulletin board system that runs under Os9 Level 2.  It's would like to write one that runs under Nitro-os9 that supports message bases, file transfer area that supports both xmodem and ymodem.  What would be the best solution to use inetd or tsmon? I would like for the bbs to be able to handle ansi.
How can I make this code for accepting and handling only telnet request in plain asci please
[httpd.b09]
PROCEDURE httpd
(* HTTPD09 - process one http request, should be spawned by inetd *)
!    This program is free software: you can redistribute it and/or modify
!    it under the terms of the GNU General Public License as published by
!    the Free Software Foundation, either version 3 of the License, or
!    (at your option) any later version.
!    This program is distributed in the hope that it will be useful,
!    but WITHOUT ANY WARRANTY; without even the implied warranty of
!    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
!    GNU General Public License for more details.
ON ERROR GOTO 99
BASE 0
DIM fp:BYTE
DIM errnum:BYTE
DIM req:STRING[255]
DIM target:STRING[255]
DIM lf:BYTE
DIM cr:BYTE
DIM inbyte:BYTE
DIM buffer(256):BYTE
TYPE RREGISTERS=CC,A,B:BYTE; DP:BYTE; X,Y,U:INTEGER DIM rregs:RREGISTERS DIM reqid:BYTE DIM i,p:INTEGER DIM httperr:STRING[40] DIM dent(32):BYTE
lf=10
cr=13
(* turn off echo on the input path *)
(* this will be done by inetd in the future *)
(* get ss.opt *)
rregs.A = 0
rregs.B = 0
rregs.X = ADDR(buffer)
reqid = $8D
RUN SYSCALL(reqid,rregs)
(* set PD.EKO to 0 *)
buffer(4) = 0
(* set ss.opt *)
rregs.A = 0
rregs.B = 0
rregs.X = ADDR(buffer)
reqid = $8E
RUN SYSCALL(reqid,rregs)
(* read headers from client *)
REPEAT
    req = ""
    REPEAT
        GET #0,inbyte
        req = req + chr$(inbyte)
    UNTIL inbyte = 13 or EOF(#0)
    IF LEFT$(req,4) = "GET " THEN
        target = req
    ENDIF
UNTIL PEEK(ADDR(req)) = 13 OR EOF(#0)
(* just die if stdin is gone.. might help with hung runbs? *) IF EOF(#0) THEN 99
(* fixup paths *)
IF left$(target,6) = "GET / " THEN
    req = "/DD/WWWROOT/index.html"
ELSE
    req = mid$(target,5,len(target) - 14) ENDIF
IF right$(req,1) = "/" THEN
    req = left$(req,len(req)-1)
ENDIF
(* "security" checks *)
target = ""
FOR i=1 TO SIZE(req)
 inbyte=ASC(MID$(req,i,1))
 IF $40<inbyte AND inbyte<$60 THEN
     inbyte = inbyte + $20
 ENDIF
 target=target + CHR$(inbyte)
NEXT i
IF (SUBSTR("..",req) > 0) OR (SUBSTR("/sys/",target) > 0) THEN
    httperr = "403 Forbidden"
    GOTO 1000
ENDIF
(* /favicon.ico *)
IF (req = "/favicon.ico") THEN
    req = "/DD/WWWROOT/favicon.ico"
ENDIF
ON ERROR GOTO 100
OPEN #fp,req:READ
ON ERROR GOTO 50
httperr = "200 OK"
GOSUB 2000
IF RIGHT$(req,4) = ".htm" OR RIGHT$(req,5) = ".html" THEN
    PRINT "Content-Type: text/html"
ELSE
    IF RIGHT$(req,4) = ".jpg" THEN
        PRINT "Content-Type: image/jpeg"
    ELSE
        IF RIGHT$(req,4) = ".gif" THEN
            PRINT "Content-Type: image/gif"
        ELSE
            IF RIGHT$(req,4) = ".png" THEN
                PRINT "Content-Type: image/png"
            ELSE
                IF RIGHT$(req,4) = ".ico" THEN
                    PRINT "Content-Type: image/x-icon"
                    PRINT "Cache-Control: public, max-age=31536000"
                ELSE
                    PRINT "Content-Type: text/plain"
                ENDIF
            ENDIF
        ENDIF
    ENDIF
ENDIF
PUT #1,lf
(* send file contents *)
REPEAT
    rregs.A = fp
    rregs.Y = 256
    rregs.X = ADDR(buffer)
    reqid = $89
    RUN SYSCALL(reqid,rregs)
    rregs.A = 1
    rregs.X = ADDR(buffer)
    reqid = $8A
    RUN SYSCALL(reqid,rregs)
UNTIL EOF(#fp)
50 ON ERROR GOTO 99
CLOSE #fp
target = DATE$ + " 200 OK " + req
GOSUB 3000
99 END
100 ON ERROR GOTO 99
errnum := ERR
IF errnum = 214 THEN
    (* directory check *)
    ON ERROR GOTO 200
    OPEN #fp,req:READ+DIR
    ON ERROR GOTO 99
    httperr = "200 OK"
    GOSUB 2000
    PRINT "Content-Type: text/html"
    PUT #1,lf
    PRINT "<HTML><HEAD><TITLE>"
    PRINT "Directory of ";req
    PRINT "</TITLE></HEAD><BODY>"
    PRINT "<H3>Directory of ";req;"</H3>"
    PRINT "<HR>"
    REPEAT
        get #fp,dent
        IF dent(0) > 0 THEN
            target = ""
            inbyte = dent(0)
            i = 0
            WHILE inbyte < 128 AND i<29 DO
                target = target + chr$(inbyte)
                i = i + 1
                inbyte = dent(i)
            ENDWHILE
            target = target + chr$(inbyte - 128)
            IF target <> "." THEN
                PRINT "<A HREF=";req;"/";target;">";target;"</A>"
                PRINT "<br>"
            ENDIF
        ENDIF
    UNTIL EOF(#fp)
    CLOSE #fp
    GOSUB 2100
    PRINT "</BODY></HTML>"
    target = DATE$ + " 200 OK (dir) " + req
    GOSUB 3000
    END
ELSE
    IF errnum = 216 THEN
        httperr = "404 Not Found"
    ELSE
        IF errnum = 215 THEN
            httperr = "400 Bad Request"
        ELSE
            httperr = "500 Internal Server Error"
        ENDIF
    ENDIF
    GOTO 1000
ENDIF
200 ON ERROR GOTO 99
httperr = "403 Forbidden"
(* error result *)
1000 GOSUB 2000
PRINT "Content-Type: text/html"
PUT #1,lf
PRINT "<HTML>"
PRINT "<HEAD><TITLE>";httperr;"</TITLE></HEAD>"
PRINT "<BODY><H2>";httperr;"</H2>"
GOSUB 2100
PRINT "</BODY></HTML>"
target = DATE$ + " " + httperr + " " + req GOSUB 3000 END
(* server headers *)
2000 PRINT "HTTP/1.1 ";httperr
PRINT "Server: CoCoHTTPD"
PRINT "Connection: close"
RETURN
(* footer *)
2100 PRINT "<br><HR><font face=Tahoma;Arial;Sans size=2><i>httpd09 version
1.1 -
 ";DATE$;"</i></font>"
RETURN
(* logging - string to log in target *)
3000 ON ERROR GOTO 3010
CREATE #fp,"/DD/LOG/httpd.log":WRITE
ON ERROR GOTO 3030
GOTO 3020
3010 ON ERROR GOTO 3040
OPEN #fp,"/DD/LOG/httpd.log":WRITE
ON ERROR GOTO 3030
(* getstat ss.siz *)
rregs.A = fp
rregs.B = $02
reqid = $8D
RUN SYSCALL(reqid,rregs)
(* seek to eof *)
rregs.A = fp
reqid = $88
RUN SYSCALL(reqid,rregs)
3020 WRITE #fp,target
3030 ON ERROR GOTO 3040
CLOSE #fp
3040 ON ERROR GOTO 99
RETURN
I hope this helps.
William
On Tue, Jan 10, 2017 at 12:45 PM, Taylor, Phillip L CIV < Phillip.L.Taylor at uscg.mil> wrote:
> Robert
    
    
More information about the Coco
mailing list