309 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			309 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\" Copyright (c) 2003-2009 Tim Kientzle
 | |
| .\" All rights reserved.
 | |
| .\"
 | |
| .\" Redistribution and use in source and binary forms, with or without
 | |
| .\" modification, are permitted provided that the following conditions
 | |
| .\" are met:
 | |
| .\" 1. Redistributions of source code must retain the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer.
 | |
| .\" 2. Redistributions in binary form must reproduce the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer in the
 | |
| .\"    documentation and/or other materials provided with the distribution.
 | |
| .\"
 | |
| .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 | |
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 | |
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | |
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | |
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | |
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | |
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | |
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
| .\" SUCH DAMAGE.
 | |
| .\"
 | |
| .\" $FreeBSD: head/lib/libarchive/archive_read_disk.3 190957 2009-04-12 05:04:02Z kientzle $
 | |
| .\"
 | |
| .Dd March 10, 2009
 | |
| .Dt archive_read_disk 3
 | |
| .Os
 | |
| .Sh NAME
 | |
| .Nm archive_read_disk_new ,
 | |
| .Nm archive_read_disk_set_symlink_logical ,
 | |
| .Nm archive_read_disk_set_symlink_physical ,
 | |
| .Nm archive_read_disk_set_symlink_hybrid ,
 | |
| .Nm archive_read_disk_entry_from_file ,
 | |
| .Nm archive_read_disk_gname ,
 | |
| .Nm archive_read_disk_uname ,
 | |
| .Nm archive_read_disk_set_uname_lookup ,
 | |
| .Nm archive_read_disk_set_gname_lookup ,
 | |
| .Nm archive_read_disk_set_standard_lookup ,
 | |
| .Nm archive_read_close ,
 | |
| .Nm archive_read_finish
 | |
| .Nd functions for reading objects from disk
 | |
| .Sh SYNOPSIS
 | |
| .In archive.h
 | |
| .Ft struct archive *
 | |
| .Fn archive_read_disk_new "void"
 | |
| .Ft int
 | |
| .Fn archive_read_disk_set_symlink_logical "struct archive *"
 | |
| .Ft int
 | |
| .Fn archive_read_disk_set_symlink_physical "struct archive *"
 | |
| .Ft int
 | |
| .Fn archive_read_disk_set_symlink_hybrid "struct archive *"
 | |
| .Ft int
 | |
| .Fn archive_read_disk_gname "struct archive *" "gid_t"
 | |
| .Ft int
 | |
| .Fn archive_read_disk_uname "struct archive *" "uid_t"
 | |
| .Ft int
 | |
| .Fo archive_read_disk_set_gname_lookup
 | |
| .Fa "struct archive *"
 | |
| .Fa "void *"
 | |
| .Fa "const char *(*lookup)(void *, gid_t)"
 | |
| .Fa "void (*cleanup)(void *)"
 | |
| .Fc
 | |
| .Ft int
 | |
| .Fo archive_read_disk_set_uname_lookup
 | |
| .Fa "struct archive *"
 | |
| .Fa "void *"
 | |
| .Fa "const char *(*lookup)(void *, uid_t)"
 | |
| .Fa "void (*cleanup)(void *)"
 | |
| .Fc
 | |
| .Ft int
 | |
| .Fn archive_read_disk_set_standard_lookup "struct archive *"
 | |
| .Ft int
 | |
| .Fo archive_read_disk_entry_from_file
 | |
| .Fa "struct archive *"
 | |
| .Fa "struct archive_entry *"
 | |
| .Fa "int fd"
 | |
| .Fa "const struct stat *"
 | |
| .Fc
 | |
| .Ft int
 | |
| .Fn archive_read_close "struct archive *"
 | |
| .Ft int
 | |
| .Fn archive_read_finish "struct archive *"
 | |
| .Sh DESCRIPTION
 | |
| These functions provide an API for reading information about
 | |
| objects on disk.
 | |
| In particular, they provide an interface for populating
 | |
| .Tn struct archive_entry
 | |
| objects.
 | |
| .Bl -tag -width indent
 | |
| .It Fn archive_read_disk_new
 | |
| Allocates and initializes a
 | |
| .Tn struct archive
 | |
| object suitable for reading object information from disk.
 | |
| .It Xo
 | |
| .Fn archive_read_disk_set_symlink_logical ,
 | |
