diff options
Diffstat (limited to 'src/coopgammad.c')
-rw-r--r-- | src/coopgammad.c | 265 |
1 files changed, 42 insertions, 223 deletions
diff --git a/src/coopgammad.c b/src/coopgammad.c index 7e6422e..df8f95d 100644 --- a/src/coopgammad.c +++ b/src/coopgammad.c @@ -15,7 +15,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <libgamma.h> +#include "arg.h" +#include "util.h" +#include "server.h" +#include "state.h" #include <sys/resource.h> #include <sys/socket.h> @@ -30,11 +33,6 @@ #include <string.h> #include <unistd.h> -#include "arg.h" -#include "output.h" -#include "util.h" -#include "server.h" - /** @@ -55,51 +53,13 @@ -extern char* restrict argv0_real; -extern struct output* restrict outputs; -extern size_t outputs_n; -extern int socketfd; extern char* restrict pidpath; extern char* restrict socketpath; extern int gerror; -extern int method; -extern char* restrict sitename; -extern libgamma_site_state_t site; -extern libgamma_partition_state_t* restrict partitions; -extern libgamma_crtc_state_t* restrict crtcs; -extern volatile sig_atomic_t reexec; -extern volatile sig_atomic_t terminate; -extern volatile sig_atomic_t connection; /** - * The name of the process - */ -char* restrict argv0; - -/** - * The real pathname of the process's binary, - * `NULL` if `argv0` is satisfactory - */ -char* restrict argv0_real = NULL; - -/** - * Array of all outputs - */ -struct output* restrict outputs = NULL; - -/** - * The nubmer of elements in `outputs` - */ -size_t outputs_n = 0; - -/** - * The server socket's file descriptor - */ -int socketfd = -1; - -/** * The pathname of the PID file */ char* restrict pidpath = NULL; @@ -112,52 +72,7 @@ char* restrict socketpath = NULL; /** * Error code returned by libgamma */ -int gerror; - -/** - * The adjustment method, -1 for automatic - */ -int method = -1; - -/** - * The site's name, may be `NULL` - */ -char* restrict sitename = NULL; - -/** - * The libgamma site state - */ -libgamma_site_state_t site; - -/** - * The libgamma partition states - */ -libgamma_partition_state_t* restrict partitions = NULL; - -/** - * The libgamma CRTC states - */ -libgamma_crtc_state_t* restrict crtcs = NULL; - -/** - * Has the process receive a signal - * telling it to re-execute? - */ -volatile sig_atomic_t reexec = 0; - -/** - * Has the process receive a signal - * telling it to terminate? - */ -volatile sig_atomic_t terminate = 0; - -/** - * Has the process receive a to - * disconnect from or reconnect to - * the site? 1 if disconnct, 2 if - * reconnect, 0 otherwise. - */ -volatile sig_atomic_t connection = 0; +int gerror; /* do not marshal */ @@ -905,12 +820,16 @@ static void destroy(int full) { size_t i; + if (full) + disconnect_all(); + if (full && (socketfd >= 0)) { shutdown(socketfd, SHUT_RDWR); close(socketfd); unlink(socketpath); } + #define RESTORE_RAMPS(SUFFIX, MEMBER) \ do \ if (outputs[i].saved_ramps.MEMBER.red != NULL) \ @@ -922,51 +841,36 @@ static void destroy(int full) while (0) if (outputs != NULL) for (i = 0; i < outputs_n; i++) - { - if (full && (outputs[i].supported != LIBGAMMA_NO)) - switch (outputs[i].depth) - { - case 8: - RESTORE_RAMPS(8, u8); - break; - case 16: - RESTORE_RAMPS(16, u16); - break; - case 32: - RESTORE_RAMPS(32, u32); - break; - case 64: - RESTORE_RAMPS(64, u64); - break; - case -1: - RESTORE_RAMPS(f, f); - break; - case -2: - RESTORE_RAMPS(d, d); - break; - default: - break; /* impossible */ - } - if (crtcs == NULL) - libgamma_crtc_destroy(outputs[i].crtc + i); - output_destroy(outputs + i); - } - free(outputs); - if (crtcs != NULL) - for (i = 0; i < outputs_n; i++) - libgamma_crtc_destroy(crtcs + i); - free(crtcs); - if (partitions != NULL) - for (i = 0; i < site.partitions_available; i++) - libgamma_partition_destroy(partitions + i); - free(partitions); - libgamma_site_destroy(&site); + if (full && (outputs[i].supported != LIBGAMMA_NO)) + switch (outputs[i].depth) + { + case 8: + RESTORE_RAMPS(8, u8); + break; + case 16: + RESTORE_RAMPS(16, u16); + break; + case 32: + RESTORE_RAMPS(32, u32); + break; + case 64: + RESTORE_RAMPS(64, u64); + break; + case -1: + RESTORE_RAMPS(f, f); + break; + case -2: + RESTORE_RAMPS(d, d); + break; + default: + break; /* impossible */ + } + free(socketpath); if (full && (pidpath != NULL)) unlink(pidpath); free(pidpath); - free(argv0_real); - free(sitename); + state_destroy(); } @@ -987,38 +891,13 @@ static void destroy(int full) */ static size_t marshal(void* restrict buf) { - size_t off = 0, i, n; + size_t off = 0, n; char* restrict bs = buf; if (bs != NULL) *(int*)(bs + off) = MARSHAL_VERSION; off += sizeof(int); - if (argv0_real == NULL) - { - if (bs != NULL) - *(bs + off) = '\0'; - off += 1; - } - else - { - n = strlen(argv0_real) + 1; - if (bs != NULL) - memcpy(bs + off, argv0_real, n); - off += n; - } - - if (bs != NULL) - *(size_t*)(bs + off) = outputs_n; - off += sizeof(size_t); - - for (i = 0; i < outputs_n; i++) - off += output_marshal(outputs + i, bs ? bs + off : NULL); - - if (bs != NULL) - *(int*)(bs + off) = socketfd; - off += sizeof(int); - n = strlen(pidpath) + 1; if (bs != NULL) memcpy(bs + off, pidpath, n); @@ -1029,26 +908,7 @@ static size_t marshal(void* restrict buf) memcpy(bs + off, socketpath, n); off += n; - off += server_marshal(bs ? bs + off : NULL); - - if (bs != NULL) - *(int*)(bs + off) = method; - off += sizeof(int); - - if (bs != NULL) - *(int*)(bs + off) = sitename != NULL; - off += sizeof(int); - if (sitename != NULL) - { - n = strlen(sitename) + 1; - if (bs != NULL) - memcpy(bs + off, sitename, n); - off += n; - } - - if (bs != NULL) - *(sig_atomic_t*)(bs + off) = connection; - off += sizeof(sig_atomic_t); + off += state_marshal(bs ? bs + off : NULL); return off; } @@ -1061,12 +921,12 @@ static size_t marshal(void* restrict buf) * @return The number of marshalled bytes, 0 on error */ GCC_ONLY(__attribute__((nonnull))) -static size_t unmarshal(void* restrict buf) +static size_t unmarshal(const void* restrict buf) { - size_t off = 0, i, n; - char* restrict bs = buf; + size_t off = 0, n; + const char* restrict bs = buf; - if (*(int*)(bs + off) != MARSHAL_VERSION) + if (*(const int*)(bs + off) != MARSHAL_VERSION) { fprintf(stderr, "%s: re-executing to incompatible version, sorry about that\n", argv0); errno = 0; @@ -1074,30 +934,6 @@ static size_t unmarshal(void* restrict buf) } off += sizeof(int); - if (*(bs + off)) - { - off += 1; - n = strlen(bs + off) + 1; - if (!(argv0_real = memdup(bs + off, n))) - return 0; - off += n; - } - else - off += 1; - - outputs_n = *(size_t*)(bs + off); - off += sizeof(size_t); - - for (i = 0; i < outputs_n; i++) - { - off += n = output_unmarshal(outputs + i, bs + off); - if (n == 0) - return 0; - } - - socketfd = *(int*)(bs + off); - off += sizeof(int); - n = strlen(bs + off) + 1; if (!(pidpath = memdup(bs + off, n))) return 0; @@ -1108,27 +944,10 @@ static size_t unmarshal(void* restrict buf) return 0; off += n; - off += n = server_unmarshal(bs + off); + off += n = state_unmarshal(bs + off); if (n == 0) return 0; - method = *(int*)(bs + off); - off += sizeof(int); - - if (*(int*)(bs + off)) - { - off += sizeof(int); - n = strlen(bs + off) + 1; - if (!(sitename = memdup(bs + off, n))) - return 0; - off += n; - } - else - off += sizeof(int); - - connection = *(sig_atomic_t*)(bs + off); - off += sizeof(sig_atomic_t); - return off; } |