xref: /haiku/src/add-ons/kernel/file_systems/ramfs/SymLink.cpp (revision a127b88ecbfab58f64944c98aa47722a18e363b2)
1 /*
2  * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include <limits.h>
7 
8 #include "AllocationInfo.h"
9 #include "DebugSupport.h"
10 #include "SizeIndex.h"
11 #include "SymLink.h"
12 #include "Volume.h"
13 
14 // constructor
15 SymLink::SymLink(Volume *volume)
16 	: Node(volume, NODE_TYPE_SYMLINK),
17 	  fLinkedPath()
18 {
19 }
20 
21 // destructor
22 SymLink::~SymLink()
23 {
24 }
25 
26 // SetSize
27 status_t
28 SymLink::SetSize(off_t newSize)
29 {
30 	status_t error = (newSize >= 0 && newSize < PATH_MAX ? B_OK : B_BAD_VALUE);
31 	int32 oldSize = GetLinkedPathLength();
32 	if (error == B_OK && newSize < oldSize) {
33 		fLinkedPath.Truncate(newSize);
34 		MarkModified(B_STAT_SIZE);
35 		// update the size index
36 		if (SizeIndex *index = GetVolume()->GetSizeIndex())
37 			index->Changed(this, oldSize);
38 	}
39 	return error;
40 }
41 
42 // GetSize
43 off_t
44 SymLink::GetSize() const
45 {
46 	return GetLinkedPathLength();
47 }
48 
49 // SetLinkedPath
50 status_t
51 SymLink::SetLinkedPath(const char *path)
52 {
53 	int32 oldLen = GetLinkedPathLength();
54 	int32 len = strnlen(path, PATH_MAX - 1);
55 	if (fLinkedPath.SetTo(path, len)) {
56 		MarkModified(B_STAT_MODIFICATION_TIME);
57 		// update the size index, if necessary
58 		if (len != oldLen) {
59 			MarkModified(B_STAT_SIZE);
60 
61 			if (SizeIndex *index = GetVolume()->GetSizeIndex())
62 				index->Changed(this, oldLen);
63 		}
64 		return B_OK;
65 	}
66 	RETURN_ERROR(B_NO_MEMORY);
67 }
68 
69 // GetAllocationInfo
70 void
71 SymLink::GetAllocationInfo(AllocationInfo &info)
72 {
73 	info.AddSymLinkAllocation(GetSize());
74 }
75 
76