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); }
/** 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; }