1
0
mirror of https://github.com/GeorgeMcMullen/rxIRC.git synced 2026-01-14 15:46:54 +00:00

Compare commits

...

4 Commits
2.0 ... master

Author SHA1 Message Date
George McMullen
c7934f2457 A couple of VM/CMS modules that are required by rxIRC. 2013-06-08 16:34:24 -07:00
George McMullen
916e4338f1 Version 2.0 of rxIRC (By Lynx (244661 at DOLUNI1) 1993) 2013-06-08 16:31:39 -07:00
George McMullen
8801ea2c49 Version 2.1 of rxIRC (By Lynx (244661 at DOLUNI1) 1994) 2013-06-08 14:50:10 -07:00
George McMullen
62aca2100b Version 2.0.1 of rxIRC (By Lynx (244661 at DOLUNI1) 1993) 2013-06-08 14:43:28 -07:00
16 changed files with 1482 additions and 599 deletions

View File

@ -1,7 +0,0 @@
From: Carl von Loesch <Carl.von.Loesch@arbi.informatik.uni-oldenburg.de>
To: rxirc-l@vmtecqro.qro.itesm.mx (The rxIRC List),
operlist@eff.org (IRC Operchaos List)
Subject: rxIRC 2.0 ready to go - FTP admins invited to copy/mirror!
Date: Mon, 14 Jun 93 15:57:16 CES
I am hereby releasing rxIRC 2.0. rxIRC is the IRC client for IBM VM systems.

View File

@ -25,10 +25,5 @@ ACTION commands:
with the /ME or /Emote commands, like this:
/me feels a little hungry now.
You can also try to add your own commands into the program. With the way
it is done, it should be easy to understand also for someone who doesn't
really know REXX. Just edit the RXIRC EXEC, move to the bottom of the file,
and turn a page back. You'll see where you can add your lines.
Good suggestions for action commands are always welcome, send them to me
by NoteServ or mail. :)
And finally create your own commands with help of the /ALIAS command.
See the "SPECIAL" help page.

View File

@ -1,4 +1,4 @@
.cm last change by lynx -- april 25, 1991
.cm last change by lynx -- nov 94
_______
*|^^^^^^^|* The Internet Relay Chat program
@ -11,19 +11,26 @@
The PROFILE RXIRC startup file:
| This file should contain a series of lines that are /source'd by
| rxIRC as soon as you get connected to the first server. You could
| for instance do "join #fun" or "who bunny", probably you will
| want to set up some aliases. See /source for more.
| The file IRC PROFILE is obsolete. For a conversion you have
| to rename it and remove all the command characters (the slashes).
This file should contain a series of lines that are /source'd by
rxIRC as soon as you get connected to the first server. You could
for instance do "join #fun" or "who bunny", probably you will
want to set up some aliases. See /source for more.
The file IRC PROFILE is obsolete. For a conversion you have
to rename it and remove all the command characters (the slashes).
Namesfile settings:
rxIRC gets your default nickname and full name from your namesfile
unless otherwise specified in the command line. You can also set
a 'motto' line by adding a :motto tag to your self-entry in your
namesfile which will be displayed when USERINFO requests are sent
to you while you are ircing with rxIRC.
unless otherwise specified in the command line. First it looks for
:ircnick and :ircname tags in your 'self-entry' in your namesfile,
if not present it will take the normal :nick and :name entries.
Environment settings supercede these entries. You may also set a
'motto' line by adding a :motto tag, which will be displayed when
USERINFO requests are sent to you while you are on IRC. Particularely
| interesting is how you can specify a :wwwport entry, which will acti-
| vate rxIRC's builtin httpd (world wide web server). :wwwport should
| contain a number greater than 1023. Also look up the /export command
| to see how to use the httpd. Use a WWW client to learn about writing
| HTML files. That is beyond the scope of these help files.
Environment settings:
You may use 'setenv' or 'globalv' to put some values into environment
@ -32,29 +39,30 @@ Environment settings:
other IRC programs.
The RXIRC PFKEYS file is obsolete. You can use the 'PF' commands
| from PROFILE RXIRC now.
from PROFILE RXIRC now.
Defaults in the RXIRC NAMES file (the rxIRC configuration file):
server: The internet address of an IRC server
| pass: A password, if your IRC server needs it (rarely ever)
port: The TCP/IP port it runs on, usually 6667
| browser: Name of a command good for showing files.
| Typically BROWSE, but if that's not there try XEDIT.
| timeout: Not used anymore, you can remove it
browser: Name of a command good for showing files.
Typically BROWSE, but if that's not there try XEDIT.
timeout: Not used anymore, you can remove it
logging: Set it to ON or OFF for default logging
quiet_ignore: Usually OFF
loud_beeps: Switch it ON only when a BEEP MODULE is available.
show_numbers: When ON, rxIRC shows the numerics of IRC server replies
list_all: Show also channels without topic in /list
| beep_char: The character that gets translated into a beep and back.
| bold_char: If you define this one, you can make 'bold' messages
| by inserting this character in your messages. They
| will appear hilighted on rxIRC and bold on ircII
| clients (at least)
| highlight_char: Not used anymore
| show_time: When the current time will be displayed on the
| screen. Choices are 0 (never), 10 (every ten
| minutes), 20 (every 20 minutes), 30 (every 30
| minutes), and 60 (every 60 minutes).
beep_char: The character that gets translated into a beep and back.
bold_char: If you define this one, you can make 'bold' messages
by inserting this character in your messages. They
will appear hilighted on rxIRC and bold on ircII
clients (at least)
highlight_char: Not used anymore
show_time: When the current time will be displayed on the
screen. Choices are 0 (never), 10 (every ten
minutes), 20 (every 20 minutes), 30 (every 30
minutes), and 60 (every 60 minutes).
You might choose to copy this file onto your disk to be able to
modify the values.

View File

@ -2,28 +2,19 @@ Frequently asked questions:
--------------------------
What am I supposed to write into the :server field in RXIRC NAMES?
You don't have a server? If you're in the US then Trillian
(hrose@eff.org) will most probably be able to tell you the nearest
server to you. You can however connect to IRC through an open server
like irc.mit.edu (18.70.0.224), fairhope.andrew.cmu.edu (128.2.11.213)
magpie.ee.su.oz.au (129.78.13.28) or ucsu.colorado.edu (128.138.129.83)
| and then ask operators for the nearest server to you.
You can also examine the /links list, but geographical vicinity
usually is not network vicinity!
| You don't have a server? Check out the "servers.*" list which
| is available by ftp on cs-ftp.bu.edu in /irc/support/.
|Why can't rxIRC have /on and /notify and everything else
|that ircII has?
Why can't rxIRC have everything that ircII has?
Because ircII is a giant program that a lot of people have worked on
to be able to do all of that. rxIRC is a relatively little program
which I also want to stay that way, or it might get unpleasantly
slow in execution!
|
|Strange says:
| There is no /on because no one wants to code it. None of the people
| who have worked on rxIRC NEED or WANT /on. :P
|
| Concerning /notify: Use a /note server! :)
Strange says:
There is no /on because no one wants to code it. None of the people
who have worked on rxIRC NEED or WANT /on. :P
Why when I do something outside of rxIRC with /exec, or simply read
the /help files, the server signs me off?
@ -40,24 +31,17 @@ You have a bug, "/who -h *.il" doesn't work!
to ircII. They are NOT standard. It is the normal and natural way
to do it simply with "/who *.il". Or what about trying /local.
When I use one of the new action commands on a channel, like /smile
I get error messages.
| There are controverse notions of the ethics of the CTCP ACTION protocol.
| I think it's a valid alternative form of communication and should be
| supported, but since I invented it I might be biased. Well some IRC
| client programmers insist on not supporting this protocol and return
| all sorts of funny messages. Eventually avoid using these commands
| on channels where people's clients answer with sarcastic comments.
rxIRC crashes and then no communication software (like CHAT) works
anymore!
| rxIRC should not crash, if it does please report that to me.
| To unlock your machine in such a situation it is not necessary to
| re-IPL it, instead just do "NUCXDROP REXXWAIT". "NUCXMAP" shows
| what so-called nucleus extensions are loaded in your machine.
rxIRC should not crash, if it does please report that to me.
To unlock your machine in such a situation it is not necessary to
re-IPL it, instead just do "NUCXDROP REXXWAIT". "NUCXMAP" shows
what so-called nucleus extensions are loaded in your machine.
It tells me loader table overflow
Use 'SET LDRTBLS 10' in your PROFILE or in the RXIRC EXEC.
You still have a question?
Write mail to 'loesch@informatik.uni-oldenburg.de' (internet).
or to '244661 at DOLUNI1' (bitnet)
Write mail to <lynx@imp.de> or to '244661 at DOLUNI1'.

View File

@ -10,13 +10,8 @@ pf6 IMM /lastlog
alias ctoggle %k %c pf$k IMM /toggle $k |join $c|part $c
ctoggle 9 #talk
ctoggle 10 #initgame
* Easy use of services
alias .ni msg nickserv@service.de
alias .no msg noteserv@service.de
alias .w .ni whois
alias .await .no waitfor
alias .del .no delete
alias .list .no list
alias .m .no msg
alias .read .no read
pf11 DEL /notify
* here comes the list of friends to notify for
* these are just examples, fill in your own
notify SymLynX Lambretta

View File

