Skip to content

Instantly share code, notes, and snippets.

@e7
Created January 16, 2020 10:40
Show Gist options
  • Save e7/500222dbd1d4ab058028e8a1c4c5d207 to your computer and use it in GitHub Desktop.
Save e7/500222dbd1d4ab058028e8a1c4c5d207 to your computer and use it in GitHub Desktop.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NGX_OK 0
#define NGX_ERROR -1
#define NGX_SETPROCTITLE_PAD '\0'
typedef int ngx_int_t;
typedef unsigned int ngx_uint_t;
extern char **environ;
static char *ngx_os_argv_last;
static int ngx_argc;
static char **ngx_os_argv;
static u_char *ngx_cpystrn(u_char *dst, const u_char *src, size_t n) {
if (n == 0) {
return dst;
}
while (--n) {
*dst = *src;
if (*dst == '\0') {
return dst;
}
dst++;
src++;
}
*dst = '\0';
return dst;
}
static void ngx_init_setproctitle() {
u_char *p;
size_t size;
ngx_uint_t i;
size = 0;
for (i = 0; environ[i]; i++) {
size += strlen(environ[i]) + 1;
}
p = (u_char *) malloc(size);
ngx_os_argv_last = ngx_os_argv[0];
for (i = 0; ngx_os_argv[i]; i++) {
if (ngx_os_argv_last == ngx_os_argv[i]) {
ngx_os_argv_last = ngx_os_argv[i] + strlen(ngx_os_argv[i]) + 1;
}
}
for (i = 0; environ[i]; i++) {
if (ngx_os_argv_last == environ[i]) {
size = strlen(environ[i]) + 1;
ngx_os_argv_last = environ[i] + size;
ngx_cpystrn(p, (u_char *) environ[i], size);
environ[i] = (char *) p;
p += size;
}
}
ngx_os_argv_last--;
}
static void ngx_setproctitle(const char *title) {
u_char *p;
ngx_os_argv[1] = NULL;
p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "",
ngx_os_argv_last - ngx_os_argv[0]);
p = ngx_cpystrn(p, (const u_char *) title, ngx_os_argv_last - (char *) p);
if (ngx_os_argv_last - (char *) p) {
memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);
}
}
void change_process_name(int argc, char *argv[], const char *new_name) {
ngx_os_argv = argv;
ngx_argc = argc;
ngx_init_setproctitle();
ngx_setproctitle(new_name);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment