+static Yaz_Proxy *static_yaz_proxy = 0;
+static void sighup_handler(int num)
+{
+ signal(SIGHUP, sighup_handler);
+ if (static_yaz_proxy)
+ static_yaz_proxy->reconfig();
+}
+
+#if HAVE_XSLT
+static void proxy_xml_error_handler(void *ctx, const char *fmt, ...)
+{
+ char buf[1024];
+
+ va_list ap;
+ va_start(ap, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+
+ yaz_log(LOG_WARN, "%s", buf);
+
+ va_end (ap);
+}
+#endif
+
+static void child_run(Yaz_SocketManager *m, int run)
+{
+ signal(SIGHUP, sighup_handler);
+
+#if HAVE_XSLT
+ xmlSetGenericErrorFunc(0, proxy_xml_error_handler);
+#endif
+ yaz_log(LOG_LOG, "0 proxy run=%d pid=%ld", run, (long) getpid());
+
+ if (no_limit_files)
+ {
+#if HAVE_SETRLIMIT
+ struct rlimit limit_data;
+ limit_data.rlim_cur = no_limit_files;
+ limit_data.rlim_max = no_limit_files;
+
+ yaz_log(LOG_LOG, "0 setrlimit NOFILE cur=%d max=%d",
+ limit_data.rlim_cur, limit_data.rlim_max);
+ if (setrlimit(RLIMIT_NOFILE, &limit_data))
+ yaz_log(LOG_ERRNO|LOG_WARN, "setrlimit");
+#else
+ yaz_log(LOG_WARN, "setrlimit unavablable. Option -n ignored");
+#endif
+ }
+ if (pid_fname)
+ {
+ FILE *f = fopen(pid_fname, "w");
+ if (!f)
+ {
+ yaz_log(LOG_ERRNO|LOG_FATAL, "Couldn't create %s", pid_fname);
+ exit(0);
+ }
+ fprintf(f, "%ld", (long) getpid());
+ fclose(f);
+ xfree(pid_fname);
+ }
+ if (uid)
+ {
+ struct passwd *pw;
+
+ if (!(pw = getpwnam(uid)))
+ {
+ yaz_log(LOG_FATAL, "%s: Unknown user", uid);
+ exit(3);
+ }
+ if (log_file)
+ {
+ chown(log_file, pw->pw_uid, pw->pw_gid);
+ xfree(log_file);
+ }
+ if (setuid(pw->pw_uid) < 0)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
+ exit(4);
+ }
+ xfree(uid);
+ }
+#if HAVE_GETRLIMIT
+ struct rlimit limit_data;
+ getrlimit(RLIMIT_NOFILE, &limit_data);
+ yaz_log(LOG_LOG, "0 getrlimit NOFILE cur=%d max=%d",
+ limit_data.rlim_cur, limit_data.rlim_max);
+#endif
+
+ while (m->processEvent() > 0)
+ ;
+
+ exit (0);
+}
+