er, this time with the patch.... Dave Leskovec wrote: > This patch will use a file in the lxc configuration directory to store the tty > forwarding process pid. The pid is stored after the process is fork()'d. It's > loaded during startup when the config for a running container is loaded. The > file is deleted when the domain is undefined. This should avoid "losing" the > tty pid over a libvirtd restart. > -- Best Regards, Dave Leskovec IBM Linux Technology Center Open Virtualization
--- src/lxc_conf.c | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lxc_conf.h | 5 + src/lxc_driver.c | 6 ++ 3 files changed, 168 insertions(+) Index: b/src/lxc_conf.h =================================================================== --- a/src/lxc_conf.h 2008-05-29 14:34:48.000000000 -0700 +++ b/src/lxc_conf.h 2008-05-29 14:34:51.000000000 -0700 @@ -71,6 +71,8 @@ char configFile[PATH_MAX]; char configFileBase[PATH_MAX]; + char ttyPidFile[PATH_MAX]; + int parentTty; int containerTtyFd; char *containerTty; @@ -134,6 +136,9 @@ lxc_driver_t *driver, const char *configFile, const char *name); +int lxcStoreTtyPid(lxc_driver_t *driver, lxc_vm_t *vm); +int lxcLoadTtyPid(lxc_driver_t *driver, lxc_vm_t *vm); +int lxcDeleteTtyPid(lxc_vm_t *vm); void lxcError(virConnectPtr conn, virDomainPtr dom, Index: b/src/lxc_conf.c =================================================================== --- a/src/lxc_conf.c 2008-05-29 14:34:48.000000000 -0700 +++ b/src/lxc_conf.c 2008-05-29 14:34:51.000000000 -0700 @@ -650,6 +650,10 @@ strncpy(vm->configFileBase, file, PATH_MAX); vm->configFile[PATH_MAX-1] = '\0'; + if (lxcLoadTtyPid(driver, vm) < 0) { + DEBUG0("failed to load tty pid"); + } + return vm; } @@ -883,4 +887,157 @@ return 0; } +/** + * lxcStoreTtyPid: + * @driver: pointer to driver + * @vm: Ptr to VM + * + * Stores the pid of the tty forward process contained in vm->pid + * SYSCONFIG_DIR/libvirt/lxc/{container_name}.pid + * + * Returns 0 on success or -1 in case of error + */ +int lxcStoreTtyPid(lxc_driver_t *driver, lxc_vm_t *vm) +{ + int rc = -1; + int fd = -1; + FILE *file = NULL; + + if (vm->ttyPidFile[0] == 0x00) { + if (virFileBuildPath(driver->configDir, vm->def->name, ".pid", + vm->ttyPidFile, PATH_MAX) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot construct tty pid file path")); + goto error_out; + } + } + + if ((fd = open(vm->ttyPidFile, + O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR)) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot create tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + goto error_out; + } + + if (!(file = fdopen(fd, "w"))) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot fdopen tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + + if (close(fd) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("failed to close tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + } + + goto error_out; + } + + if (fprintf(file, "%d", vm->pid) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot write tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + + goto fclose_error_out; + } + + rc = 0; + +fclose_error_out: + if (fclose(file) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("failed to close tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + } + +error_out: + return rc; +} + +/** + * lxcLoadTtyPid: + * @driver: pointer to driver + * @vm: Ptr to VM + * + * Loads the pid of the tty forward process from the pid file. + * SYSCONFIG_DIR/libvirt/lxc/{container_name}.pid + * + * Returns + * > 0 - pid of tty process + * 0 - no tty pid file + * -1 - error + */ +int lxcLoadTtyPid(lxc_driver_t *driver, lxc_vm_t *vm) +{ + int rc = -1; + FILE *file; + + if (vm->ttyPidFile[0] == 0x00) { + if (virFileBuildPath(driver->configDir, vm->def->name, ".pid", + vm->ttyPidFile, PATH_MAX) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot construct tty pid file path")); + goto cleanup; + } + } + + if (!(file = fopen(vm->ttyPidFile, "r"))) { + if (ENOENT == errno) { + rc = 0; + goto cleanup; + } + + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot open tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + goto cleanup; + } + + if (fscanf(file, "%d", &(vm->pid)) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot read tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + goto cleanup; + } + + if (fclose(file) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("failed to close tty pid file %s: %s"), + vm->ttyPidFile, strerror(errno)); + goto cleanup; + } + + rc = vm->pid; + + cleanup: + return rc; +} + +/** + * lxcDeleteTtyPid: + * @vm: Ptr to VM + * + * Unlinks the tty pid file for the vm + * SYSCONFIG_DIR/libvirt/lxc/{container_name}.pid + * + * Returns on 0 success or -1 in case of error + */ +int lxcDeleteTtyPid(lxc_vm_t *vm) +{ + if (vm->ttyPidFile[0] == 0x00) { + goto no_file; + } + + if (unlink(vm->ttyPidFile) < 0) { + lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("cannot remove ttyPidFile %s"), vm->ttyPidFile); + return -1; + } + +no_file: + return 0; +} + #endif /* WITH_LXC */ Index: b/src/lxc_driver.c =================================================================== --- a/src/lxc_driver.c 2008-05-29 14:34:45.000000000 -0700 +++ b/src/lxc_driver.c 2008-05-29 14:34:51.000000000 -0700 @@ -328,6 +328,8 @@ vm->configFile[0] = '\0'; + lxcDeleteTtyPid(vm); + lxcRemoveInactiveVM(driver, vm); return 0; @@ -798,6 +800,10 @@ lxcTtyForward(vm->parentTty, vm->containerTtyFd); } + if (lxcStoreTtyPid(driver, vm)) { + DEBUG0("unable to store tty pid"); + } + close(vm->parentTty); close(vm->containerTtyFd);
-- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list