mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Fix one error in the example usage of the archive_write API and fill
in a few missing details. The example code here is now a complete, functioning example program.
This commit is contained in:
parent
ed57871e83
commit
43b1ef9bc2
1 changed files with 57 additions and 32 deletions
|
|
@ -272,38 +272,17 @@ and
|
|||
.Xr close 2
|
||||
system calls.
|
||||
.Bd -literal -offset indent
|
||||
void
|
||||
write_archive(const char **filename)
|
||||
{
|
||||
struct mydata *mydata = malloc(sizeof(struct mydata));
|
||||
struct archive *a;
|
||||
struct archive_entry *entry;
|
||||
struct stat st;
|
||||
char buff[8192];
|
||||
int len;
|
||||
#include <sys/stat.h>
|
||||
#include <archive.h>
|
||||
#include <archive_entry.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
a = archive_write_new();
|
||||
mydata->name = name;
|
||||
archive_write_set_compression_gzip(a);
|
||||
archive_write_set_format_ustar(a);
|
||||
archive_write_open(a, mydata, myopen, mywrite, myclose);
|
||||
while (*filename) {
|
||||
stat(*filename, &st);
|
||||
entry = archive_entry_new();
|
||||
archive_entry_copy_stat(entry, &st);
|
||||
archive_entry_set_pathname(entry, *filename);
|
||||
archive_write_header(a, entry);
|
||||
fd = open(*filename, O_RDONLY);
|
||||
len = read(fd, buff, sizeof(buff));
|
||||
while ( len >= 0 ) {
|
||||
archive_write_data(a, buff, len);
|
||||
len = read(fd, buff, sizeof(buff));
|
||||
}
|
||||
archive_entry_free(entry);
|
||||
filename++;
|
||||
}
|
||||
archive_write_finish(a);
|
||||
}
|
||||
struct mydata {
|
||||
const char *name;
|
||||
int fd;
|
||||
};
|
||||
|
||||
int
|
||||
myopen(struct archive *a, void *client_data)
|
||||
|
|
@ -311,7 +290,10 @@ myopen(struct archive *a, void *client_data)
|
|||
struct mydata *mydata = client_data;
|
||||
|
||||
mydata->fd = open(mydata->name, O_WRONLY | O_CREAT, 0644);
|
||||
return (mydata->fd >= 0);
|
||||
if (mydata->fd >= 0)
|
||||
return (ARCHIVE_OK);
|
||||
else
|
||||
return (ARCHIVE_FATAL);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
|
|
@ -331,6 +313,49 @@ myclose(struct archive *a, void *client_data)
|
|||
close(mydata->fd);
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
write_archive(const char *outname, const char **filename)
|
||||
{
|
||||
struct mydata *mydata = malloc(sizeof(struct mydata));
|
||||
struct archive *a;
|
||||
struct archive_entry *entry;
|
||||
struct stat st;
|
||||
char buff[8192];
|
||||
int len;
|
||||
int fd;
|
||||
|
||||
a = archive_write_new();
|
||||
mydata->name = outname;
|
||||
archive_write_set_compression_gzip(a);
|
||||
archive_write_set_format_ustar(a);
|
||||
archive_write_open(a, mydata, myopen, mywrite, myclose);
|
||||
while (*filename) {
|
||||
stat(*filename, &st);
|
||||
entry = archive_entry_new();
|
||||
archive_entry_copy_stat(entry, &st);
|
||||
archive_entry_set_pathname(entry, *filename);
|
||||
archive_write_header(a, entry);
|
||||
fd = open(*filename, O_RDONLY);
|
||||
len = read(fd, buff, sizeof(buff));
|
||||
while ( len > 0 ) {
|
||||
archive_write_data(a, buff, len);
|
||||
len = read(fd, buff, sizeof(buff));
|
||||
}
|
||||
archive_entry_free(entry);
|
||||
filename++;
|
||||
}
|
||||
archive_write_finish(a);
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
const char *outname;
|
||||
argv++;
|
||||
outname = argv++;
|
||||
write_archive(outname, argv);
|
||||
return 0;
|
||||
}
|
||||
.Ed
|
||||
.Sh RETURN VALUES
|
||||
Most functions return zero on success, non-zero on error.
|
||||
|
|
|
|||
Loading…
Reference in a new issue