Problems compiling partimage-cvs-0.7.2 on openSuSE 11.3

Everything about the installation and compilation

Moderator: feffer

Post Reply
Hartmut
Posts: 26
Joined: Thu Aug 26, 2010 10:06 am

Problems compiling partimage-cvs-0.7.2 on openSuSE 11.3

Post by Hartmut » Thu Aug 26, 2010 11:35 am

Hi all,

after successfull compilation of partimage-0.6.9 on opensuse 11.3
I tried to do the same with partimage-cvs-0.7.2 from sourceforge

The first Problem I run into was:

Code: Select all

partimage-cvs-0.7.2/src/shared/modules/backup/compress.cpp
source='compress.cpp' object='compress.o' libtool=no \
        depfile='.deps/compress.Po' tmpdepfile='.deps/compress.TPo' \
        depmode=gcc3 /bin/sh ../../../../depcomp \
        g++ -DHAVE_CONFIG_H -I. -I. -I../../../.. -I../../../.. -I../../../../src/client -I../../../../src/shared -I../../../../src/shared/modules -I../../../../src/shared/network  -fexceptions   -c -o compress.o `test -f 'compress.cpp' || echo './'`compress.cpp
In file included from compress.cpp:36:0:
compress.h: In member function ‘virtual char* CModulesCompress::getName()’:
compress.h:34:37: warning: deprecated conversion from string constant to ‘char*’
compress.cpp: In member function ‘virtual void CModulesCompress::Module()’:
compress.cpp:97:30: error: cannot convert ‘DWORD*’ to ‘uLongf*’ for argument ‘2’ to ‘int compress(Bytef*, uLongf*, const Bytef*, uLong)’
make: *** [compress.o] Fehler 1
Had to change

Code: Select all