@ -1,7 +1,6 @@
/* rxIRC
* Internet Relay Chat client program for VM/CMS systems
* written by Carl 'LynX' v. Loesch (loesch@informatik.uni-oldenburg.de)
* created by Lynx (244661 at DOLUNI1) on Thursday, 14 Feb 1991
* Credits for suggestions, code contribution, miscellaneous help go to:
* Jose Maria Blasco, Doug Sewell, Martin Ahlborn, Jim McMaster,
* Scott Maxell, Juan Courcoul, Rob Blais, Mike Letourneau, Grant Pair
@ -9,23 +8,24 @@
*
* requires RXSOCKET MODULE version 2 by Arty Ecock (eckcu@cunyvm.bitnet)
*
* Copyright (C)1991,2,3 by Lynx & CvO University Oldenburg, Germany
* Copyright (C)1991,2,3,4 by LynX & CvO University Oldenburg, Germany
* You may freely use this software at your own risk.
* No distribution of modified copies permitted, pls send changes to me.
*
* By the way, this is _not_ the source code of rxIRC. There exists a
* special file IRC PREXX which when run through a preprocessor produces
* the actual RXIRC EXEC. That file is commented. This one is not.
*/ vers='2.0'; trace 'O'
* Warning: Changing the code to display fake user information is
* considered an offense by many IRC administrators!
*
*/ progname='rxIRC'; vers='2.1'; trace 'O'
address "COMMAND"; signal on HALT; "VMFCLEAR"
cmds='AWAY AWAIT ADMIN CHANNEL CONNECT DEOP DIE HASH INFO ISON JOIN KICK',
'KILL LIST LINKS LUSERS MODE MAIL MOTD NAMES NICK NOTICE NOTE OPER PASS',
'PART REHASH RESTART QUIT SERVICE SQUIT SUMMON STATS TOPIC TIME TRACE',
'PART REHASH RESTART QUIT SERVICE SQUIT SUMMON STATS TIME TRACE',
'USERS USERHOST VOICE WHOWAS WALLOPS WALL XTRA'
log=0; query=; ignore=; lastjoin=; lastsender=; onoff.1="on"; onoff.0="off"
log=0; query=; ignore=; omit=; lastjoin=; lastsender=; lastorigin=;
export=; onoff.1="on"; onoff.0="off"
invitation=; away=; ll.=; curll=1; logevent=0; target=time('R')
v.=; al.=; varnames=; aliasnames=; cmdchar=; userinfo=; sourcing=0
have_rxwt=0; who_empty=0; catmode=0; catlist=; abortsource=0; skiplines=0
nflist=; nfhere=; nfcatch=0
"EXECIO * CP (STEM PF. STRING QUERY PF"
do i=1 to pf.0
a=word(pf.i,2)
@ -53,14 +53,14 @@
end
if rc/=0 then call BYE "RXSOCKET version 2 required"
do 3
parse value SOCKET('INITIALIZE', 'rxIRC', 1) with rc . etc
parse value SOCKET('INITIALIZE', "rxIRC", 7) with rc . etc
if rc=2004 then do
say '<cleaning up a zombie rxsocket nucext>'
'NUCXDROP RXSOCKET'
end
else leave
end
if rc/=0 then call BYE "initialize error:" etc
if rc/=0 then call BYE "socket init error:" etc
parse value SOCKET('GETHOSTNAME') with . hostname
parse value SOCKET('GETDOMAINNAME') with . domain
'REXXWAIT TEST'
@ -76,8 +76,9 @@
'IMMCMD SET HI'
"NAMEF :NICK RXIRC :SERVER :PORT :LOGGING :QUIET_IGNORE :SHOW_TIME ",
":BOLD_CHAR :BEEP_CHAR :LOUD_BEEPS :SHOW_NUMBERS :LIST_ALL :BROWSER",
"(LIFO FILE RXIRC"
":PASS (LIFO FILE RXIRC"
if rc/=0 then call BYE "missing or unreadable RXIRC NAMES file"
parse pull server_pass
pull viewcmd; pull def_listall; pull def_numb; pull def_loud
parse pull beepch; parse pull boldch; parse pull showtime; pull def_quiet
pull def_log; parse pull def_port; parse pull def_server
@ -86,8 +87,11 @@
if boldch='' then boldch=d2c(0)
"GLOBALV SELECT CENV GET IRCNICK IRCSERVER IRCNAME IRCPORT"
"NAMEFIND :USERID" me ":NICK :NAME :MOTTO :CMDCHAR :IRCNICK :IRCNAME (LIFO"
"NAMEFIND :USERID" me ":NICK :NAME :MOTTO :CMDCHAR :IRCNICK :IRCNAME ",
":WWWPORT (LIFO"
if rc=0 then do
parse pull wwwport; if wwwport/='' & ^datatype(wwwport,'W') then do
wwwport=; call BYE "WWW port must be numeric"; end
parse pull name; parse pull nick
if ircnick="" then ircnick=nick
if ircname="" then ircname=name
@ -131,25 +135,44 @@
parse value RESETVALUE('ALL') with rc .
if rc/=0 then call BYE "problem w/RESETVALUE"
parse value SETVALUE('TIME ==:=0:00') with rc .
parse value SETVALUE('TIME ==:==:00') with rc .
if rc/=0 then call BYE "problem w/SETVALUE TIME"
parse value SETVALUE('MSG IUCV') with rc .
if rc/=0 then call BYE "problem w/SETVALUE MSG IUCV"
call S "rxIRC"hi||vers||yo"- You are" ircnick "("ircname")"
if wwwport<1024 then wwwport=''
else do
parse value SOCKET('SOCKET') with rc www etc
if rc/=0 then call BYE "socket:" etc
parse value SOCKET('SETSOCKOPT',www,'SOL_SOCKET','SO_ASCII','ON'),
with rc . etc
if rc/=0 then call BYE "setsockopt:" etc
parse value SOCKET('BIND', www, 'AF_INET' wwwport SOCKET('GETHOSTID')),
with rc . etc
if rc/=0 then call BYE "bind:" etc
parse value SOCKET('LISTEN', www, 9) with rc . etc
if rc/=0 then call BYE "listen:" etc
parse value SOCKET('IOCTL', www, 'FIONBIO', 1) with rc . etc
if rc/=0 then call BYE "nonblocking i/o:" etc
myurl="http://"hostname"."domain":"wwwport"/"
end
call S progname||hi||vers||yo"- You are" ircnick "("ircname")"
call S "Logging is" onoff.log"; Audible bells are",
onoff.loud"; Quiet ignore is" onoff.quiet
if showtime=80 then say "Time display is off"
else say "Time is displayed every" showtime "minutes"
if www/='' then call S "Builtin httpd active as"hi||myurl||yo
call CONNECT ircserver
call SOURCE "PROFILE", 1
if nflist/='' then do; nfcatch=1; call SEND "ISON" nflist; end
call S copies("-",79)lo
do forever
"IMMCMD STATUS HI"
if rc/=0 then call S,
'Sorry, "hi" is a system reserved word. Try an other operating system.'
parse value WAIT('TIME','CONS','MSG','SOCKET READ' sock) with rc type data
parse value WAIT('TIME','CONS','MSG','SOCKET READ *') with rc type data
select
when rc/=0 then call BYE "REXXWAIT returning code" rc
when type='SOCKET' then do
when rc/=0 then call BYE "REXXWAIT returning" rc
when type='SOCKET' & data='READ' sock then do
parse value SOCKET('READ', sock) with rc . data
if rc=54 then call BYE
if rc/=0 then call BYE 'socket read error' rc
@ -175,12 +198,16 @@
if ^quiet & left(data,1)/='*' then call TELL origin '*' ignore_reply
end; else do
call OUT hi||ni':'lo||data
if away/='' & left(data,1)/='*' then call TELL origin '* away:' away
if away/='' & left(data,1)/='*' & origin/=lastorigin then do
call TELL origin '* away:' away
lastorigin = origin
end
end
end
when type = 'TIME' then do
parse var data . hh':'mm':' .
if datatype(mm/showtime,'w') then call S 'It is now' hh':'mm
if nflist/='' then do; nfcatch=1; call SEND "ISON" nflist; end
'EXECIO 1 CP(VAR A STR Q' me
parse var a . '-' a .
if a='DSC' then do
@ -189,16 +216,46 @@
call BYE data
end
end
otherwise
call S 'Unexpected event:' type data
when type='SOCKET' then do
parse var data . gsock
if gsock=www then do
parse value SOCKET('ACCEPT', www) with rc gsock . gport gipnum
end; else do
parse value SOCKET('READ', gsock) with rc . data
if rc=54 then iterate
if rc/=0 then call S 'Read error on http connection' gsock '('rc')'
else do
if data='' then do; SOCKET('CLOSE', gsock); iterate; end
parse var data cmd url .
parse var url URL(lf) .
if url='/' then url='/index.html'
parse var url '/'fn'.'ft'/' x; upper fn ft
if x='' & fn/='' & fn/='*' & ft/='' & ft/='*' &,
(cmd='GET'|cmd='HEAD') & FINDM(export,fn'.'ft) then do
call S 'httpd: request from' gipnum':' cmd url
/* 'MAKEBUF'; 'LISTFILE' fn ft '(STACK'; t=rc; 'DROPBUF' */
'STATE' fn ft
if rc=0 then do
call WRITE gsock "HTTP/1.0 200 Sure"
call WRITE gsock "Server:" progname"/"vers
if ft='HTML' then ct='html'; else ct='plain'
call WRITE gsock "Content-type: text/"ct
call WRITE gsock ''
if cmd='GET' then call WRITEFILE gsock fn ft pubmode
end
end; else call S 'httpd: invalid request ('cmd url') from' gipnum
SOCKET('SHUTDOWN', gsock)
end
end
end
otherwise call S 'Unexpected event:' type data
end
end
call BYE "a rexx oddity"
PARSE:
parse arg a
if loud & pos(beep,a)/=0 then "BEEP"
b=; a=translate(a,"%"||beepch||"_",rev||beep||undl)
tu=; a=translate(a,"%"||beepch||"_",rev||beep||undl)
i=1; j=0; do forever; i=index(a,bold,i)
if i=0 then leave
if j=0 then a=insert(hi,a,i)
@ -209,76 +266,86 @@ PARSE:
if j=1 then a=a||lo
if left(a,1)=':' then do
parse var a ':'s m e f ':'g
parse var s s'!'sad
parse var s s"!"sad
end
else do; s=''; parse var a m e f ':'g; end
f=strip(f)
logevent = 1
select
when m='CHANNEL' then if e="0"
then b='***' s 'leaves this channel'
else b='***' s 'joins this channel'
then tu='***' s 'leaves this channel'
else tu='***' s 'joins this channel'
when m='INVITE' then do
f=strip(word(f g,1))
invitation = f
lastsender = s
b='***' s '('sad') invites you to channel' f; end
tu='***' s '('sad') invites you to channel' f g; end
when m='JOIN' then do
e=strip(word(e g,1))
b='***' s '('sad') joins channel' e
tu='***' s '('sad') joins channel' e
if s=ircnick then target=translate(e)
else lastjoin=s
end
when m='KICK' then b='***' s 'kicks' f 'off channel' e
when m='KILL' then b='You were killed by' s subword(g,2)
when m='MODE' then b='Mode change:' s 'sets' f 'on' e
when m='MSG' then b='<'s'>' g
when m='NICK' then b='***' s 'is now known as' e||g
when m='KICK' then tu='***' s 'kicks' f 'off channel' e '('g')'
when m='KILL' then tu='You were killed by' s subword(g,2)
when m='MODE' then tu='Mode change:' s 'sets' f 'on' e||g
when m='MSG' then tu='<'s'>' g
when m='NICK' then tu='***' s 'is now known as' e||g
when m='NOTICE' then select
when s='' | s=servername then do
if word(g,1)="***" then b=subword(g,2)
else b=g
a=; parse var b 'Your host is 'g'['a .
if word(g,1)="***" then tu=subword(g,2)
else tu=g
a=; parse var tu 'Your host is 'g'['a .
if a/='' then servername=g
end
when translate(e)=capnick then do
if FINDM(ignore,s) | FINDM(ignore,sad) then do
return ''; end
else do; b='-'s'-' g
lastsender=s
if ^FINDM(ignore,s) & ^FINDM(ignore,sad) then do
tu='-'s'-' g; lastsender=s
end
end
otherwise b='-'s':'e'-' g; end
when m='PART' then b='***' s 'parts channel' e
otherwise if ^FINDM(omit,s) & ^FINDM(omit,sad) then tu='-'s':'e'-' g
end
when m='PART' then tu='***' s 'leaves channel' e
when m='PING' then call SEND("PONG :"ircnick)
when m='PRIVMSG' then select
when translate(e)=capnick then do
when m='PRIVMSG' then do
if translate(e)=capnick then do
if FINDM(ignore,s) | FINDM(ignore,sad) then do
if ^quiet then call SEND('NOTICE' s ':'ignore_reply)
return ''; end
else do
if CTCP(1 g) then b='*'s'*' g
if CTCP(1 g) then tu='*'s'*' g
lastsender=s
end
end
when translate(e)=target then if CTCP(0 g) then b='<'s'>' g
otherwise if CTCP(0 g) then b='<'s':'e'>' g; end
when m='QUIT' then b='Signoff by' s '('g')'
when m='TOPIC' then b='***' s 'sets the topic to:' g
when m='WALLOPS' then b='Wallops from' s':' g
when m='WALL' then b='Broadcast from' s':' g
when m='221' then b='Your mode is' g
when m='301' then b=f 'is away:' g
else if ^FINDM(omit,s) & ^FINDM(omit,sad) then
if CTCP(0 g) then do
if translate(e)=target then tu='<'s'>' g
else tu='<'s':'e'>' g
end
end
when m='QUIT' then tu='Signoff by' s '('g')'
when m='TOPIC' then tu='***' s 'sets the topic to:' g
when m='WALLOPS' then tu='Wallops from' s':' g
when m='WALL' then tu='Broadcast from' s':' g
when m='221' then tu='Your mode is' g
when m='301' then tu=f 'is away:' g
when m='302' then do
parse var g ni'='uh
if left(uh,1)='+' then aw='here'
else aw='away'
tu=ni 'is' aw '('substr(uh,2)')'
end
when m='303' & nfcatch then call ISON g
when m='311' then do
parse var f ni ui no .
b=ni 'is' ui'@'no '('g')'
tu=ni 'is' ui'@'no '('g')'
end
when m='314' then do; parse var f ni ui no .
b=ni 'was' ui'@'no '('g')'; end
when m='312' then b='via' word(f,2) '('g')'
tu=ni 'was' ui'@'no '('g')'; end
when m='312' then tu='via' word(f,2) '('g')'
when m='315' then if who_empty then call S 'No matches for /who'
when m='319' then b='on channels:' g
when m='317' then b='and has been idle' word(f,2) 'seconds'
when m='319' then tu='on channels:' g
when m='317' then tu='apparently idle' word(f,2)/60 'minutes'
when m='322' then do
parse var f ch n .
if ch/='*' & substr(ch,2,1)/='27'x then do
@ -287,10 +354,10 @@ PARSE:
end; end
when m='323' then do
if catmode then do
call OUT 'Channels:' catlist; catlist=; catmode=0; end; end
when m='324' then b='The mode on channel' word(f,1) 'is' word(f,2)
when m='332' then b='The topic is:' g
when m='341' then b='Inviting' word(f,1) 'to channel' word(f,2)
call OUT 'Channels:' catlist; catlist=; catmode=0; end; end
when m='324' then tu='The mode on channel' word(f,1) 'is' word(f,2)
when m='332' then tu='The topic is:' g
when m='341' then tu='Inviting' word(f,1) 'to channel' word(f,2)
when m='352' then do
parse var f ch us no . ni st .
if st="S" then return ''
@ -307,23 +374,25 @@ PARSE:
when m='353' then do; ch=word(f,2); a=words(g)
if ch/='*' & (a>6 | translate(ch)=target) then call OUT hi||left(ch,15)yo||g
end
when m='313'|m='364' then b=f g
when m='313'|m='364' then tu=f g
when m='004'|m='318'|m='321'|m='365'|m='366'|m='406' then nop
when m='001' then do; servername=s; b=subword(g,1,words(g)-1); end
when m='252'|m='254' then b=f g
when m='001' then do; servername=s; tu=subword(g,1,words(g)-1); end
when m='376' then call SOURCE "CONNECT", 1
when m='252'|m='254' then tu=f g
otherwise select
when g="" then b=f
when f=""|f=s then b=g
otherwise b=f":" g
when g="" then tu=f
when f=""|f=s then tu=g
otherwise tu=f":" g
end
if s/="" & s/=servername then b='('s')' b
if numb then b='{'m'}' b
if s/="" & s/=servername then tu='('s')' tu
if numb then tu='{'m'}' tu
end
return translate(b,"@",msa)
return translate(tu,"@",msa)
VAR:
parse arg x
select
when datatype(x,'w') then return '$'||x
when x=',' then return lastsender
when x=':' then return lastjoin
when x='A' then return away
@ -338,6 +407,7 @@ VAR:
if query='' then return target
else return query
end
when x='U' then return myurl
when x='V' then return vers
when x='Z' then return left(time(),5)
when x='$' then return '$'
@ -346,12 +416,12 @@ VAR:
return '<error>'
SET:
parse arg r
if r='' then do i=1 to words(varnames)
r=word(varnames,i); call S '$('r') is "'v.r'"'
parse arg z
if z='' then do i=1 to words(varnames)
z=word(varnames,i); call S '$('z') is "'v.z'"'
end
else do
parse var r a b
parse var z a b
if b='' then call S 'Variable' a 'has the value "'v.a'"'
else do; v.a=b; if find(varnames,a)=0 then varnames=a varnames; end
end
@ -384,27 +454,27 @@ SHELL:
end
return
end
do while lin^=''
do while lin/=''
if left(lin,1)='*' then return
parse var lin one '15'x lin
par=; lc=; com='$'; al.com = one
do while al.com^=''; a=al.com
do while left(a,1)='%'
parse var a '%'var a
parse var par b par
v.var=b
do while al.com/=''; sa=al.com
do while left(sa,1)='%'
parse var sa '%'var sa
parse var par sb par
v.var=sb
end
if par^='' then do; a=a par; par=''; end
b=; do while a^=''
parse var a k'$'y a
if y='' then do; b=b||k; leave; end
if left(y,1)='(' then do; parse var y 2 x')'y; a=y a; end
else do; x=left(y,1); a=substr(y,2) a; end
b=b||k||VAR(x)
if par/='' then do; sa=sa par; par=''; end
sb=; do while sa/=''
parse var sa k'$'y sa
if y='' then do; sb=sb||k; leave; end
if left(y,1)='(' then do; parse var y 2 x')'y; sa=y sa; end
else do; x=left(y,1); sa=substr(y,2) sa; end
sb=sb||k||VAR(x)
end
parse var b com par '::' next
parse var sb com par '::' next
upper com
if next^='' then lin=next||'15'x||lin
if next/='' then lin=next||'15'x||lin
if find(lc, com)=0 then lc=com lc
else do; call S 'Alias loop of "'com'" encountered'; return; end
end
@ -414,9 +484,10 @@ SHELL:
COMMAND:
parse arg q r; out=; upper q
if abbrev('LEAVE',q,2) then q='PART'
select
when abbrev('ABORT',q,2) then call BYE "your abort request"
when abbrev('AWAY',q,2) then do; away=r; out="AWAY" r; end
when abbrev('AWAY',q,2) then do; lastorigin=; away=r; out="AWAY :"r; end
when abbrev('BYE',q,1)|abbrev('SIGNOFF',q,6)|abbrev('QUIT',q,3) then do
call SEND('QUIT' r); call BYE; end
when abbrev('CATALOG',q,2) then do; catmode=1; out='LIST' r; end
@ -429,13 +500,14 @@ COMMAND:
when abbrev('CMDCHARACTER',q,2) then cmdchar=left(r,1)
when q='ECHO' then call OUT r
when abbrev('EXECUTE',q,1) then call EXECUTE r
when abbrev('EXPORT',q,4) then call EXPORT r
when abbrev('EXPRESSION',q,4) then call SET word(r,1) EXPR(subword(r,2))
when abbrev('FOLLOW',q,1) then out='JOIN' invitation
when abbrev('HELP',q,1) then do
address 'CMS' "HELP RXIRC"; say; end
when q='IF' then do
parse var r cond a r
if translate(a)^='THEN' then call S "IF" cond": THEN is missing"
if translate(a)/='THEN' then call S "IF" cond": THEN is missing"
else do
rc = INTERP("if ("cond") then rc=0; else rc=1")
if rc=0 then call COMMAND r
@ -450,6 +522,7 @@ COMMAND:
when abbrev('LOGGING',q,2) then call LOGGING r
when abbrev('NICKNAME',q,1) then if r='' then out='WHOIS' ircnick
else do; out='NICK' r; ircnick=r; capnick=translate(r); end
when q='NF'|abbrev('NOTIFY',q,4) then call NOTIFY r
when left(q,2)='PF' then 'CP SET' q r
when abbrev('REPLY',q,1) then call QUERY lastsender
when abbrev('SERVER',q,1) then call CONNECT r
@ -467,7 +540,7 @@ COMMAND:
when abbrev('TELL',q,2) then call TELL r
when abbrev('TOGGLE',q,3) then call TOGGLE r
when abbrev('VERSION',q,3) then do; out='VERSION' r
if r='' then call S 'rxIRC' vers
if r='' then call S progname vers
end
when abbrev('VIEWLOG',q,2) & viewcmd/='' then do
address 'CMS' viewcmd logfile; say; end
@ -483,6 +556,7 @@ COMMAND:
who_empty=1; out="WHO *"right(domain,trunc(length(domain)/2)); end
when q='M'|q='MSG'|abbrev('MESSAGE',q,3) then do
parse var r ni r; out='PRIVMSG' ni ':'r; end
when abbrev('OMIT',q,2) then call OMIT r
when abbrev('QUERY',q,1) then call QUERY r
when abbrev('REQUEST',q,3)|q='CTCP' then do
parse var r ni rq .; upper rq
@ -493,6 +567,7 @@ COMMAND:
when q='SAY' then out='PRIVMSG' target ':'r
when q='SWHO' then out='NAMES'
when q='T' then out='TOPIC' target ':'r
when abbrev('TOPIC',q,2) then out='TOPIC' word(r,1) ':'subword(r,2)
when q='WHO' then do
who_empty=1
if r="" then out='WHO' target
@ -522,15 +597,37 @@ COMMAND:
IGNORE:
arg a
do words(a)
parse var a ig a
z=find(ignore,ig); if z/=0 then
ignore=strip(delword(ignore,z,1))
else ignore=ig ignore
parse var a x a
z=find(ignore,x); if z/=0 then
ignore=strip(delword(ignore,z,1))
else ignore=x ignore
end
call OUT 'You are ignoring:' ignore
if quiet then call S "And you don't send notices about it (quiet ignore)."
return
EXPORT:
arg a
do words(a)
parse var a x a
z=find(export,x); if z/=0 then
export=strip(delword(export,z,1))
else export=x export
end
call OUT 'You are exporting:' export
return
OMIT:
arg a
do words(a)
parse var a x a
z=find(omit,x); if z/=0 then
omit=strip(delword(omit,z,1))
else omit=x omit
end
call OUT 'You are omitting:' omit
return
QUERY:
parse arg qq
if query/='' then call S 'Terminating query with' query
@ -559,28 +656,25 @@ LOGGING:
return
S:
parse arg k
say k
parse arg k; say k; if log then writelog k
if logevent/=0 then do
curll=curll+1; ll.curll=x; logevent=0; k=curll-50; ll.k=; end
if log then writelog k
curll=curll+1; ll.curll=k; logevent=0; k=curll-50; ll.k=; end
return
OUT:
parse arg x
if x="" then return
if length(x) < 81 then q=0
parse arg x; if x="" then return
if length(x) < 81 then y=0
else do 1
q=pos(word(x,2),x)-1; if q>30 | q<0 then q=3
p=lastpos(" ",x,80)
if p<30 then do; q=3; p=77; end
call S left(x,p); x=substr(x,p+1)
do while length(x)+q > 80
p=lastpos(" ",x,80-q); if p<30 then do; q=3; p=77; end
call S copies(" ",q)left(x,p); x=substr(x,p+1)
y=pos(word(x,2),x)-1; if y>30 | y<0 then y=3
z=lastpos(" ",x,80)
if z<30 then do; y=3; z=77; end
call S left(x,z); x=substr(x,z+1)
do while length(x)+y > 80
z=lastpos(" ",x,80-y); if z<30 then do; y=3; z=77; end
call S copies(" ",y)left(x,z); x=substr(x,z+1)
end
end
call S copies(" ",q)x
call S copies(" ",y)x
return
CONNECT:
@ -594,16 +688,16 @@ CONNECT:
in.2=me x2c('4b404b') ':'ircname
parse value SOCKET('SOCKET', 'AF_INET', 'SOCK_STREAM') with rc sock etc
if rc/=0 then do; sock=; call BYE "socket error:" etc; end
parse value SOCKET('SETSOCKOPT', sock,'SOL_SOCKET','SO_ASCII','ON') with rc . etc
if rc/=0 then call BYE "SetSockOpt error:" etc
parse value SOCKET('SETSOCKOPT',sock,'SOL_SOCKET','SO_ASCII','ON') with rc . etc
if rc/=0 then call BYE "setsockopt:" etc
call S "Connecting to" ircserver "on port" ircport"." etc
parse value SOCKET('CONNECT', sock, 'AF_INET' ircport ircserver) with rc . etc
if rc/=0 then call BYE "connect error:" etc
if rc/=0 then call BYE "connect:" etc
parse value SOCKET('IOCTL', sock, 'FIONBIO', 1) with rc . etc
if rc/=0 then call BYE "nonblocking I/O:" etc
if rc/=0 then call BYE "nonblocking i/o:" etc
if server_pass/='' then do; call SEND("PASS" server_pass); server_pass=; end
call SEND(x2c('D5C9C3D2') ircnick)
call SEND(x2c('E4E2C5D9') in.2)
call SOURCE "PROFILE", 1
return
CTCP:
@ -613,14 +707,18 @@ CTCP:
select
when ctcp="ACTION" then call OUT '*' s bla
when ctcp="CLIENTINFO" then
call MSAREPLY "CLIENTINFO ACTION CLIENTINFO FINGER TIME USERINFO VERSION"
call MSAREPLY "CLIENTINFO ACTION CLIENTINFO FINGER TIME URL USERINFO VERSION"
when ctcp="FINGER" then
call MSAREPLY "FINGER" realname '('me'@'hostname'.'domain',',
me'@'mynode') - Idle' trunc(time('E'),2) 'seconds'
when ctcp="TIME" then call MSAREPLY "TIME" left(time(),5)
when ctcp="URL" then do
if wwwport='' then call MSAREPLY "ERRMSG No http port set up by user"
else call MSAREPLY "URL" myurl
end
when ctcp="USERINFO" then call MSAREPLY "USERINFO" userinfo
when ctcp="VERSION" then
call MSAREPLY "VERSION rxIRC" vers "VM/CMS",
call MSAREPLY "VERSION" progname vers "VM/CMS",
":Survival package for VM-struck humans"
otherwise if fla=1 then call MSAREPLY "ERRMSG Huh? Can't do" ctcp
end
@ -633,7 +731,7 @@ MSAREPLY:
SYNTAX:
say errortext(rc)
return
return 0
HALT:
call BYE "halt request"
@ -655,6 +753,8 @@ BYE:
'CP TERM LINEND' a 'CHARDEL' k
i=2; parse var qt.i 'LINESIZE' a',' .
'CP TERM LINESIZE' a
if www/='' then do
SOCKET('SHUTDOWN',www); SOCKET('CLOSE',www); www=; end
if sock/='' then do
call SHUT
parse value SOCKET('TERMINATE') with .
@ -781,38 +881,42 @@ SHUT:
return
NICE:
parse arg a'@'b;if b="" then b=mynode
if nice.a.b^='*' then do
if nice.a.b^='' then return nice.a.b
'NAMEF :userid' a ':node' b ':nick (LIFO'
if rc=0 then do;parse pull nice.a.b .
return nice.a.b;end
if b=mynode then do; 'NAMEF :userid' a ':node :nick (LIFO'
if rc=0 then do;parse pull nice.a.b .
pull ln .;if ln='' then return nice.a.b;end
arg u'@'v;if v='' then v=mynode
if nice.u.v/='' then return nice.u.v
'NAMEF :userid' u ':node' v ':nick (LIFO'
if rc=0 then parse pull nice.u.v .
else if v=mynode then do
'NAMEF :userid' u ':node :nick (LIFO'
if rc=0 then do
parse pull nice.u.v .
pull ln .
if ln='' then return nice.u.v
end
nice.a.b='*';end
if a='RSCS' then return b
return a
nice.u.v=u
end
else if u='RSCS' then nice.u.v=v
else nice.u.v=u'@'v
return nice.u.v
U@N:
parse arg q p; if q='' then return 0 'missing args'
upper q; parse var q q'@'r
if r^='' then return q r p
if word(p,1)='AT' then do
parse var p . r p; upper r
if r='' then return 0 'missing node'
return q r p;end
if u@n.q^='' then return u@n.q p
'NAMEF :nick' q ':userid :node :via (LIFO'
parse arg x z; if q='' then return 0 'missing args'
upper x; parse var x x'@'y
if y/='' then return x y z
if word(z,1)='AT' then do
parse var z . y z; upper y
if y='' then return 0 'missing node'
return x y z;end
if u@n.x/='' then return u@n.x z
'NAMEF :nick' x ':userid :node :via (LIFO'
if rc=0 then do 1
pull la; pull ln; pull li
if li='' then leave
parse value li ln mynode with a r .
u@n.q=a r; if via.a.r='' then via.a.r=la
return a r p
pull k; pull y; pull a
if a='' then leave
if y='' then y=mynode
u@n.q=a y; if via.a.y='' then via.a.y=k
return a y z
end
u@n.q = q mynode;return q mynode p
u@n.x = x mynode
return x mynode z
TELL:
parse arg tea
@ -830,7 +934,7 @@ TELL:
else via=via.xid.xnod
select
when via='SMSG'|via='SEND' then do
if xnod^=mynode then err='SEND & SMSG only local'
if xnod/=mynode then err='SEND & SMSG only local'
else do
if via='SMSG' then parse value diagrc(8,'SMSG' xid tea) with rc . err
else do
@ -839,9 +943,9 @@ TELL:
parse value diagrc(8,'SEND CP' xid translate(tea?)) with rc . err
else parse value diagrc(8,'SEND' xid tea) with rc . err
end; end; end
when via=''|left(via,1)^="'" then do
when via=''|left(via,1)/="'" then do
if via='RSCS' then do;viar=1;via='';end;else viar=0
if via^='' then via='CMD' via
if via/='' then via='CMD' via
if xid='RSCS'|(xid=rscs&xnod=mynode) then do
if xnod=mynode&^viar then parse value diagrc(8,'SM' rscs tea) with rc . err
else parse value diagrc(8,'SM' rscs via 'CMD' xnod tea) with rc . err
@ -867,18 +971,18 @@ TELL:
return
SOURCE:
arg a, b
if a='' then do
arg sfn, sfl
if sfn='' then do
call S "You must specify a file to /source"
return -1
end
a=a 'RXIRC *'
"STATE" a
sfn = sfn 'RXIRC *'
"STATE" sfn
if rc/=0 then do
if b/=1 then call S 'Could not access' a
if sfl/=1 then call S 'Could not access' sfn
end
else do
'MAKEBUF'; 'EXECIO * DISKR' a '(FIFO FINIS'; skiplines=0;
'MAKEBUF'; 'EXECIO * DISKR' sfn '(FIFO FINIS'; skiplines=0;
do queued(); sourcing=1
parse pull l; if abortsource then iterate
if skiplines=0 then call SHELL strip(l)
@ -913,13 +1017,70 @@ INTERP:
signal on SYNTAX; INTERPRET(statement); signal off SYNTAX
return rc
EXECUTE:
parse arg r
if r='' then do
say 'Suspending rxIRC; Enter "return" to return'
r='SUBSET'
NOTIFY:
arg a
do i=1 to words(a)
x=word(a,i); y=find(nflist,x); z=find(translate(nfhere),a)
if z/=0 then nfhere=strip(delword(nfhere,z,1))
if y/=0 then nflist=strip(delword(nflist,y,1))
else nflist=nflist x
end
address 'CMS' r
call OUT 'Observing:' nflist
if a='' then call OUT 'Present:' nfhere
return
ISON:
parse arg g
i=1; do words(nfhere)
a=word(nfhere,i)
if find(g,a)=0 then do
nfhere = strip(delword(nfhere,i,1))
call OUT a "has gone"
end
else i=i+1
end
do i=1 to words(g)
a=word(g,i)
if find(nfhere,a)=0 then do
nfhere = a nfhere
call SEND "USERHOST" a
end
end
nfcatch=0
return
EXECUTE:
parse arg a
if a='' then do
say 'Suspending rxIRC; Enter "return" to return'
a='SUBSET'
end
address 'CMS' a
if rc=0 then say "rxIRC ready"
else say "rxIRC ready("rc")"
return
WRITE:
parse arg qp tx
parse value SOCKET('WRITE', qp, tx||cr||lf) with rc . etc
if rc/=0 then call S "Socket write error:" etc
return
WRITEFILE:
parse arg qp fn ft .
'MAKEBUF'
'EXECIO * DISKR' fn ft '(FINIS FIFO'
if rc=0 then do
do queued()
parse pull l
call WRITE qp l
if rc/=0 then do
call S 'httpd: File transmission interrupted (by caller probably)'
signal DROPIT
end
end
call S 'httpd: Sent' fn ft
end
DROPIT:
'DROPBUF'
return

View File

@ -1,12 +1,11 @@
.cm last change by lynx.
.mt IRC
rxIRC
^^^
Internet Relay Chat client program for VM/CMS systems
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
written by Carl 'LynX' v. Loesch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
by Carl v. Loesch
^^^^^^^^^^^^^^^
Move the cursor onto a topic and press ENTER

View File

@ -1,38 +1,45 @@
rxIRC Installation Guide
========================
| To run rxIRC you need RXSOCKET 2 and REXXWAIT.
| You don't need REXTCPIP anymore (Sorry Ken).
To run rxIRC you need RXSOCKET 2 and REXXWAIT.
You don't need REXTCPIP anymore (Sorry Ken).
Before you start rxIRC you should edit the RXIRC NAMES file which
contains all the default values for rxIRC. Most important: the address
of your default IRC server host!
| On VM/ESA systems you might have to enter the 'NXA' command before
| starting up rxIRC. I'm not familiar with those systems so I don't know
| what needs to be changed to make that work right, same goes for other
| exotic VM derivates on which rxIRC makes problems. If you manage to
| fix rxIRC up on such systems please send me your changes!
| The VM Gopher client is written to work with the old RXSOCKET version
| so you get the problem that either you have Gopher or you have rxIRC
| working by default. Sorry but I guess Gopher needs an update!
| If you have any problems/improvements/suggestions/etc. contact the rxIRC
| mailing list rxIRC-l@vmtecqro.qro.itesm.mx.
| You can subscribe to the mailing list with 'SUB RXIRC-L <fullname>'
| sent to listserv@vmtecqro.qro.itesm.mx or LISTSERV AT VMTECQRO.
| With the AFD and FUI commands you can get automatic information
| about new releases of rxIRC from the LISTSERV. You can also decide
| to look out for announcements of mine in the VMUTIL-L, alt.irc
| or de.comm.internet newsgroups.
| However don't expect frequent announcements. Changes to rxIRC
| happen seldomly. I usually don't have the time for it. :(
Ciao -lynx
o-------------------------------------------------------------------o
| Carl "LynX" v. Loesch is loesch@informatik.uni-oldenburg.de |
| ---------------------- or 244661 at DOLUNI1.bitnet / .earn |
On VM/ESA systems you can try to obtain the ESA-Version of RXSOCKET,
or switch into the 370 mode (with SET MACHINE 370 and IPL CMS).
If you're lucky it will work from scratch even on those systems,
it's a question of how your mainframe is being configured.
When it tells you the TCPIP DATA file is missing, you probably
need to ACCESS (or even CP LINK) the appropriate system disk,
which is tipically labeled ('TCPIP'). Try 'QUERY DASD'.
When you see the whole internet address in people's messages
instead of just the nickname, or other similar weird things
you might have some improper ASCII/EBCDIC translation set up!
In that case check that STANDARD TCPXLATE and STANDARD TCPXLBIN
from your TCPIP system disk come before other * TCPXLATE files.
If you have any problems/improvements/suggestions/etc. contact the rxIRC
mailing list rxIRC-l@vmtecqro.qro.itesm.mx.
You can subscribe to the mailing list with 'SUB RXIRC-L <fullname>'
sent to listserv@vmtecqro.qro.itesm.mx or LISTSERV AT VMTECQRO.
With the AFD and FUI commands you can get automatic information
about new releases of rxIRC from the LISTSERV. You can also decide
to look out for announcements of mine in the VMUTIL-L, alt.irc
or de.comm.internet newsgroups.
However don't expect frequent announcements. Changes to rxIRC
happen seldomly. I usually don't have the time for it. :(
--
____ http://www.noris.de/~lynx/
LynX Carl von Loesch lynx@imp.de
~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~
LynX@You.might.aswell.use.This.as.my.Email.Address.Biol.Chemie.TU-Muenchen.DE

