lib:replace: Add getprogname()
authorAndreas Schneider <asn@samba.org>
Fri, 2 Nov 2018 17:04:28 +0000 (18:04 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Mon, 12 Nov 2018 08:50:25 +0000 (09:50 +0100)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/replace/replace.c
lib/replace/replace.h
lib/replace/wscript

index 113137c29928c840c7523ffda4d56ca743a97524..e38df98ea3a034532a1bf4be3d2ede3c8dfaf64d 100644 (file)
@@ -978,3 +978,74 @@ int rep_memset_s(void *dest, size_t destsz, int ch, size_t count)
        return 0;
 }
 #endif /* HAVE_MEMSET_S */
+
+#ifndef HAVE_GETPROGNAME
+# ifndef _GNU_SOURCE
+# define PROGNAME_SIZE 32
+static char rep_progname[PROGNAME_SIZE];
+# endif /* _GNU_SOURCE */
+
+const char *rep_getprogname(void)
+{
+#ifdef _GNU_SOURCE
+       return program_invocation_short_name;
+#else /* _GNU_SOURCE */
+       FILE *fp = NULL;
+       char cmdline[4096] = {0};
+       char *p = NULL;
+       pid_t pid;
+       size_t nread;
+       int len;
+
+       if (rep_progname[0] != '\0') {
+               return rep_progname;
+       }
+
+       len = snprintf(rep_progname, sizeof(rep_progname), "%s", "<unknown>");
+       if (len <= 0) {
+               return "<unknown>";
+       }
+
+       pid = getpid();
+       if (pid <= 1 || pid == (pid_t)-1) {
+               return rep_progname;
+       }
+
+       len = snprintf(cmdline,
+                      sizeof(cmdline),
+                      "/proc/%u/cmdline",
+                      (unsigned int)pid);
+       if (len <= 0 || len == sizeof(cmdline)) {
+               return rep_progname;
+       }
+
+       fp = fopen(cmdline, "r");
+       if (fp == NULL) {
+               return rep_progname;
+       }
+
+       nread = fread(cmdline, 1, sizeof(cmdline) - 1, fp);
+       if (nread == 0) {
+               return rep_progname;
+       }
+
+       cmdline[nread] = '\0';
+
+       p = strrchr(cmdline, '/');
+       if (p != NULL) {
+               p++;
+       } else {
+               p = cmdline;
+       }
+
+       len = strlen(p);
+       if (len > PROGNAME_SIZE) {
+               p[PROGNAME_SIZE - 1] = '\0';
+       }
+
+       (void)snprintf(rep_progname, sizeof(rep_progname), "%s", p);
+
+       return rep_progname;
+#endif /* _GNU_SOURCE */
+}
+#endif /* HAVE_GETPROGNAME */
index de4e20c445417c9bb50ba63ddcb4c450bd8bfd18..732a822685824cdeeea95cdaa0c9309a5d1b96a2 100644 (file)
@@ -933,6 +933,11 @@ void rep_setproctitle_init(int argc, char *argv[], char *envp[]);
 int rep_memset_s(void *dest, size_t destsz, int ch, size_t count);
 #endif
 
+#ifndef HAVE_GETPROGNAME
+#define getprogname rep_getprogname
+const char *rep_getprogname(void);
+#endif
+
 #ifndef FALL_THROUGH
 # ifdef HAVE_FALLTHROUGH_ATTRIBUTE
 #  define FALL_THROUGH __attribute__ ((fallthrough))
index 8adfffe9584e4808672d04ad38542fb717788edb..c8693a3f2e17fbde4005a790f210a844441391f7 100644 (file)
@@ -426,6 +426,7 @@ def configure(conf):
     conf.CHECK_FUNCS('getgrent_r getgrgid_r getgrnam_r getgrouplist getpagesize')
     conf.CHECK_FUNCS('getpwent_r getpwnam_r getpwuid_r epoll_create')
     conf.CHECK_FUNCS('port_create')
+    conf.CHECK_FUNCS('getprogname')
 
     conf.SET_TARGET_TYPE('attr', 'EMPTY')