forums.ps2dev.org Forum Index forums.ps2dev.org
Homebrew PS2, PSP & PS3 Development Discussions
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

paths
Goto page 1, 2  Next
 
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development
View previous topic :: View next topic  
Author Message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sat Feb 13, 2010 4:43 am    Post subject: paths Reply with quote

Hi all,

sorry to ask maybe a stupid question, but I'm dealing with paths and filenames, and would like to know if there si a function for expanding a relative path to an absolute one.
I'm "pretty" new to the "C" language, and after having find'd grep'd the pspdsk and the internet with my friend google, I haven't came across anything...

Something like the Borland Pascal FExpand, that for "./currentfolder/../common/fonts" should return "ms0:/PSP/GAME/MYSW/common/fonts", provided the current working directory was "ms0:/PSP/GAME/MYSW".

Thank you for any tips, I would like to avoid writing one from scrap... ;-)

Cheers, A.
Back to top
View user's profile Send private message
m0skit0



Joined: 02 Jun 2009
Posts: 226

PostPosted: Sun Feb 14, 2010 2:49 am    Post subject: Reply with quote

I don't know if there's a function that returns the current working directory path (like pwd on *IX systems), but your application should just keep track of the current directory, it's easier and cleaner.
_________________
The Incredible Bill Gates wrote:
The obvious mathematical breakthrough would be development of an easy way to factor large prime numbers.
Back to top
View user's profile Send private message
Zer01ne



Joined: 08 Sep 2008
Posts: 29

PostPosted: Sun Feb 14, 2010 3:57 am    Post subject: Reply with quote

Code:

sceIoChdir("ms0:/PSP/GAME/MYSW/");

This function change the current directory to the directory "ms0:/PSP/GAME/MYSW/"
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sun Feb 14, 2010 6:09 am    Post subject: Reply with quote

Thank you both for the answer.
actually, I don't need to change the directory, so sceIoChdir has no use for me.
Finally I ended up writing a function from scratch; it _does_ know the base folder to use in case of relative paths (the running folder I can get from argv[0], and that would eventually change, shall I adopt any Chdir...), and returns a fully qualified absolute path, from the "ms0:/" and on.

First, I split the path in its components and fill a list with them (adds a little overhead, but at the end is a lot easier to use). Then I just remove the ".." entries together with the previous one. The "." entries are just removed.
Finally I just repack the path.

In the graphical "open file dialog" I made, if I reach a root, where ".." isn't there, I just add it to the "list", and when applying it to a root, I just clean and fill the list only with devices like "ms0:/", "host0:/" etc.

Works good for what are my needs.
It took me a day, but a good 50% was for the graphical part, icons, etc.

Cheers, A.
Back to top
View user's profile Send private message
jsharrad



Joined: 20 Oct 2005
Posts: 102

PostPosted: Sun Feb 14, 2010 7:11 am    Post subject: Reply with quote

If you're using newlib you can just getCwd(); if not then yeah getting it from argv[0] is what I do too.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Fri Feb 19, 2010 12:28 pm    Post subject: Reply with quote

Use realpath:
Code:

char buf[MAXPATHLEN];
if (realpath("../", buf) != NULL) {
   printf("the absolute path is %s\n", buf);
}
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sat Feb 20, 2010 5:52 am    Post subject: Reply with quote

jimparis wrote:
Use realpath:
Code:

char buf[MAXPATHLEN];
if (realpath("../", buf) != NULL) {
   printf("the absolute path is %s\n", buf);
}


good find... thou' I'm not able to compile: 'realpath' was not declared in this scope. Including either stdlib.h or unistd.h, same thing.
Where is it defined?

Thanks, A.
Back to top
View user's profile Send private message
carl0sgs



Joined: 10 Dec 2009
Posts: 41

PostPosted: Sat Feb 20, 2010 6:49 am    Post subject: Reply with quote

I think this is what you need:

Code:

#include <dirent.h> // for getcwd
char buffer[601];
getcwd(buffer, 600);


(not sure of the values 600 & 601)

Hope it is useful
Back to top
View user's profile Send private message Visit poster's website
Coldbird



Joined: 08 Feb 2007
Posts: 155

