Overview
Comment: | Added start of XVFS system |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
47dcf5fc2766aeff19b726fb8e1b3e03 |
User & Date: | rkeene on 2019-05-01 20:53:31 |
Other Links: | manifest | tags |
Context
2019-05-02
| ||
13:58 | Moved header to template check-in: 303b2de493 user: rkeene tags: trunk | |
2019-05-01
| ||
20:53 | Added start of XVFS system check-in: 47dcf5fc27 user: rkeene tags: trunk | |
20:36 | initial empty check-in check-in: 636592c8e1 user: rkeene tags: trunk | |
Changes
Added lib/minirivet/minirivet.tcl version [88a3db5d6b].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #! /usr/bin/env tclsh namespace eval ::minirivet {} proc ::minirivet::parseString {string} { set fixMap [list] foreach char [list "\{" "\}" "\\"] { lappend fixMap $char "\}; puts -nonewline \"\\$char\"; puts -nonewline \{" } set code "" while {$string ne ""} { set endIndex [string first "<?" $string] if {$endIndex == -1} { set endIndex [expr {[string length $string] + 1}] } append code "puts -nonewline \{" [string map $fixMap [string range $string 0 $endIndex-1]] "\}; " set string [string range $string $endIndex end] set endIndex [string first "?>" $string] if {$endIndex == -1} { set endIndex [expr {[string length $string] + 1}] } set work [string range $string 0 2] if {$work eq "<?="} { set startIndex 3 append code "puts -nonewline [string trim [string range $string 3 $endIndex-1]]; " } else { append code [string range $string 2 $endIndex-1] "\n" } set string [string range $string $endIndex+2 end] } tailcall namespace eval ::request $code } proc ::minirivet::parse {file} { set fd [open $file] set data [read $fd] close $fd tailcall parseString $data } package provide minirivet 1 |
Added lib/minirivet/pkgIndex.tcl version [dbbac7d54f].
> | 1 | package ifneeded minirivet 1 [list source [file join $dir minirivet.tcl]] |
Added lib/xvfs/pkgIndex.tcl version [3f7dc1ca53].
> | 1 | package ifneeded xvfs 1 [list source [file join $dir xvfs.tcl]] |
Added lib/xvfs/xvfs.tcl version [2d70678c88].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | #! /usr/bin/env tclsh namespace eval ::xvfs {} # Functions proc ::xvfs::printHelp {channel {errors ""}} { if {[llength $errors] != 0} { foreach error $errors { puts $channel "error: $error" } puts $channel "" } puts $channel "Usage: dir2c \[--help\] --directory <rootDirectory> --name <fsName>" flush $channel } proc ::xvfs::sanitizeCString {string} { set output [join [lmap char [split $string ""] { if {![regexp {[A-Za-z0-9./-]} $char]} { binary scan $char H* char set char "\\[format %03o 0x$char]" } set char }] ""] return $output } proc ::xvfs::binaryToCHex {binary {prefix ""} {width 10}} { binary scan $binary H* binary set output [list] set width [expr {$width * 2}] set stopAt [expr {$width - 1}] while {$binary ne ""} { set row [string range $binary 0 $stopAt] set binary [string range $binary $width end] set rowOutput [list] while {$row ne ""} { set value [string range $row 0 1] set row [string range $row 2 end] lappend rowOutput "\\x$value" } set rowOutput [join $rowOutput {}] set rowOutput "${prefix}\"${rowOutput}\"" lappend output $rowOutput } if {[llength $output] == 0} { return "${prefix}\"\"" } set output [join $output "\n"] } proc ::xvfs::processFile {fsName inputFile outputFile fileInfoDict} { array set fileInfo $fileInfoDict switch -exact -- $fileInfo(type) { "file" { set type "XVFS_FILE_TYPE_REG" set fd [open $inputFile] fconfigure $fd -encoding binary -translation binary -blocking true set data [read $fd] set size [string length $data] set data [string trimleft [binaryToCHex $data "\t\t\t"]] close $fd } "directory" { set data "NULL" set type "XVFS_FILE_TYPE_DIR" set size "0" } default { return -code error "Unable to process $inputFile, unknown type: $fileInfo(type)" } } puts "\t\{" puts "\t\t.name = \"[sanitizeCString $outputFile]\"," puts "\t\t.type = $type," puts "\t\t.size = $size," puts "\t\t.data = $data" puts "\t\}," } proc ::xvfs::processDirectory {fsName directory {subDirectory ""}} { set subDirectories [list] set outputFiles [list] set workingDirectory [file join $directory $subDirectory] set outputDirectory $subDirectory if {$subDirectory eq ""} { set isTopLevel true } else { set isTopLevel false } if {$isTopLevel} { puts { /* * XXX:TODO: Move this header information */ #include <unistd.h> #include <tcl.h> typedef enum { XVFS_FILE_TYPE_REG, XVFS_FILE_TYPE_DIR } xvfs_file_type_t; typedef Tcl_WideInt xvfs_size_t; struct xvfs_file_data { const char *name; xvfs_file_type_t type; xvfs_size_t size; const unsigned char *data; };} puts "static struct xvfs_file_data xvfs_${fsName}_data\[\] = \{" } # XXX:TODO: Include hidden files ? foreach file [glob -nocomplain -tails -directory $workingDirectory *] { if {$file in {. ..}} { continue } set inputFile [file join $workingDirectory $file] set outputFile [file join $outputDirectory $file] unset -nocomplain fileInfo catch { file lstat $inputFile fileInfo } if {![info exists fileInfo]} { puts stderr "warning: Unable to access $inputFile, skipping" } if {$fileInfo(type) eq "directory"} { lappend subDirectories $outputFile } processFile $fsName $inputFile $outputFile [array get fileInfo] lappend outputFiles $outputFile } foreach subDirectory $subDirectories { lappend outputFiles {*}[processDirectory $fsName $directory $subDirectory] } if {$isTopLevel} { puts "\};" if {0} { puts "" puts "static <type> xvfs_${fsName}_nameToIndex\[\] = \{" foreach outputFile $outputFiles { puts "\t\"$outputFile\"," } puts "\};" } } return $outputFiles } proc ::xvfs::main {argv} { # Main entry point ## 1. Parse arguments if {[llength $argv] % 2 != 0} { lappend argv "" } foreach {arg val} $argv { switch -exact -- $arg { "--help" { printHelp stdout exit 0 } "--directory" { set rootDirectory $val } "--name" { set fsName $val } default { printHelp stderr [list "Invalid option: $arg $val"] exit 1 } } } ## 2. Validate arguments set errors [list] if {![info exists rootDirectory]} { lappend errors "--directory must be specified" } if {![info exists fsName]} { lappend errors "--name must be specified" } if {[llength $errors] != 0} { printHelp stderr $errors exit 1 } ## 3. Start processing directory and producing initial output processDirectory $fsName $rootDirectory set ::xvfs::fsName $fsName set ::xvfs::rootDirectory $rootDirectory } package provide xvfs 1 |
Added xvfs-common.c version [a7ffc6f8bf].
Added xvfs-common.h version [2ead4ff626].
> > > > > > | 1 2 3 4 5 6 | #ifndef XVFS_COMMON_H_1B4B28D60EBAA11D5FF85642FA7CA22C29E8E817 #define XVFS_COMMON_H_1B4B28D60EBAA11D5FF85642FA7CA22C29E8E817 1 #define XVFS_PROTOCOL_VERSION 1 #endif |
Added xvfs-create version [d4bcdb5bcc].
> > > > > > > > > | 1 2 3 4 5 6 7 8 9 | #! /usr/bin/env tclsh set sourceDirectory [file dirname [file normalize [info script]]] lappend auto_path [file join $sourceDirectory lib] set template [file join xvfs.c.rvt] package require minirivet minirivet::parse $template |
Added xvfs.c.rvt version [2a2a28b86b].
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <xvfs-common.h> <? package require xvfs xvfs::main $argv ?> static const char **xvfs_<?= $::xvfs::fsName ?>_getChildren(const char *path, Tcl_WideInt limit) { } static const unsigned char *xvfs_<?= $::xvfs::fsName ?>_getData(const char *path, Tcl_WideInt start, Tcl_WideInt length) { } int Xvfs_<?= $::xvfs::fsName ?>_Init() { // Init->Register("<?= $::xvfs::fsName ?>", XVFS_PROTOCOL_VERSION, xvfs_<?= $::xvfs::fsName ?>_getChildren, xvfs_<?= $::xvfs::fsName ?>_getData) } |