From c28cae95cd9d450a46520248977cf074736faf55 Mon Sep 17 00:00:00 2001
From: Joel <sauskethunderkid@gmail.com>
Date: Sat, 19 May 2018 09:50:00 -0500
Subject: [PATCH] Add setGetSerialNumber (#95)

---
 nx/include/switch/services/set.h |  6 ++++++
 nx/source/services/set.c         | 37 ++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/nx/include/switch/services/set.h b/nx/include/switch/services/set.h
index 57ffeeff..cd4fc0a0 100644
--- a/nx/include/switch/services/set.h
+++ b/nx/include/switch/services/set.h
@@ -66,3 +66,9 @@ void setsysExit(void);
 
 /// Gets the current system theme.
 Result setsysGetColorSetId(ColorSetId* out);
+
+/**
+ * @brief Gets the system's serial number.
+ * @param serial Pointer to output the serial to. (The buffer size needs to be at least 0x19 bytes)
+ */
+Result setsysGetSerialNumber(char *serial);
diff --git a/nx/source/services/set.c b/nx/source/services/set.c
index ae66fad0..6bf4b5c7 100644
--- a/nx/source/services/set.c
+++ b/nx/source/services/set.c
@@ -346,3 +346,40 @@ Result setsysGetColorSetId(ColorSetId* out)
     return rc;
 
 }
+
+Result setsysGetSerialNumber(char *serial) {
+    IpcCommand c;
+    ipcInitialize(&c);
+
+    if (serial) memset(serial, 0, 0x19);
+
+    struct {
+        u64 magic;
+        u64 cmd_id;
+    } *raw;
+
+    raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+    raw->magic = SFCI_MAGIC;
+    raw->cmd_id = 68;
+
+    Result rc = serviceIpcDispatch(&g_setsysSrv);
+
+    if (R_SUCCEEDED(rc)) {
+        IpcParsedCommand r;
+        ipcParse(&r);
+
+        struct {
+            u64 magic;
+            u64 result;
+            char serial[0x18];
+        } *resp = r.Raw;
+
+        rc = resp->result;
+
+        if (R_SUCCEEDED(rc) && serial)
+        	memcpy(serial, resp->serial, 0x18);
+    }
+
+    return rc;
+}