PostPosted: Sat Feb 20, 2010 11:04 am    Post subject: Reply with quote

I just wanna note that relying on argv[0] for boot path checks isn't a clever idea as the OFW isn't providing anything of the sort when loading modules (the argument isnt given!).

So if you rely on argv[0] to get your path you will run into trouble if you run your module from flash0 using pspbtcnf loading lists...

If you only intend to run your modules on "sane areas" - like cfw ms0 loaders (game.txt, etc...) or using your own prx loader that provides argv[0] for you then its fine though.

But I must admit I'm doing it the same way, grabbing from argv[0] whenever possible.

I'm sure though there just has to be a function to grab the cwd natively built into the PSP firmware... probably somewhere in sascore or something...
_________________
Been gone for some time. Now I'm back. Someone mind getting me up-2-date?
Back to top
View user's profile Send private message MSN Messenger
TyRaNiD



Joined: 18 Jan 2004
Posts: 918

PostPosted: Sun Feb 21, 2010 12:01 am    Post subject: Reply with quote

There is sceIoGetThreadCwd but annoyingly it is kernel mode only from what I remember. This is why the C library maintains its own copy based on argv[0] but as that doesn't have to match where the file really comes from it isn't ideal.
Back to top
View user's profile Send private message
Torch



Joined: 28 May 2008
Posts: 842

PostPosted: Sun Feb 21, 2010 7:08 am    Post subject: Reply with quote

I thought even official games used hardcoded paths for custom memory stick data?
Back to top
View user's profile Send private message
carl0sgs



Joined: 10 Dec 2009
Posts: 41

PostPosted: Sun Feb 21, 2010 9:38 am    Post subject: Reply with quote

carl0sgs wrote:
I think this is what you need:

Code:

#include <dirent.h> // for getcwd
char buffer[601];
getcwd(buffer, 600);


(not sure of the values 600 & 601)

Hope it is useful


I repeat, getcwd() works for me.
Back to top
View user's profile Send private message Visit poster's website
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Sun Feb 21, 2010 12:20 pm    Post subject: Reply with quote

Alberto wrote:
jimparis wrote:
Use realpath:
Code:

char buf[MAXPATHLEN];
if (realpath("../", buf) != NULL) {
   printf("the absolute path is %s\n", buf);
}


good find... thou' I'm not able to compile: 'realpath' was not declared in this scope. Including either stdlib.h or unistd.h, same thing.
Where is it defined?

Thanks, A.
It's in newlib, but I think it's missing from the header file. Just add its prototype:
Code:
char *realpath(const char *path, char *resolved_path);
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sun Feb 21, 2010 11:42 pm    Post subject: Reply with quote

jimparis wrote:
It's in newlib, but I think it's missing from the header file. Just add its prototype:
Code:
char *realpath(const char *path, char *resolved_path);


sorry to bug, now I do get it compiled, but get "undefined reference to realpath"

I just defined the prototype at the beginning of the main.c, just to test it.
I'm new to C when it comes to these things, so maybe I'm still missing something? Any library to include (apart from the -lc which gets included by build.mak)?

Thanks in advance,
A.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Wed Feb 24, 2010 4:06 am    Post subject: Reply with quote

It's there... maybe you have an old newlib or you're using psplibc or something. try:
Code:
psp-nm /usr/local/pspdev/psp/lib/libc.a | grep realpath
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Wed Feb 24, 2010 5:49 am    Post subject: Reply with quote

jimparis wrote:
It's there... maybe you have an old newlib or you're using psplibc or something. try:
Code:
psp-nm /usr/local/pspdev/psp/lib/libc.a | grep realpath


this is what I got:

realpath.o:
00000000 T realpath

Don't have a clue of what this may mean, but looks like I have it...
so I need to compile the application with USE_PSPSDK_LIBC = 1 in the makefile?

I'm asking, because if I do so, I get a lot of undefined references to opendir, readdir, closedir... and some undefined references to _impure_ptr_, plus something else...

Any help?

Thanks, A.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Wed Feb 24, 2010 8:21 am    Post subject: Reply with quote

