///////////////////////////////////////////////////////////////////////////////// // // Function: // // Purpose: // // Parameters: // // Return value: // // Author: Komatsu Yuji(Zheng Chuyu) // ///////////////////////////////////////////////////////////////////////////////// void jhklog_unlock(void) { if (jx_log == NULL) return; if (jx_log->fp != NULL) apr_file_unlock(jx_log->fp); }
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db) { if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK))) return APR_EINVAL; if (--db->lckcnt > 0) return APR_SUCCESS; db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK); return apr_file_unlock(db->dirf); }
static int file_unlock(lua_State *L) { apr_status_t status; lua_apr_file *file; file = file_check(L, 1, 1); status = apr_file_unlock(file->handle); return push_file_status(L, file, status); }
/* unlocks a filehandle */ void MVM_file_unlock(MVMThreadContext *tc, MVMObject *oshandle) { apr_status_t rv; MVMOSHandle *handle; verify_filehandle_type(tc, oshandle, &handle, "unlock filehandle"); if ((rv = apr_file_unlock(handle->body.file_handle)) != APR_SUCCESS) { MVM_exception_throw_apr_error(tc, rv, "Failed to unlock filehandle: "); } }
/* * write JSON metadata to a file */ static apr_byte_t oidc_metadata_file_write(request_rec *r, const char *path, const char *data) { // TODO: completely erase the contents of the file if it already exists.... apr_file_t *fd = NULL; apr_status_t rc = APR_SUCCESS; apr_size_t bytes_written = 0; char s_err[128]; /* try to open the metadata file for writing, creating it if it does not exist */ if ((rc = apr_file_open(&fd, path, (APR_FOPEN_WRITE | APR_FOPEN_CREATE), APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) { oidc_error(r, "file \"%s\" could not be opened (%s)", path, apr_strerror(rc, s_err, sizeof(s_err))); return FALSE; } /* lock the file and move the write pointer to the start of it */ apr_file_lock(fd, APR_FLOCK_EXCLUSIVE); apr_off_t begin = 0; apr_file_seek(fd, APR_SET, &begin); /* calculate the length of the data, which is a string length */ apr_size_t len = strlen(data); /* (blocking) write the number of bytes in the buffer */ rc = apr_file_write_full(fd, data, len, &bytes_written); /* check for a system error */ if (rc != APR_SUCCESS) { oidc_error(r, "could not write to: \"%s\" (%s)", path, apr_strerror(rc, s_err, sizeof(s_err))); return FALSE; } /* check that all bytes from the header were written */ if (bytes_written != len) { oidc_error(r, "could not write enough bytes to: \"%s\", bytes_written (%" APR_SIZE_T_FMT ") != len (%" APR_SIZE_T_FMT ")", path, bytes_written, len); return FALSE; } /* unlock and close the written file */ apr_file_unlock(fd); apr_file_close(fd); oidc_debug(r, "file \"%s\" written; number of bytes (%" APR_SIZE_T_FMT ")", path, len); return TRUE; }
/* NOTE: this function blocks until it acquires the lock */ APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type) { apr_status_t status; if (!(type == APR_FLOCK_SHARED || type == APR_FLOCK_EXCLUSIVE)) return APR_EINVAL; if (db->flags & SDBM_EXCLUSIVE_LOCK) { ++db->lckcnt; return APR_SUCCESS; } else if (db->flags & SDBM_SHARED_LOCK) { /* * Cannot promote a shared lock to an exlusive lock * in a cross-platform compatibile manner. */ if (type == APR_FLOCK_EXCLUSIVE) return APR_EINVAL; ++db->lckcnt; return APR_SUCCESS; } /* * zero size: either a fresh database, or one with a single, * unsplit data page: dirpage is all zeros. */ if ((status = apr_file_lock(db->dirf, type)) == APR_SUCCESS) { apr_finfo_t finfo; if ((status = apr_file_info_get(&finfo, APR_FINFO_SIZE, db->dirf)) != APR_SUCCESS) { (void) apr_file_unlock(db->dirf); return status; } SDBM_INVALIDATE_CACHE(db, finfo); ++db->lckcnt; if (type == APR_FLOCK_SHARED) db->flags |= SDBM_SHARED_LOCK; else if (type == APR_FLOCK_EXCLUSIVE) db->flags |= SDBM_EXCLUSIVE_LOCK; } return status; }