Have user_runtime_dir return /var/run/user/uid for *BSD (#194)

diff --git a/src/platformdirs/unix.py b/src/platformdirs/unix.py
index cd55058..c93bb48 100644
--- a/src/platformdirs/unix.py
+++ b/src/platformdirs/unix.py
@@ -150,11 +150,17 @@
     def user_runtime_dir(self) -> str:
         """
         :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or
-         ``$XDG_RUNTIME_DIR/$appname/$version``
+         ``$XDG_RUNTIME_DIR/$appname/$version``.
+
+         For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/user/$(id -u)/$appname/$version`` if
+         ``$XDG_RUNTIME_DIR`` is not set.
         """
         path = os.environ.get("XDG_RUNTIME_DIR", "")
         if not path.strip():
-            path = f"/run/user/{getuid()}"
+            if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
+                path = f"/var/run/user/{getuid()}"
+            else:
+                path = f"/run/user/{getuid()}"
         return self._append_app_name_and_version(path)
 
     @property
diff --git a/tests/test_unix.py b/tests/test_unix.py
index 0ef607d..196ef6b 100644
--- a/tests/test_unix.py
+++ b/tests/test_unix.py
@@ -142,6 +142,20 @@
     assert result == "/custom-dir"
 
 
+@pytest.mark.usefixtures("_getuid")
+def test_platform_on_bsd(monkeypatch: pytest.MonkeyPatch, mocker: MockerFixture) -> None:
+    monkeypatch.delenv("XDG_RUNTIME_DIR", raising=False)
+    mocker.patch("sys.platform", "freebsd")
+    expected_path = "/var/run/user/1234"
+    assert Unix().user_runtime_dir == expected_path
+
+    mocker.patch("sys.platform", "openbsd")
+    assert Unix().user_runtime_dir == expected_path
+
+    mocker.patch("sys.platform", "netbsd")
+    assert Unix().user_runtime_dir == expected_path
+
+
 def test_platform_on_win32(monkeypatch: pytest.MonkeyPatch, mocker: MockerFixture) -> None:
     monkeypatch.delenv("XDG_RUNTIME_DIR", raising=False)
     mocker.patch("sys.platform", "win32")