/pliant/linux/kernel/device.pli
 
 1  module "/pliant/language/os.pli" 
 2  module "/pliant/admin/file.pli" 
 3   
 4  function os_mknod pathname mode dev -> err 
 5    arg CStr pathname ; arg Int mode dev ; arg Int err 
 6    kernel_function 14 
 7   
 8  constant os_S_IFCHR 2*8^# 0020000 
 9  constant os_S_IFBLK 6*8^# 0060000 
 10   
 11  public 
 12   
 13  constant kernel_character_device os_S_IFCHR 
 14  constant kernel_bloc_device os_S_IFBLK 
 15   
 16  function kernel_make_device device kind major minor write -> status 
 17    arg Str device ; arg Int kind major minor ; arg CBool write ; arg Status status 
 18    # we create a temporary entry because if we have write access to the device, but no right to create it, we don't want to delete the existing entry before failing to create the new one 
 19    file_tree_create device 
 20    file_delete device+".tmp" 
 21    status := shunt (os_mknod (file_os_name device+".tmp"kind+6*8^2+4*8+major*2^8+minor)=0 success failure 
 22    if status=success 
 23      file_move device+".tmp" device 
 24      if write 
 25        file_rights device undefined undefined 6*8^2+6*8+6 0 
 26   
 27  function kernel_make_device device kind major minor -> status 
 28    arg Str device ; arg Int kind major minor ; arg Status status 
 29    status := kernel_make_device device kind major minor false 
 30   
 31  function kernel_make_device device -> status 
 32    arg Str device ; arg Status status 
 33    var Str name := device (device search_last "/" -1)+device:len 
 34   
 35    if (name parse "hd" any:(var Str drive) (var Int part)) and drive:len=and drive>="a" and drive<="b" and part>=and part<64 
 36      status := kernel_make_device device kernel_bloc_device 3 64*(drive:0:number-"a":number)+part 
 37    eif (name parse "hd" any:(var Str drive) (var Int part)) and drive:len=and drive>="c" and drive<="d" and part>=and part<64 
 38      status := kernel_make_device device kernel_bloc_device 22 64*(drive:0:number-"c":number)+part 
 39    eif (name parse "hde" (var Int part)) and part>=and part<=8 
 40      status := kernel_make_device device kernel_bloc_device 33 part 
 41    eif (name parse "hd" any:(var Str drive)) and drive:len=and drive>="a" and drive<="b" 
 42      status := kernel_make_device device kernel_bloc_device 3 64*(drive:0:number-"a":number) 
 43    eif (name parse "hd" any:(var Str drive)) and drive:len=and drive>="c" and drive<="d" 
 44      status := kernel_make_device device kernel_bloc_device 22 64*(drive:0:number-"c":number) 
 45    eif name="hde" 
 46      status := kernel_make_device device kernel_bloc_device 33 0 
 47    eif (name parse "sd" any:(var Str drive) (var Int part)) and drive:len=and drive>="a" and drive<="p" and part>=and part<16 
 48      status := kernel_make_device device kernel_bloc_device 8 16*(drive:0:number-"a":number)+part 
 49    eif (name parse "sd" any:(var Str drive) (var Int part)) and drive:len=and drive>="q" and drive<="z" and part>=and part<16 
 50      status := kernel_make_device device kernel_bloc_device 65 16*(drive:0:number-"q":number)+part 
 51    eif (name parse "sd" any:(var Str drive)) and drive:len=and drive>="a" and drive<="p" 
 52      status := kernel_make_device device kernel_bloc_device 8 16*(drive:0:number-"a":number) 
 53    eif (name parse "sd" any:(var Str drive)) and drive:len=and drive>="q" and drive<="z" 
 54      status := kernel_make_device device kernel_bloc_device 65 16*(drive:0:number-"q":number) 
 55    eif (name parse "scd" (var Int part)) and part>=and part<256 
 56      status := kernel_make_device device kernel_bloc_device 11 part 
 57    eif (name parse "sg" (var Int part)) and part>=and part<16 
 58      status := kernel_make_device device kernel_character_device 21 part 
 59    eif (name parse "pg" (var Int part)) and part>=and part<4 
 60      status := kernel_make_device device kernel_character_device 97 part 
 61    eif (name parse "fd" (var Int part)) and part>=and part<2 
 62      status := kernel_make_device device kernel_bloc_device 2 part 
 63    eif (name parse "md" (var Int part)) and part>=and part<16 
 64      status := kernel_make_device device kernel_bloc_device 9 part 
 65    eif (name parse "loop" (var Int part)) and part>=and part<8 
 66      status := kernel_make_device device kernel_bloc_device 7 part 
 67   
 68    eif (name parse "tty" (var Int n)) and n>=and n<10 
 69      status := kernel_make_device device kernel_character_device 4 n 
 70    eif (name parse "tty" any:(var Str twin) ) and twin:len=and ((twin:0>="a" and twin:0<="e"or (twin:0>="p" and twin:0<="z")) and ((twin:1>="0" and twin:1<="9"or (twin:1>="a" and twin:1<="f")) 
 71      status := kernel_make_device device kernel_character_device 3 (shunt (twin:0>="a" and twin:0<="e") 176+16*(twin:0:number-"a":number) 16*(twin:0:number-"p":number))+(shunt (twin:1>="0" and twin:1<="9"twin:1:number-"0":number 10+twin:1:number-"a":number) 
 72    eif (name parse "ttyUSB" (var Int n)) and n>=and n<16 
 73      status := kernel_make_device device kernel_character_device 188 n 
 74    eif (name parse "pty" any:(var Str twin) ) and twin:len=and ((twin:0>="a" and twin:0<="e"or (twin:0>="p" and twin:0<="z")) and ((twin:1>="0" and twin:1<="9"or (twin:1>="a" and twin:1<="f")) 
 75      status := kernel_make_device device kernel_character_device 2 (shunt (twin:0>="a" and twin:0<="e") 176+16*(twin:0:number-"a":number) 16*(twin:0:number-"p":number))+(shunt (twin:1>="0" and twin:1<="9"twin:1:number-"0":number 10+twin:1:number-"a":number) 
 76    eif (name parse "vcs" (var Int n)) and n>=and n<64 
 77      status := kernel_make_device device kernel_character_device 7 n 
 78    eif name="tty" 
 79      status := kernel_make_device device kernel_character_device 5 0 
 80    eif name="console" 
 81      status := kernel_make_device device kernel_character_device 5 1 
 82   
 83    eif name="mem" 
 84      status := kernel_make_device device kernel_character_device 1 1 
 85      file_rights device 0 15 0 3*8+7 
 86    eif name="null" 
 87      status := kernel_make_device device kernel_character_device 1 3 true 
 88    eif name="zero" 
 89      status := kernel_make_device device kernel_character_device 1 5 
 90    eif name="random" 
 91      status := kernel_make_device device kernel_character_device 1 8 
 92    eif name="rtc" 
 93      status := kernel_make_device device kernel_character_device 10 135 
 94    eif (name parse "ram" (var Int i))  and i>=and i<=16 
 95      status := kernel_make_device device kernel_bloc_device 1 i 
 96    eif name="raw1394" 
 97      status := kernel_make_device device kernel_character_device 171 0 
 98    eif name="agpgart" 
 99      status := kernel_make_device device kernel_character_device 10 175 
 100    eif (name parse "fb" (var Int n)) and n>=and n<32 
 101      status := kernel_make_device device kernel_character_device 29 n 
 102   
 103    eif name="psaux" 
 104      status := kernel_make_device device kernel_character_device 10 1 
 105    eif name="mice" 
 106      status := kernel_make_device device kernel_character_device 13 63 
 107    eif name="keyboard" 
 108      status := kernel_make_device device kernel_character_device 10 150 
 109    eif (name parse "lp" (var Int i))  and i>=and i<=2 
 110      status := kernel_make_device device kernel_character_device 6 i 
 111    eif (name parse "ttyS" (var Int n)) and n>=and n<64 
 112      status := kernel_make_device device kernel_character_device 4 64+n 
 113    eif (name parse "ircomm" (var Int n)) and n>=and n<16 
 114      status := kernel_make_device device kernel_character_device 161 n 
 115    eif (name parse "irlpt" (var Int n)) and n>=and n<16 
 116      status := kernel_make_device device kernel_character_device 161 16+n 
 117   
 118   
 119    eif name="dsp" 
 120      status := kernel_make_device device kernel_character_device 14 3 
 121    eif (name parse "dsp" (var Int i)) and i>=and i<4 
 122      status := kernel_make_device device kernel_character_device 14 3+i*16 
 123    eif name="mixer" 
 124      status := kernel_make_device device kernel_character_device 14 0 
 125    eif (name parse "mixer" (var Int i)) and i>=and i<4 
 126      status := kernel_make_device device kernel_character_device 14 i*16 
 127   
 128    eif name="ppp" 
 129      status := kernel_make_device device kernel_character_device 108 0 
 130    eif (name parse "ippp" (var Int part)) and part>=and part<64 
 131      status := kernel_make_device device kernel_character_device 45 128+part 
 132    eif name="isdninfo" 
 133      status := kernel_make_device device kernel_character_device 45 255 
 134    eif name="isdnctrl" 
 135      status := kernel_make_device device kernel_character_device 45 64 
 136    eif (name parse "isdnctrl" (var Int part)) and part>=and part<64 
 137      status := kernel_make_device device kernel_character_device 45 64+part 
 138    eif (name parse "rfcomm" (var Int part)) and part>=and part<32 
 139      status := kernel_make_device device kernel_character_device 216 part 
 140   
 141    else 
 142      plugin device 
 143        status := failure