Initial revision
diff --git a/Demo/rpc/rnusersclient.py b/Demo/rpc/rnusersclient.py
new file mode 100644
index 0000000..ed81081
--- /dev/null
+++ b/Demo/rpc/rnusersclient.py
@@ -0,0 +1,81 @@
+# Remote nusers client interface
+
+import rpc
+from rpc import Packer, Unpacker, TCPClient, UDPClient
+
+
+class RnusersPacker(Packer):
+	def pack_utmp(self, ui):
+		ut_line, ut_name, ut_host, ut_time = utmp
+		self.pack_string(ut_line)
+		self.pack_string(ut_name)
+		self.pack_string(ut_host)
+		self.pack_int(ut_time)
+	def pack_utmpidle(self, ui):
+		ui_itmp, ui_idle = ui
+		self.pack_utmp(ui_utmp)
+		self.pack_uint(ui_idle)
+	def pack_utmpidlearr(self, list):
+		self.pack_array(list, self.pack_itmpidle)
+
+
+class RnusersUnpacker(Unpacker):
+	def unpack_utmp(self):
+		ut_line = self.unpack_string()
+		ut_name = self.unpack_string()
+		ut_host = self.unpack_string()
+		ut_time = self.unpack_int()
+		return ut_line, ut_name, ut_host, ut_time
+	def unpack_utmpidle(self):
+		ui_utmp = self.unpack_utmp()
+		ui_idle = self.unpack_uint()
+		return ui_utmp, ui_idle
+	def unpack_utmpidlearr(self):
+		return self.unpack_array(self.unpack_utmpidle)
+
+
+class RnusersClient(UDPClient):
+
+	def addpackers(self):
+		self.packer = RnusersPacker().init()
+		self.unpacker = RnusersUnpacker().init('')
+
+	def init(self, host):
+		return UDPClient.init(self, host, 100002, 2)
+
+	def Num(self):
+		self.start_call(1)
+		self.do_call()
+		n = self.unpacker.unpack_int()
+		self.end_call()
+		return n
+
+	def Names(self):
+		self.start_call(2)
+		self.do_call()
+		list = self.unpacker.unpack_utmpidlearr()
+		self.end_call()
+		return list
+
+	def Allnames(self):
+		self.start_call(3)
+		self.do_call()
+		list = self.unpacker.unpack_utmpidlearr()
+		self.end_call()
+		return list
+
+
+def test():
+	import sys
+	host = ''
+	if sys.argv[1:]: host = sys.argv[1]
+	c = RnusersClient().init(host)
+	list = c.Names()
+	def strip0(s):
+		while s and s[-1] == '\0': s = s[:-1]
+		return s
+	for (line, name, host, time), idle in list:
+		line = strip0(line)
+		name = strip0(name)
+		host = strip0(host)
+		print name, host, line, time, idle