aboutsummaryrefslogblamecommitdiffstats
path: root/libcoopgamma_get_socket_file.c
blob: 3ac9a2bb482ae1664f9041d79717ad989caccb0c (plain) (tree)










































                                                                                    
/* See LICENSE file for copyright and license details. */
#include "common.h"


/**
 * Get the socket file of the coopgamma server
 * 
 * SIGCHLD must not be ignored or blocked
 * 
 * @param   method   The adjustment method, `NULL` for automatic
 * @param   site     The site, `NULL` for automatic
 * @return           The pathname of the server's socket, `NULL` on error
 *                   or if there server does have its own socket. The later
 *                   case is detected by checking that `errno` is set to 0,
 *                   and is the case when communicating with a server in a
 *                   multi-server display server like mds.
 */
char *
libcoopgamma_get_socket_file(const char *restrict method, const char *restrict site)
{
	char *raw;
	char *p;

	raw = libcoopgamma_query__(method, site, "-qq");
	if (!raw)
		return NULL;

	p = &strchr(raw, '\0')[-1];
	if (p < raw || *p != '\n') {
		errno = EBADMSG;
		goto fail;
	}
	*p = '\0';
	if (!*raw) {
		errno = EBADMSG;
		goto fail;
	}

	return raw;
fail:
	free(raw);
	return NULL;
}