Nope, don't USE_PSPSDK_LIBC. Your grep shows that realpath is defined in libc, so either you're compiling against the wrong libc or something else. Post the full output of your compilation, maybe we can see what's wrong.
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Wed Feb 24, 2010 6:07 pm    Post subject: Reply with quote

Ok,

let me arrange a smaller app that gives me the errors and I'll post everything later on, today.

Thanks for the support,
A.
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Wed Feb 24, 2010 7:10 pm    Post subject: Reply with quote

here's the compilation log (hope it's what you asked)

Code:

rm -f empty.elf empty.prx  main.o  /home/batman/Projects/PSP/library/utils.o /home/batman/Projects/PSP/library/fileutils.o  /home/batman/Projects/PSP/psplib/pspapplication.o /home/batman/Projects/PSP/psplib/pspcrt.o  PARAM.SFO EBOOT.PBP EBOOT.PBP
psp-g++ -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o main.o main.cpp
psp-g++ -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o /home/batman/Projects/PSP/library/utils.o /home/batman/Projects/PSP/library/utils.cpp
psp-g++ -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o /home/batman/Projects/PSP/library/fileutils.o /home/batman/Projects/PSP/library/fileutils.cpp
psp-g++ -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o /home/batman/Projects/PSP/psplib/pspapplication.o /home/batman/Projects/PSP/psplib/pspapplication.cpp
psp-g++ -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o /home/batman/Projects/PSP/psplib/pspcrt.o /home/batman/Projects/PSP/psplib/pspcrt.cpp
psp-gcc -I/home/batman/Projects/PSP/library -I/home/batman/Projects/PSP/psplib -I/home/batman/Projects/PSP/danzeff -I. -I/usr/local/pspdev/psp/sdk/include -O3 -G0 -Wall -g -D_PSP_FW_VERSION=150  -L. -L/usr/local/pspdev/psp/sdk/lib   main.o /home/batman/Projects/PSP/library/utils.o /home/batman/Projects/PSP/library/fileutils.o /home/batman/Projects/PSP/psplib/pspapplication.o /home/batman/Projects/PSP/psplib/pspcrt.o -lpsppower -lpsprtc -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o empty.elf
main.o: In function `main':
/home/batman/Projects/PSP/Empty_Text/main.cpp:30: undefined reference to `realpath(char const*, char*)'
collect2: ld returned 1 exit status
make: *** [empty.elf] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
1 errors, 0 warnings


and this is the makefile

Code:

TARGET = empty
DESCRIPTION = Sony PSP Text Example

INCDIR = $(COMMON_LIBRARY) $(PSP_LIBRARY) $(DANZEFF_LIBRARY)

OBJS_MAIN = main.o

## base library functions, not PSP-specific, add lines in the form OBJS_COMMON += $(COMMON_LIBRARY)/<filename.o>
OBJS_COMMON =
OBJS_COMMON += $(COMMON_LIBRARY)/utils.o
OBJS_COMMON += $(COMMON_LIBRARY)/fileutils.o

## PSP-specific library functions, add lines in the form OBJS_PSP += $(PSP_LIBRARY)/<filename.o>
OBJS_PSP =
OBJS_PSP += $(PSP_LIBRARY)/pspapplication.o
OBJS_PSP += $(PSP_LIBRARY)/pspcrt.o

## PSP-specific, DanZeff on-screen keyboard, enable the line OBJS_DANZEFF += $(DANZEFF_LIBRARY)/<danzeff.o>
OBJS_DANZEFF =
##OBJS_DANZEFF = $(DANZEFF_LIBRARY)/danzeff.o

OBJS = $(OBJS_MAIN) $(OBJS_COMMON) $(OBJS_PSP) $(OBJS_DANZEFF)

CFLAGS = -O3 -G0 -Wall -g
##CXXFLAGS and ASFLAGS are automatically added the CFLAGS in the final (build.mak) make file, so no need to add them here
CXXFLAGS = -fno-exceptions -fno-rtti
ASFLAGS =
LDFLAGS =

##MAKE_PRX = 1
##USE_PSPSDK_LIBC = 1
##USE_KERNEL_LIBC = 1

LIBS = -lpsppower -lpsprtc