void CModulesCompress::Module()
{
  printf("compress started\n");
  sleep(5);
//  DWORD dwDestLen;
   uLongf  dwDestLen;
....
The same with decompress.cpp

Also it didn't find lzo1x.h - OK no Problem change the include

Code: Select all

partimage-cvs-0.7.2/src/shared/modules/backup/compress.cpp:
#ifdef LEVELSUPPORT_LZO
  #include <[color=red]lzo[/color]/lzo1x.h>
same with
partimage-cvs-0.7.2/src/shared/modules/backup/decompress.cpp

Next was an error of

Code: Select all

partimage-cvs-0.7.2/src/shared/modules/backup/part_reader.h
part_reader.h: In member function ‘virtual char* CModulesPartReader::getName()’:
part_reader.h:46:37: warning: deprecated conversion from string constant to ‘char*’
part_reader.cpp: In member function ‘virtual void CModulesPartReader::Module()’:
part_reader.cpp:214:15: error: ‘PED_SECTOR_SIZE’ was not declared in this scope
part_reader.cpp:235:39: error: ‘buffer’ was not declared in this scope
part_reader.cpp:240:30: error: ‘buffer’ was not declared in this scope
part_reader.cpp: In member function ‘void CModulesPartReader::ComputeUsedBlocks(char*)’:
part_reader.cpp:255:15: error: ‘PED_SECTOR_SIZE’ was not declared in this scope
part_reader.cpp:262:39: error: ‘buffer’ was not declared in this scope
part_reader.cpp:265:44: error: ‘buffer’ was not declared in this scope
Same with partimage-cvs-0.7.2/src/shared/modules/backup/part_writer.h

After integrating

Code: Select all

public:
  CModulesPartWriter(int _nPipeInput, int _nPipeOutput, CPool & _Pool,
....
  int PED_SECTOR_SIZE;
Went until:

Code: Select all

In file included from decode.cpp:36:0:
../../../src/shared/fs/fs_xfs.h:34:0: warning: "BBSIZE" redefined
../../../src/shared/fs/fs_ufs.h:73:0: note: this is the location of the previous definition
In file included from decode.cpp:26:0:
decode.h:37:3: error: extra qualification ‘CModulesDecodeParttable::’ on member ‘CModulesDecodeParttable’
decode.h:38:11: error: extra qualification ‘CModulesDecodeParttable::’ on member ‘CModulesDecodeParttable’
decode.h: In member function ‘virtual char* CModulesDecodeParttable::getName()’:
decode.h:47:37: warning: deprecated conversion from string constant to ‘char*’
make[5]: *** [decode.o] Fehler 1
make[5]: Leaving directory `/home/hartmut/Downloads/partimage-cvs-0.7.2/src/shared/modules'
make[4]: *** [all-recursive] Fehler 1
make[4]: Leaving directory `/home/hartmut/Downloads/partimage-cvs-0.7.2/src/shared/modules'
make[3]: *** [all-recursive] Fehler 1
make[3]: Leaving directory `/home/hartmut/Downloads/partimage-cvs-0.7.2/src/shared'
make[2]: *** [all-recursive] Fehler 1
make[2]: Leaving directory `/home/hartmut/Downloads/partimage-cvs-0.7.2/src'
make[1]: *** [all-recursive] Fehler 1
make[1]: Leaving directory `/home/hartmut/Downloads/partimage-cvs-0.7.2'
make: *** [all] Fehler 2
And is this where I'm stuck now.
My g++ knowledge is not sufficient to solve this problem.... :cry:

Did anyone solve this?

feffer
Posts: 126
Joined: Tue Mar 17, 2009 4:30 am

Post by feffer » Thu Aug 26, 2010 7:12 pm

As you probably know, partimage has not been under active development for some time. It still works for many filesystems, but does not support ext4. I was not familiar with partimage-cvs-0.7.2 so I googled it. There are some references to it on this forum dating from 2004, so it is old code.

Why not just use the latest partimage, which I believe is 0.6.9? I think it is still in the debian repos, or you can download it from here. I think the partimage-cvs-0.7.2 thing is a blind alley.

Regards,
feffer

Hartmut
Posts: 26
Joined: Thu Aug 26, 2010 10:06 am

Post by Hartmut » Fri Aug 27, 2010 7:54 am

feffer wrote:As you probably know, partimage has not been under active development for some time. It still works for many filesystems, but does not support ext4. I was not familiar with partimage-cvs-0.7.2 so I googled it. There are some references to it on this forum dating from 2004, so it is old code.
Yes, it is a litte old, but if people always wait for others to solve their problems opensource will die and we have to go back to companies selling such tools. As I have seen there are a lot of people out there using partimage - even in their company - so maybe there is an interest in saving this project.
As you have seen, I managed to compile 0.6.9 so I was curious if I can do the same with the newer one.
With my (limited) c++ knowledge I came to the point mentioned above. Maybe there is someone with better c++ know-how, that can solve this problem, so we can step further.

feffer wrote: Why not just use the latest partimage, which I believe is 0.6.9? I think it is still in the debian repos, or you can download it from here. I think the partimage-cvs-0.7.2 thing is a blind alley.

Regards,
feffer
Well 0.6.9 doesn't offer ext4 support either - so if there is no Support for this project, it will be dead in the near future. On the other hand I didn't find any RPM-Packages of actual releases in the net (newest was 0.6.5). So thats the next problem... if noone is trying to compile - there will no longer be packages around!!!
So now my next project will be to build a .rpm package from the 0.6.9 release, but as long as the svn-0.7.2 will not compile, I will not be able to create one for that!
Of course I could use (if it works) the pkg2rpm tools and hope that the debian guys will always be so kind to create a package for the actual system - but that would also be a kind of rely upon other peoples work.
In this case partimage itself will be a dead alley!!

feffer
Posts: 126
Joined: Tue Mar 17, 2009 4:30 am

Post by feffer » Fri Aug 27, 2010 9:06 pm

In this case partimage itself will be a dead alley!!
hmmm, that's what I was trying to say in softer words. Maybe not a dead alley, but a frozen one. I've been using partimage to back up my linux OS partitions for 5-6 years and it worked fine -- still does, but since it hasn't been actively developed for several years, it hasn't kept up with file-system changes.

Partimage saved my bacon several times in the past, so I still hang out here to help where I can, but this isn't a very active forum. Most partimage users have moved on. I was a holdout but finally installing on ext4 forced me to consider the options (I finally went to fsarchiver for OS partitions). Not block based like partimage, but it handles ext4 and worked well in my tests.

So, Hartmut, if you don't have a problem with partimage's limitations, by all means use it. As far as "saving" the project, I agree with you, partimage has a unique place, and some other people have shown an interest in the code. I hope so, but it's been a while, and nothing yet.

As far as your desire to compile partimage for opensuse, there may not be much difference between 0.6.9 and 0.7.2. Looking at Sourceforge, 0.6.9 is the stable branch and 0.7.2 an unstable (beta-type) branch. Is there a particular feature or functionality that you think is in 0.7.2 that you need? If not, 0.6.9 does the job very nicely...

Good luck, and post your resolution to aid others.

feffer

Hartmut
Posts: 26
Joined: Thu Aug 26, 2010 10:06 am

Post by Hartmut » Mon Aug 30, 2010 7:22 am

feffer wrote:In this case partimage itself will be a dead alley!!
hmmm, that's what I was trying to say in softer words. Maybe not a dead alley, but a frozen one. I've been using partimage to back up my linux OS partitions for 5-6 years and it worked fine -- still does, but since it hasn't been actively developed for several years, it hasn't kept up with file-system changes.
Hmm sad... but at the moment it works..
So the main problem is the change in available filesystems. Especially the newest ext4 and btrfs and the native zfs.
Which means the content of partimage-0.6.9/src/client/fs should be developed - thats right.
feffer wrote:Partimage saved my bacon several times in the past, so I still hang out here to help where I can, but this isn't a very active forum. Most partimage users have moved on. I was a holdout but finally installing on ext4 forced me to consider the options (I finally went to fsarchiver for OS partitions). Not block based like partimage, but it handles ext4 and worked well in my tests.

So, Hartmut, if you don't have a problem with partimage's limitations, by all means use it. As far as "saving" the project, I agree with you, partimage has a unique place, and some other people have shown an interest in the code. I hope so, but it's been a while, and nothing yet.
At the moment I don't see any limitations - only advantages ;)
Especially when setting up an environment, where I want to set up an installation server that serves boot images (vmlinuz, initrd) and installation images (partimage) for setting up a system semi-automatic.
So one question to you - when I created the systemimage of the test maschine I realized that partimage recognizes the ext4 partitions, but marking them as ext3 - makes sence, because i principle the ext4 is ext3 with special features and can be upgraded ext3 -> ext4 (same as ext2 -> ext3) - am I right? Did you also see the ext4 partitions as ext3?
I was also able to create an image from these ext4 partitions. Next will be the test with restore - I think it should work but the question is - will the system realize, this partition as native ext3 or ext4 with some missing informations? - And trying to repair it.
feffer wrote:As far as your desire to compile partimage for opensuse, there may not be much difference between 0.6.9 and 0.7.2. Looking at Sourceforge, 0.6.9 is the stable branch and 0.7.2 an unstable (beta-type) branch. Is there a particular feature or functionality that you think is in 0.7.2 that you need? If not, 0.6.9 does the job very nicely...
Well at first I expect new filesystems be integrated and tested in the newest development branch... next I think the new version would be the one, where additional features will appear first - so I was curious and tried it.
feffer wrote: Good luck, and post your resolution to aid others.

feffer
At the moment I stopped tries with 0.7 and switched back to 0.6.9:
Now I could create an rpm with static linked x86_64 binaries. This was the most important for me - to be able to use the bins without installing all the stuff on the target maschine or the bootimage.
But I also realized, that openSuSE 11.3 uses a newer rpm version with newer rpmlibs, so I could not install the rpms at CentOS 5.5 (=redhat ES5). Nevertheless, I was able to work with the static binaries and start the server at the installserver (using also a init script for start).
Next I try to create a static i386 version. And then switching back to 0.7.x

feffer
Posts: 126
Joined: Tue Mar 17, 2009 4:30 am

Post by feffer » Thu Sep 02, 2010 2:25 am

As I said, if it works for your purposes, that's great. I did not test partimage with ext4, but as you say, there may be work-arounds.

Most of my machines have at least 2 linux distros installed. I used partimage to back up the OS partition of unbooted ones using a script I had written. The script lived on a server but called partimage on the client machine. I found this was a bit faster than using partimaged on the server. My purpose was to have a known system image not over a week old. I was quite happy with this, and successfully restored systems several times.

I too hope that someone capable takes up the torch and tries to develop partimage further. There have been some efforts, but the code must be difficult, because I haven't seen anything similar yet. Clonezilla and partimage-ng are two examples, but I don't think they would really work for my purposes. The best drop-in replacement I've found is fsarchiver, but it has some drawbacks too -- it's doesn't do block level imaging, but filesystem copies.

Hartmut, if you are successful in getting partimage to work for your purposes, please post the result. Good luck.

feffer

Hartmut
Posts: 26
Joined: Thu Aug 26, 2010 10:06 am

Post by Hartmut » Fri Sep 10, 2010 9:43 am

So it seems to be (at least partially) a problem with the compiler Version... OpenSuSE uses gcc/g++ 4.5.0

The latest mentioned problem was (see above):

Code: Select all

decode.h:37:3: error: extra qualification ‘CModulesDecodeParttable::’ on member ‘CModulesDecodeParttable’
decode.h:38:11: error: extra qualification ‘CModulesDecodeParttable::’ on member ‘CModulesDecodeParttable’ 
I found out (google and other forums) that replacing

Code: Select all

  CModulesDecodeParttable::CModulesDecodeParttable(const CPool & _Pool, BOOL bShowPartDetails);
  virtual CModulesDecodeParttable::~CModulesDecodeParttable();
with

Code: Select all

  CModulesDecodeParttable(const CPool & _Pool, BOOL bShowPartDetails);
  virtual ~CModulesDecodeParttable();
(so simply deleting the CModulesDecodeParttable:: in Front solves that problem.)

But now I'm stuck in the gui section:
partimage-cvs-0.7.2/src/gui-client/shared
when doing the gui.cpp it comes to:

Code: Select all

make[4]: Entering directory `/home/hartmut/Downloads/partimage-cvs-0.7.2/src/gui-client/shared'
source='gui.cpp' object='gui.o' libtool=no \
        depfile='.deps/gui.Po' tmpdepfile='.deps/gui.TPo' \
        depmode=gcc3 /bin/sh ../../../depcomp \
        g++ -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../.. -I../../../src/client -I../../../src/shared -I../../../src/shared/modules -I../../../src/shared/network  -fexceptions   -c -o gui.o `test -f 'gui.cpp' || echo './'`gui.cpp
source='interface_net.cpp' object='interface_net.o' libtool=no \
        depfile='.deps/interface_net.Po' tmpdepfile='.deps/interface_net.TPo' \
        depmode=gcc3 /bin/sh ../../../depcomp \
        g++ -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../.. -I../../../src/client -I../../../src/shared -I../../../src/shared/modules -I../../../src/shared/network  -fexceptions   -c -o interface_net.o `test -f 'interface_net.cpp' || echo './'`interface_net.cpp
source='args.cpp' object='args.o' libtool=no \
        depfile='.deps/args.Po' tmpdepfile='.deps/args.TPo' \
        depmode=gcc3 /bin/sh ../../../depcomp \
        g++ -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../.. -I../../../src/client -I../../../src/shared -I../../../src/shared/modules -I../../../src/shared/network  -fexceptions   -c -o args.o `test -f 'args.cpp' || echo './'`args.cpp
gui.cpp:474:2: warning: #warning "FIXME: remove comments here after debug complete"
In file included from /usr/include/c++/4.5/string:53:0,
                 from /usr/include/c++/4.5/bits/locale_classes.h:42,
                 from /usr/include/c++/4.5/bits/ios_base.h:43,
                 from /usr/include/c++/4.5/ios:43,
                 from /usr/include/c++/4.5/ostream:40,
                 from /usr/include/c++/4.5/iostream:40,
                 from ../../../src/shared/network/net.h:31,
                 from ../../../src/shared/network/netclient.h:27,
                 from interface_net.h:22,
                 from gui.h:29,
                 from gui.cpp:29:
/usr/include/c++/4.5/bits/basic_string.h: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(const std::basic_string<_CharT, _Traits, _Alloc>&) const’:
/usr/include/c++/4.5/bits/basic_string.h:2134:31: error: expected unqualified-id before ‘(’ token
In file included from /usr/include/c++/4.5/string:56:0,
                 from /usr/include/c++/4.5/bits/locale_classes.h:42,
                 from /usr/include/c++/4.5/bits/ios_base.h:43,
                 from /usr/include/c++/4.5/ios:43,
                 from /usr/include/c++/4.5/ostream:40,
                 from /usr/include/c++/4.5/iostream:40,
                 from ../../../src/shared/network/net.h:31,
                 from ../../../src/shared/network/netclient.h:27,
                 from interface_net.h:22,
                 from gui.h:29,
                 from gui.cpp:29:
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘std::basic_string<_CharT, _Traits, _Alloc>::size_type std::basic_string<_CharT, _Traits, _Alloc>::rfind(const _CharT*, std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:784:17: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const std::basic_string<_CharT, _Traits, _Alloc>&) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:921:36: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const std::basic_string<_CharT, _Traits, _Alloc>&, std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:938:36: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(const _CharT*) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:954:36: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _CharT*) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:970:36: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/basic_string.tcc: In member function ‘int std::basic_string<_CharT, _Traits, _Alloc>::compare(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _CharT*, std::basic_string<_CharT, _Traits, _Alloc>::size_type) const’:
/usr/include/c++/4.5/bits/basic_string.tcc:986:36: error: expected unqualified-id before ‘(’ token
In file included from /usr/include/c++/4.5/streambuf:799:0,
                 from /usr/include/c++/4.5/ios:44,
                 from /usr/include/c++/4.5/ostream:40,
                 from /usr/include/c++/4.5/iostream:40,
                 from ../../../src/shared/network/net.h:31,
                 from ../../../src/shared/network/netclient.h:27,
                 from interface_net.h:22,
                 from gui.h:29,
                 from gui.cpp:29:
/usr/include/c++/4.5/bits/streambuf.tcc: In member function ‘virtual std::streamsize std::basic_streambuf<_CharT, _Traits>::xsgetn(char_type*, std::streamsize)’:
/usr/include/c++/4.5/bits/streambuf.tcc:54:38: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/streambuf.tcc: In member function ‘virtual std::streamsize std::basic_streambuf<_CharT, _Traits>::xsputn(const char_type*, std::streamsize)’:
/usr/include/c++/4.5/bits/streambuf.tcc:88:38: error: expected unqualified-id before ‘(’ token
In file included from /usr/include/c++/4.5/istream:854:0,
                 from /usr/include/c++/4.5/iostream:41,
                 from ../../../src/shared/network/net.h:31,
                 from ../../../src/shared/network/netclient.h:27,
                 from interface_net.h:22,
                 from gui.h:29,
                 from gui.cpp:29:
/usr/include/c++/4.5/bits/istream.tcc: In member function ‘std::streamsize std::basic_istream<_CharT, _Traits>::readsome(char_type*, std::streamsize)’:
/usr/include/c++/4.5/bits/istream.tcc:691:46: error: expected unqualified-id before ‘(’ token
gui.cpp: In member function ‘SPartInfo* CGui::getPartInfo(int, int)’:
gui.cpp:75:21: error: cannot convert ‘__gnu_cxx::__normal_iterator<SPartInfo*, std::vector<SPartInfo> >’ to ‘SPartInfo*’ in return
gui.cpp: In member function ‘void CGui::showError(int, char*, ...)’:
gui.cpp:92:45: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:92:45: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘void CGui::showAboutDialog(char*)’:
gui.cpp:107:61: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘void CGui::InitLog(char*)’:
gui.cpp:135:49: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘CResult CGui::OperationFormat(char*, char*, char*)’:
gui.cpp:200:30: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘CResult CGui::OperationPiSave()’:
gui.cpp:213:65: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:225:45: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:250:42: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:258:31: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:259:36: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘CResult CGui::OperationPiRestore()’:
gui.cpp:271:49: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:284:45: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:301:31: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:302:36: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘CResult CGui::OperationPiConvert()’:
gui.cpp:310:54: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘BOOL CGui::checkForInterruption(WORD)’:
gui.cpp:388:69: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:388:69: warning: deprecated conversion from string constant to ‘char*’
gui.cpp: In member function ‘unsigned int CGui::MainLoop()’:
gui.cpp:665:58: warning: deprecated conversion from string constant to ‘char*’
gui.cpp:665:58: warning: deprecated conversion from string constant to ‘char*’
 ....
 [b]a lot of similar errors[/b]
....
gui.cpp:1042:32: warning: deprecated conversion from string constant to ‘char*’
make[4]: *** [gui.o] Fehler 1
It seemed to be a problem with gui.cpp (line 70-77)
SPartInfo *CGui::getPartInfo(int nDisk, int nPart)
{
vector<SPartInfo>::iterator it2;
vector<SDrives>::iterator it = m_Drives->begin();
it2 = (it+nDisk)->piInfo.begin();
return (it2+nPart);
}
I found a discussion at http://bytes.com/topic/c/answers/562939 ... -container with a similar problem
and introducing a
typedef std::vector<SPartInfo>::iterator it2;
changes the problem to

Code: Select all

gui.cpp: In member function ‘SPartInfo* CGui::getPartInfo(int, int)’:
gui.cpp:74:8: error: expected unqualified-id before ‘=’ token
gui.cpp:75:15: error: expected primary-expression before ‘+’ token
and now I'm stuck once again.... :cry:

Post Reply