1 /* 2 * Copyright 2001-2005, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Erik Jaesler (erik@cgsoftware.com) 7 */ 8 9 /** Extra messaging utility functions */ 10 11 #include <string.h> 12 #include <ByteOrder.h> 13 14 #include <MessageUtils.h> 15 16 17 uint32 18 _checksum_(const uchar* buf, int32 size) 19 { 20 uint32 sum = 0; 21 uint32 temp = 0; 22 23 while (size > 3) { 24 #if defined(__INTEL__) 25 sum += B_SWAP_INT32(*(int*)buf); 26 #else 27 sum += *(int*)buf; 28 #endif 29 30 buf += 4; 31 size -= 4; 32 } 33 34 while (size > 0) { 35 temp = (temp << 8) + *buf++; 36 size -= 1; 37 } 38 39 return sum + temp; 40 } 41 42 43 namespace BPrivate { // Only putting these here because Be did 44 45 status_t 46 entry_ref_flatten(char* buffer, size_t* size, const entry_ref* ref) 47 { 48 memcpy((void*)buffer, (const void*)&ref->device, sizeof (ref->device)); 49 buffer += sizeof (ref->device); 50 memcpy((void*)buffer, (const void*)&ref->directory, sizeof (ref->directory)); 51 buffer += sizeof (ref->directory); 52 53 size_t len = 0; 54 if (ref->name) { 55 len = strlen(ref->name) + 1; // extra for NULL terminator 56 memcpy((void*)buffer, (const void*)ref->name, len); 57 } 58 59 *size = sizeof (ref->device) + sizeof (ref->directory) + len; 60 return B_OK; 61 } 62 63 64 status_t 65 entry_ref_unflatten(entry_ref* ref, const char* buffer, size_t size) 66 { 67 if (size < (sizeof (ref->device) + sizeof (ref->directory))) { 68 *ref = entry_ref(); 69 return B_BAD_VALUE; 70 } 71 72 memcpy((void*)&ref->device, (const void*)buffer, sizeof (ref->device)); 73 buffer += sizeof (ref->device); 74 memcpy((void*)&ref->directory, (const void*)buffer, 75 sizeof (ref->directory)); 76 buffer += sizeof (ref->directory); 77 78 if (ref->device != -1 79 && size > (sizeof (ref->device) + sizeof (ref->directory))) { 80 ref->set_name(buffer); 81 if (ref->name == NULL) { 82 *ref = entry_ref(); 83 return B_NO_MEMORY; 84 } 85 } else 86 ref->set_name(NULL); 87 88 return B_OK; 89 } 90 91 92 status_t 93 entry_ref_swap(char* buffer, size_t size) 94 { 95 if (size < (sizeof (dev_t) + sizeof (ino_t))) 96 return B_BAD_DATA; 97 98 dev_t* dev = (dev_t*)buffer; 99 *dev = B_SWAP_INT32(*dev); 100 buffer += sizeof (dev_t); 101 102 ino_t* ino = (ino_t*)buffer; 103 *ino = B_SWAP_INT64(*ino); 104 105 return B_OK; 106 } 107 108 109 size_t 110 calc_padding(size_t size, size_t boundary) 111 { 112 size_t pad = size % boundary; 113 if (pad) 114 pad = boundary - pad; 115 116 return pad; 117 } 118 119 } // namespace BPrivate 120 121 122 // #pragma mark - 123 124 125 int32 126 TChecksumHelper::CheckSum() 127 { 128 return _checksum_(fBuffer, fBufPtr - fBuffer); 129 } 130 131