mirror of
https://github.com/clearlinux/clr-debug-info.git
synced 2026-09-06 13:51:38 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc376d5e8b | ||
|
|
c831ecb902 | ||
|
|
0978d429b2 |
@@ -1,6 +1,7 @@
|
||||
[Unit]
|
||||
Description=Clear Linux debuginfo fuse monitor
|
||||
After=clr_debug_daemon.service
|
||||
After=clr_debug_daemon.socket
|
||||
Requires=clr_debug_daemon.socket
|
||||
DefaultDependencies=no
|
||||
|
||||
[Service]
|
||||
|
||||
+3
-1
@@ -2,7 +2,7 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.66])
|
||||
AC_INIT(clr-debug-info, 47, arjan@linux.intel.com)
|
||||
AC_INIT(clr-debug-info, 48, arjan@linux.intel.com)
|
||||
AM_INIT_AUTOMAKE([foreign -Wall -W subdir-objects])
|
||||
AM_SILENT_RULES([yes])
|
||||
AC_PROG_CC
|
||||
@@ -15,6 +15,8 @@ PKG_CHECK_MODULES([SYSTEMD], [systemd])
|
||||
PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd])
|
||||
LT_INIT
|
||||
|
||||
AC_DEFINE([SOCKET_PATH], ["/run/clr-debug-info"], [path to communication socket])
|
||||
|
||||
dir=""
|
||||
AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
|
||||
[path to systemd system service dir @<:@default=/usr/lib/systemd/system@:>@]), [dir=${withval}],
|
||||
|
||||
+6
-4
@@ -36,6 +36,8 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/* 0.75 seconds timeout */
|
||||
#define TIMEOUT 75000
|
||||
#define TIMEOUT2 1500
|
||||
@@ -58,7 +60,7 @@ void try_to_get(const char *path, int pid, time_t timestamp)
|
||||
int shorttime = 0;
|
||||
__nc_unused__ size_t wr = -1;
|
||||
|
||||
// printf("Trying to aquire %s\n", path);
|
||||
// printf("Trying to aquire %s\n", path);
|
||||
|
||||
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sockfd < 0) {
|
||||
@@ -66,13 +68,13 @@ void try_to_get(const char *path, int pid, time_t timestamp)
|
||||
}
|
||||
|
||||
sun.sun_family = AF_UNIX;
|
||||
strcpy(sun.sun_path, "/run/clr-debug-info");
|
||||
strcpy(sun.sun_path, SOCKET_PATH);
|
||||
|
||||
ret = connect(sockfd,
|
||||
(struct sockaddr *)&sun,
|
||||
offsetof(struct sockaddr_un, sun_path) + strlen("/run/clr-debug-info") + 1);
|
||||
offsetof(struct sockaddr_un, sun_path) + strlen(SOCKET_PATH) + 1);
|
||||
if (ret < 0) {
|
||||
printf("Cannot connect %s\n", strerror(errno));
|
||||
printf("Cannot connect to %s: %s\n", SOCKET_PATH, strerror(errno));
|
||||
close(sockfd);
|
||||
return;
|
||||
}
|
||||
|
||||
+10
@@ -75,6 +75,16 @@ static int xmp_getattr(const char *path, struct stat *stbuf)
|
||||
memset(stbuf, 0, sizeof(struct stat));
|
||||
res = lstat(newpath, stbuf);
|
||||
|
||||
/*
|
||||
* filter out things that never should get fetched
|
||||
* this prevents us from asking curl to fetch us useless things
|
||||
*/
|
||||
if (strncmp(path, "/.Trash", strlen("/.Trash")) == 0) {
|
||||
return -ENOENT;
|
||||
} else if (strcmp(path, "/") == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* get the file. if the st_mtime is set, this is just an async refresh, otherwise it's
|
||||
* a synchronous request.
|
||||
|
||||
+48
-31
@@ -57,6 +57,8 @@
|
||||
#include <stdatomic.h>
|
||||
#endif
|
||||
|
||||
#define TIMEOUT 600 /* 10 minutes */
|
||||
|
||||
static pthread_mutex_t dupes_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
char *urls[2] = { "https://cdn.download.clearlinux.org/debuginfo/",
|
||||
@@ -431,54 +433,71 @@ int main(__nc_unused__ int argc, __nc_unused__ char **argv)
|
||||
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
if (sd_listen_fds(0) == 1) {
|
||||
/* systemd socket activation */
|
||||
printf("Received socket from systemd socket activation\n");
|
||||
sockfd = SD_LISTEN_FDS_START + 0;
|
||||
} else if (sd_listen_fds(0) > 1) {
|
||||
printf("Too many file descriptors received.\n");
|
||||
exit(1);
|
||||
} else {
|
||||
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sockfd < 0) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (sd_listen_fds(0) == 1) {
|
||||
/* systemd socket activation */
|
||||
sockfd = SD_LISTEN_FDS_START + 0;
|
||||
} else if (sd_listen_fds(0) > 1) {
|
||||
printf("Too many file descriptors received.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sockfd < 0) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
sun.sun_family = AF_UNIX;
|
||||
strcpy(sun.sun_path, "/run/clr-debug-info");
|
||||
sun.sun_family = AF_UNIX;
|
||||
strcpy(sun.sun_path, SOCKET_PATH);
|
||||
|
||||
ret = bind(sockfd,
|
||||
(struct sockaddr *)&sun,
|
||||
offsetof(struct sockaddr_un, sun_path) + strlen("/run/clr-debug-info") + 1);
|
||||
if (ret < 0) {
|
||||
printf("Failed to bind:%s \n", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
ret = bind(sockfd,
|
||||
(struct sockaddr *)&sun,
|
||||
offsetof(struct sockaddr_un, sun_path) + strlen(SOCKET_PATH) + 1);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Failed to bind:%s \n", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (listen(sockfd, 16) < 0) {
|
||||
printf("Failed to listen:%s \n", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
if (listen(sockfd, 16) < 0) {
|
||||
fprintf(stderr, "Failed to listen:%s \n", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (setgid(dbg_group)) {
|
||||
fprintf(stderr, "Unable to drop privileges setgid %s\n", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (setgroups(1, &dbg_group)) {
|
||||
fprintf(stderr, "Unable to drop privileges setgroups %s\n", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (setuid(dbg_user)) {
|
||||
fprintf(stderr, "Unable to drop privileges setuid %s\n", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
fd_set rfds;
|
||||
struct timeval tv;
|
||||
int ret;
|
||||
int clientsock;
|
||||
pthread_t thread;
|
||||
|
||||
malloc_trim(0);
|
||||
|
||||
/* use select() to timeout and exit gracefully */
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(sockfd, &rfds);
|
||||
tv.tv_sec = TIMEOUT;
|
||||
tv.tv_usec = 0;
|
||||
ret = select(sockfd + 1, &rfds, NULL, NULL, &tv);
|
||||
if (ret == -1) {
|
||||
perror("select()");
|
||||
exit(EXIT_FAILURE);
|
||||
} else if (ret == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
clientsock = accept(sockfd, NULL, NULL);
|
||||
|
||||
/* Too many connections, wait for the next loop/retry */
|
||||
@@ -503,6 +522,4 @@ int main(__nc_unused__ int argc, __nc_unused__ char **argv)
|
||||
if (hash) {
|
||||
nc_hashmap_free(hash);
|
||||
}
|
||||
|
||||
close(sockfd);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user