diff --git a/src/filesystem/os2/SDL_sysfilesystem.c b/src/filesystem/os2/SDL_sysfilesystem.c
index dce3f28..a440b09 100644
--- a/src/filesystem/os2/SDL_sysfilesystem.c
+++ b/src/filesystem/os2/SDL_sysfilesystem.c
@@ -40,80 +40,88 @@
 {
   PTIB       tib;
   PPIB       pib;
-  ULONG      ulRC = DosGetInfoBlocks( &tib, &pib );
+  ULONG      ulRC = DosGetInfoBlocks(&tib, &pib);
   PCHAR      pcEnd;
   ULONG      cbResult;
   CHAR       acBuf[_MAX_PATH];
-  
-  if ( ulRC != NO_ERROR )
-  {
-    debug( "DosGetInfoBlocks() failed, rc = %u", ulRC );
+
+  if (ulRC != NO_ERROR) {
+    debug("DosGetInfoBlocks() failed, rc = %u", ulRC);
     return NULL;
   }
 
-  pcEnd = SDL_strrchr( pib->pib_pchcmd, '\\' );
-  if ( pcEnd != NULL )
+  pcEnd = SDL_strrchr(pib->pib_pchcmd, '\\');
+  if (pcEnd != NULL)
     pcEnd++;
-  else
-  {
-    if ( pib->pib_pchcmd[1] == ':' )
+  else {
+    if (pib->pib_pchcmd[1] == ':')
       pcEnd = &pib->pib_pchcmd[2];
-    else
+    else {
+      SDL_SetError("No path in pib->pib_pchcmd");
       return NULL;
+    }
   }
 
   cbResult = pcEnd - pib->pib_pchcmd;
-  SDL_memcpy( acBuf, pib->pib_pchcmd, cbResult );
+  SDL_memcpy(acBuf, pib->pib_pchcmd, cbResult);
   acBuf[cbResult] = '\0';
 
-  return OS2_SysToUTF8( acBuf );
+  return OS2_SysToUTF8(acBuf);
 }
 
 char *
 SDL_GetPrefPath(const char *org, const char *app)
 {
-  PSZ        pszPath = SDL_getenv( "HOME" );
+  PSZ        pszPath;
   CHAR       acBuf[_MAX_PATH];
   int        lPosApp, lPosOrg;
-  PSZ        pszApp, pszOrg = OS2_UTF8ToSys( org );
+  PSZ        pszApp, pszOrg;
 
-  if ( pszOrg == NULL )
-  {
-    SDL_OutOfMemory();
-    return NULL;
-  }
-
-  if ( pszPath == NULL )
-  {
-    pszPath = SDL_getenv( "ETC" );
-    if ( pszPath == NULL )
+  if (!app) {
+      SDL_InvalidParamError("app");
       return NULL;
   }
 
-  lPosApp = SDL_snprintf( acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg );
-  SDL_free( pszOrg );
-  if ( lPosApp < 0 )
+  pszPath = SDL_getenv( "HOME" );
+  if (!pszPath) {
+    pszPath = SDL_getenv( "ETC" );
+    if (!pszPath) {
+      SDL_SetError("HOME or ETC environment not set");
+      return NULL;
+    }
+  }
+
+  if (!org) {
+    lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s", pszPath);
+  } else {
+    pszOrg = OS2_UTF8ToSys(org);
+    if (!pszOrg) {
+      SDL_OutOfMemory();
+      return NULL;
+    }
+    lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg);
+    SDL_free(pszOrg);
+  }
+  if (lPosApp < 0)
     return NULL;
 
-  DosCreateDir( acBuf, NULL );
+  DosCreateDir(acBuf, NULL);
 
-  pszApp = OS2_UTF8ToSys( app );
-  if ( pszApp == NULL )
-  {
+  pszApp = OS2_UTF8ToSys(app);
+  if (!pszApp) {
     SDL_OutOfMemory();
     return NULL;
   }
 
-  lPosOrg = SDL_snprintf( &acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s",
-                          pszApp );
-  SDL_free( pszApp );
-  if ( lPosOrg < 0 )
+  lPosOrg = SDL_snprintf(&acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s", pszApp);
+  SDL_free(pszApp);
+  if (lPosOrg < 0)
     return NULL;
 
-  DosCreateDir( acBuf, NULL );
+  DosCreateDir(acBuf, NULL);
   *((PUSHORT)&acBuf[lPosApp + lPosOrg]) = (USHORT)'\0\\';
 
-  return OS2_SysToUTF8( acBuf );
+  return OS2_SysToUTF8(acBuf);
 }
 
 #endif /* SDL_FILESYSTEM_OS2 */
