| Genezzo documentation | Contained in the Genezzo distribution. |
Genezzo::RawIO - Genezzo Raw IO
Additional file read and write routines for Genezzo.
sysread and syswrite are wrapped by gen_raw_read and gen_raw_write so raw devices can be used.
Performs read identical to sysread, except uses aligned buffer suitable for raw I/O.
Performs write identical to syswrite, except uses aligned buffer suitable for raw I/O.
gen_raw_read, gen_raw_write
Relies on Perl Inline::C module. Code may gracefully compile to empty stubs on non-raw (non-Linux) platforms, but this has not been thoroughly tested.
Eric Rollins, rollins@acm.org
perl(1).
Copyright (c) 2005 Eric Rollins. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Address bug reports and comments to rollins@acm.org
For more information, please visit the Genezzo homepage at http://www.genezzo.com
| Genezzo documentation | Contained in the Genezzo distribution. |
#!/usr/bin/perl # # copyright (c) 2005, Eric Rollins, all rights reserved, worldwide # # use strict; use warnings; package Genezzo::RawIO; use Inline 'C'; require Exporter; Inline->init; # help for "require RawIO" our @ISA = qw(Exporter); our @EXPORT = qw(gnz_raw_read gnz_raw_write); sub gnz_raw_read(*\$$) { my ($filehandle, $scalar, $length) = @_; # return sysread($filehandle, $$scalar, $length); return rawread($filehandle, $$scalar, $length); } sub gnz_raw_write(*$$) { my ($filehandle, $scalar, $length) = @_; # return syswrite($filehandle, $scalar, $length); return rawwrite($filehandle, $scalar, $length); } 1; __DATA__ # Below is stub documentation for your module. You better edit it!
__C__ #include <stdlib.h> #include <unistd.h> #include <string.h> SV* rawread(PerlIO *fp, SV* buf, int count){ #ifdef _GNU_SOURCE int bytes_read = 0; int fd = PerlIO_fileno(fp); char *align_buf = 0; posix_memalign(&align_buf,count,count); bytes_read = read(fd,align_buf,count); if(bytes_read != -1){ sv_setpvn(buf, align_buf, count); } free(align_buf); if(bytes_read != -1){ return newSViv(bytes_read); } #endif return newSV(0); } SV* rawwrite(PerlIO *fp, SV* buf, int count){ #ifdef _GNU_SOURCE char *align_buf = 0; posix_memalign(&align_buf,count,count); int fd = PerlIO_fileno(fp); int buf_len; char *buf_contents = SvPV(buf, buf_len); // assert(count == buf_len); memcpy(align_buf,buf_contents, count); int bytes_written = write(fd, align_buf, count); free(align_buf); if(bytes_written != -1){ return newSViv(bytes_written); } #endif return newSV(0); }