[Libguestfs] Proposed new file apis

Richard W.M. Jones rjones at redhat.com
Mon Aug 23 16:04:57 UTC 2010


On Mon, Aug 23, 2010 at 04:58:38PM +0100, Matthew Booth wrote:
> On 23/08/10 16:23, Richard W.M. Jones wrote:
> >BTW you need two spaces after full stops.
> 
> Out of curiosity is that a technical or a stylistic requirement?
> Stylistically, double spaces after a full stop have always seemed
> anachronistic to me.

It's a stylistic one.

> >>>  +hpread returns a NULL C<content>  on error.");
> >>>  +
> >>>  +  ("hwrite", (RErr, [Int "handle"; BufferIn "content"]), 273,
> >>>  +   [ProtocolLimitWarning], [],
> >>>  +   "write data to an open handle",
> >>>  +   "\
> >>>  +This command writes all the data in C<content>  to C<handle>. It
> >>>  +returns an error if this fails.");
> >So we're definitely disallowing partial writes, even though in some
> >future version we might allow writes to non-file handles?  This API
> >won't allow partial writes.
> 
> Yes. I think reads and writes are quite different in this respect.
> You always know exactly what you want to write, but you may not know
> what can be read. If this assumption is wrong, now's the time to
> disagree.

I think we should change pwrite in that case.  pwrite only works on
files, and AFAICT there is never a situation where a partial write is
possible for a file, so we should turn pwrite into a full write and
change the documentation accordingly.

> >>>  +  ("hpwrite", (RErr, [Int "handle"; BufferIn "content"]), 274,
> >>>  +   [ProtocolLimitWarning], [],
> >>>  +   "write data to an open handle at a specific offset",
> >>>  +   "\
> >>>  +This command writes all the data in C<content>  to C<handle>,
> >>>  +starting at C<offset>  bytes from the beginning of the file. It
> >>>  +returns an error if this fails.");
> >The offset is missing from the API.
> 
> Oops :)
> 
> >>>  +  ("hseek", (RInt64 "newoffset", [Int "handle"; Int64 "offset";
> >>>  +                                  Int "whence"]), 275, [],
> >>>  +   [],
> >>>  +   "seek on an open handle",
> >>>  +   "\
> >>>  +This command updates the 'current position' in C<handle>. This
> >"current position" doesn't need those extra quotes.
> >
> >>>  +affects the hread and hwrite calls. See L<lseek(3p)>  for details
> >If you're referring to another call, write:
> >
> >... C<guestfs_hread>  and C<guestfs_hwrite>  ...
> >
> >The generator will rewrite this correctly.
> >
> >>>  +of C<offset>  and C<whence>.
> >C<whence>  is presumably 0/1/2?  You should document this, or use a
> >String if you want an enumerated type.
> 
> Are you saying that a String can be magically turned into an
> enumerated type somehow? I was trying to work out how to use an
> enumerated type.

Sadly not.  However we have a long history of using strings instead of
enumerated types throughout the API.  In any case, either 0/1/2 needs
to be documented, or this should be a string.  It should not be an
undocumented int.

> >>>  +On success, hseek returns the new offset from the beginning of
> >>>  +the file. It returns an offset of -1 on failure.");
> >>>  +
> >>>  +  ("htruncate", (RErr, [Int "handle"; Int64 "size"]), 276, [],
> >>>  +   [],
> >>>  +   "truncate a file",
> >>>  +   "\
> >>>  +This command sets the size of the file referred to by C<handle>
> >>>  +to C<size>. If the file was previously larger than C<size>, the
> >>>  +extra data will be lost. If the file was previously smaller than
> >>>  +C<size>, the file will be zero-filled. The latter case will
> >>>  +typically create a sparse file.");
> >Since we already have truncate and allocate calls, I wonder what the
> >benefit is of having handle versions.  I mean, these are extremely
> >infrequent operations compared to hread/hwrite, so I doubt there's any
> >optimization benefit in adding these, and if we add these, why not
> >other very infrequent ops.
> 
> htruncate is required when streaming a file with sparse sections. i.e.
> 
> h = hopen_file("/foo");
> hwrite(h, "foo");
> htruncate(h, hseek(h, 1024, CUR));
> 
> Technically you only need this for a sparse section at the end of a
> file. You could do it by mixing paths and file handles, but that
> would be a bit jarring.

I don't think I understand this.  If you're writing to a file, you can
truncate it once (before any writing) to set its size:

  truncate-size "/output" 100M;
  hopen-file "/output";
  hwrite ...;
  hwrite ...;
  hwrite ...;
  hclose fd;

Why is htruncate needed during writes?

> hallocate is similarly there to avoid a jarring mix of paths and
> file handles when operating on a single file.  I could also add
> fchmod and fchown, I guess. Any more?

My point was we don't need to duplicate all of these.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://et.redhat.com/~rjones/libguestfs/
See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html




More information about the Libguestfs mailing list