void que_free( pbs_queue *pq, int sv_qs_mutex_held) { int i; pbs_attribute *pattr; attribute_def *pdef; /* remove any calloc working pbs_attribute space */ for (i = 0;i < QA_ATR_LAST;i++) { pdef = &que_attr_def[i]; pattr = &pq->qu_attr[i]; pdef->at_free(pattr); /* remove any acl lists associated with the queue */ if (pdef->at_type == ATR_TYPE_ACL) { pattr->at_flags |= ATR_VFLAG_MODIFY; save_acl(pattr, pdef, pdef->at_name, pq->qu_qs.qu_name); } } /* now free the main structure */ if (sv_qs_mutex_held == FALSE) lock_sv_qs_mutex(server.sv_qs_mutex, __func__); server.sv_qs.sv_numque--; if (sv_qs_mutex_held == FALSE) unlock_sv_qs_mutex(server.sv_qs_mutex, __func__); free_user_info_holder(pq->qu_uih); remove_queue(&svr_queues, pq); pq->q_being_recycled = TRUE; insert_into_queue_recycler(pq); unlock_queue(pq, "que_free", NULL, LOGLEVEL); return; } /* END que_free() */
void que_free( pbs_queue *pq) { int i; attribute *pattr; attribute_def *pdef; /* remove any malloc working attribute space */ for (i = 0;i < QA_ATR_LAST;i++) { pdef = &que_attr_def[i]; pattr = &pq->qu_attr[i]; pdef->at_free(pattr); /* remove any acl lists associated with the queue */ if (pdef->at_type == ATR_TYPE_ACL) { pattr->at_flags |= ATR_VFLAG_MODIFY; save_acl(pattr, pdef, pdef->at_name, pq->qu_qs.qu_name); } } /* now free the main structure */ server.sv_qs.sv_numque--; delete_link(&pq->qu_link); free((char *)pq); return; } /* END que_free() */
int que_save_fs(pbs_queue *pque) { int fds; int i; char namebuf1[MAXPATHLEN]; char namebuf2[MAXPATHLEN]; (void)strcpy(namebuf1, path_queues); (void)strcat(namebuf1, pque->qu_qs.qu_name); (void)strcpy(namebuf2, namebuf1); (void)strcat(namebuf2, ".new"); #ifdef WIN32 fix_perms2(namebuf2, namebuf1); #endif fds = open(namebuf2, O_CREAT | O_WRONLY | O_Sync, 0600); if (fds < 0) { sprintf(log_buffer, "error opening %s", namebuf2); log_err(errno, __func__, log_buffer); return (-1); } #ifdef WIN32 secure_file(namebuf2, "Administrators", READS_MASK|WRITES_MASK|STANDARD_RIGHTS_REQUIRED); setmode(fds, O_BINARY); #endif /* set up save buffering system */ save_setup(fds); /* save basic queue structure (fixed length stuff) */ if (save_struct((char *)&pque->qu_qs, sizeof(struct queuefix)) != 0) { log_err(-1, __func__, "save_struct failed"); (void)close(fds); return (-1); } /* save queue attributes */ if (save_attr_fs(que_attr_def, pque->qu_attr, (int)QA_ATR_LAST) != 0) { log_err(-1, __func__, "save_attr failed"); (void)close(fds); return (-1); } if (save_flush() != 0) { /* flush the save buffer */ log_err(-1, __func__, "save_flush failed"); (void)close(fds); return (-1); } #ifdef WIN32 if (_commit(fds) != 0) { log_err(errno, __func__, "flush queue file to disk failed!"); close(fds); return (-1); } #endif (void)close(fds); #ifdef WIN32 if (MoveFileEx(namebuf2, namebuf1, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH) == 0) { errno = GetLastError(); sprintf(log_buffer, "MoveFileEx(%s, %s) failed!", namebuf2, namebuf1); log_err(errno, __func__, log_buffer); } secure_file(namebuf1, "Administrators", READS_MASK|WRITES_MASK|STANDARD_RIGHTS_REQUIRED); #else if (rename(namebuf2, namebuf1) < 0) log_err(errno, __func__, "unable to rename queue name"); #endif /* * now search queue's attributes for access control lists, * they are saved separately in their own file: * ../priv/(attr name)/(queue name) */ for (i=0; i < (int)QA_ATR_LAST; i++) { if (pque->qu_attr[i].at_type == ATR_TYPE_ACL) { save_acl(&pque->qu_attr[i], &que_attr_def[i], que_attr_def[i].at_name, pque->qu_qs.qu_name); } } return (0); }
int svr_save( struct server *ps, int mode) { #ifndef SERVER_XML static char *this_function_name = "svr_save"; int i; int sdb; int save_acl(attribute *, attribute_def *, char *, char *); #endif /* ndef SERVER_XML */ /* save the server in xml only if configured */ #ifdef SERVER_XML return(svr_save_xml(ps,mode)); #endif /* def SERVER_XML */ #ifndef SERVER_XML if (mode == SVR_SAVE_QUICK) { sdb = open(path_svrdb, O_WRONLY | O_CREAT | O_Sync, 0600); if (sdb < 0) { log_err(errno, this_function_name, msg_svdbopen); return(-1); } while ((i = write( sdb, &ps->sv_qs, sizeof(struct server_qs))) != sizeof(struct server_qs)) { if ((i == -1) && (errno == EINTR)) continue; log_err(errno, this_function_name, msg_svdbnosv); return(-1); } close(sdb); } else { /* SVR_SAVE_FULL Save */ sdb = open(path_svrdb_new, O_WRONLY | O_CREAT | O_Sync, 0600); if (sdb < 0) { log_err(errno, this_function_name, msg_svdbopen); return(-1); } ps->sv_qs.sv_savetm = time_now; save_setup(sdb); if (save_struct((char *)&ps->sv_qs, sizeof(struct server_qs)) != 0) { snprintf(log_buffer, 1024, "cannot save data into server db, errno=%d (%s)", errno, pbs_strerror(errno)); log_err(errno, this_function_name, log_buffer); close(sdb); return(-1); } if (save_attr(svr_attr_def, ps->sv_attr, (int)SRV_ATR_LAST) != 0) { close(sdb); return(-1); } if (save_flush() != 0) { close(sdb); return(-1); } /* new db successfully created, remove original db */ close(sdb); unlink(path_svrdb); if (link(path_svrdb_new, path_svrdb) == -1) { snprintf(log_buffer, 1024, "cannot move new database to default database location, errno=%d (%s)", errno, pbs_strerror(errno)); log_err(errno, this_function_name, log_buffer); } else { unlink(path_svrdb_new); } /* save the server acls to their own files: */ /* priv/svracl/(attr name) */ for (i = 0;i < SRV_ATR_LAST;i++) { if (ps->sv_attr[i].at_type == ATR_TYPE_ACL) save_acl(&ps->sv_attr[i], &svr_attr_def[i], PBS_SVRACL, svr_attr_def[i].at_name); } } /* END else (mode == SVR_SAVE_QUICK) */ return(0); #endif /* ndef SERVER_XML */ } /* END svr_save() */