View File

@ -1,18 +1,26 @@
* RXIRC NAMES
* contains installationwide defaults for rxIRC
* do NOT change the next line
:nick.rxIRC
*
* Insert the network address of an IRC server near to you into here..
* Or activate a temporary choice to be able to contact an IRC
* operator for help on proper choice of IRC server
* (join #Twilight_Zone to meet irc operators)
* A list of servers exists in ftp://cs-ftp.bu.edu/irc/support/
*
:server.irc.uni-erlangen.de
:server.irc.informatik.uni-oldenburg.de
* :server.irc.fu-berlin.de
* :server.irc.mit.edu
* :server.irc.eunet.fi
* :server.irc.technion.ac.il
* :server.irc.virginia.edu
* In case your default server requires a client password, you can enter it
* here. However this is a pretty unusual case.
*
* :pass.PassWord
* Some preferences.. You can look into this later on.
* See also the helpfile about customization.
*
@ -24,12 +32,12 @@
:show_time.60
:bold_char.|
:beep_char.~
* A command to view files. If there is no BROWSE on your
* system you can use XEDIT aswell.
*
:browser.BROWSE
* No change should be necessary below here
*
:port.6667

View File

@ -1,44 +1,37 @@
Subject: rxIRC 2.0 for VM/CMS available
Newsgroups: bit.listserv.vm-util,alt.irc,de.comm.internet,de.talk.chat
Keywords: IRC rxIRC rexx vm cms internet bitnet rexx/socket lynx
Subject: rxIRC 4.1 - IRC client for VM/CMS 370 systems
Newsgroups: bit.listserv.vm-util,alt.irc.announce,de.comm.internet,de.talk.chat
Keywords: IRC rxIRC rexx vm cms internet bitnet rexx/socket
Introducing rxIRC:
rxIRC is a client software for VM to connect to the IRC network, the
Internet Relay Chat, which nowadays counts an average of 1200 users online
Internet Relay Chat, which nowadays counts an average of 3000 users online
day and night, from all over the world, therefore being the biggest
international interactive conferencing system on the planet.
You can make use of this program only if you have access to a machine
with VM/CMS-type operating system with TCPIP extension installed. To find
out you logon and type 'CP QUERY TCPIP', if it replies 'TCPIP - DSC' then
you can make use of this program, otherwise check with your administration.
chances are good, otherwise check up with your administration.
rxIRC is a program written in interpreted RexX, a rather easy to learn
language that gives you a chance to add own features if you miss something
or modify things you dislike. rxIRC supports the complete set of standard
IRC client commands plus a bunch of extras and is more or less up to date
with the current state of development of the IRC protocol.
New features in rxIRC 2.0:
- now uses RXSOCKET and REXXWAIT
- has extensive BITNet messaging support
(for instance /query +nick queries a bitnet user)
- /alias with parameter handling
- variables: /set, /expr (rexx expressions), /echo
- /if <condition> then <command>
- /source <scripts>, skip <lines>, stop (sourcing)
- /pf<n>, /toggle (setup a pf key with alternating commands)
- /localwho, /catalog
- /chop, /unchop, /k(ick), /t(opic)
- /viewlog, /interpret, /applaud
- documentation has doubled its size.. ;)
- :show_time, display time every now and then
- ircII-bold-code displayed with hilighting, :bold_char
New features in rxIRC 2.1:
* /notify - Finally it's in, thanks to Michael Letourneau
* builtin WWW server, secure and stable!
* /export to specify what files are available for WWW, typically /export *.html
* /omit - Filter channel talk that you don't want to listen to
* Support for server passwords
* The CONNECT RXIRC script is sourced right after you connect to a server
* Small fixes and protocol parsing updates
Requirements:
The TCPIP handling of rxIRC is done with help of RXSOCKET version 2.
You need to have this package installed, or at least the basic modules.
There are some restrictions concerning the use of RXSOCKET:
@ -46,40 +39,35 @@ There are some restrictions concerning the use of RXSOCKET:
programs using version 1 they won't work when you install version 2.
- VM TCP/IP version 2 is required.
- rxIRC should run on CMS 3 up to 9 (370, XA, ESA or XC MACHINE modes)
If you are going to install rxIRC on a big public disk, you probably
want to install the complete REXX/SOCKET package. You can do so by issueing
TELL LISTSERV AT CUNYVM GET RXSOCKET PACKAGE. Beware that you will be sent
the beauty of over 80 files after this!
If you want to run rxIRC just by yourself, and RXSOCKET isn't available
already (rxIRC tells you so) then merely issue these commands to get the
modules:
TELL LISTSERV AT CUNYVM GET RXSOCKET MODULE
TELL LISTSERV AT CUNYVM GET REXXWAIT MODULE
rxIRC 2.0 itself can be obtained from:
rxIRC itself can be obtained from:
<Internet>
Europe: ftp nic.funet.fi
Europe:
[Home Site] ftp ftp.m.biologie.tu-muenchen.de (129.187.220.2 or .9)
mget /pub/comp/rxirc/*.*
[Finland] ftp nic.funet.fi
mget /pub/unix/irc/rxirc/*.*
[Home Site] ftp ftp.informatik.uni-oldenburg.de (134.106.1.9)
mget /pub/irc/rxirc/*.*
America: ftp ftp.iastate.edu
mget /pub/irc/clients/rxirc/2.0/*.*
ftp slopoke.mlb.semi.harris.com
mget /pub/irc/clients/rxirc/*.*
Australia: ftp coombs.anu.edu.au
mget /pub/irc/rxirc/*.*
<BITnet>
[Mexico] TELL LISTSERV AT VMTECQRO GET RXIRC PACKAGE
rxIRC installers are invited to join the rxIRC mailing list by sending a
'SUB RXIRC-L <your-full-name>' command to LISTSERV AT VMTECQRO.

13
setenv.exec Normal file
View File

@ -0,0 +1,13 @@
/* SETENV EXEC
* Set an environment variable for C programs to access
* last change by Lynx_VM (244661 at DOLUNI1) on Sunday, 12 May 1991
*/
address 'COMMAND'
parse arg n c; upper n
if n="" then
'GLOBALV SELECT CENV LIST'
else if c="" then
'GLOBALV SELECT CENV LIST' n
else
'GLOBALV SELECT CENV SETL' n c
exit rc

