Chameleon

Chameleon Svn Source Tree

Root/branches/azimutz/Chazi/i386/libsaio/ufs_byteorder.c

1/*
2 * Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 2.0 (the "License"). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/*
25 * Copyright 1993 NeXT, Inc.
26 * All rights reserved.
27 */
28
29#include <sys/types.h>
30#include <sys/param.h>
31#include <sys/vnode.h>
32#include <ufs/ufs/dir.h>
33#include <libkern/OSByteOrder.h>
34
35//#include "libsaio.h" // ufs support reminder (check disk.c)
36#include "ufs_byteorder.h"
37
38#defineswapBigLongToHost(thing) ((thing) = OSSwapBigToHostInt32(thing))
39#defineswapBigShortToHost(thing) ((thing) = OSSwapBigToHostInt16(thing))
40#definebyte_swap_longlong(thing) ((thing) = OSSwapBigToHostInt64(thing))
41#definebyte_swap_int(thing) ((thing) = OSSwapBigToHostInt32(thing))
42#definebyte_swap_short(thing) ((thing) = OSSwapBigToHostInt16(thing))
43
44#if UNUSED
45void
46byte_swap_longlongs(unsigned long long *array, int count)
47{
48register unsigned long longi;
49
50for (i = 0; i < (unsigned long long)count; i++)
51byte_swap_longlong(array[i]);
52}
53#endif
54
55void
56byte_swap_ints(unsigned int *array, int count)
57{
58register inti;
59
60for (i = 0; i < count; i++)
61byte_swap_int(array[i]);
62}
63
64void
65byte_swap_shorts(unsigned short *array, int count)
66{
67register inti;
68
69for (i = 0; i < count; i++)
70byte_swap_short(array[i]);
71}
72
73#if UNUSED
74static void
75swapBigIntsToHost(unsigned int *array, int count)
76{
77register inti;
78
79for (i = 0; i < count; i++)
80swapBigLongToHost(array[i]);
81}
82
83static void
84swapBigShortToHosts(unsigned short *array, int count)
85{
86register inti;
87
88for (i = 0; i < count; i++)
89swapBigShortToHost(array[i]);
90}
91#endif
92
93void
94byte_swap_superblock(struct fs *sb)
95{
96u_int16_t * usptr;
97unsigned long size;
98
99byte_swap_ints(((u_int32_t *)&sb->fs_firstfield), 52);
100byte_swap_int(sb->fs_cgrotor);
101byte_swap_int(sb->fs_cpc);
102byte_swap_shorts((u_int16_t *)sb->fs_opostbl, 16 * 8);
103byte_swap_ints((u_int32_t *)sb->fs_sparecon, 50);
104byte_swap_ints((u_int32_t *)&sb->fs_contigsumsize, 3);
105#if UNUSED
106byte_swap_longlongs((u_int64_t *)&sb->fs_maxfilesize,3);
107#endif
108byte_swap_ints((u_int32_t *)&sb->fs_state, 6);
109
110/* Got these magic numbers from mkfs.c in newfs */
111if (sb->fs_nrpos != 8 || sb->fs_cpc > 16) {
112usptr = (u_int16_t *)((u_int8_t *)(sb) + (sb)->fs_postbloff);
113size = sb->fs_cpc * sb->fs_nrpos;
114byte_swap_shorts(usptr,size);/* fs_postbloff */
115}
116}
117
118
119/* This value should correspond to the value set in the ffs_mounts */
120
121#define RESYMLNKLEN 60
122
123void
124byte_swap_dinode_in(struct dinode *di)
125{
126int i;
127
128di->di_mode = OSSwapInt16(di->di_mode);
129di->di_nlink = OSSwapInt16(di->di_nlink);
130#ifdef LFS
131di->di_u.inumber = OSSwapInt32(di->di_u.inumber);
132#else
133di->di_u.oldids[0] = OSSwapInt16(di->di_u.oldids[0]);
134di->di_u.oldids[1] = OSSwapInt16(di->di_u.oldids[1]);
135#endif
136di->di_size = OSSwapInt64(di->di_size);
137di->di_atime = OSSwapInt32(di->di_atime);
138di->di_atimensec = OSSwapInt32(di->di_atimensec);
139di->di_mtime = OSSwapInt32(di->di_mtime);
140di->di_mtimensec = OSSwapInt32(di->di_mtimensec);
141di->di_ctime = OSSwapInt32(di->di_ctime);
142di->di_ctimensec = OSSwapInt32(di->di_ctimensec);
143if (((di->di_mode & IFMT) != IFLNK ) || (di->di_size > RESYMLNKLEN)) {
144for (i=0; i < NDADDR; i++)/* direct blocks */
145di->di_db[i] = OSSwapInt32(di->di_db[i]);
146for (i=0; i < NIADDR; i++)/* indirect blocks */
147di->di_ib[i] = OSSwapInt32(di->di_ib[i]);
148}
149di->di_flags = OSSwapInt32(di->di_flags);
150di->di_blocks = OSSwapInt32(di->di_blocks);
151di->di_gen = OSSwapInt32(di->di_gen);
152di->di_uid = OSSwapInt32(di->di_uid);
153di->di_gid = OSSwapInt32(di->di_gid);
154di->di_spare[0] = OSSwapInt32(di->di_spare[0]);
155di->di_spare[1] = OSSwapInt32(di->di_spare[1]);
156}
157
158void
159byte_swap_dir_block_in(char *addr, int count)
160{
161register struct direct * ep = (struct direct *) addr;
162register int entryoffsetinblk = 0;
163
164while (entryoffsetinblk < count) {
165ep = (struct direct *) (entryoffsetinblk + addr);
166swapBigLongToHost(ep->d_ino);
167swapBigShortToHost(ep->d_reclen);
168entryoffsetinblk += ep->d_reclen;
169if (ep->d_reclen < 12)/* handle garbage in dirs */
170break;
171}
172}
173

Archive Download this file

Revision: 816