Пример #1
0
void
save_licence(unsigned char *data, int length)
{
	uint8 ho[20], hi[16];
	char *home, path[PATH_MAX], tmppath[PATH_MAX], hash[41];
	int fd;

	home = getenv("HOME");
	if (home == NULL)
		return;

	snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE, home);
	path[sizeof(path) - 1] = '\0';
	if (utils_mkdir_p(path, 0700) == -1)
	{
		perror(path);
		return;
	}

	memset(hi, 0, sizeof(hi));
	snprintf((char *) hi, 16, "%s", g_hostname);
	sec_hash_sha1_16(ho, hi, g_static_rdesktop_salt_16);
	sec_hash_to_string(hash, sizeof(hash), ho, sizeof(ho));

	/* write licence to {sha1}.cal.new, then atomically 
	   rename to {sha1}.cal */
	snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE "/%s.cal", home, hash);
	path[sizeof(path) - 1] = '\0';

	snprintf(tmppath, PATH_MAX, "%s.new", path);
	path[sizeof(path) - 1] = '\0';

	fd = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, 0600);
	if (fd == -1)
	{
		perror(tmppath);
		return;
	}

	if (write(fd, data, length) != length)
	{
		perror(tmppath);
		unlink(tmppath);
	}
	else if (rename(tmppath, path) == -1)
	{
		perror(path);
		unlink(tmppath);
	}

	close(fd);
}
Пример #2
0
/** Initialize ctrl
    Ret values: <0 failure, 0 master, 1 client
 */
int
ctrl_init(const char *user, const char *domain, const char *host)
{
	struct stat st;
	struct sockaddr_un saun;
	char hash[41], path[PATH_MAX];
	char *home;

	/* check if ctrl already initialized */
	if (ctrlsock != 0 || _ctrl_is_slave)
		return 0;

	home = getenv("HOME");
	if (home == NULL)
	{
		return -1;
	}

	/* get uniq hash for ctrlsock name */
	_ctrl_create_hash(user, domain, host, hash, 41);
	snprintf(ctrlsock_name, PATH_MAX, "%s" RDESKTOP_CTRLSOCK_STORE "/%s.ctl", home, hash);
	ctrlsock_name[sizeof(ctrlsock_name) - 1] = '\0';

	/* make sure that ctrlsock store path exists */
	snprintf(path, PATH_MAX, "%s" RDESKTOP_CTRLSOCK_STORE, home);
	path[sizeof(path) - 1] = '\0';
	if (utils_mkdir_p(path, 0700) == -1)
	{
		perror(path);
		return -1;
	}

	/* check if ctrl socket already exist then this process becomes a client */
	if (stat(ctrlsock_name, &st) == 0)
	{
		/* verify that unix socket is not stale */
		if (_ctrl_verify_unix_socket() == True)
		{
			_ctrl_is_slave = True;
			return 1;
		}
		else
		{
			unlink(ctrlsock_name);
		}
	}

	/* setup ctrl socket and start listening for connections */
	if ((ctrlsock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
	{
		perror("Error creating ctrl socket:");
		exit(1);
	}

	/* bind and start listening on server socket */
	memset(&saun, 0, sizeof(struct sockaddr_un));
	saun.sun_family = AF_UNIX;
	strncpy(saun.sun_path, ctrlsock_name, sizeof(saun.sun_path));
	if (bind(ctrlsock, (struct sockaddr *) &saun, sizeof(struct sockaddr_un)) < 0)
	{
		perror("Error binding ctrl socket:");
		exit(1);
	}

	if (listen(ctrlsock, 5) < 0)
	{
		perror("Error listening on socket:");
		exit(1);
	}

	/* add ctrl cleanup func to exit hooks */
	atexit(ctrl_cleanup);

	return 0;
}