View File

@ -1,4 +1,4 @@
.cm last change by lynx -- may 93
.cm last change by lynx -- nov 94
_______
*|^^^^^^^|* The Internet Relay Chat client
@ -7,89 +7,90 @@
^^^^^^^
Special features of rxIRC:
Variables:
| rxIRC has it's own particular implementation of variables. You can
| set variables with /set or /expr, then use them anywhere within a
| command line like this:
|
| set c #rxIRC
| join $c
| expr date date()
| echo $(date)
| set helpkey 1
| pf$(helpkey) immed /help
|
| Note how you can use variables even within command names. Variables
| can be used with or without the braces. However, without braces only
| the first character is considered part of the name. So 'echo $date'
| will probably only output 'ate' since '$d' is not defined yet.
| This is compatible to the way the make program handles variables.
|
| With rxIRC variable names are case sensitive!
|
| rxIRC provides a set of predefined variables which is compatible
| to ircII. Here goes a list:
| $, the nickname that last sent you a message, notice or invitation
| $: the nickname that last joined your channel
| $A your current away message
| $C your current channel (or rather 'target' in rxIRC-speak)
| $H last protocol command or numeric received
| $I channel you were invited to last
| $K the command character (usually '/')
| $N your IRC nickname
| $Q current query nickname
| $S current IRC server's name
| $T your query partner, if you are in a query, or otherwise
| your target (channel usually)
| $V rxIRC version
| $Z current time
| $$ the $ symbol itself
rxIRC has it's own particular implementation of variables. You can
set variables with /set or /expr, then use them anywhere within a
command line like this:
set c #rxIRC
join $c
expr date date()
echo $(date)
set helpkey 1
pf$(helpkey) immed /help
Note how you can use variables even within command names. Variables
can be used with or without the braces. However, without braces only
the first character is considered part of the name. So 'echo $date'
will probably only output 'ate' since '$d' is not defined yet.
This is compatible to the way the make program handles variables.
With rxIRC variable names are case sensitive!
rxIRC provides a set of predefined variables which is compatible
to ircII. Here goes a list:
$, the nickname that last sent you a message, notice or invitation
$: the nickname that last joined your channel
$A your current away message
$C your current channel (or rather 'target' in rxIRC-speak)
$H last protocol command or numeric received
$I channel you were invited to last
$K the command character (usually '/')
$N your IRC nickname
$Q current query nickname
$S current IRC server's name
$T your query partner, if you are in a query, or otherwise
your target (channel usually)
| $U URL of your builtin httpd, if active
$V rxIRC version
$Z current time
$$ the $ symbol itself
Multiple commands:
| You can execute multiple commands in a row by putting '::' between them.
| Like this:
| /smile::grin::giggle
|
| Notice how the slash is valid for all three of the commands!
| You need not and may not call something like "/smile::/grin".
You can execute multiple commands in a row by putting '::' between them.
Like this:
/smile::grin::giggle
Notice how the slash is valid for all three of the commands!
You need not and may not call something like "/smile::/grin".
Bitnet support:
| rxIRC now fully supports BITNET messaging, first you have the /tell
| and /yell commands for traditional way of sending bitnet messages,
| but you also have /msg +nickname (or /query +nick, /target +nick).
| When a message target begins with a leading plus sign, rxIRC will
| not send the message to IRC, but instead send it to the BITNET
| user specified. So you can easily query a bitnet user with /query +.
|
| BITnet message receivers can be specified by nickname from NAMES
| file or with <userid>@<node> or '<userid> at <node>' or <local_userid>.
|
| rxIRC handles incoming BITnet messages properly and will
| display them as neat as possible. It also checks for /ignore
| by both nickname and userid@node. If you are /away, also bitnet
| users are informed of this when they talk to you.
|
| rxIRC is capable of sending messages over alternative routes
| than BITnet allows by default. To achieve this you need to
| specify "via <node>" at the beginning of a message and all following
| messages will be forwarded through that node. For instance:
|
| /m +strange via psuvm hello!
|
| This will send 'hello!' first to PSUVM which then forwards it to MAINE.
|
| You can also generate local CP SMSG or CP SEND by specifying "smsg" or
| "send" as arguments to "via".
| You can remove a 'via' redirection with "via none".
| You can set up different via's for each userid@node.
|
| To speed up operation, rxIRC keeps internal mappings from nickname to
| userid@node and from userid@node to nickname. That is, your NAMES file
| is only queried once. So should you change the userid@node information
| in your NAMES file from within rxIRC for a nickname that has already
| been read in, you'll have to restart rxIRC.
rxIRC now fully supports BITNET messaging, first you have the /tell
and /yell commands for traditional way of sending bitnet messages,
but you also have /msg +nickname (or /query +nick, /target +nick).
When a message target begins with a leading plus sign, rxIRC will
not send the message to IRC, but instead send it to the BITNET
user specified. So you can easily query a bitnet user with /query +.
BITnet message receivers can be specified by nickname from NAMES
file or with <userid>@<node> or '<userid> at <node>' or <local_userid>.
rxIRC handles incoming BITnet messages properly and will
display them as neat as possible. It also checks for /ignore
by both nickname and userid@node. If you are /away, also bitnet
| users are informed of this when they talk to you, but only once.
rxIRC is capable of sending messages over alternative routes
than BITnet allows by default. To achieve this you need to
specify "via <node>" at the beginning of a message and all following
messages will be forwarded through that node. For instance:
/m +strange via psuvm hello!
This will send 'hello!' first to PSUVM which then forwards it to MAINE.
You can also generate local CP SMSG or CP SEND by specifying "smsg" or
"send" as arguments to "via".
You can remove a 'via' redirection with "via none".
You can set up different via's for each userid@node.
To speed up operation, rxIRC keeps internal mappings from nickname to
userid@node and from userid@node to nickname. That is, your NAMES file
is only queried once. So should you change the userid@node information
in your NAMES file from within rxIRC for a nickname that has already
been read in, you'll have to restart rxIRC.
Escape characters:
There are two escape characters in rxIRC. One is the rxIRC command
character, which is by default a slash ('/'). Two is the CMS command
@ -101,7 +102,7 @@ Default PF keys:
your normal CMS PF setup works also within rxIRC, unless you redefine
keys during your rxIRC session. When leaving, rxIRC puts the PF key
settings back as they were before (or almost).
Special commands of rxIRC:
/ABort
@ -109,53 +110,53 @@ Special commands of rxIRC:
connection. Use this only when you can't get out with /bye.
/ALias [<alias name> [[<argument catchers>] <command string>]]
| You may create your own abbreviations for simple or complex commands.
| Commands may not contain the command char. Multiple commands can be
| specified by separating them with '::'. User-provided arguments can be put
| into variables by writing as many '%<var>' as you need in front of the
| command string. Alias names are case insensitive.
|
| Some examples:
| alias ni msg nickserv@service.de
| This will convince rxIRC to send a message to NickServ with /ni <msg>.
|
| alias date expr date date()::echo $(date)
| This makes rxIRC output today's date. Notice how I first used the
| /expr command, then the /echo command.
|
| alias ctoggle %k %c pf$k imm /toggle $k |join $c|part $c
| This allows you to setup a PF key to join or leave a channel
| alternatingly simply by typing "/ctoggle 9 #PartyZone".
| Notice how it catches the two arguments and puts it into $k and $c.
| Then it calls pf$k which in our case is 'PF9', the rxIRC command
| to setup the PF9 key. The key then will immediately perform
| "/toggle 9 |join #PartyZone|part #PartyZone" which takes
| care of the alternating impact of the pf9 key. See /toggle for details.
|
| alias sgg smile::grin::giggle
| /alias is treated differently from all other commands, in the sense
| that the line following /alias is not preprocessed as usual.
| This means $(variable) is only replaced _when_ the alias is actually
| used, not when you define it. Also you can specify multiple commands
| within an alias by putting '::' between them. The commands will be
| executed in a row as soon as the alias is used.
|
| alias sgg
| Using /alias with just one argument will display the definition of
| that particular alias.
|
| alias
| Using /alias without arguments will list the aliases.
|
| Note: I have not provided a command to un-alias an alias as it's
| not really needed.
You may create your own abbreviations for simple or complex commands.
Commands may not contain the command char. Multiple commands can be
specified by separating them with '::'. User-provided arguments can be put
into variables by writing as many '%<var>' as you need in front of the
command string. Alias names are case insensitive.
Some examples:
alias ni msg nickserv@service.de
This will convince rxIRC to send a message to NickServ with /ni <msg>.
alias date expr date date()::echo $(date)
This makes rxIRC output today's date. Notice how I first used the
/expr command, then the /echo command.
alias ctoggle %k %c pf$k imm /toggle $k |join $c|part $c
This allows you to setup a PF key to join or leave a channel
alternatingly simply by typing "/ctoggle 9 #PartyZone".
Notice how it catches the two arguments and puts it into $k and $c.
Then it calls pf$k which in our case is 'PF9', the rxIRC command
to setup the PF9 key. The key then will immediately perform
"/toggle 9 |join #PartyZone|part #PartyZone" which takes
care of the alternating impact of the pf9 key. See /toggle for details.
alias sgg smile::grin::giggle
/alias is treated differently from all other commands, in the sense
that the line following /alias is not preprocessed as usual.
This means $(variable) is only replaced _when_ the alias is actually
used, not when you define it. Also you can specify multiple commands
within an alias by putting '::' between them. The commands will be
executed in a row as soon as the alias is used.
alias sgg
Using /alias with just one argument will display the definition of
that particular alias.
alias
Using /alias without arguments will list the aliases.
Note: I have not provided a command to un-alias an alias as it's
not really needed.
/CAtalog
| This command will show you a compact list of all channel names that have at
| least 5 persons on them. Unfortunately it takes quite some time to perform
| as it has to process a lot of data from the IRC server before being able
| to display the collected information.
This command will show you a compact list of all channel names that have at
least 5 persons on them. Unfortunately it takes quite some time to perform
as it has to process a lot of data from the IRC server before being able
to display the collected information.
/Channel <new channel>
This command will automatically /part you from your previous channel
before joining this new channel. If you don't want to get confused
@ -163,9 +164,9 @@ Special commands of rxIRC:
Without argument it will tell you what channel you are on.
/CHOP <nickname> [<nickname> [<nickname>]]
| Make people channel operators of the current channel.
| A shorthand for "/mode $C +o <nickname>"
Make people channel operators of the current channel.
A shorthand for "/mode $C +o <nickname>"
/CLear
Clear the screen. Just in case you're not used to hitting PA2.
@ -173,88 +174,108 @@ Special commands of rxIRC:
Use another character than '/' to introduce commands.
/DEscribe <target> <description>
| This command generates a CTCP ACTION description like /ME and the
| other action commands, but you can specify where to send it to.
| Target can be a nickname or a channel, not a bitnet user of course.
This command generates a CTCP ACTION description like /ME and the
other action commands, but you can specify where to send it to.
Target can be a nickname or a channel, not a bitnet user of course.
/ECHO <text>
| Display a line of text to the screen. Typically used combined with
| variables like this:
| expr t left(time(),5)
| echo The time is $t
Display a line of text to the screen. Typically used combined with
variables like this:
expr t left(time(),5)
echo The time is $t
/Execute <command> or more easily just: !<command>
You can execute CMS commands with this, but remember not to stay too
long outside IRC or the IRC-server will most likely close your connection.
/EXPOrt <filemasks>
| With this command you define which files can be accessed via WWW if you
| activate the builtin httpd, using a <filename>.<filetype> notation as is
| visible from WWW (hello.html being the file HELLO HTML *). Typical usage
| is "/export *.html", remember that index.html is the file that is loaded
| first when a user inspects your WWW server.
/EXPRession <varname> <rexx expression>
| This allows you to store the value of a rexx expression into a variable.
| You can use RexX builtin functions such as substr(), words() giving you
| a quite powerful medium to operate on variables.
| Some examples:
| expr time time()
| expr t left('$(time)',5)
| echo $t
| Notice the trick that makes the contents of $(time) a valid rexx
| string by putting '' around it.
This allows you to store the value of a rexx expression into a variable.
You can use RexX builtin functions such as substr(), words() giving you
a quite powerful medium to operate on variables.
Some examples:
expr time time()
expr t left('$(time)',5)
echo $t
Notice the trick that makes the contents of $(time) a valid rexx
string by putting '' around it.
/Follow
If you have just been invited to a channel this is an easier way to
join it. rxIRC will remember the name of the channel for you.
/IF <rexx condition expression> THEN <command>
| This will make rxIRC perform <command> only when <condition> is met.
| The <condition> must not contain spaces, in exchange it may contain
| RexX builtin function.. you can even make floating point calculus!
| Here goes an example:
| expr a 5/2
| if 2*$a=5 then echo People really win on IRC!
/IGnore <nickname>|<address-mask> [<more arguments>]
This will make rxIRC perform <command> only when <condition> is met.
The <condition> must not contain spaces, in exchange it may contain
RexX builtin function.. you can even make floating point calculus!
Here goes an example:
expr a 5/2
if 2*$a=5 then echo People really win on IRC!
/IGnore [ <nickname>|<address-mask> ] [ <more...> ]
If you don't want to receive a person's messages, you can use /ignore
on him. Use it again to remove the /ignore. Without arguments you
| get the list of people being ignored by you. The ignore function
| catches /msg's, /notice's and bitnet messages from the specified
get the list of people being ignored by you. The ignore function
catches /msg's, /notice's and bitnet messages from the specified
nickname. It also sends a notice back to the sender telling him that
you are not receiving his messages unless you specify it to be silent with
| the rxIRC option "(Quiet". An <address-mask> is a string that will
| match a set of hosts from whom you don't want to hear anything.
| For example "*.ais.org" will keep any message from a user of that
| organization away from you. You can apply this to BITnet nodes aswell.
the rxIRC option "(Quiet". An <address-mask> is a string that will
match a set of hosts from whom you don't want to hear anything.
For example "*.ais.org" will keep any message from a user of that
organization away from you. You can apply this to BITnet nodes aswell.
/INTerpret <rexx statement>
| This will simply execute a RexX statement. A command for hackers.
This will simply execute a RexX statement. A command for hackers.
/Invite <nickname> [<channel>]
| I made the channel argument optional. "/i lynx" will invite me to
| your current channel without hassle.
I made the channel argument optional. "/i lynx" will invite me to
your current channel without hassle.
/K <nickname>
| The quick way to kick somebody off a channel. This is a shorthand
| for /kick $C <nickname>
The quick way to kick somebody off a channel. This is a shorthand
for /kick $C <nickname>
/LAstlog [<number of lines>]
This shows you the last messages you received, usually 12 lines, but
you can request more (up to 50) or less.
/LIst
Shows a list of channel names, number of users and topic.
| There must be at least 8 people on the channel for it to be listed,
There must be at least 8 people on the channel for it to be listed,
unless you are running in LIST_ALL mode (See options in SYNTAX).
/Localwho (you may as well type /LCL)
| Shows you a list of IRC users that are from the same site as you or
| are using an IRC server which runs at your institution.
Shows you a list of IRC users that are from the same site as you or
are using an IRC server which runs at your institution.
/LOgging [ON | OFF]
You can switch the logging on and off. That means you get a transcription
of your IRC session into the file IRC LOG A0 on disk.
/NAmes
| Shows a list of channels and people on them, but only those channels
| that have at least 7 visible persons aboard. This should be modified into
| something more flexible but for now it's like this. See also: /cat
Shows a list of channels and people on them, but only those channels
that have at least 7 visible persons aboard. This should be modified into
something more flexible but for now it's like this. See also: /cat
/NF [ <nicknames> ]
| Short form of /notify
/NOTIFy [ <nicknames> ]
| With this command you can tell rxIRC to watch out for certain people to
| show up on IRC. You will be informed within one minute when they sign on.
| Using /notify on the nickname again will remove it from the list.
/OMit [ <nickname>|<address-mask> ] [ <more...> ]
| This one lets you filter the communication on a channel by leaving the
| lines out that were typed by people you aren't listening to anyway.
| So it's much like an /ignore for channel talk.
/Query [ <nickname> | <channel> ]
You can get into a dialogue mode with a person, all lines you type are
sent as private message to this person. If you want to talk onto a
@ -263,11 +284,11 @@ Special commands of rxIRC:
If you want to use #-type channels you need to /query those, too.
/PF<n> <mode> <string>
| You can use /pf1 through /pf24 to setup your PF keys. This command is
| actually nothing but a short form of !cp set pf<n> <mode> <string>
| so better refer to the CP SET manual for details on usage.
| Ok, I will resume: <mode> can either be IMMediate or DELayed.
You can use /pf1 through /pf24 to setup your PF keys. This command is
actually nothing but a short form of !cp set pf<n> <mode> <string>
so better refer to the CP SET manual for details on usage.
Ok, I will resume: <mode> can either be IMMediate or DELayed.
/Reply
This is a shortcut to get into a /query with the person that last sent
you a message, notice or invitation.
@ -278,42 +299,43 @@ Special commands of rxIRC:
automatically respond as does rxIRC when it gets such a request.
/SAY <words>
| Speaks to the channel. Useful for aliases and source-scripts.
Speaks to the channel. Useful for aliases and source-scripts.
/SErver <address> [ <port> [ <timeout> ] ]
Switch to another IRC server. rxIRC will exit if the server does not
respond.
/SET [<variable> [<value>]]
| Set or query the contents of a variable, or if used without arguments,
| give a listing of all user-defined variables.
Set or query the contents of a variable, or if used without arguments,
give a listing of all user-defined variables.
/SKIP <number_of_lines>
| Tell rxIRC to skip the next <number> of lines of the file being
| sourced. Meaningless to be entered interactively. Lookup up /source
| for a practical example of skip's use.
Tell rxIRC to skip the next <number> of lines of the file being
sourced. Meaningless to be entered interactively. Lookup up /source
for a practical example of skip's use.
/SOurce <filename>
| Looks for a file called '<filename> RXIRC *' on all linked disks,
| then attempts to read it and execute it line by line.
| /source profile is automatically executed when you start up rxIRC.
| Lines are always treated as commands. The commands may not have the
| leading command character (the slash). Multiple commands can be specified
| in one line separated by '::' and lines can be indented.
| Especially interesting for scripts are the commands /if, /skip, /stop.
| For instance like this:
|
| expr month word(date(),2)
| if word(date(),1)/=1 then skip 2
| echo Hey! Today is the 1st of $(month)!
| skip 1
| echo Today is just another day of $(month)...
| echo Anyway.. what I really wanted to say...
|
| This shows how to make an if-then-else construct in an rxIRC script
| in a pretty assembler-like manner.. ;)
| Indenting improves readability slightly.
Looks for a file called '<filename> RXIRC *' on all linked disks,
then attempts to read it and execute it line by line.
/source PROFILE is automatically executed when you start up rxIRC,
| /source CONNECT right after you have connected to the server.
Lines are always treated as commands. The commands may not have the
leading command character (the slash). Multiple commands can be specified
in one line separated by '::' and lines can be indented.
Especially interesting for scripts are the commands /if, /skip, /stop.
For instance like this:
expr month word(date(),2)
if word(date(),1)/=1 then skip 2
echo Hey! Today is the 1st of $(month)!
skip 1
echo Today is just another day of $(month)...
echo Anyway.. what I really wanted to say...
This shows how to make an if-then-else construct in an rxIRC script
in a pretty assembler-like manner.. ;)
Indenting improves readability slightly.
/STatus
This outputs some of rxIRC's variables, tells you what channel you are
talking to (Target), what query, where you got invited to last and who
@ -321,12 +343,12 @@ Special commands of rxIRC:
It also shows a /whois of yourself.
/STOP
| This command only makes sense within scripts. It stops rxIRC from
| executing scripts any longer. Might be useful combined with /if.
This command only makes sense within scripts. It stops rxIRC from
executing scripts any longer. Might be useful combined with /if.
/T <topic>
| Set a topic on the current channel. Shorthand for "/topic $C <topic>".
Set a topic on the current channel. Shorthand for "/topic $C <topic>".
/TAlkto <new target>
This is the ONLY command to allow you to switch to another channel when
you are on multiple channels! You can NOT use /join for that.
@ -337,64 +359,64 @@ Special commands of rxIRC:
command.
/TCPipstatus
| Gives some information about your connection to IRC. The number of bytes
| in the input buffer might be interesting. If there are any, then your
| connection to the server is probably suffering from netlag.
Gives some information about your connection to IRC. The number of bytes
in the input buffer might be interesting. If there are any, then your
connection to the server is probably suffering from netlag.
/TEll <nickname>|<user@node>|<user at node> [via <gateway>] message
| Use this command to send a message to a user in BITNet.
| See note about the bitnet support of rxIRC at the top of this file.
Use this command to send a message to a user in BITNet.
See note about the bitnet support of rxIRC at the top of this file.
/TOGgle <key> <c><first command><c><second command>
| This is a tricky feature to allow you to program pf keys with alternating
| function each time you use them. <key> is the number of the pf key.
| <c> is the character used to separate the commands. I use '|' usually.
| Toggle performs <first command>, then sets up PF<key> to call the
| inverted command '/TOGGLE <key> <c><second command><c><first command>'
| Here's one practical example you can include in your PROFILE RXIRC:
|
| pf5 imm toggle 5 |query Nickserv@service.de|query
|
| This will set up the PF05 key to /query or un-/query NickServ.
| Look also for the 'ctoggle' alias described in /alias.
This is a tricky feature to allow you to program pf keys with alternating
function each time you use them. <key> is the number of the pf key.
<c> is the character used to separate the commands. I use '|' usually.
Toggle performs <first command>, then sets up PF<key> to call the
inverted command '/TOGGLE <key> <c><second command><c><first command>'
Here's one practical example you can include in your PROFILE RXIRC:
pf5 imm toggle 5 |query Nickserv@service.de|query
This will set up the PF05 key to /query or un-/query NickServ.
Look also for the 'ctoggle' alias described in /alias.
/Umode <mode switches>
| Change your "mode", that is change some flags in the IRC server
| concerning your connection. See IRC documentation about this.
| This is just a shorthand for "/mode <yournick> <switches>".
Change your "mode", that is change some flags in the IRC server
concerning your connection. See IRC documentation about this.
This is just a shorthand for "/mode <yournick> <switches>".
/UNCHOP <nickname> [<nickname> [<nickname>]]
| Remove channel operatorship of the current channel from some people.
| A shorthand for "/mode $C -o <nickname>"
Remove channel operatorship of the current channel from some people.
A shorthand for "/mode $C -o <nickname>"
/VIewlog
| A handy command to check out today's IRC log.
| Uses the CMS command 'BROWSE'. Hope that one exists on every CMS.
A handy command to check out today's IRC log.
Uses the CMS command 'BROWSE'. Hope that one exists on every CMS.
/WHO [<channel> | <nickname> | <matchstring>]
| The /who command can now be used without arguments, if you are talking
| to a channel, it will show you the WHO list of that channel.
The /who command can now be used without arguments, if you are talking
to a channel, it will show you the WHO list of that channel.
You can match hosts as well as real names with <matchstring>, so
the normal way to get a list of e.g. all italians is to type '/who *.it'.
| The logic that displays WHO output has become very complex (and
| colourful if you have colours by the way). It will display the channel
| information only if it still fits into the line. Also, if there is still
| not enough space, it will truncate the hostname and put an '*' after the
| '@' to indicate that. But it will only truncate the hostname to a certain
| minimum, from then on it will shorten the real name information and
| indicate that with a pair of periods, but that only happens in extreme
| cases. /who should always give you as much info as possible without
| wrapping lines. If you however do need more info don't forget about /whois.
The logic that displays WHO output has become very complex (and
colourful if you have colours by the way). It will display the channel
information only if it still fits into the line. Also, if there is still
not enough space, it will truncate the hostname and put an '*' after the
'@' to indicate that. But it will only truncate the hostname to a certain
minimum, from then on it will shorten the real name information and
indicate that with a pair of periods, but that only happens in extreme
cases. /who should always give you as much info as possible without
wrapping lines. If you however do need more info don't forget about /whois.
/Xamine
Quicky to get a /whois of the person that lest sent you a message.
/Yell <arguments>
| This is just like /tell with one little difference. Yell prepends
| your own nickname in front of the message. Use it when it's likely
| that your dialogue partner is not running a message handling program
| and doesn't know your userid by heart.
This is just like /tell with one little difference. Yell prepends
your own nickname in front of the message. Use it when it's likely
that your dialogue partner is not running a message handling program
and doesn't know your userid by heart.
* <remark>
| With this you can add CMS-style comments in your RXIRC source files.
| Lines beginning with * are skipped.
With this you can add CMS-style comments in your RXIRC source files.
Lines beginning with * are skipped.

