[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