EXTRA_TARGETS = EBOOT.PBP
## The title in the XMB
PSP_EBOOT_TITLE = $(DESCRIPTION)
## The icon of the program, png format, 144x80 MAX
##PSP_EBOOT_ICON = $(TARGET).png
## The background image of the program in the XMB, png format, 480x272 MAX
##PSP_EBOOT_PIC1 = $(TARGET)-pic.png
## The sound being played in the XMB, Atrac3 format
##PSP_EBOOT_SND0  = $(TARGET).at3

PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
##include $(PSPSDK)/lib/build_prx.mak



Hope you can find something.

Thanks for helping,
A.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Thu Feb 25, 2010 5:54 am    Post subject: Reply with quote

Oh, you said C, not C++.
Wrap the prototype:
Code:
extern "C" {
  char *realpath(const char *path, char *resolved_path);
}
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Thu Feb 25, 2010 6:25 am    Post subject: Reply with quote

jimparis wrote:
Oh, you said C, not C++.
Wrap the prototype:
Code:
extern "C" {
  char *realpath(const char *path, char *resolved_path);
}


ehm... it works. :-D

Thank you... gonna save tip this for future issues.
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Fri Feb 26, 2010 5:15 am    Post subject: realpath Reply with quote

ok, as I said, it works... but...

is it correct, that if I try to explode a path that doesn't exist, it returns NULL?
I see in the man pages that it's buggy, so does this behavior fall into the word "buggy"?
If it _is_ so, I think I'll stuck with my implementation; maybe extend it a little to comply properly with chdir, and that's it. ;-)

Anyway, thanks again for getting it to compile and link.


Cheers, A.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Fri Feb 26, 2010 10:37 am    Post subject: Reply with quote

Yes, it needs to exist -- just like any implementation of realpath. I don't know what you mean by "buggy", but returning NULL and errno=ENOENT, ENOTDIR, etc is normal behavior when files or dirs don't exist.

If that's not what you want, you can try using the low-level and nonstandard __psp_path_absolute function from newlib.
Code:
int __psp_path_absolute(const char *in, char *out, int len);
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Fri Feb 26, 2010 5:44 pm    Post subject: Reply with quote

Hi,

sorry, I meant "broken by desing"... but haven't read to the end the manpage. It's "broken" for it's impossible to determine a suitable size for the output buffer, not for the behavior.

TTYTT, I can write C ot C++ code -more or less- easily; what I don't know is the complete library functions... I'm still at the beginning :-(
Most of the times I search the man pages and succeed in finding suitable things; but this time had no clue of realpath (and anyway I would have still hit the missing export thing...)

So I don't discuss what the function does or does not, but it doesn't do what I was expecting it to. I come mainly from Borland's Pascal and Delphi (on Windows envs.), and there, the functions FExpand and ExpandFilePath do exactly what I want: just resolve the "." and "..", shrink any non-leading "//", and add the cwd in front of paths not beginning with the drive; no matter whether the path actually exists or not.

Nevermind, if you like I can post my implementation, you can have a look at it, and just say what is good and what not... that could be of great help for me ;-)

Cheers, A.
Back to top
View user's profile Send private message
jimparis



Joined: 10 Jun 2005
Posts: 1179
Location: Boston

PostPosted: Sat Feb 27, 2010 3:40 am    Post subject: Reply with quote

Alberto wrote:
sorry, I meant "broken by desing"... but haven't read to the end the manpage. It's "broken" for it's impossible to determine a suitable size for the output buffer, not for the behavior.
The size is PATH_MAX. On PSP PATH_MAX is a defined constant, so none of the issues listed in the Linux man page apply.

