]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/pack.c
Remove all Appletalk stuff
[netatalk.git] / etc / cnid_dbd / pack.c
1 /*
2  * Copyright (C) Joerg Lenneis 2003
3  * Copyright (C) Frank Lahm 2010
4  * All Rights Reserved.  See COPYING.
5  */
6
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif /* HAVE_CONFIG_H */
10
11 #include <arpa/inet.h>
12
13 #include <string.h>
14 #include <inttypes.h>
15 #include <sys/param.h>
16 #include <db.h>
17
18 #include <atalk/unicode.h>
19 #include <atalk/volinfo.h>
20 #include <atalk/logger.h>
21 #include <atalk/cnid_dbd_private.h>
22 #include "pack.h"
23
24 /* in main.c for `cnid_dbd` or cmd_dbd.c for `dbd` */
25 extern struct volinfo volinfo;
26
27 /* --------------- */
28 /*
29  *  This implementation is portable, but could probably be faster by using htonl
30  *  where appropriate. Also, this again doubles code from the cdb backend.
31  */
32 static void pack_devino(unsigned char *buf, dev_t dev, ino_t ino)
33 {
34     buf[CNID_DEV_LEN - 1] = dev; dev >>= 8;
35     buf[CNID_DEV_LEN - 2] = dev; dev >>= 8;
36     buf[CNID_DEV_LEN - 3] = dev; dev >>= 8;
37     buf[CNID_DEV_LEN - 4] = dev; dev >>= 8;
38     buf[CNID_DEV_LEN - 5] = dev; dev >>= 8;
39     buf[CNID_DEV_LEN - 6] = dev; dev >>= 8;
40     buf[CNID_DEV_LEN - 7] = dev; dev >>= 8;
41     buf[CNID_DEV_LEN - 8] = dev;
42
43     buf[CNID_DEV_LEN + CNID_INO_LEN - 1] = ino; ino >>= 8;
44     buf[CNID_DEV_LEN + CNID_INO_LEN - 2] = ino; ino >>= 8;
45     buf[CNID_DEV_LEN + CNID_INO_LEN - 3] = ino; ino >>= 8;
46     buf[CNID_DEV_LEN + CNID_INO_LEN - 4] = ino; ino >>= 8;
47     buf[CNID_DEV_LEN + CNID_INO_LEN - 5] = ino; ino >>= 8;
48     buf[CNID_DEV_LEN + CNID_INO_LEN - 6] = ino; ino >>= 8;
49     buf[CNID_DEV_LEN + CNID_INO_LEN - 7] = ino; ino >>= 8;
50     buf[CNID_DEV_LEN + CNID_INO_LEN - 8] = ino;    
51 }
52
53 /* --------------- */
54 int didname(DB *dbp _U_, const DBT *pkey _U_, const DBT *pdata, DBT *skey)
55 {
56 int len;
57  
58     memset(skey, 0, sizeof(DBT));
59     skey->data = (char *)pdata->data + CNID_DID_OFS;
60     /* FIXME: At least DB 4.0.14 and 4.1.25 pass in the correct length of
61        pdata.size. strlen is therefore not needed. Also, skey should be zeroed
62        out already. */
63     len = strlen((char *)skey->data + CNID_DID_LEN);
64     skey->size = CNID_DID_LEN + len + 1;
65     return (0);
66 }
67  
68 /* --------------- */
69 int devino(DB *dbp _U_, const DBT *pkey _U_,  const DBT *pdata, DBT *skey)
70 {
71     memset(skey, 0, sizeof(DBT));
72     skey->data = (char *)pdata->data + CNID_DEVINO_OFS;
73     skey->size = CNID_DEVINO_LEN;
74     return (0);
75 }
76
77 /* --------------- */
78 int idxname(DB *dbp _U_, const DBT *pkey _U_,  const DBT *pdata, DBT *skey)
79 {
80     static char buffer[MAXPATHLEN +2];
81     uint16_t flags = CONV_TOLOWER;
82     memset(skey, 0, sizeof(DBT));
83
84     if (convert_charset(volinfo.v_volcharset,
85                         volinfo.v_volcharset,
86                         volinfo.v_maccharset,
87                         (char *)pdata->data + CNID_NAME_OFS,
88                         strlen((char *)pdata->data + CNID_NAME_OFS),
89                         buffer,
90                         MAXPATHLEN,
91                         &flags) == (size_t)-1) {
92         LOG(log_error, logtype_cnid, "idxname: conversion error");
93     }
94
95     skey->data = buffer;
96     skey->size = strlen(skey->data);
97     return (0);
98 }
99
100 /* The equivalent to make_cnid_data in the cnid library. Non re-entrant. We
101    differ from make_cnid_data in that we never return NULL, rqst->name cannot
102    ever cause start[] to overflow because name length is checked in libatalk. */
103
104 unsigned char *pack_cnid_data(struct cnid_dbd_rqst *rqst)
105 {
106     static unsigned char start[CNID_HEADER_LEN + MAXPATHLEN + 1];
107     unsigned char *buf = start +CNID_LEN;
108     u_int32_t i;
109
110     pack_devino(buf, rqst->dev, rqst->ino);
111     buf += CNID_DEVINO_LEN;
112
113     i = htonl(rqst->type);
114     memcpy(buf, &i, sizeof(i));
115     buf += sizeof(i);
116
117     /* did is already in network byte order */
118     buf = memcpy(buf, &rqst->did, sizeof(rqst->did));
119     buf += sizeof(rqst->did);
120     buf = memcpy(buf, rqst->name, rqst->namelen);
121     *(buf + rqst->namelen) = '\0';
122
123     return start;
124 }
125