1caf54c4fSMartin Matuska /*-
2caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle
3caf54c4fSMartin Matuska * All rights reserved.
4caf54c4fSMartin Matuska *
5caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without
6caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions
7caf54c4fSMartin Matuska * are met:
8caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright
9caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer.
10caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright
11caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the
12caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution.
13caf54c4fSMartin Matuska *
14caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15caf54c4fSMartin Matuska * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16caf54c4fSMartin Matuska * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17caf54c4fSMartin Matuska * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18caf54c4fSMartin Matuska * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19caf54c4fSMartin Matuska * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20caf54c4fSMartin Matuska * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21caf54c4fSMartin Matuska * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22caf54c4fSMartin Matuska * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23caf54c4fSMartin Matuska * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24caf54c4fSMartin Matuska */
25caf54c4fSMartin Matuska
26caf54c4fSMartin Matuska #include "archive_platform.h"
27caf54c4fSMartin Matuska
28caf54c4fSMartin Matuska #ifdef HAVE_SYS_STAT_H
29caf54c4fSMartin Matuska #include <sys/stat.h>
30caf54c4fSMartin Matuska #endif
31caf54c4fSMartin Matuska #ifdef HAVE_SYS_TYPES_H
32caf54c4fSMartin Matuska #include <sys/types.h>
33caf54c4fSMartin Matuska #endif
34caf54c4fSMartin Matuska #ifdef HAVE_LIMITS_H
35caf54c4fSMartin Matuska #include <limits.h>
36caf54c4fSMartin Matuska #endif
37caf54c4fSMartin Matuska #ifdef HAVE_LINUX_FS_H
38caf54c4fSMartin Matuska #include <linux/fs.h> /* for Linux file flags */
39caf54c4fSMartin Matuska #endif
40caf54c4fSMartin Matuska /*
41caf54c4fSMartin Matuska * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.
42caf54c4fSMartin Matuska * As the include guards don't agree, the order of include is important.
43caf54c4fSMartin Matuska */
44caf54c4fSMartin Matuska #ifdef HAVE_LINUX_EXT2_FS_H
45caf54c4fSMartin Matuska #include <linux/ext2_fs.h> /* for Linux file flags */
46caf54c4fSMartin Matuska #endif
47caf54c4fSMartin Matuska #if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
48caf54c4fSMartin Matuska #include <ext2fs/ext2_fs.h> /* for Linux file flags */
49caf54c4fSMartin Matuska #endif
50caf54c4fSMartin Matuska #include <stddef.h>
51caf54c4fSMartin Matuska #include <stdio.h>
52caf54c4fSMartin Matuska #ifdef HAVE_STDLIB_H
53caf54c4fSMartin Matuska #include <stdlib.h>
54caf54c4fSMartin Matuska #endif
55caf54c4fSMartin Matuska #ifdef HAVE_STRING_H
56caf54c4fSMartin Matuska #include <string.h>
57caf54c4fSMartin Matuska #endif
58caf54c4fSMartin Matuska #ifdef HAVE_WCHAR_H
59caf54c4fSMartin Matuska #include <wchar.h>
60caf54c4fSMartin Matuska #endif
61caf54c4fSMartin Matuska
62caf54c4fSMartin Matuska #include "archive.h"
63caf54c4fSMartin Matuska #include "archive_entry.h"
64caf54c4fSMartin Matuska #include "archive_private.h"
65caf54c4fSMartin Matuska #include "archive_entry_private.h"
66caf54c4fSMartin Matuska
67caf54c4fSMartin Matuska /*
68caf54c4fSMartin Matuska * extended attribute handling
69caf54c4fSMartin Matuska */
70caf54c4fSMartin Matuska
71caf54c4fSMartin Matuska void
archive_entry_xattr_clear(struct archive_entry * entry)72caf54c4fSMartin Matuska archive_entry_xattr_clear(struct archive_entry *entry)
73caf54c4fSMartin Matuska {
74caf54c4fSMartin Matuska struct ae_xattr *xp;
75caf54c4fSMartin Matuska
76caf54c4fSMartin Matuska while (entry->xattr_head != NULL) {
77caf54c4fSMartin Matuska xp = entry->xattr_head->next;
78caf54c4fSMartin Matuska free(entry->xattr_head->name);
79caf54c4fSMartin Matuska free(entry->xattr_head->value);
80caf54c4fSMartin Matuska free(entry->xattr_head);
81caf54c4fSMartin Matuska entry->xattr_head = xp;
82caf54c4fSMartin Matuska }
83caf54c4fSMartin Matuska
84caf54c4fSMartin Matuska entry->xattr_head = NULL;
85caf54c4fSMartin Matuska }
86caf54c4fSMartin Matuska
87caf54c4fSMartin Matuska void
archive_entry_xattr_add_entry(struct archive_entry * entry,const char * name,const void * value,size_t size)88caf54c4fSMartin Matuska archive_entry_xattr_add_entry(struct archive_entry *entry,
89caf54c4fSMartin Matuska const char *name, const void *value, size_t size)
90caf54c4fSMartin Matuska {
91caf54c4fSMartin Matuska struct ae_xattr *xp;
92caf54c4fSMartin Matuska
93caf54c4fSMartin Matuska if ((xp = (struct ae_xattr *)malloc(sizeof(struct ae_xattr))) == NULL)
94f061a221SMartin Matuska __archive_errx(1, "Out of memory");
95caf54c4fSMartin Matuska
96cdf63a70SMartin Matuska if ((xp->name = strdup(name)) == NULL)
97f061a221SMartin Matuska __archive_errx(1, "Out of memory");
98cdf63a70SMartin Matuska
99caf54c4fSMartin Matuska if ((xp->value = malloc(size)) != NULL) {
100caf54c4fSMartin Matuska memcpy(xp->value, value, size);
101caf54c4fSMartin Matuska xp->size = size;
102caf54c4fSMartin Matuska } else
103caf54c4fSMartin Matuska xp->size = 0;
104caf54c4fSMartin Matuska
105caf54c4fSMartin Matuska xp->next = entry->xattr_head;
106caf54c4fSMartin Matuska entry->xattr_head = xp;
107caf54c4fSMartin Matuska }
108caf54c4fSMartin Matuska
109caf54c4fSMartin Matuska
110caf54c4fSMartin Matuska /*
111caf54c4fSMartin Matuska * returns number of the extended attribute entries
112caf54c4fSMartin Matuska */
113caf54c4fSMartin Matuska int
archive_entry_xattr_count(struct archive_entry * entry)114caf54c4fSMartin Matuska archive_entry_xattr_count(struct archive_entry *entry)
115caf54c4fSMartin Matuska {
116caf54c4fSMartin Matuska struct ae_xattr *xp;
117caf54c4fSMartin Matuska int count = 0;
118caf54c4fSMartin Matuska
119caf54c4fSMartin Matuska for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
120caf54c4fSMartin Matuska count++;
121caf54c4fSMartin Matuska
122caf54c4fSMartin Matuska return count;
123caf54c4fSMartin Matuska }
124caf54c4fSMartin Matuska
125caf54c4fSMartin Matuska int
archive_entry_xattr_reset(struct archive_entry * entry)126caf54c4fSMartin Matuska archive_entry_xattr_reset(struct archive_entry * entry)
127caf54c4fSMartin Matuska {
128caf54c4fSMartin Matuska entry->xattr_p = entry->xattr_head;
129caf54c4fSMartin Matuska
130caf54c4fSMartin Matuska return archive_entry_xattr_count(entry);
131caf54c4fSMartin Matuska }
132caf54c4fSMartin Matuska
133caf54c4fSMartin Matuska int
archive_entry_xattr_next(struct archive_entry * entry,const char ** name,const void ** value,size_t * size)134caf54c4fSMartin Matuska archive_entry_xattr_next(struct archive_entry * entry,
135caf54c4fSMartin Matuska const char **name, const void **value, size_t *size)
136caf54c4fSMartin Matuska {
137caf54c4fSMartin Matuska if (entry->xattr_p) {
138caf54c4fSMartin Matuska *name = entry->xattr_p->name;
139caf54c4fSMartin Matuska *value = entry->xattr_p->value;
140caf54c4fSMartin Matuska *size = entry->xattr_p->size;
141caf54c4fSMartin Matuska
142caf54c4fSMartin Matuska entry->xattr_p = entry->xattr_p->next;
143caf54c4fSMartin Matuska
144caf54c4fSMartin Matuska return (ARCHIVE_OK);
145caf54c4fSMartin Matuska } else {
146caf54c4fSMartin Matuska *name = NULL;
147caf54c4fSMartin Matuska *value = NULL;
148caf54c4fSMartin Matuska *size = (size_t)0;
149caf54c4fSMartin Matuska return (ARCHIVE_WARN);
150caf54c4fSMartin Matuska }
151caf54c4fSMartin Matuska }
152caf54c4fSMartin Matuska
153caf54c4fSMartin Matuska /*
154caf54c4fSMartin Matuska * end of xattr handling
155caf54c4fSMartin Matuska */
156