]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/pack.c
Import FCE
[netatalk.git] / etc / cnid_dbd / pack.c
1 /*
2  * $Id: pack.c,v 1.6 2009-10-13 22:55:37 didg Exp $
3  *
4  * Copyright (C) Joerg Lenneis 2003
5  * All Rights Reserved.  See COPYING.
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <netatalk/endian.h>
13
14 #include <string.h>
15 #ifdef HAVE_SYS_TYPES_H
16 #include <sys/types.h>
17 #endif /* HAVE_SYS_TYPES_H */
18 #include <sys/param.h>
19 #include <sys/cdefs.h>
20 #include <db.h>
21
22 #include <atalk/cnid_dbd_private.h>
23 #include "pack.h"
24
25 /* --------------- */
26 /*
27  *  This implementation is portable, but could probably be faster by using htonl
28  *  where appropriate. Also, this again doubles code from the cdb backend.
29  */
30 static void pack_devino(unsigned char *buf, dev_t dev, ino_t ino)
31 {
32     buf[CNID_DEV_LEN - 1] = dev; dev >>= 8;
33     buf[CNID_DEV_LEN - 2] = dev; dev >>= 8;
34     buf[CNID_DEV_LEN - 3] = dev; dev >>= 8;
35     buf[CNID_DEV_LEN - 4] = dev; dev >>= 8;
36     buf[CNID_DEV_LEN - 5] = dev; dev >>= 8;
37     buf[CNID_DEV_LEN - 6] = dev; dev >>= 8;
38     buf[CNID_DEV_LEN - 7] = dev; dev >>= 8;
39     buf[CNID_DEV_LEN - 8] = dev;
40
41     buf[CNID_DEV_LEN + CNID_INO_LEN - 1] = ino; ino >>= 8;
42     buf[CNID_DEV_LEN + CNID_INO_LEN - 2] = ino; ino >>= 8;
43     buf[CNID_DEV_LEN + CNID_INO_LEN - 3] = ino; ino >>= 8;
44     buf[CNID_DEV_LEN + CNID_INO_LEN - 4] = ino; ino >>= 8;
45     buf[CNID_DEV_LEN + CNID_INO_LEN - 5] = ino; ino >>= 8;
46     buf[CNID_DEV_LEN + CNID_INO_LEN - 6] = ino; ino >>= 8;
47     buf[CNID_DEV_LEN + CNID_INO_LEN - 7] = ino; ino >>= 8;
48     buf[CNID_DEV_LEN + CNID_INO_LEN - 8] = ino;    
49 }
50
51 /* --------------- */
52 int didname(DB *dbp _U_, const DBT *pkey _U_, const DBT *pdata, DBT *skey)
53 {
54 int len;
55  
56     memset(skey, 0, sizeof(DBT));
57     skey->data = (char *)pdata->data + CNID_DID_OFS;
58     /* FIXME: At least DB 4.0.14 and 4.1.25 pass in the correct length of
59        pdata.size. strlen is therefore not needed. Also, skey should be zeroed
60        out already. */
61     len = strlen((char *)skey->data + CNID_DID_LEN);
62     skey->size = CNID_DID_LEN + len + 1;
63     return (0);
64 }
65  
66 /* --------------- */
67 int devino(DB *dbp _U_, const DBT *pkey _U_,  const DBT *pdata, DBT *skey)
68 {
69     memset(skey, 0, sizeof(DBT));
70     skey->data = (char *)pdata->data + CNID_DEVINO_OFS;
71     skey->size = CNID_DEVINO_LEN;
72     return (0);
73 }
74
75 /* The equivalent to make_cnid_data in the cnid library. Non re-entrant. We
76    differ from make_cnid_data in that we never return NULL, rqst->name cannot
77    ever cause start[] to overflow because name length is checked in libatalk. */
78
79 unsigned char *pack_cnid_data(struct cnid_dbd_rqst *rqst)
80 {
81     static unsigned char start[CNID_HEADER_LEN + MAXPATHLEN + 1];
82     unsigned char *buf = start +CNID_LEN;
83     u_int32_t i;
84
85     pack_devino(buf, rqst->dev, rqst->ino);
86     buf += CNID_DEVINO_LEN;
87
88     i = htonl(rqst->type);
89     memcpy(buf, &i, sizeof(i));
90     buf += sizeof(i);
91
92     /* did is already in network byte order */
93     buf = memcpy(buf, &rqst->did, sizeof(rqst->did));
94     buf += sizeof(rqst->did);
95     buf = memcpy(buf, rqst->name, rqst->namelen);
96     *(buf + rqst->namelen) = '\0';
97
98     return start;
99 }
100