libarchive: アーカイブを作成する

archive_entry_copy_statをしないとアーカイブがうまく作成できず。

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <share.h>

#include <archive.h>
#include <archive_entry.h>

int main() { 
  struct archive *a;
  struct archive_entry *ae;
  int fd, len;
  char buff[BUFSIZ];
  struct stat s;

  a = archive_write_new();
  archive_write_set_compression_none(a);
  archive_write_set_format_ustar(a);

  archive_write_open_file(a, "C:\\foo.tar");
  ae = archive_entry_new();
  stat("C:\\inclick.txt", &s);
  archive_entry_copy_stat(ae, &s);
  archive_entry_copy_pathname(ae, "inclick.txt");

  archive_write_header(a, ae);
  _sopen_s(&fd, "C:\\inclick.txt", O_RDONLY | O_BINARY, _SH_DENYWR, _S_IREAD);
  len = _read(fd, buff, sizeof(buff));
  
  while (len > 0) {
    archive_write_data(a, buff, len);
    len = _read(fd, buff, sizeof(buff));
  }
  
  _close(fd);
  archive_entry_free(ae);
  archive_write_close(a);
  archive_write_finish(a);

  return 0;
}

_sopen_sはなんで似たよーなフラグをたくさん渡すんだろう?