@@ -1857,6 +1857,101 @@ chDomainSetVcpusFlags(virDomainPtr dom,
18571857 return ret ;
18581858}
18591859
1860+ static int chDomainSetAutostart (virDomainPtr dom ,
1861+ int autostart )
1862+ {
1863+ virCHDriverPtr driver = dom -> conn -> privateData ;
1864+ virDomainObjPtr vm ;
1865+ g_autofree char * configFile = NULL ;
1866+ g_autofree char * autostartLink = NULL ;
1867+ int ret = -1 ;
1868+ g_autoptr (virCHDriverConfig ) cfg = NULL ;
1869+
1870+ if (!(vm = virCHDomainObjFromDomain (dom )))
1871+ return -1 ;
1872+
1873+ cfg = virCHDriverGetConfig (driver );
1874+
1875+ if (virDomainSetAutostartEnsureACL (dom -> conn , vm -> def ) < 0 )
1876+ goto cleanup ;
1877+
1878+ if (!vm -> persistent ) {
1879+ virReportError (VIR_ERR_OPERATION_INVALID ,
1880+ "%s" , _ ("cannot set autostart for transient domain" ));
1881+ goto cleanup ;
1882+ }
1883+
1884+ autostart = (autostart != 0 );
1885+
1886+ if (vm -> autostart != autostart ) {
1887+ if (virCHDomainObjBeginJob (vm , CH_JOB_MODIFY ) < 0 )
1888+ goto cleanup ;
1889+
1890+ if (!(configFile = virDomainConfigFile (cfg -> stateDir , vm -> def -> name )))
1891+ goto endjob ;
1892+
1893+ if (!(autostartLink = virDomainConfigFile (cfg -> autostartDir ,
1894+ vm -> def -> name )))
1895+ goto endjob ;
1896+
1897+ if (autostart ) {
1898+ if (virFileMakePath (cfg -> autostartDir ) < 0 ) {
1899+ virReportSystemError (errno ,
1900+ _ ("cannot create autostart directory %s" ),
1901+ cfg -> autostartDir );
1902+ goto endjob ;
1903+ }
1904+
1905+ if (symlink (configFile , autostartLink ) < 0 ) {
1906+ virReportSystemError (errno ,
1907+ _ ("Failed to create symlink '%s to '%s'" ),
1908+ autostartLink , configFile );
1909+ goto endjob ;
1910+ }
1911+ } else {
1912+ if (unlink (autostartLink ) < 0 &&
1913+ errno != ENOENT &&
1914+ errno != ENOTDIR ) {
1915+ virReportSystemError (errno ,
1916+ _ ("Failed to delete symlink '%s'" ),
1917+ autostartLink );
1918+ goto endjob ;
1919+ }
1920+ }
1921+
1922+ vm -> autostart = autostart ;
1923+
1924+ endjob :
1925+ virCHDomainObjEndJob (vm );
1926+ }
1927+ ret = 0 ;
1928+
1929+ cleanup :
1930+ virDomainObjEndAPI (& vm );
1931+ return ret ;
1932+ }
1933+
1934+ static int chDomainGetAutostart (virDomainPtr dom ,
1935+ int * autostart )
1936+ {
1937+ virDomainObjPtr vm ;
1938+ int ret = -1 ;
1939+
1940+ if (!(vm = virCHDomainObjFromDomain (dom )))
1941+ goto cleanup ;
1942+
1943+ if (virDomainGetAutostartEnsureACL (dom -> conn , vm -> def ) < 0 )
1944+ goto cleanup ;
1945+
1946+ * autostart = vm -> autostart ;
1947+ ret = 0 ;
1948+
1949+ cleanup :
1950+ virDomainObjEndAPI (& vm );
1951+ return ret ;
1952+ };
1953+
1954+
18601955/* Function Tables */
18611956static virHypervisorDriver chHypervisorDriver = {
18621957 .name = "CH" ,
@@ -1906,6 +2001,9 @@ static virHypervisorDriver chHypervisorDriver = {
19062001 .domainSetNumaParameters = chDomainSetNumaParameters , /* 6.7.0 */
19072002 .domainGetNumaParameters = chDomainGetNumaParameters , /* 6.7.0 */
19082003 .domainSetVcpusFlags = chDomainSetVcpusFlags , /* 6.7.0 */
2004+ .domainGetAutostart = chDomainGetAutostart , /* 6.7.0 */
2005+ .domainSetAutostart = chDomainSetAutostart , /* 6.7.0 */
2006+
19092007};
19102008
19112009static virConnectDriver chConnectDriver = {
0 commit comments