Blob


1 /*
2 * Copyright (c) 2018 Stefan Sperling <stsp@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
17 #include <sys/queue.h>
18 #include <sys/stat.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <sha1.h>
25 #include "got_error.h"
27 #include "got_fileindex_priv.h"
29 const struct got_error *
30 got_fileindex_entry_open(struct got_fileindex_entry **entry, const char *path,
31 uint8_t *blob_sha1)
32 {
33 struct stat sb;
34 size_t len;
36 if (lstat(path, &sb) != 0)
37 return got_error_from_errno();
39 *entry = calloc(1, sizeof(**entry));
40 if (*entry == NULL)
41 return got_error(GOT_ERR_NO_MEM);
43 (*entry)->path = strdup(path);
44 if ((*entry)->path == NULL) {
45 free(*entry);
46 *entry = NULL;
47 return got_error(GOT_ERR_NO_MEM);
48 }
50 (*entry)->ctime_sec = sb.st_ctime;
51 (*entry)->ctime_nsec = sb.st_ctimensec;
52 (*entry)->mtime_sec = sb.st_mtime;
53 (*entry)->mtime_nsec = sb.st_mtimensec;
54 (*entry)->uid = sb.st_uid;
55 (*entry)->gid = sb.st_gid;
56 (*entry)->size = (sb.st_size & 0xffffffff);
57 if (sb.st_mode & S_IFLNK)
58 (*entry)->mode = GOT_INDEX_ENTRY_MODE_SYMLINK;
59 else
60 (*entry)->mode = GOT_INDEX_ENTRY_MODE_REGULAR_FILE;
61 (*entry)->mode |= ((sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) <<
62 GOT_INDEX_ENTRY_MODE_PERMS_SHIFT);
63 memcpy((*entry)->blob_sha1, blob_sha1, SHA1_DIGEST_LENGTH);
64 len = strlen(path);
65 if (len > GOT_INDEX_ENTRY_F_PATH_LEN)
66 len = GOT_INDEX_ENTRY_F_PATH_LEN;
67 (*entry)->flags |= len;
69 return NULL;
70 }
72 void
73 got_fileindex_entry_close(struct got_fileindex_entry *entry)
74 {
75 free(entry->path);
76 free(entry);
77 }