| .Fn archive_read_disk_set_symlink_physical ,
 | |
| .Fn archive_read_disk_set_symlink_hybrid
 | |
| .Xc
 | |
| This sets the mode used for handling symbolic links.
 | |
| The
 | |
| .Dq logical
 | |
| mode follows all symbolic links.
 | |
| The
 | |
| .Dq physical
 | |
| mode does not follow any symbolic links.
 | |
| The
 | |
| .Dq hybrid
 | |
| mode currently behaves identically to the
 | |
| .Dq logical
 | |
| mode.
 | |
| .It Xo
 | |
| .Fn archive_read_disk_gname ,
 | |
| .Fn archive_read_disk_uname
 | |
| .Xc
 | |
| Returns a user or group name given a gid or uid value.
 | |
| By default, these always return a NULL string.
 | |
| .It Xo
 | |
| .Fn archive_read_disk_set_gname_lookup ,
 | |
| .Fn archive_read_disk_set_uname_lookup
 | |
| .Xc
 | |
| These allow you to override the functions used for
 | |
| user and group name lookups.
 | |
| You may also provide a
 | |
| .Tn void *
 | |
| pointer to a private data structure and a cleanup function for
 | |
| that data.
 | |
| The cleanup function will be invoked when the
 | |
| .Tn struct archive
 | |
| object is destroyed or when new lookup functions are registered.
 | |
| .It Fn archive_read_disk_set_standard_lookup
 | |
| This convenience function installs a standard set of user
 | |
| and group name lookup functions.
 | |
| These functions use
 | |
| .Xr getpwid 3
 | |
| and
 | |
| .Xr getgrid 3
 | |
| to convert ids to names, defaulting to NULL if the names cannot
 | |
| be looked up.
 | |
| These functions also implement a simple memory cache to reduce
 | |
| the number of calls to
 | |
| .Xr getpwid 3
 | |
| and
 | |
| .Xr getgrid 3 .
 | |
| .It Fn archive_read_disk_entry_from_file
 | |
| Populates a
 | |
| .Tn struct archive_entry
 | |
| object with information about a particular file.
 | |
| The
 | |
| .Tn archive_entry
 | |
| object must have already been created with
 | |
| .Xr archive_entry_new 3
 | |
| and at least one of the source path or path fields must already be set.
 | |
| (If both are set, the source path will be used.)
 | |
| .Pp
 | |
| Information is read from disk using the path name from the
 | |
| .Tn struct archive_entry
 | |
| object.
 | |
| If a file descriptor is provided, some information will be obtained using
 | |
| that file descriptor, on platforms that support the appropriate
 | |
| system calls.
 | |
| .Pp
 | |
| If a pointer to a
 | |
| .Tn struct stat
 | |
| is provided, information from that structure will be used instead
 | |
| of reading from the disk where appropriate.
 | |
| This can provide performance benefits in scenarios where
 | |
| .Tn struct stat
 | |
| information has already been read from the disk as a side effect
 | |
| of some other operation.
 | |
| (For example, directory traversal libraries often provide this information.)
 | |
| .Pp
 | |
| Where necessary, user and group ids are converted to user and group names
 | |
| using the currently registered lookup functions above.
 | |
| This affects the file ownership fields and ACL values in the
 | |
| .Tn struct archive_entry
 | |
| object.
 | |
| .It Fn archive_read_close
 | |
| This currently does nothing.
 | |
| .It Fn archive_write_finish
 | |
| Invokes
 | |
| .Fn archive_write_close
 | |
| if it was not invoked manually, then releases all resources.
 | |
| .El
 | |
| More information about the
 | |
| .Va struct archive
 | |
| object and the overall design of the library can be found in the
 | |
| .Xr libarchive 3
 | |
| overview.
 | |
| .Sh EXAMPLE
 | |
| The following illustrates basic usage of the library by
 | |
| showing how to use it to copy an item on disk into an archive.
 | |
| .Bd -literal -offset indent
 | |
| void
 | |
| file_to_archive(struct archive *a, const char *name)
 | |
