Add an "open" command to the "file" (now "session") menu on the Mac to
[u/mdw/putty] / mac / macstore.c
index fa6493a..fe1232e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: macstore.c,v 1.1 2002/11/19 02:13:46 ben Exp $ */
+/* $Id: macstore.c,v 1.6 2002/12/30 18:21:17 ben Exp $ */
 
 /*
  * macstore.c: Macintosh-specific impementation of the interface
 
 #include "putty.h"
 #include "storage.h"
+#include "mac.h"
 
 #define PUTTY_CREATOR  FOUR_CHAR_CODE('pTTY')
 #define SESS_TYPE      FOUR_CHAR_CODE('Sess')
 
 
-OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID);
 OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit);
 
 /*
@@ -87,7 +87,6 @@ struct write_settings {
 void *open_settings_w(char *sessionname) {
     short sessVRefNum, tmpVRefNum;
     long sessDirID, tmpDirID;
-    FSSpec sessfile;
     OSErr error;
     Str255 psessionname;
     struct write_settings *ws;
@@ -192,21 +191,32 @@ void close_settings_w(void *handle) {
     safefree(handle);
 }
 
-void *open_settings_r(char *sessionname) {
+void *open_settings_r(char *sessionname)
+{
     short sessVRefNum;
     long sessDirID;
     FSSpec sessfile;
     OSErr error;
     Str255 psessionname;
-    int fd;
-    int *handle;
 
     error = get_session_dir(kDontCreateFolder, &sessVRefNum, &sessDirID);
 
     c2pstrcpy(psessionname, sessionname);
     error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &sessfile);
     if (error != noErr) goto out;
-    fd = FSpOpenResFile(&sessfile, fsRdPerm);
+    return open_settings_r_fsp(&sessfile);
+
+  out:
+    return NULL;
+}
+
+void *open_settings_r_fsp(FSSpec *sessfile)
+{
+    OSErr error;
+    int fd;
+    int *handle;
+
+    fd = FSpOpenResFile(sessfile, fsRdPerm);
     if (fd == 0) {error = ResError(); goto out;}
 
     handle = safemalloc(sizeof *handle);
@@ -217,11 +227,10 @@ void *open_settings_r(char *sessionname) {
     return NULL;
 }
 
-
 char *read_setting_s(void *handle, char *key, char *buffer, int buflen) {
     int fd;
     Handle h;
-    OSErr error;
+    size_t len;
 
     if (handle == NULL) goto out;
     fd = *(int *)handle;
@@ -230,8 +239,11 @@ char *read_setting_s(void *handle, char *key, char *buffer, int buflen) {
     h = get1namedresource(FOUR_CHAR_CODE('TEXT'), key);
     if (h == NULL) goto out;
 
-    if (GetHandleSize(h) > buflen) goto out;
-    p2cstrcpy(buffer, (StringPtr)*h);
+    len = GetHandleSize(h);
+    if (len + 1 > buflen) goto out;
+    memcpy(buffer, *h, len);
+    buffer[len] = '\0';
+
     ReleaseResource(h);
     if (ResError() != noErr) goto out;
     return buffer;
@@ -243,7 +255,6 @@ char *read_setting_s(void *handle, char *key, char *buffer, int buflen) {
 int read_setting_i(void *handle, char *key, int defvalue) {
     int fd;
     Handle h;
-    OSErr error;
     int value;
 
     if (handle == NULL) goto out;