#this function is just to test the executable webpage option
webExecDemo:
addiu $sp,-0x20
sw $ra,0x1c($sp)
sw $s0,0x18($sp)
move $s0,$a0
sw $s1,0x14($sp)
move $s1,$a1
sw $s2,0x10($sp)
sw $s3,0x0c($sp)
sw $s4,0x08($sp)
move $s4,$a2
jal taskIdSelf
nop
move $s2,$v0
move $a0,$v0
jal ioTaskStdGet
li $a1,1 #get current task so we can reset output
move $s3,$v0
move $a0,$s2
li $a1,1
jal ioTaskStdSet
move $a2,$s0 #redirect console output to www
la $a0,aWebExecDemoTxt
move $a1,$s1
jal printf
move $a2,$s0
jal webInfo
move $a0,$s4
jal envShow
move $a0,$0
la $a0,webExecDemo
jal l
li $a1,29
move $a0,$s2
li $a1,1
jal ioTaskStdSet
move $a2,$s3 #redirect console output back to whatever
lw $s4,0x8($sp)
lw $s3,0xc($sp)
lw $s2,0x10($sp)
lw $s1,0x14($sp)
lw $s0,0x18($sp)
lw $ra,0x1c($sp)
jr $ra
addiu $sp,0x20
#webShowEnSyms(webhandle) lists all symbols allowed to be NV pairs
webShowEnSyms:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
move $s0,$a0
la $a0,awebShowNvsHdr
jal printf
lw $a1,0x20($s0)
lw $s0,0x4($s0)
showwnvp:
la $a0,aslfcr
jal printf #show us what u got line by line
lw $a1,0x0($s0)
lw $v0,0x4($s0) #check the next one for a blank
bnez $v0,showwnvp #should work since there is allways 1 at least!!
addiu $s0,0x4
lw $ra,0x2c($sp)
lw $s0,0x28($sp)
jr $ra
addiu $sp,0x30
#webShowPages(handle) lists all web pages in current table
webShowPages:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
move $s0,$a0
la $a0,ashowWebHeader
jal printf
lw $a1,0x20($s0)
lw $s0,0($s0)
showwpfb:
la $a0,a02x06x0x08xs
lw $a1,0x8($s0)
lw $a2,0xc($s0)
lw $a3,0x0($s0)
sw $a3,0x10($sp)
jal printf #show us what u got line by line
lw $a3,0x4($s0)
lw $v0,0x10($s0) #check the next one for a blank
bnez $v0,showwpfb #should work since there is allways 1 at least!!
addiu $s0,0x10
lw $ra,0x2c($sp)
lw $s0,0x28($sp)
jr $ra
addiu $sp,0x30
#webShowTypes(handle) will show known file extention types and their content-type
webShowTypes:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
nop
move $s0,$a0
la $a0,awebShowTypesHdr
jal printf
lw $a1,0x20($s0)
lw $s0,0x8($s0)
showtyp:
la $a0,a10ss
lw $a1,0x0($s0)
jal printf #show us what u got line by line
lw $a2,0x4($s0)
lw $v0,0x8($s0) #check the next one for a blank
bnez $v0,showtyp #should work since there is allways 1 at least!!
addiu $s0,0x8
lw $ra,0x2c($sp)
lw $s0,0x28($sp)
jr $ra
addiu $sp,0x30
#webFindType(handle, int Fd, str * filename) Searchs for file known file extentions, if found it sends out a header
webFindType:
addiu $sp,-0x230
sw $ra,0x22c($sp)
sw $s0,0x228($sp)
sw $s1,0x224($sp)
sw $s2,0x220($sp)
move $s2,$a0 #handle
move $s0,$a1
move $s1,$a2
move $a0,$s1 #extract extention
jal strchr
li $a1,0x2e #look for "."
beqz $v0,wFTexit #cant find it then leave!
addiu $s1,$v0,1 #move one step beyond it and we have the extention
lw $s2,0x8($s2)
addwct:
jal strlen
lw $a0,0($s2) #Check if extentions match
move $a2,$v0 #only match so many bits
move $a0,$s1
jal memcmp
lw $a1,0($s2) #Check if extentions match
beqz $v0,wFTFound #found it then break loop
lw $v0,0x8($s2) #check the next one for a blank
bnez $v0,addwct #should work since there is allways 1 at least!!
addiu $s2,0x8
j wFTexit #guess its not in the table
nop
wFTFound:
addiu $a0,$sp,0x20 #Use the stack to store the sprintf result of the header
la $a1,ahttphdr #Get Generic http header
jal sprintf #for now print it
lw $a2,4($s2) #get content type
addiu $a1,$sp,0x20
jal WriteSock
move $a0,$s0 #write it out now
wFTexit:
lw $s2,0x220($sp)
lw $s1,0x224($sp)
lw $s0,0x228($sp)
lw $ra,0x22c($sp) #ok, have added whatever u told u to add
jr $ra
addiu $sp,0x230
#webCopy(uint srcwebHandle,uint destwebHandle)
webCopy:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
sw $s2,0x20($sp)
move $s0,$a0
move $s1,$a1
#copy web pages
lw $s2,0($s0)
webcpyloop1:
move $a0,$s1
lw $a1,0($s2)
beqz $a1,weblp1done
lw $a2,0x8($s2)
lw $a3,0xc($s2)
lw $v0,0x4($s2)
jal webAddPage
sw $v0,0x10($sp)
lw $v0,0x10($s2)
bnez $v0,webcpyloop1
addiu $s2,0x10
#copy web enSyms
weblp1done:
lw $s2,0x4($s0)
webcpyloop2:
move $a0,$s1
lw $a1,0($s2)
beqz $a1,weblp2done
nop
jal webEnableSym
move $a0,$s1
lw $v0,0x4($s2)
bnez $v0,webcpyloop2
addiu $s2,0x4
#copy web types
weblp2done:
lw $s2,0x8($s0)
webcpyloop3:
lw $a1,0($s2)
beqz $a1,weblp3done
lw $a2,0x4($s2)
jal webAddType
move $a0,$s1
lw $v0,0x8($s2)
bnez $v0,webcpyloop3
addiu $s2,0x8
weblp3done:
lw $s2,0x20($sp)
lw $s0,0x28($sp)
lw $s1,0x24($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webAddPage(uint handle, str * name, char type, integer length, char * content)
webAddPage:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
sw $s2,0x20($sp)
sw $s3,0x1c($sp)
sw $s4,0x18($sp)
lw $s4,0x40($sp) #pop this off the stack we hope
move $s1,$a1
move $s2,$a2
move $s3,$a3
jal webDeletePage #first delete old page with same name if it exists
lw $s0,0($a0)
addwpfb:
lw $v0,0x0($s0) #check the next one for a blank
bnez $v0,addwpfb #should work since there is allways 1 at least!!
addiu $s0,0x10
sw $s1,-0x10($s0)
sw $s2,0xfff8($s0)
sw $s3,0xfffc($s0)
sw $s4,0xfff4($s0) #ok, have added whatever u told u to add
lw $s4,0x18($sp)
lw $s3,0x1c($sp)
lw $s2,0x20($sp)
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webDeleteSym(handle, str* sym)
webDeleteSym:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
move $s1,$a1
lw $s0,0x4($a0)
webDSL1:
lw $a0,0($s0)
beqz $a0,webDSNF
addiu $s0,4
jal strcmp
move $a1,$s1
bnez $v0,webDSL1
webDSL2:
lw $a0,0x0($s0)
sw $a0,0xfffc($s0)
bnez $a0,webDSL2
addiu $s0,4
webDSNF:
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webDeleteType(handle, str* extention)
webDeleteType:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
move $s1,$a1
lw $s0,0x8($a0)
webDTL1:
lw $a0,0($s0)
beqz $a0,webDTNF
addiu $s0,0x8
jal strcmp
move $a1,$s1
bnez $v0,webDTL1
webDTL2:
lw $a0,0x4($s0)
sw $a0,0xfffc($s0)
lw $a0,0x0($s0)
sw $a0,0xfff8($s0)
bnez $a0,webDTL2
addiu $s0,8
webDTNF:
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webDeletePage(handle, str* name)
webDeletePage:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
move $s1,$a1
lw $s0,0($a0)
webDPL:
lw $a0,0($s0)
beqz $a0,webDPNF
addiu $s0,0x10
jal strcmp
move $a1,$s1
bnez $v0,webDPL
webDPL2:
lw $a0,0x4($s0)
sw $a0,0xfff4($s0)
lw $a0,0x8($s0)
sw $a0,0xfff8($s0)
lw $a0,0xc($s0)
sw $a0,0xfffc($s0)
lw $a0,0x0($s0)
sw $a0,0xfff0($s0)
bnez $a0,webDPL2
addiu $s0,0x10
webDPNF:
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webAddType(handle, str * fileextention, str * ctype) Assume fileextention="txt"
#and ctype="text/plain" then all files with ".txt" will use "text/Plain" in the header
webAddType:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
sw $s2,0x20($sp)
lw $s0,0x8($a0)
move $s1,$a1
jal webDeleteType #first delete type of same name if it exists
move $s2,$a2
addwnvpz:
lw $v0,0x0($s0) #check the next one for a blank
bnez $v0,addwnvpz #should work since there is allways 1 at least!!
addiu $s0,0x8
sw $s1,-0x8($s0)
sw $s2,-0x4($s0)
lw $s2,0x20($sp)
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp) #ok, have added whatever u told u to add
jr $ra
addiu $sp,0x30
#webEnableSym(handle, str * symname) enables name to be used as a name=value pair in present in the URL
#Note the above webAddType uses the function so dont mod without considering
webEnableSym:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
lw $s0,0x4($a0)
jal webDeleteSym #first delete symbol of same name
move $s1,$a1
addwnvp:
lw $v0,0x0($s0) #check the next one for a blank
bnez $v0,addwnvp #should work since there is allways 1 at least!!
addiu $s0,0x4
sw $s1,-0x4($s0) #store it at -4 of it
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp) #ok, have added whatever u told u to add
jr $ra
addiu $sp,0x30
#webInfo(uint webhandle) Prints verbose version of header info
webInfo:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
move $s0,$a0
la $a0,awebinfodata1
lw $a1,0x20($s0)
lw $a2,0x0($s0)
jal printf
lw $a3,0x4($s0)
la $a0,awebinfodata2
lw $a1,0x8($s0)
lw $a2,0xc($s0)
jal printf
lw $a3,0x1c($s0)
la $a0,awebinfodata3
lw $a1,0x10($s0)
lw $a2,0x14($s0)
jal printf
lw $a3,0x18($s0)
jal inet_ntoa
lw $a0,0x28($s0)
move $a1,$v0
move $s1,$v0
la $a0,awebinfodata4
lw $a3,0x2c($s0)
jal printf
lw $a2,0x24($s0)
jal free
move $a0,$s1
lw $s1,0x24($sp)
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webDestroy(uint webhandle) closes listening socket, kills webTask, frees used memory, etc.
#Note all requests in progress will continue, we just hope the free'd memory isnt instantly reused hehe
webDestroy:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
move $s0,$a0
jal close #close listening socket
lw $a0,0x18($s0)
jal td #kill task
lw $a0,0x1c($s0)
jal free #free used mem
lw $a0,0x0($s0) #for now assume webpage table will be start of our malloc'd mem
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
#webflagflip(str *) converts str to a value and does a FlagFlip on it
webflagflip:
addiu $sp,-0x20
sw $ra,0x1c($sp)
la $a1,a2x
jal sscanf
addiu $a2,$sp,0x18 #convert arg to
jal FlagFlip
lw $a0,0x18($sp) #there flipped !!
lw $ra,0x1c($sp)
jr $ra
addiu $sp,0x20
#uint webHandle=webInit(char * bindaddress, uint bindport)
webInit:
addiu $sp,-0x100
sw $ra,0x9c($sp)
sw $s0,0x98($sp)
sw $s1,0x94($sp)
sw $s2,0x90($sp)
sw $s3,0x8c($sp)
sw $s4,0x88($sp)
sw $s5,0x84($sp)
jal inet_addr #convert address
move $s3,$a1
move $s4,$v0 #store needed values before initalizing tables
jal malloc #allocate enuff mem for everything including
li $a0,0x840 #webpagestable+webensyms+pagestypes+webhandle
move $s0,$v0
move $a0,$v0
jal bzero
li $a1,0x840 #zero it
addiu $s5,$s0,0x800 #store handle table pointer
sw $s0,0x00($s5) #store webpagestableptr
addiu $a0,$s0,0x400
sw $a0,0x04($s5) #store webensymstableptr
addiu $a0,$s0,0x600
sw $a0,0x08($s5) #store webpagetypesptr
la $a0,webSocketTask
sw $a0,0x0c($s5) #store webSockTask for hook
li $a0,0x8 #max of 8 tasks
sw $a0,0x10($s5) #store webMaxbabies
sw $0,0x14($s5) #zero count (should allready be zero, but just in case)
sw $s3,0x24($s5) #store bind Port
sw $s4,0x28($s5) #store bind Address
la $a0,aNotfound #"pagenotfound.html"
sw $a0,0x2c($s5) #string to use if page not found
# word 0 = port?
jal malloc
li $a0,0x10 #create sockaddr struct
move $s1,$v0
move $a0,$s1
jal bzero
li $a1,0x10 #init struct
#no sh instruction either!
# sh $s3,0x2($s1) #store listen port
# li $s3,2
# sh $s3,0x0($s1)
sw $s3,0x0($s1)
li $s3,2
sb $s3,0x1($s1)
sw $s4,0x4($s1) #store listen addr
#init values now plz
li $a0,2 #IPv4 protocol
li $a1,1 #????0 = stream, 1=dgram, 2=raw
jal socket
move $a2,$0 #0=ip 1=icmp
move $s0,$v0 #store listening socket handle
sw $s0,0x18($s5) #store listening socket handle into webHandleStruct
li $v0,1
sw $v0,0x80($sp) #store for later
move $a0,$s0
li $a1,0xffff
li $t0,0x4
sw $t0,0x10($sp)
li $a2,4
jal setsockopt
addiu $a3,$sp,0x80
move $a0,$s0 #sock handle
move $a1,$s1 #sockaddr struct
jal bind
li $a2,0x10 #length of sockaddr struct
move $a0,$s0
jal listen
li $a1,0x5 #max num of backlog'd connections
la $a2,webTaskCount
lw $a3,0($a2)
addiu $a3,1
sw $a3,0($a2)
sw $a3,0x20($s5) #store this server's count to webhandle
la $a1,asd #"%s%d"
la $a2,aHTTPD
jal sprintf
addiu $a0,$sp,0x60
jal WebDefault
move $a0,$s5 #pass handle Pointer
sw $s5,0x14($sp) #task arg0
sw $s0,0x18($sp) #task arg1
sw $s1,0x1c($sp) #task arg2
la $a0,webTask
sw $a0,0x10($sp) #
li $v0,0x10
sw $v0,0x20($sp) #task arg3
addiu $a0,$sp,0x24
jal bzero
li $a1,0x34 #zero out all stack values for safty
addiu $a0,$sp,0x60
li $a1,0xc8
move $a2,$0
jal taskSpawn
ori $a3,$0,0xf00 #this is prolly way too big!!
sw $v0,0x1c($s5) #store task ID of httpd to webhandle
la $a0,awebstarted
jal printf
nop
la $a0,awebstarted
jal mylog
nop
move $v0,$s5 #return handle
lw $s0,0x98($sp)
lw $s1,0x94($sp)
lw $s2,0x90($sp)
lw $s3,0x8c($sp)
lw $s4,0x88($sp)
lw $s5,0x84($sp)
lw $ra,0x9c($sp)
jr $ra
addiu $sp,0x100
#Opens a socket and waits for web requests in a loop over and over and over and over
#webTask(int handle, int s, struct sockaddr *addr, int addrlen)
webTask:
addiu $sp,-0x160
sw $ra,0x15c($sp)
sw $s0,0x158($sp)
sw $s1,0x154($sp)
sw $s2,0x150($sp)
sw $s3,0x14c($sp)
sw $s4,0x148($sp)
sw $s5,0x144($sp)
move $s5,$a0
move $s0,$a1 #
move $s1,$a2
sw $a3,0x140($sp)
.if webdbg=true
la $a0,awebtaskspawned
jal printf
move $a1,$s0
la $a0,awebtaskdbg3
move $a1,$s0 #sockhandle
jal printf
move $a2,$s5 #sockaddrstruct
.endif
waitfornextreq:
move $a0,$s0 #sockhandle MABY U SHOULD USE A COPY OF THE SOCKADDR
move $a1,$s1 #sockaddrstruct
jal accept
addiu $a2,$sp,0x140 #get ptr to file sockaddr length
move $s4,$v0 #FileDesc
addiu $a0,$0,-1
beq $v0,$a0,wlgcnerr
nop
#Here is where u need to thread
sw $s5,0x14($sp) #task arg0
sw $s4,0x18($sp) #task arg1
sw $s1,0x1c($sp) #task arg2
lw $a0,0x140($sp) #load sockaddrlength
sw $a0,0x20($sp) #task arg3
GiveBirth:
lw $a0,0x10($s5) #get max child count
lw $a3,0x14($s5) #get curr child cnt
beq $a0,$a3,AbortFetus
addiu $a3,1 #increment cnt
j MammaNeedsMoreWelfare
sw $a3,0x14($s5) #store cnt
AbortFetus:
j GiveBirth
MammaNeedsMoreWelfare:
lw $a2,0x20($s5)
la $a1,atSHttpd #tH%dSock%d
jal sprintf
addiu $a0,$sp,0x60
la $a0,webSocketHook
sw $a0,0x10($sp) #store task address
addiu $a0,$sp,0x60
lw $a1,0x14($s5)
addiu $a1,0xc9 #priority 1 more than webTask (so its less priority)
li $a2,0x0080 #Give Us a Private Enviroment
jal taskSpawn
li $a3,0x6ff0 #this is prolly way too big!!
j waitfornextreq #this dont look right, i feel i should leave open the accept or something i dunno
nop
wlgcnerr:
lw $ra,0x15c($sp)
lw $s0,0x158($sp)
lw $s1,0x154($sp)
lw $s2,0x150($sp)
lw $s3,0x14c($sp)
lw $s4,0x148($sp)
lw $s5,0x144($sp)
jr $ra
addiu $sp,0x160
#webSocketHook(int handle, int socket, struct sockaddr *addr, int addrlen) Calls the specified webSoket task and does cleanup)
webSocketHook:
addiu $sp,-0x20
sw $ra,0x1c($sp)
sw $s0,0x18($sp)
sw $s1,0x14($sp)
move $s0,$a0
move $s1,$a1
lw $v0,0xc($a0)
jalr $v0 #call the specified websockettask
nop
jal close
move $a0,$s1 #close the socket just in case
.if webdbg=true
jal errnoget
move $a0,$0
la $a0,awebSockHkDbg
lw $a1,0x20($s0)
move $a3,$v0
jal printf
move $a2,$s1
.endif
lw $a0,0x14($s0) #get count
addiu $a0,-1
sw $a0,0x14($s0) #store task count
lw $s1,0x14($sp)
lw $s0,0x18($sp)
lw $ra,0x1c($sp)
jr $ra
addiu $sp,0x20
#webSocketTask(int handle, int socket, struct sockaddr *addr, int addrlen)
webSocketTask:
addiu $sp,-0x2030
sw $ra,0x202c($sp)
sw $s0,0x2028($sp)
sw $s1,0x2024($sp)
sw $s2,0x2020($sp)
sw $s3,0x201c($sp)
sw $s4,0x2018($sp)
sw $s5,0x2014($sp)
move $s0,$a0
move $s1,$a1
move $s2,$a2
move $s3,$a3
.if webdbg=true
la $a0,awebTaskDbg
lw $a1,0x14($s0) #Get web task count
move $a3,$s0
jal printf
move $a2,$s1
.endif
move $a0,$s1 #rememer to use fd for accecpted port
addiu $a1,$sp,0x20
jal webLineGet
li $a2,0x0fc0
addiu $a0,$0,-1
beq $v0,$a0,wlgdone
addiu $a0,$sp,0x20
jal strchr
li $a1,0x2f
beqz $v0,wlgdone #not a / on the first line then ur phucked
li $t0,0x3d #replace / with = for env trick
sb $t0,0($v0)
addiu $a0,$sp,0x1000
jal strcpy
addiu $a1,$v0,1 #store URL untill later
addiu $a0,$sp,0x1000
jal strchr
li $a1,0x20
beqz $v0,wlgdone #not a " " on the first line after the "/" then forget it too
nop
sb $0,0($v0) #Remove " HTTP" whatever
#store POST or GET line as envvar
jal putenv #store url as post= or get= whatever
addiu $a0,$sp,0x20 #see if its post
sw $v0,0x2000($sp) #store here for l8tr
wlgnxtline:
move $a0,$s1 #rememer to use fd for accecpted port
addiu $a1,$sp,0x20
jal webLineGet
li $a2,0x0fc0
lb $a0,0x20($sp)
beqz $a0,wlgnxtlinedone #check for a blank line
#Parse out crap to taskenviroment
addiu $a0,$sp,0x20
jal strchr
li $a1,0x3a #search for : to indicate a name/value pair here
beqz $v0,wlgnxtline #if not found then get the next line
li $t0,0x3d
sb $t0,0($v0) #store '=' in place of :
jal putenv
addiu $a0,$sp,0x20
nop
j wlgnxtline
wlgnxtlinedone:
.if webdbg=true
la $a0,awebTaskDb2
lw $a1,0x14($s0) #Get web task count
jal printf
addiu $a2,$sp,0x1000
.endif
#If its post get the post line here... Considering using filesystem for this.... maby... possibly have webpath variable?
#nah, just handle post with type of application/x-www-form-urlencoded, in such cases the next line should be the POST data, which we
#handle like a url, multipart/form-data will be handled by whatever webpage specified..
la $a0,aPOST
jal getenv
nop
beqz $v0,itsnotpost #see if it was post
la $a0, aContentType
jal getenv
nop
beqz $v0,itsnotpost
la $a1,axwwwformurlencoded
jal strstr
move $a0,$v0 #see if this is out content type...
beqz $v0,itsnotpost #if its not www-form-urlencoded then forget getting post data
move $a0,$s1 #Get one more line should contain post data if www-form-urlencoded
addiu $a1,$sp,0x20
jal read
li $a2,0x0fc0
addu $t0,$v0,$sp
sb $0,0x20($t0) #store 0 at last byte location
addiu $a1,$sp,0x20 #process name=value pairs now
move $a0,$s0 #handle
jal urlparse
move $a2,$s1 #send sock
itsnotpost:
move $a0,$s0
move $a1,$s1
jal webHandleUrl
addiu $a2,$sp,0x1000
wlgdone:
#DONT YET CLOSE ME!
# jal close
# move $a0,$s1
#endwebsocktask
lw $ra,0x202c($sp)
lw $s0,0x2028($sp)
lw $s1,0x2024($sp)
lw $s2,0x2020($sp)
lw $s3,0x201c($sp)
lw $s4,0x2018($sp)
lw $s5,0x2014($sp)
jr $ra
addiu $sp,0x2030
#webLineGet(int Fd, char * buffer, int length) #aug 17 2005 changed to 0xd 0xa termination?!
webLineGet:
addiu $sp,-0x30
sw $ra,0x2c($sp)
sw $s0,0x28($sp)
sw $s1,0x24($sp)
sw $s2,0x20($sp)
sw $s3,0x1c($sp)
move $s0,$a0
move $s1,$a1
move $s2,$a2
move $s3,$s1
linegetloop:
move $a0,$s0
addiu $a1,$sp,0x14
jal read
li $a2,1 #read one byte at a time plz
addiu $t0,$0,-1
beq $t0,$v0,wlgerr
lbu $a1,0x14($sp) #get me outta here if its blank please
li $a2,0xd
beq $a1,$a2,linegetloop
li $a2,0xa
beq $a1,$a2,wlgcr
sb $a1,0($s1)
addiu $s2,-1
bnez $s2,linegetloop
addiu $s1,1
wlgcr:
sb $0,0($s1) #zero last byte
subu $v0,$s1,$s3 #should be length
wlgerr:
lw $ra,0x2c($sp)
lw $s0,0x28($sp)
lw $s1,0x24($sp)
lw $s2,0x20($sp)
lw $s3,0x1c($sp)
jr $ra
addiu $sp,0x30
#webSetSocketHook(handle, newhookaddress)
webSetSocketHook:
jr $ra
sw $a1,0xc($a0)
#webSetMaxThreads(handle, int maxthreads)
webSetMaxThreads:
jr $ra
sw $a1,0x10($a0)
#webDefault(handle) will add defaults pages, types, and enabled syms to table
webDefault:
addiu $sp,0x20
sw $ra,0x1c($sp)
sw $s0,0x18($sp)
sw $s1,0x14($sp)
move $s0,$a0
la $a0,webDefSigmaPageTable
li $a2,0x4 #only copy the first few
jal wcopy
lw $a1,0x0($s0) #webpagestablestart
la $a0,wDefTypes
li $a2,0x10 #only copy the first few
jal wcopy
lw $a1,0x8($s0) #webpagestypeptr
#THIS HAS OR HAD SOME BIZZARE ERROR!!!!!
.if webdbg=true
jal webShowPages
move $a0,$s0
jal webShowEnSyms
move $a0,$s0
# jal webShowTypes
# move $a0,$s0
.endif
lw $ra,0x1c($sp)
lw $s0,0x18($sp)
lw $s1,0x14($sp)
jr $ra
addiu $sp,-0x20
#webHandleUrl(handle, int fd, char * URL)
webHandleUrl:
addiu $sp,-0x50
sw $ra, 0x4c($sp)
sw $a0, 0x48($sp)
sw $a1, 0x44($sp)
sw $a2, 0x40($sp)
sw $s5, 0x3c($sp)
sw $s0, 0x38($sp)
sw $s1, 0x34($sp)
sw $s2, 0x30($sp)
sw $s3, 0x2c($sp)
sw $s4, 0x28($sp)
move $s4,$a0 #s4=handle
move $s0,$a1 #s0=sock
move $s1,$a2 #s1=url
jal strlen
move $a0,$s1
jal malloc
addiu $a0,$v0,0x10 #Reserve some space to save the decoded url
move $s2,$v0 #s2=temp url
move $s5,$v0 #this is just here to keep it from loosing the stupid malloc, this needs to be reworked and rethought and stuff because its lame, yes lame
move $a0,$v0
jal strcpy
move $a1,$s1 #copy the decoded url for possible use by exec pages
ForceDefaultPage0:
move $a0,$s2
jal strchr
li $a1,0x3f #find the ?
beqz $v0,TryNextWebPage
lw $s3,0($s4) #Find Address of Webpage Table
sb $0,0($v0) #erase the ?
move $a0,$s4 #handle
move $a2,$s0 #send sock
jal urlparse
addiu $a1,$v0,1 #move past the ? and process the name=value pairs
TryNextWebPage:
lw $a1,0($s3) #get next page name from table
beqz $a1,webPageNotInTable
nop
jal strcmp #Check the url
move $a0,$s2
bnez $v0,TryNextWebPage
addiu $s3,0x10
addiu $s3,-0x10
move $a0,$s4
move $a2,$s2 #send decoded url?
jal webFindType #try sending a header for every known extention??
move $a1,$s0 #send fd
lw $a1,0x8($s3) #get type
bnez $a1,wwwtypenot0
li $v0,1 #must be type 0 server parsed html text
lw $a1, 0x4($s3) #show MYYYYYY webpage, its not urs its mine!
jal webSendHtml
move $a0,$s0
j wwwdoneclose
nop
webPageNotInTable:
j ForceDefaultPage0
lw $s2,0x2c($s4) #retrieve default page to use's string
wwwtypenot0:
bne $a1,$v0,wwwtypenot1
li $v0,2
move $a0,$s0
lw $a1, 0x4($s3) #show MYYYYYY webcontent, its not urs its mine!
jal write #write raw data to socket
lw $a2, 0xc($s3) #size of gif
j wwwdoneclose
nop
wwwtypenot1:
bne $a1,$v0,webtypenotfound
li $v0,3
move $a0,$s0
move $a2,$s4 #for gawds sake pass the web handle
lw $v0,0x4($s3) #get address of what to execute
move $a3,$s1 #arg3 = original URL untouched!! i think
jalr $v0
move $a1,$s2
wwwdoneclose:
# jal taskDelay
# li $a0,0x20
#Dont Close This YET! One Place ONLY
# jal close
move $a0,$s0
sb $0,0($s1) #erase page name
webtypenotfound:
jal free
move $a0,$s5
lw $a0, 0x48($sp)
lw $a1, 0x44($sp)
lw $a2, 0x40($sp)
lw $s5, 0x3c($sp)
lw $s0, 0x38($sp)
lw $s1, 0x34($sp)
lw $s2, 0x30($sp)
lw $s3, 0x2c($sp)
lw $ra, 0x4c($sp)
lw $s4, 0x28($sp)
jr $ra
addiu $sp,0x50
#This deals with everything past the ? in the url
#urlparse(handle, urlpast?, sock)
urlparse:
addiu $sp,-0x30
sw $ra,0x2c($sp) #
sw $s0,0x28($sp)
move $s0,$a0
sw $a2,0x18($sp) #i know will need sock handle later
sw $a1,8($sp) #store where we start
urlplp1:
lw $a0,8($sp)
jal strchr
li $a1,0x26 #look for &
bnez $v0,urltoend
nop
jal strlen
lw $a0,8($sp)
lw $a0,8($sp)
addu $v0,$v0,$a0
urltoend:
lb $a0,0($v0)
sb $a0,0xc($sp) #remember what char was originally at the end of this piece
sb $0,0($v0) #set the & to 0 (or the end to 0)
move $a0,$s0
lw $a1,8($sp) #get start of string
sw $v0,8($sp) #Set new start of string since we are about to process this piece
jal webHandleNv #Process the nv pair
lw $a2,0x18($sp) #pass sockhandle just incase!
lw $a0,8($sp) #get start of string
lb $v0,0xc($sp) #get old char
sb $v0,0($a0) #put old char back
addiu $a0,1
bnez $v0,urlplp1 #if it is not zero then get the next piece
sw $a0,8($sp)
urlparsedone:
lw $s0,0x28($sp)
lw $ra,0x2c($sp)
jr $ra
addiu $sp,0x30
aHTTPD:
.asciiz "tHttpd"
atSHTTPD:
.asciiz "tH%dSock%d"
awebstarted:
.asciiz "Sigma webserver started!\l\n"
awebflashshowcol:
.includehtml webflashrow.txt
nop
.if webdbg=true
awebSockHkDbg:
.asciiz "webSocketTask%d: Closed WebSocket FD-%d errno-%d\l\n"
awebtaskspawned:
.asciiz "Spawned new Web Task! Listening Socket - %d\n\l"
awebTaskDbg:
.asciiz "webSocketTask%d: Accepted connection! Fd-%d hWeb-0x%08x\n\l"
awebTaskDb2:
.asciiz "webSocketTask%d: Requested URL - %s\n\l"
awebtaskdbg3:
.asciiz "webTask: Listening socket FD-%d hWeb-0x%08x\n\l"
awebinfodata1:
.asciiz "tHttpd%d: SigmaHTTPD v1.20 Beta\n\l0x%08x webPagesTable\n\l0x%08x webEnabledSymbolsTable\n\l"
awebinfodata2:
.asciiz "0x%08x webPageTypesTable\n\l0x%08x webSockTask\n\l0x%08x webTaskID\n\l"
awebinfodata3:
.asciiz "webMaxThreads - %04d \n\lwebThreadCount - %04d\n\lwebSocketFD - %04d\n\l"
awebinfodata4:
.asciiz "Bind Address - %s\n\lBind Port - %d\n\lNot Found Page - %s\n\"
ashowWebHeader:
.asciiz "tHttpd%d: Installed WebPages\n\lType Length Location Name\n\l"
awebShowNvsHdr:
.asciiz "tHttpd%d: Symbols allowed as name=value pairs in URL\n\l"
speplwww:
nop
webTaskCount:
nop #Web Task Count
hWebDef:
nop
SigmaVer:
nop
awebGif0:
.asciiz "
"
awebGif1:
.asciiz "
"
webmintable:
.word webMinPageTable
.word defminNVTable
.word wDefTypes
webDefTable:
.word webSigmaPageTable
.word defwebNVTable
.word wDefTypes
#Table of filename extentions vs content type
wDefTypes:
.word ahtml
.word atexthtml
.word ahtm
.word atexthtml
.word atxt
.word atextplain
.word agif
.word aimagegif
.word ajpg
.word aimagejpeg
.word ajpeg
.word aimagejpeg
.word apng
.word aimagepng
.word abin
.word aappoct
nop
nop
agif:
.asciiz "gif"
chksumvalue:
.if tools.left(sigmakey,4)=705f #If Flash is Toshiba
.word ToshiChksm
.else
.word IntelChksm
.endif
aimagegif:
.asciiz "image/gif"
ajpg:
.asciiz "jpg"
ajpeg:
.asciiz "jpeg"
aimagejpeg:
.asciiz "image/jpeg"
atxt:
.asciiz "txt"
atextplain:
.asciiz "text/plain"
ahtm:
.asciiz "htm"
ahtml:
.asciiz "html"
atexthtml:
.asciiz "text/html"
apng:
.asciiz "png"
aimagepng:
.asciiz "image/png"
abin:
.asciiz "bin"
aappoct:
.asciiz "application/octet-stream" #use .bin for raw data
adothtml:
.asciiz ".html"
adotbin:
.asciiz ".bin"
areboot:
.asciiz "buttonCMCIUp"
#Sigma Defualt accptable name value pairs
#Two words, first is str * to name
defwebNVTable:
.word aexec
.word areboot
.word 0 #LAST 2 WILL ALLWAYS BE 00
.word 0
defminNvTable:
.word aDLImageName
.word aDLImageIp
.word agetimg
.word 0
.word 0
asetdeflog__Fv:
.asciiz "setdeflog__Fv"