BIN
vm.modules/rexxwait.vmarc Normal file

Binary file not shown.

101
vm.modules/rxsocket.list Normal file
View File

@ -0,0 +1,101 @@
Filename Filetype FM Format LRecL Date Time Compressed Size
EXTINT52 ASSEMBLE W1 F 80 1993-02-17 11:55:28 6561
RXSOCKET $PACKAGE W1 V 72 1994-01-10 17:10:36 2668
EXTINT52 MODULE W1 F 1360 1993-02-17 11:55:18 1228
RXWSAMPL TIMEFILE W1 V 57 1993-02-17 11:55:04 431
RXWSAMPL EXEC W1 V 73 1994-06-06 21:11:30 2866
REXXWAIT MODULE W1 V -11456 1994-04-15 07:01:03 33148
WNG HELPEVNT W1 V 79 1994-01-10 17:04:48 911
WAIT HELPEVNT W1 V 79 1994-01-10 17:04:47 831
TIME HELPEVNT W1 V 79 1994-01-10 17:04:46 1231
SMSG HELPEVNT W1 V 79 1994-01-10 17:04:45 991
OMSG HELPEVNT W1 V 79 1994-01-10 17:04:44 1551
MSG HELPEVNT W1 V 79 1994-01-10 17:04:43 911
MAIL HELPEVNT W1 V 79 1994-01-10 17:04:42 1071
FILE HELPEVNT W1 V 79 1994-01-10 17:04:40 1391
CONS HELPEVNT W1 V 79 1994-01-10 17:04:37 911
ALL HELPEVNT W1 V 79 1994-01-10 17:04:36 751
EVNTHND HELPMENU W1 V 75 1994-01-10 17:04:48 991
WAIT HELPREXX W1 V 79 1994-01-10 17:05:06 1151
SETVALUE HELPREXX W1 V 79 1994-01-10 17:05:03 911
RESETVAL HELPREXX W1 V 79 1994-01-10 17:05:03 671
QUERYVAL HELPREXX W1 V 79 1994-01-10 17:05:02 991
CTABLE HELPREXX W1 V 79 1994-01-10 17:04:59 1151
CTYPE HELPREXX W1 V 79 1994-01-10 17:05:00 591
EC2AC HELPREXX W1 V 79 1994-01-10 17:05:01 511
AC2EC HELPREXX W1 V 79 1994-01-10 17:04:58 511
REXXWAIT HELPMENU W1 V 75 1994-01-10 17:04:51 1071
REXXWAIT MANUAL W1 V 110 1994-04-15 07:00:52 45429
REXXWAIT MEMO W1 V 76 1993-09-15 09:30:55 4419
RXSOCKET TCPXLATE W1 V 59 1993-02-17 11:53:48 1551
RXSOCKET TCPXLBIN W1 F 256 1993-02-17 11:53:59 757
RSCLIENT EXEC W1 V 72 1993-02-17 11:53:29 2881
RSSERVER EXEC W1 V 72 1993-02-17 11:53:18 4321
RXSSAMPL EXEC W1 V 73 1993-02-17 11:52:50 3210
RESOLVE EXEC W1 V 60 1993-02-17 11:52:33 1038
FINGER EXEC W1 V 82 1995-03-27 08:58:48 2582
DAYTIME EXEC W1 V 82 1993-02-17 12:19:28 2262
ARCHIE EXEC W1 V 94 1995-06-09 17:38:17 7702
RXSOCKET MODULE W1 V -28648 1994-07-01 09:55:53 25201
RXSOCKET MEMO W1 V 74 1993-02-17 21:23:48 8600
RXSOCKET MANUAL W1 V 96 1993-06-04 10:23:03 36004
RXSOCKET SCRIPT W1 V 133 1994-04-20 10:44:15 34194
IMMCMD HELPEVNT W1 V 79 1994-01-12 08:50:31 991
HOLIDAY HELPEVNT W1 V 79 1994-01-12 08:50:11 1151
SOCKET HELPEVNT W1 V 79 1994-01-10 17:04:45 1151
SOCKET HELPREXX W1 V 79 1994-01-10 17:05:04 991
REXXSOCK HELPMENU W1 V 73 1994-01-10 17:04:50 671
RXS028W HELPMSG W1 V 76 1994-01-10 17:04:57 674
RXS012E HELPMSG W1 V 77 1994-01-10 17:04:56 514
RXS008E HELPMSG W1 V 78 1994-01-10 17:04:55 674
RXS004E HELPMSG W1 V 79 1994-01-10 17:04:52 674
WRITE HELPRXSO W1 V 78 1994-01-10 17:06:12 1231
VERSION HELPRXSO W1 V 78 1994-01-10 17:06:11 1071
TERMINAT HELPRXSO W1 V 79 1994-01-10 17:06:10 1311
TAKESOCK HELPRXSO W1 V 78 1994-01-10 17:06:09 1631
SOCKETSE HELPRXSO W1 V 79 1994-01-10 17:06:00 2591
SOCKET HELPRXSO W1 V 77 1994-01-10 17:05:59 1631
SHUTDOWN HELPRXSO W1 V 78 1994-01-10 17:05:59 1151
SETSOCKO HELPRXSO W1 V 78 1994-01-10 17:05:58 1871
SENDTO HELPRXSO W1 V 79 1994-01-10 17:05:57 1471
SEND HELPRXSO W1 V 77 1994-01-10 17:05:56 1391
SELECT HELPRXSO W1 V 78 1994-01-10 17:05:55 1791
RESOLVE HELPRXSO W1 V 77 1994-01-10 17:05:53 1551
RECVFROM HELPRXSO W1 V 78 1994-01-10 17:05:52 1711
RECV HELPRXSO W1 V 78 1994-01-10 17:05:51 1551
READ HELPRXSO W1 V 77 1994-01-10 17:05:49 1471
LISTEN HELPRXSO W1 V 79 1994-01-10 17:05:48 1151
IOCTL HELPRXSO W1 V 78 1994-01-10 17:05:46 1631
INITIALI HELPRXSO W1 V 79 1994-01-10 17:05:45 1711
GIVESOCK HELPRXSO W1 V 78 1994-01-10 17:05:45 1551
GETSOCKO HELPRXSO W1 V 78 1994-01-10 17:05:44 1951
GETSOCKN HELPRXSO W1 V 79 1994-01-10 17:05:32 1151
GETSERVB HELPRXSO W1 V 74 1994-01-10 17:05:32 1231
GETPROTO HELPRXSO W1 V 73 1994-01-10 17:05:31 1071
GETPEERN HELPRXSO W1 V 79 1994-01-10 17:05:29 1071
GETHOSTN HELPRXSO W1 V 76 1994-01-10 17:05:28 991
GETHOSTI HELPRXSO W1 V 79 1994-01-10 17:05:26 991
GETHOSTB HELPRXSO W1 V 77 1994-01-10 17:05:25 1711
GETDOMAI HELPRXSO W1 V 76 1994-01-10 17:05:24 1071
GETCLIEN HELPRXSO W1 V 78 1994-01-10 17:05:23 1311
FCNTL HELPRXSO W1 V 78 1994-01-10 17:05:22 1391
CONNECT HELPRXSO W1 V 79 1994-01-10 17:05:21 1631
CLOSE HELPRXSO W1 V 78 1994-01-10 17:05:19 911
BIND HELPRXSO W1 V 78 1994-01-10 17:05:18 1471
ACCEPT HELPRXSO W1 V 79 1994-01-10 17:05:17 1471
RXSOCKET HELPTASK W1 V 80 1994-01-10 17:06:13 2191
RXSOCKET HOWMVS W1 F 80 1994-06-06 21:17:51 751
RXSOCKET TXTMVS W1 F 80 1994-03-14 14:10:24 57720
WRITESRV EXEC W1 V 115 1993-11-29 12:44:49 3311
TACACSD EXEC W1 V 77 1995-06-09 17:35:30 5358
RACROUTE ASSEMBLE W1 F 1024 1994-09-27 14:08:04 8185
RACROUTE MODULE W1 V 2120 1993-11-08 14:30:55 1684
TALK EXEC W1 V 93 1994-12-07 14:22:05 10087
EC2AC EXEC W1 F 80 1994-08-17 12:39:07 958
AC2EC EXEC W1 F 80 1994-08-17 12:22:55 958
WRITE EXEC W1 V 115 1994-02-16 13:53:35 4111
NFTP EXEC W1 V 95 1993-10-20 16:20:40 4594
TALKD EXEC W1 V 130 1993-07-17 11:11:04 4620
SYSLOGD EXEC W1 V 78 1995-06-09 17:41:32 3708
TCPLOGD NAMES W1 V 75 1995-06-09 17:47:27 985
NFSUTIL EXEC W1 F 80 1995-06-09 17:48:24 20226

