summaryrefslogtreecommitdiffstats
path: root/src/kmk/kmkbuiltin/solfakes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kmk/kmkbuiltin/solfakes.c')
-rw-r--r--src/kmk/kmkbuiltin/solfakes.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/kmk/kmkbuiltin/solfakes.c b/src/kmk/kmkbuiltin/solfakes.c
new file mode 100644
index 0000000..6996ab4
--- /dev/null
+++ b/src/kmk/kmkbuiltin/solfakes.c
@@ -0,0 +1,99 @@
+/* $Id: solfakes.c 2901 2016-09-09 15:10:24Z bird $ */
+/** @file
+ * Fake Unix stuff for Solaris.
+ */
+
+/*
+ * Copyright (c) 2005-2010 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
+ *
+ * This file is part of kBuild.
+ *
+ * kBuild is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * kBuild is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with kBuild. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "config.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include "solfakes.h"
+
+
+int asprintf(char **strp, const char *fmt, ...)
+{
+ int rc;
+ va_list va;
+ va_start(va, fmt);
+ rc = vasprintf(strp, fmt, va);
+ va_end(va);
+ return rc;
+}
+
+
+int vasprintf(char **strp, const char *fmt, va_list va)
+{
+ int rc;
+ char *psz;
+ size_t cb = 1024;
+
+ *strp = NULL;
+ for (;;)
+ {
+ va_list va2;
+
+ psz = malloc(cb);
+ if (!psz)
+ return -1;
+
+#ifdef va_copy
+ va_copy(va2, va);
+ rc = vsnprintf(psz, cb, fmt, va2);
+ va_end(va2);
+#else
+ va2 = va;
+ rc = vsnprintf(psz, cb, fmt, va2);
+#endif
+ if (rc < 0 || (size_t)rc < cb)
+ break;
+ cb *= 2;
+ free(psz);
+ }
+
+ *strp = psz;
+ return rc;
+}
+
+
+
+int sol_lchmod(const char *pszPath, mode_t mode)
+{
+ /*
+ * Weed out symbolic links.
+ */
+ struct stat s;
+ if ( !lstat(pszPath, &s)
+ && S_ISLNK(s.st_mode))
+ {
+ errno = -ENOSYS;
+ return -1;
+ }
+
+ return chmod(pszPath, mode);
+}
+