Quote:
TTYTT, I can write C ot C++ code -more or less- easily; what I don't know is the complete library functions... I'm still at the beginning :-(
Most of the times I search the man pages and succeed in finding suitable things; but this time had no clue of realpath (and anyway I would have still hit the missing export thing...)
Looking through the newlib source is helpful, that's where all the libc stuff is done and these sort of functions is defined (download newlib and apply psptoolchain/patches/newlib-1.16.0-PSP.patch, then look in newlib/libc/sys/psp)

Quote:
So I don't discuss what the function does or does not, but it doesn't do what I was expecting it to. I come mainly from Borland's Pascal and Delphi (on Windows envs.), and there, the functions FExpand and ExpandFilePath do exactly what I want: just resolve the "." and "..", shrink any non-leading "//", and add the cwd in front of paths not beginning with the drive; no matter whether the path actually exists or not.
That's what __psp_path_absolute does.
Back to top
View user's profile Send private message
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sat Feb 27, 2010 6:15 am    Post subject: Reply with quote

jimparis wrote:

That's what __psp_path_absolute does.


mmm, ok, it does to some extent... I checked it out, but found the following misbehaviors:
assumed: we run from "host0:/TEST/"

locals...
1. "test.txt" gives "host0:/TEST/test.txt" CORRECT
2. "./test.txt" gives "host0:/TEST/host0:./test.txt" WRONGGG!
3. "host0:test.txt" gives "host0:/TEST/host0:test.txt" WRONGGG!
4. "host0:/test.txt" gives "host0:/test.txt' CORRECT

others...
1. expanding "ms0:test.txt" gives "host0:/TEST/ms0:test.txt" WRONG!
2. expanding "ms0:../test.txt" gives "host0:/TEST/ms0:../test.txt" WRONG!
they should both return, at least, ms0:/test.txt
3. expanding "ms0:/test.txt" gives "ms0:/test.txt" CORRECT
3. expanding "ms0:/../test.txt" gives "ms0:/test.txt" CORRECT

so, even forgetting for a moment the relative paths on different devices (on which I am still working, so no matter for now), what can you tell me now? ;-)


Cheers, A.
Back to top
View user's profile Send private message
carl0sgs



Joined: 10 Dec 2009
Posts: 41

PostPosted: Sat Feb 27, 2010 6:31 am    Post subject: Reply with quote

I don't see why can't you use getcwd.
Back to top
View user's profile Send private message Visit poster's website
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sat Feb 27, 2010 6:45 am    Post subject: Reply with quote

carl0sgs wrote:
I don't see why can't you use getcwd.


I do use it.

The thing is that I _want_ to expand relative paths (including . and ..) to absolute ones, no matter whther they exist or not.

So far, realpath doesn't suit my needs, as it returns NULL for non existen paths.

__psp_path_absolute returns wrong resuls, not only on different devices, but on local (getcwd'd) ones too.
see: ./test.txt MUST return host0:/TEST/test.txt (assumed getcwd is host0:/TEST), instead it returns host0:/TEST/host0:./test.txt

Am I stupid or what? ;-)

Cheers, A.

edit: by the way, looking at the source code of __psp_path_absolute I see I had the same approach (the code looks amazingly the same... wow), thou' I caerd for something more about assuming the path is absolute because it begins with a device name, and I also remove trailing /. and /.., that is, not assuming . and .. always end with a /

Again, cheers, A.

P.S.
too lazy to change my profile, but it should now read Location: Sofia
edit: ...ehm, also done that.
Back to top
View user's profile Send private message
carl0sgs



Joined: 10 Dec 2009
Posts: 41

PostPosted: Sat Feb 27, 2010 8:11 am    Post subject: Reply with quote

Alberto wrote:
Am I stupid or what? ;-).


Of course not!
It was just that I had posted about getcwd here twice, and didn't got an answer xD

good luck
Back to top
View user's profile Send private message Visit poster's website
Alberto



Joined: 12 Feb 2007
Posts: 57
Location: Sofia

PostPosted: Sat Feb 27, 2010 9:26 pm    Post subject: Reply with quote

Hi there,

carl0sgs wrote:

Of course not!


well, thanks for trusting... :-D

It was just that I had posted about getcwd here twice, and didn't got an answer xD

yeah, I see, but getcwd is one thing, but expanding a relative path prepending the getcwd result and then resolving all the . and .. entries is another.

carl0sgs wrote:
good luck


Thanks, I'm almost done, for what are my needs ATM.

P.S.
how's it going on your multitasking thing? Looks amazing. There is also another big project, very similar: NanoDesktop, but as far as I can see your one looks nicer (althou' I would change a bit the graphics, but this is no issue), and faster. Keep the good work up.


Cheers, A.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development All times are GMT + 10 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group