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