| {
 | |
|   char buff[8192];
 | |
|   size_t bytes_read;
 | |
|   struct archive *ard;
 | |
|   struct archive_entry *entry;
 | |
|   int fd;
 | |
| 
 | |
|   ard = archive_read_disk_new();
 | |
|   archive_read_disk_set_standard_lookup(ard);
 | |
|   entry = archive_entry_new();
 | |
|   fd = open(name, O_RDONLY);
 | |
|   if (fd < 0)
 | |
|      return;
 | |
|   archive_entry_copy_sourcepath(entry, name);
 | |
|   archive_read_disk_entry_from_file(ard, entry, fd, NULL);
 | |
|   archive_write_header(a, entry);
 | |
|   while ((bytes_read = read(fd, buff, sizeof(buff))) > 0)
 | |
|     archive_write_data(a, buff, bytes_read);
 | |
|   archive_write_finish_entry(a);
 | |
|   archive_read_finish(ard);
 | |
|   archive_entry_free(entry);
 | |
| }
 | |
| .Ed
 | |
| .Sh RETURN VALUES
 | |
| Most functions return
 | |
| .Cm ARCHIVE_OK
 | |
| (zero) on success, or one of several negative
 | |
| error codes for errors.
 | |
| Specific error codes include:
 | |
| .Cm ARCHIVE_RETRY
 | |
| for operations that might succeed if retried,
 | |
| .Cm ARCHIVE_WARN
 | |
| for unusual conditions that do not prevent further operations, and
 | |
| .Cm ARCHIVE_FATAL
 | |
| for serious errors that make remaining operations impossible.
 | |
| The
 | |
| .Xr archive_errno 3
 | |
| and
 | |
| .Xr archive_error_string 3
 | |
| functions can be used to retrieve an appropriate error code and a
 | |
| textual error message.
 | |
| (See
 | |
| .Xr archive_util 3
 | |
| for details.)
 | |
| .Pp
 | |
| .Fn archive_read_disk_new
 | |
| returns a pointer to a newly-allocated
 | |
| .Tn struct archive
 | |
| object or NULL if the allocation failed for any reason.
 | |
| .Pp
 | |
| .Fn archive_read_disk_gname
 | |
| and
 | |
| .Fn archive_read_disk_uname
 | |
| return
 | |
| .Tn const char *
 | |
| pointers to the textual name or NULL if the lookup failed for any reason.
 | |
| The returned pointer points to internal storage that
 | |
| may be reused on the next call to either of these functions;
 | |
| callers should copy the string if they need to continue accessing it.
 | |
| .Pp
 | |
| .Sh SEE ALSO
 | |
| .Xr archive_read 3 ,
 | |
| .Xr archive_write 3 ,
 | |
| .Xr archive_write_disk 3 ,
 | |
| .Xr tar 1 ,
 | |
| .Xr libarchive 3
 | |
| .Sh HISTORY
 | |
| The
 | |
| .Nm libarchive
 | |
| library first appeared in
 | |
| .Fx 5.3 .
 | |
| The
 | |
| .Nm archive_read_disk
 | |
| interface was added to
 | |
| .Nm libarchive 2.6
 | |
| and first appeared in
 | |
| .Fx 8.0 .
 | |
| .Sh AUTHORS
 | |
| .An -nosplit
 | |
| The
 | |
| .Nm libarchive
 | |
| library was written by
 | |
| .An Tim Kientzle Aq kientzle@freebsd.org .
 | |
| .Sh BUGS
 | |
| The
 | |
| .Dq standard
 | |
| user name and group name lookup functions are not the defaults because
 | |
| .Xr getgrid 3
 | |
| and
 | |
| .Xr getpwid 3
 | |
| are sometimes too large for particular applications.
 | |
| The current design allows the application author to use a more
 | |
| compact implementation when appropriate.
 | |
| .Pp
 | |
| The full list of metadata read from disk by
 | |
| .Fn archive_read_disk_entry_from_file
 | |
| is necessarily system-dependent.
 | |
| .Pp
 | |
| The
 | |
| .Fn archive_read_disk_entry_from_file
 | |
| function reads as much information as it can from disk.
 | |
| Some method should be provided to limit this so that clients who
 | |
| do not need ACLs, for instance, can avoid the extra work needed
 | |
| to look up such information.
 | |
| .Pp
 | |
| This API should provide a set of methods for walking a directory tree.
 | |
| That would make it a direct parallel of the
 | |
| .Xr archive_read 3
 | |
| API.
 | |
| When such methods are implemented, the
 | |
| .Dq hybrid
 | |
| symbolic link mode will make sense.
 | 