609
vm.modules/rxsocket.read-me Normal file
View File

@ -0,0 +1,609 @@
TCP/IP Socket support function for REXX (Rxsocket & Rexxwait)
Arty Ecock <eckcu@cunyvm.cuny.edu>
CUNY
Last revised: 17 February 1993
This file contains tips for converting applications from
RXSOCKET Version 1 to RXSOCKET Version 2.
A word about defaults:
----------------------
RXSOCKET Version 2 reads the TCPIP DATA file in order to establish
non-default values for such things as the TCP/IP server userid,
the Name Server IP addresses to use for name resolution, the local
Domain Origin, Resolver Timeout value, etc.
If the TCPIP DATA file is *NOT* available, the following defaults are
used:
TCPIPuserid TCPIP
HostName (the value returned from the TCPIP server)
DomainOrigin (null string)
NSinterAddr 14.0.0.0
NSportAddr 53
ResolveVia UDP
ResolverTimeout 30
ResolverUdpRetries 1 (not fully supported; soon, though)
The value of "TCPIPuserid" can be overridden by specifying a value for
the fourth argument of an "Initialize" subfunction:
Parse Value Socket('Initialize', 'Test', 40, 'TCPIPTST') With rc ...
-or-
Parse Value Socket('Initialize', 'Test', ,'TCPIPTST') With rc ...
RXSOCKET Version 2 uses a specific hierarchy when searching for an
appropriate set of ASCII/EBCDIC translate tables. Using the example
"Initialize" subfunction above, the following translate tables are
sought: (the first table found is used)
1) "TEST TCPXLBIN *". Note that the socket-set name "Test" has
been upper-cased.
2) If not found, RXSOCKET searches for "userid TCPXLBIN *", where
"userid" is the VM userid using RXSOCKET.
3) If not found, RXSOCKET searches for "STANDARD TCPXLBIN *".
(STANDARD TCPXLBIN is usually supplied with VM TCP/IP on the
TCPMAINT 592 minidisk.)
4) Then "RXSOCKET TCPXLBIN *". These tables are *IDENTICAL* to
the tables that are hard-coded into RXSOCKET.
RXSOCKET TCPXLATE contains the source version of these translate
tables. This file is converted to RXSOCKET TCPXLBIN by using the
CONVXLAT MODULE supplied with TCP/IP (on the TCPMAINT 592 disk).
RXSOCKET TCPXLATE and STANDARD TCPXLATE can be used as templates
for cistomizing your own translate tables.
5) If none of these tables are found, an internal set of ASCII/EBCDIC
translate tables are used.
STANDARD TCPXLBIN is usually suitable for most applications. Problems
with square brackets, for example, can usually be overcome by creating
a customized TCPXLBIN file.
A word about the format of the new result string:
-------------------------------------------------
In RXSOCKET, the result of a SOCKET function call is always a character
string. This string usually contains several items. The first item
will always be a return code value. A return code of "0" indicates that
the function call completed without error. The remaining items in the
result string contain function-specific values.
Example 1:
Parse Value Socket('Initialize', 'Test') With rc sockset count server
might yield:
rc = "0" Return code "0" (Success)
sockset = "Test" The name of this socket-set
count = "40" Default number of sockets available
server = "TCPIP" Default TCP/IP server userid
Example 2:
Call Socket 'Initialize', 'Test'
Parse Var result rc sockset count server
should yield the same values. (Remember that the "result" variable
is set by REXX when you "Call" a REXX function.)
If the return code value is other than "0", an error is indicated. In
such a case, the second item in the result string corresponds to an
"Errno Value" as described in Chapter 3 of the IBM TCP/IP Programmer's
Reference manual. "EBADF", "EWOULDBLOCK", "EFAULT", "ENOPROTOOPT" and
"EINVALIDRXSOCKETCALL" are a few of the possible values. The remaining
items (words) of the result string describe the error in more
understandable terms (I hope).
Examples:
"9 EBADF Bad file number"
"35 EWOULDBLOCK Operation would block"
"36 EINPROGRESS Operation now in progress"
"60 ETIMEDOUT Connection timed out"
"61 ECONNREFUSED Connection refused"
Note that rc=36 is not necessarily an error condition.
"EINPROGRESS" may be returned for certain operations on non-blocking
sockets.
See Chapter 3 of the IBM TCP/IP Programmer's Reference manual for
information on which "Errno Values" correspond to which socket calls.
Thus, you must take care when parsing the result of a RXSOCKET
subfunction. Using a trailing "." on a "Parse" statement may cause
you to lose the descriptive text in the case of an error.
Example 1:
Parse Value Socket('Close', socket) With rc .
If "rc" was not "0" then the "Errno Value" and descriptive text of
the error will be lost.
Example 2:
Parse Value Socket('Close', socket) With rc rest
In this case, the "rest" variable will contain both
"Errno Value" and descriptive text when rc is not "0".
Example 3:
Parse Value Socket('Close', socket) With result
Parse Var result rc .
If rc^=0 Then Do
Parse Var result errno errno_value errno_text
...
End
-or-
Call Socket 'Close', socket
Parse Var result rc .
If rc^=0 Then Do
Parse Var result errno errno_value errno_text
...
End
This is fine if you like to use many "Parse" statements.
Example 4:
Parse Value Socket('Close', socket) With result
If Word(result,1)^=0 Then Do
Say TcpError("Error during Close")
Call Exit
End
-or-
Parse Value Socket('Close', socket) With rc .
If rc^=0 Then Do
Say TcpError("Error during Close")
Call Exit
End
The former is nice, but the latter is my personal favorite.
The "TcpError" call in this example would yield:
"Error during Close:" errno_text
where "errno_text" is the descriptive text associated with the
errno value.
Example:
"Error during Close: Bad file number"
There's also less parsing, fuss, and mess with this example.
Comparison of RXSOCKET Version 2 functions to Version 1
-------------------------------------------------------
The Version 2 function and result string will be listed first,
followed by the Version 1 function call.
function: Socket('Initialize', subtaskid, <maxdesc>, <serverid>)
result: rc subtaskid maxdesc serverid
Version1: rc = Socket('Initialize', subtaskid, serverid, maxdesc)
Note: "maxdesc" and "serverid" have swapped places in
RXSOCKET Version 2.
"rc" is no longer set to the "maxdesc" value.
function: Socket('Accept', socket)
result: rc newsocket name
Version1: rc = Socket('Accept', socket, name)
Note: "name" has been moved into the result string.
"name" is now returned as "AF_INET port nnn.nnn.nnn.nnn".
"rc" is no longer set to the "newsocket" number.
function: Socket('Bind', socket, name)
result: rc
Version1: rc = Socket('Bind', socket, name)
Note: "name" is now specified as "AF_INET port ipaddr|hostname"
Examples:
"AF_INET INPORT_ANY CUNYVM"
"AF_INET 123 CUNYVM.CUNY.EDU"
"AF_INET 0 CUNYVM.CUNY.EDU"
"AF_INET 42 128.228.1.2"
"AF_INET 12 INADDR_ANY"
"AF_INET"
"AF_INET 77"
"AF_INET INPORT_ANY INADDR_ANY"
"AF_INET INPORT_ANY ANY"
"AF_INET ANY ANY"
"AF_INET 23 LOOPBACK"
"AF_INET INPORT_ANY INADDR_BROADCAST"
"AF_INET INPORT_ANY BROADCAST"
You get the idea :-)
function: Socket('Close', socket)
result: rc
Version1: rc = Socket('Close', socket)
function: Socket('Connect', socket, name)
result: rc
Version1: rc = Socket('Connect', socket, name)
Note: "name" is now specified as "AF_INET port ipaddr|hostname".
function: Socket('Fcntl', socket, cmd, <data>)
result: rc <data>
Version1: rc = Socket('Fcntl', socket, cmd, data)
Note: "Blocking" and "Non-Blocking" have been added as
permissible values for "data".
"rc" is no longer set to the value of "data" (in the
case of "F_GETFL").
function: Socket('GetClientId', <domain>)
result: rc clientid
Version1: rc = Socket('GetClientId', domain, clientid)
Note: "clientid" has been moved into the result string.
function: Socket('GetDomainName')
result: rc domain
No corresponding RXSOCKET Version 1 subfunction.
The Version 1 GetHostName used to append the domain
origin to the host name. The "GetDomainName" subfunction
has been added to return the domain origin string.
"GetHostName" has been changed to return just the host
name.
function: Socket('GetDTableSize') not implemented in RXSOCKET Version 2
Version1: rc = Socket('GetDTableSize')
The number of sockets for a specified socket set may be
obtained using the "SocketSetStatus" subfunction. The
number of sockets is also returned in the result string
of the "Initialize" subfunction.
function: Socket('GetHostByAddr', ipaddr)
result: rc hostname
Version1: rc = Socket('GetHostByAddr', hostaddr, hostname)
Note: "hostname" has been moved into the result string.
function: Socket('GetHostByName', hostname)
result: rc ipaddr1 ipaddr2 ... ipaddrN
Version1: rc = Socket('GetHostByName', hostname)
Note: "rc" is no longer set to the "ipaddr" value. The
result string may contain a list of "ipaddr" values.
If the specified hostname is not multi-homed, then
a single "ipaddr" value is returned (in the form:
"nnn.nnn.nnn.nnn").
function: Socket('GetHostId')
result: rc ipaddr
Version1: rc = Socket('GetHostId')
Note: "rc" is no longer set to the "ipaddr" value.
"ipaddr" is returned in the form "nnn.nnn.nnn.nnn".
function: Socket('GetHostName')
result: rc hostname
Version1: rc = Socket('GetHostName', hostname)
Note: "hostname" has been moved into the result string.
"hostname" is returned as the "HostName" value from
TCPIP DATA (or the value obtained from the TCPIP
server) *WITHOUT* the Domain Origin string appended.
function: Socket('GetPeerName', socket)
result: rc name
Version1: rc = Socket('GetPeerName', socket, name)
Note: "name" has been moved into the result string.
"name" is now returned as "AF_INET port nnn.nnn.nnn.nnn".
function: Socket('GetProtoByName', protocol_name)
result: rc protocol_number
No corresponding RXSOCKET Version 1 subfunction.
function: Socket('GetProtoByNumber', protocol_number)
result: rc protocol_name
No corresponding RXSOCKET Version 1 subfunction.
function: Socket('GetServByName', service_name, <service_protocol>)
result: rc service_name service_port service_protocol
No corresponding RXSOCKET Version 1 subfunction.
*All* values listed in RFC1340 for "service_name" are
supported. See "well known ports" in RFC1340.
function: Socket('GetServByPort', service_port, <service_protocol>)
result: rc service_name service_port service_protocol
No corresponding RXSOCKET Version 1 subfunction.
*All* values listed in RFC1340 for "service_port" are
supported. See "well known ports" in RFC1340.
function: Socket('GetSockName', socket)
result: rc name
Version1: rc = Socket('GetSockName', socket, name)
Note: "name" has been moved into the result string.
"name" is now returned as "AF_INET port nnn.nnn.nnn.nnn".
function: Socket('GetSockOpt', socket, level, optname)
result: rc optval
Version1: rc = Socket('GetSockOpt', socket, level, optname, optval)
Note: "optval" has been moved into the result string.
Values for "optval" are now returned in a more
human-usable format.
function: Socket('GiveSocket', socket, clientid)
result: rc
Version1: rc = Socket('GiveSocket', socket, clientid)
Note: This subfunction now works.
"clientid" is now specified as "AF_INET subtaskid userid".
function: Socket('Ioctl', socket, cmd, <data>)
result: rc <data>
Version1: rc = Socket('Ioctl', socket, cmd, data)
Note: This subfunction now works.
Values for "data" are now accepted and returned in a
more human-usable format.
function: Socket('Listen', socket, <backlog>)
result: rc
Version1: rc = Socket('Listen', socket, backlog)
Note: "backlog" now defaults to "10".
function: Socket('Path') removed from RXSOCKET Version 2
Version1: rc = Socket('Path', subtaskid)
Note: This function has been renamed to "SocketSet".
function: Socket('Read', socket, <length>)
result: rc length data
Version1: rc = Socket('Read', socket, data, length)
Note: "rc" is no longer set to the number of bytes read.
"length" defaults to "10000", with a maximum value
of "100000".
"data" has been moved into the result string.
function: Socket('Recv', socket, <length>, <flags>)
result: rc length data
Version1: rc = Socket('Recv', socket, data, length, flags)
Note: "rc" is no longer set to the number of bytes read.
"length" defaults to "10000", with a maximum value
of "100000".
"data" has been moved into the result string.
"flags" may now contain more than a single value.
function: Socket('RecvFrom', socket, <length>, <flags>)
result: rc name length data
Version1: rc = Socket('RecvFrom', socket, data, length, flags, name)
Note: "rc" is no longer set to the number of bytes read.
"length" defaults to "10000", with a maximum value
of "100000".
"data" has been moved into the result string.
"name" has been moved into the result string.
"flags" may now contain more than a single value.
function: Socket('Resolve', ipaddr|hostname, <timeout>)
result: rc ipaddr hostname
No corresponding RXSOCKET Version 1 subfunction.
Note: I use "Resolve" instead of "GetHostByAddr" and
"GetHostByName" since "Resolve" does not care
whether its input is an IP address or a hostname.
"timeout" allows you to override the "ResolverTimeout"
value in TCPIP DATA.
function: Socket('Select', 'Read n Write n Exception n', <timeout>)
result: rc numready READ n n WRITE n n n EXCEPTION n
Version1: rc = Socket('Select', nfds, rmask, wmask, xmask, timeout)
Note: All the bitmask manipulation functions (FD_SET, FD_CLR,
etc.) have been removed.
Specifying "0" as a value for "n" still refers to the
console ("Read 0" means, "wait for a Console Attention").
REXXWAIT is far superior in function to "Select"
("Wait('Cons Time 5 Seconds Socket' socket 'SMSG')" is
certainly lots more versatile.)
"Select" is handy for applications that don't require
enhanced "wait" facilities.
function: Socket('Send', socket, data, <flags>)
result: rc length
Version1: rc = Socket('Send', socket, data, flags)
Note: "rc" is no longer set to the number of bytes transmitted.
function: Socket('SendTo', socket, data, <flags>, name)
result: rc length
Version1: rc = Socket('SendTo', socket, data, flags, name)
Note: "rc" is no longer set to the number of bytes transmitted.
"name" is now specified as "AF_INET port ipaddr|hostname".
function: Socket('SetSockOpt', socket, level, optname, optval)
result: rc
Version1: rc = Socket('SetSockOpt', socket, level, optname, optval)
Note: "optval" can now be expressed in a more human-usable
format.
An "optname" of "SO_ASCII" indicates that the data
flowing across the socket should be "ASCII". Please
note that RXSOCKET Version 1 used "SO_EBCDIC" for
this purpose. "SO_EBCDIC" now indicates that the
data flowing across the socket is EBCDIC and is to
be treated as such. "So_ASCII" set to "On" forces
data translation to and from EBCDIC (thus allowing
ASCII data to flow across the socket).
function: Socket('ShutDown', socket, <how>)
result: rc
Version1: rc = Socket('ShutDown', socket, how)
Note: "how" now defaults to "BOTH" (instead of "FROM").
function: Socket('Socket', <domain>, <type>, <protocol>)
result: rc newsocket
Version1: rc = Socket('Socket', domain, type, protocol)
Note: "rc" is no longer set to the value of "newsocket".
"domain" defaults to "AF_INET".
"type" defaults to "Sock_Stream".
"protocol" defaults to "IPPROTO_TCP".
function: Socket('SocketSet', <subtaskid>)
result: rc subtaskid
Version1: rc = Socket('Path', subtaskid)
Note: When switching to a new socket set, the name of the
previously active socket set is returned. This makes
it easier to switch back if switching between many
socket sets. If switching between 2 socket sets,
you needn't bother remembering the previously active
socket set name, since RXSOCKET maintains socket sets
on a push-down stack in Least Recently Used order.
function: Socket('SocketSetList')
result: rc subtaskid1 subtaskid2 ... subtaskidN
No corresponding RXSOCKET Version 1 subfunction.
function: Socket('SocketSetStatus', <subtaskid>)
result: rc subtaskid status <connectinfo>|<reason>
No corresponding RXSOCKET Version 1 subfunction.
function: Socket('TakeSocket', clientid, hissocket)
result: rc newsocket
Version1: rc = Socket('TakeSocket', clientid, hissocket)
Note: This subfunction now works.
"rc" is no longer set to the value of "newsocket".
"clientid" is now specified as "AF_INET subtaskid userid".
function: Socket('Terminate', <subtaskid>)
result: rc subtaskid
Version1: rc = Socket('Terminate', subtaskid)
Note: if "subtaskid" is omitted, the "active" socket set
is terminated. In any case, the name of the terminated
socket set is returned in the result string.
function: Socket('Version')
result: rc REXX/SOCKETS version date
rs = Socket('Version')
Note: "rs" is similar in format to the result string.
The associated "version" values. of course, differ.
function: Socket('Write', socket, data)
result: rc length
Version1: rc = Socket('Write', socket, data)
Note: "rc" is no longer set to the number of bytes transmitted.
A word from your sponsors:
--------------------------
Rainer and I worked long and hard on this collaboration. We hope it
was a successful one. We love feedback, comments and suggestions.
I personally prefer chocolate.
Please let us know if you run into any problems with REXX/SOCKETS.
Cheers,
Arty Ecock - CUNY/UCC
Rainer Hauser - IBM, Zurich

BIN
vm.modules/rxsocket.vmarc Normal file

Binary file not shown.