Skip to content

Instantly share code, notes, and snippets.

@sergeykish
Created April 10, 2011 14:18
Show Gist options
  • Save sergeykish/912377 to your computer and use it in GitHub Desktop.
Save sergeykish/912377 to your computer and use it in GitHub Desktop.
access /dev/draw from C, rc, python, ruby, go
# C
% ./8.out
4 1 x8r8g8b8 0 83 41 889 739 83 41 889 739
# rc, message by python
% named-image.rc
close failed: [Errno 12] Invalid argument
5 1 x8r8g8b8 0 83 41 889 739 83 41 889 739
% python named-image.py
27 1 x8r8g8b8 0 333 17 1607 692 333 17 1607 692
# rc, message by ruby
% named-image.rc
8 1 x8r8g8b8 0 83 41 889 739 83 41 889 739
% ruby named-image.rb
26 1 x8r8g8b8 0 14 130 1085 976 14 130 1085 976
# Go
% 8.out
23 1 x8r8g8b8 0 11 17 1322 765 11 17 1322 765
#!/bin/python
import struct
def named_image(id, name):
return 'n' + struct.pack('<IB', id, len(name)) + name + 'v'
name = open('/dev/winname').read()
print named_image(1, name)
class Integer
def to_c
[self].pack('c')
end
def to_v
[self].pack('v')
end
def to_V
[self].pack('V')
end
end
def named_image(id, name)
'n' + id.to_V + name.length.to_c + name + 'v'
end
name = open("/dev/winname").read(64)
print named_image(1, name)
#include <u.h>
#include <libc.h>
#include <draw.h>
void
main(int argc, char*argv [])
{
char buf[128], info[12 * 12 + 1], name[256];
int datafd, ctlfd, namefd;
int count, namelen;
ctlfd = open("/dev/draw/new", ORDWR|OCEXEC);
read(ctlfd, info, sizeof info);
sprint(buf, "/dev/draw/%d/data", atoi(info+0*12));
datafd = open(buf, ORDWR|OCEXEC);
namefd = open("/dev/winname", OREAD);
namelen = read(namefd, name, sizeof name);
buf[0] = 'n';
BPLONG(buf+1, 1);
buf[5] = namelen;
memmove(buf+6, name, namelen);
buf[6+namelen] = 'v';
write(datafd, buf, 6 + namelen + 1);
count = read(ctlfd, info, sizeof info);
print(info);
}
package main
import (
"os"
"strings"
"bytes"
"encoding/binary"
"fmt"
)
func initDraw() (ctl *os.File, data *os.File) {
buf := make([]byte, 12 * 12)
ctl, _ = os.Open("/dev/draw/new", os.O_RDONLY, 0)
ctl.Read(buf)
params := strings.Fields(string(buf))
dirno := params[0]
data, _ = os.Open("/dev/draw/" + dirno + "/data", os.O_RDWR, 0)
return ctl, data
}
func name() []byte {
buf := make([]byte, 256)
f, _ := os.Open("/dev/winname", os.O_RDONLY, 0)
num, _ := f.Read(buf)
buf = buf[:num]
return buf
}
func namedImage(data *os.File, id int, name []byte) {
buf := make([]byte, 0)
message := bytes.NewBuffer(buf)
message.WriteString("n")
binary.Write(message, binary.LittleEndian, uint32(id))
binary.Write(message, binary.LittleEndian, uint8(len(name)))
message.Write(name)
message.WriteString("v")
message.WriteTo(data)
}
func main() {
ctl, data := initDraw()
namedImage(data, 1, name())
buf := make([]byte, 12 * 12)
_, err := ctl.Read(buf)
if err != nil {
fmt.Printf("error: %s\n", err.String())
os.Exit(1)
}
fmt.Printf(string(buf))
}
#!/bin/python
import struct
def named_image(id, name):
return 'n' + struct.pack('<IB', id, len(name)) + name + 'v'
ctl = open('/dev/draw/new', 'r')
conf = ctl.read().split()
dirno = conf[0]
data = open('/dev/draw/'+dirno+'/data', 'r+')
name = open('/dev/winname').read()
data.write(named_image(1, name))
data.flush()
print ctl.read()
class Integer
def to_c
[self].pack('c')
end
def to_v
[self].pack('v')
end
def to_V
[self].pack('V')
end
end
def named_image(id, name)
'n' + id.to_V + name.length.to_c + name + 'v'
end
ctl = open("/dev/draw/new", "r+")
params = ctl.read(12 * 12).split
dirno = params[0].to_i
data = open("/dev/draw/#{dirno}/data", "r+")
name = open("/dev/winname").read(64)
data.write named_image(1, name)
data.flush
puts ctl.read
#!/bin/rc
clonefile=/dev/draw/new
<[4] $clonefile {
conf=`{cat /fd/4 >[2]/dev/null}
id=`{echo $conf | awk '{print $1}'}
data=`{basename -d $clonefile} ^ / ^ $id ^/data
python named-image-message.py >$data
cat /fd/4 >[2]/dev/null
}
6604 ruby Open 0x9bdf4 00181fcc/"/dev/draw/new" 00000002 = 4 "" 0x1213802cb72ccfe8 0x1213802cb748d3c8
6604 ruby Pread 0x9e861 4 0018030c/".........16...........0....x8r8g8b8...........0...........0....." 4096 -0x1 = 144 "" 0x1213802cb78728d0 0x1213802cb7918140
6604 ruby Brk 0x9e404 0018251c 00000000 0009c01b = 0 "" 0x1213802cb7dc2a88 0x1213802cb7dc5198
6604 ruby Open 0x9bdf4 001823a4/"/dev/draw/16/data" 00000002 = 5 "" 0x1213802cb823e1e8 0x1213802cb844f6a8
6604 ruby Open 0x9bdf4 00182094/"/dev/winname" 00000000 = 6 "" 0x1213802cb87f09d8 0x1213802cb8a3cfe8
6604 ruby Brk 0x9e404 00183534 00023b05 0009c075 = 0 "" 0x1213802cb8d678a8 0x1213802cb8d69bd0
6604 ruby Pread 0x9e861 6 0018252c/"window.1.8" 4096 -0x1 = 10 "" 0x1213802cb9303168 0x1213802cb94518f8
6604 ruby Pread 0x9e861 6 0018252c/"" 4096 -0x1 = 0 "" 0x1213802cb98e9190 0x1213802cb9a263c8
6604 ruby Pread 0x9e861 6 0018252c/"" 4096 -0x1 = 0 "" 0x1213802cba0023c8 0x1213802cba1420f8
6604 ruby Brk 0x9e404 00183654 3ffff728 0009c01b = 0 "" 0x1213802cba4f60f0 0x1213802cba4f8800
6604 ruby Brk 0x9e404 0018466c 0011a9f4 0009c075 = 0 "" 0x1213802cbaa2a558 0x1213802cbaa2cc68
6604 ruby Fstat 0x9d028 00000004 000faae8 00000071 = 82 "" 0x1213802cbaec1238 0x1213802cbaf568d8
6604 ruby Pread 0x9e861 4 /"" 4096 0xffffffffffffffff = -1 "unknown id for draw image" 0x1213802cbb395390 0x1213802cbb446f50
6604 ruby Errstr 0x9f484 0xc3860/"" 128 = 0 "" 0x1213802cbb800538 0x1213802cbb807e50
6604 ruby Errstr 0x9f4d9 0xc3860/"" 128 = 0 "" 0x1213802cbbc090a8 0x1213802cbbc0ea80
6604 ruby Pread 0x9e861 4 /"" 4096 0xffffffffffffffff = -1 "unknown id for draw image" 0x1213802cbbff9960 0x1213802cbc09ea00
6604 ruby Errstr 0x9f484 0xc3860/"" 128 = 0 "" 0x1213802cbc459370 0x1213802cbc45f130
6604 ruby Errstr 0x9f4d9 0xc3860/"" 128 = 0 "" 0x1213802cbc8d8180 0x1213802cbc8ddb58
6604 ruby Brk 0x9e404 0018492c 0000002b 0009c01b = 0 "" 0x1213802cbcc7c390 0x1213802cbcc7e6b8
6604 ruby Brk 0x9e404 00184b24 00000000 0009c01b = 0 "" 0x1213802cbd2b28e0 0x1213802cbd2b4ff0
6604 ruby Brk 0x9e404 00185b3c 00181934 0009c075 = 0 "" 0x1213802cbd74c0b8 0x1213802cbd74e7c8
6604 ruby Brk 0x9e404 00185ccc 001225a0 0009c01b = 0 "" 0x1213802cbdbe1df8 0x1213802cbdbe48f0
6604 ruby Pwrite 0x9e5dd 2 00184b34/"named-image.rb:26:in.`read':.Invalid.argument.-./dev/draw/new.(E" 78 -0x1named-image.rb:26:in `read': Invalid argument - /dev/draw/new (Errno::EINVAL)
= 78 "" 0x1213802cbe05ba00 0x1213802cbe318108
6604 ruby Pwrite 0x9e5dd 2 00184b34/".from.named-image.rb:26." 24 -0x1 from named-image.rb:26
= 24 "" 0x1213802cbe6ff550 0x1213802cbea570b8
6604 ruby Close 0x9e199 6 = 0 "" 0x1213802cbf0357c8 0x1213802cbf145370
6604 ruby Pwrite 0x9e5dd 5 00183664/"n.....window.1.8v" 17 -0x1 = 17 "" 0x1213802cbf5367e0 0x1213802cbf5e58a8
6604 ruby Close 0x9e199 5 = 0 "" 0x1213802cbf976620 0x1213802cbf9f8ff8
6604 ruby Close 0x9e199 4 = 0 "" 0x1213802cbfdac438 0x1213802cbfe52860
6604 ruby Exits 0x9f3cf 000d3e80/"1"cwrite: /proc/6604/syscall: failed 12 bytes: process exited
6632 python Open 0x228045 00395720/"/dev/draw/new" 00000000 = 3 "" 0x1213805f67ab6ac8 0x1213805f67cc4cc0
6632 python Fstat 0x229874 00000003 00474a8c 00000071 = 82 "" 0x1213805f68082510 0x1213805f6811cdb8
6632 python Brk 0x22acd6 00476800 00000000 0022826c = 0 "" 0x1213805f68633590 0x1213805f68636088
6632 python Fstat 0x229874 00000003 00474a8c 00000071 = 82 "" 0x1213805f68b5f528 0x1213805f68bf47e0
6632 python Seek 0x22842b 3ffffbb8 0000000000000003 00000000 = 0 "" 0x1213805f69021570 0x1213805f690253f0
6632 python Seek 0x22842b 3ffffb8c 0000000000000003 00000000 = 0 "" 0x1213805f694632f0 0x1213805f69467558
6632 python Brk 0x22acd6 0047a818 00474a50 002282c6 = 0 "" 0x1213805f698969f8 0x1213805f69899108
6632 python Pread 0x22b14c 3 00402f50/".........18...........0....x8r8g8b8...........0...........0....." 4096 -0x1 = 144 "" 0x1213805f69cd3958 0x1213805f69d72c38
6632 python Pread 0x22b14c 3 /"" 8048 0xffffffffffffffff = -1 "unknown id for draw image" 0x1213805f6a20a4d0 0x1213805f6a2a6100
6632 python Errstr 0x22bd6f 0x36b19c/"" 128 = 0 "" 0x1213805f6a85a060 0x1213805f6a85fe20
6632 python Errstr 0x22bdc4 0x36b19c/"" 128 = 0 "" 0x1213805f6ac9c1c8 0x1213805f6aca1ba0
6632 python Open 0x228045 003d8528/"/dev/draw/18/data" 00000002 = 5 "" 0x1213805f6b1eea90 0x1213805f6b48fc18
6632 python Fstat 0x229874 00000005 00474a8c 00000071 = 83 "" 0x1213805f6b939d90 0x1213805f6b9d32b0
6632 python Open 0x228045 003d8528/"/dev/draw/18/refresh" 00000000 = 6 "" 0x1213805f6be51508 0x1213805f6bfcea98
6632 python Fstat 0x229874 00000006 00474a8c 00000071 = 86 "" 0x1213805f6c363690 0x1213805f6c3fc3e0
6632 python Open 0x228045 00395720/"/dev/winname" 00000000 = 7 "" 0x1213805f6c7e0d30 0x1213805f6c93e6f0
6632 python Fstat 0x229874 00000007 00474a8c 00000071 = 86 "" 0x1213805f6ceeebb8 0x1213805f6cffbc68
6632 python Fstat 0x229874 00000007 00474a8c 00000071 = 86 "" 0x1213805f6d2d6fa0 0x1213805f6d3a0648
6632 python Seek 0x22842b 3ffffbb8 0000000000000007 00000000 = 0 "" 0x1213805f6d988998 0x1213805f6d98df88
6632 python Seek 0x22842b 3ffffb8c 0000000000000007 00000000 = 0 "" 0x1213805f7193d318 0x1213805f71941d50
6632 python Pread 0x22b14c 7 00473920/"window.9.1" 4096 -0x1 = 10 "" 0x1213805f7206b158 0x1213805f721f07d0
6632 python Pread 0x22b14c 7 0047682e/"" 8182 -0x1 = 0 "" 0x1213805f726ed198 0x1213805f728733c8
6632 python Close 0x22aa13 7 = 0 "" 0x1213805f72d18b08 0x1213805f72ea7208
6632 python Brk 0x22acd6 0047b290 0011e56a 0022826c = 0 "" 0x1213805f733843e8 0x1213805f73386ee0
6632 python Fstat 0x229874 00000003 00474a8c 00000071 = 82 "" 0x1213805f73969c40 0x1213805f73a05870
6632 python Seek 0x22842b 3ffffbb8 0000000000000003 00000000 = 0 "" 0x1213805f73eb76e8 0x1213805f73ebbd38
6632 python Seek 0x22842b 3ffffb8c 0000000000000003 00000000 = 0 "" 0x1213805f745c1308 0x1213805f745c5570
6632 python Brk 0x22acd6 0047f2a8 00474a50 002282c6 = 0 "" 0x1213805f74a24f80 0x1213805f74a27690
6632 python Pread 0x22b14c 3 /"" 4096 0xffffffffffffffff = -1 "unknown id for draw image" 0x1213805f74e553c0 0x1213805f74eed940
6632 python Errstr 0x22bd6f 0x36b19c/"" 128 = 0 "" 0x1213805f75381f10 0x1213805f75387cd0
6632 python Errstr 0x22bdc4 0x36b19c/"" 128 = 0 "" 0x1213805f757c4460 0x1213805f757c9e38
6632 python Brk 0x22acd6 004802c0 0004ed2b 002282c6 = 0 "" 0x1213805f75d086b0 0x1213805f75d0b1a8
6632 python Pwrite 0x22aec8 2 0047f2b8/"Traceback.(most.recent.call.last):." 35 -0x1Traceback (most recent call last):
= 35 "" 0x1213805f761553f8 0x1213805f7638b2a8
6632 python Open 0x228045 00414fac/"named-image.py" 00000000 = 7 "" 0x1213805f7678ad90 0x1213805f768cc618
6632 python Pwrite 0x22aec8 2 0047f2b8/"..File."named-image.py",.line.13,.in.<module>." 46 -0x1 File "named-image.py", line 13, in <module>
= 46 "" 0x1213805f76ce62f8 0x1213805f7705e200
6632 python Brk 0x22acd6 004812d8 002213ef 002282c6 = 0 "" 0x1213805f7743ecd0 0x1213805f774417c8
6632 python Pread 0x22b14c 7 004802d0/"#!/bin/python..import.struct..ctl.=.open('/dev/draw/new',.'r').c" 4096 -0x1 = 319 "" 0x1213805f77966230 0x1213805f77a02248
6632 python Pwrite 0x22aec8 2 0047f2b8/"....print.ctl.read()." 21 -0x1 print ctl.read()
= 21 "" 0x1213805f77f15f28 0x1213805f781f6468
6632 python Close 0x22aa13 7 = 0 "" 0x1213805f785e0f60 0x1213805f78673ef0
6632 python Pwrite 0x22aec8 2 0047f2b8/"IOError:.[Errno.12].Invalid.argument." 37 -0x1IOError: [Errno 12] Invalid argument
= 37 "" 0x1213805f78b7fae8 0x1213805f78de8de8
6632 python Close 0x22aa13 6 = 0 "" 0x1213805f7979a120 0x1213805f797a3590
6632 python Close 0x22aa13 3 = 0 "" 0x1213805f7e704e18 0x1213805f7e70ee40
6632 python Pwrite 0x22aec8 5 00473920/"n.....window.9.1v" 17 -0x1 = 17 "" 0x1213805f7eb50bc0 0x1213805f7ec39e38
6632 python Close 0x22aa13 5 = 0 "" 0x1213805f7f055a58 0x1213805f7f104738
6632 python Exits 0x22bcba 0036fe2c/"1"cwrite: /proc/6632/syscall: failed 12 bytes: process exited
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment