static struct fstab * getfs(const char *spec, const char *file, int source) { struct fstab *res = NULL; struct lu_thread_info *tdata; tdata = _lu_data_create_key(_lu_data_key_fstab, free_lu_thread_info_fstab); if (tdata == NULL) { tdata = (struct lu_thread_info *)calloc(1, sizeof(struct lu_thread_info)); _lu_data_set_key(_lu_data_key_fstab, tdata); } if (_lu_running()) { switch (source) { case FS_GET_SPEC: res = lu_getfsspec(spec); break; case FS_GET_FILE: res = lu_getfsfile(file); break; case FS_GET_ENT: res = lu_getfsent(); break; default: res = NULL; } } else { pthread_mutex_lock(&_fstab_lock); switch (source) { case FS_GET_SPEC: res = copy_fstab(_old_getfsspec(spec)); break; case FS_GET_FILE: res = copy_fstab(_old_getfsfile(file)); break; case FS_GET_ENT: res = copy_fstab(_old_getfsent()); break; default: res = NULL; } pthread_mutex_unlock(&_fstab_lock); } recycle_fstab(tdata, res); return (struct fstab *)tdata->lu_entry; }
gint32 Mono_Posix_Syscall_getfsent (struct Mono_Posix_Syscall__Fstab *fsbuf) { mph_fstab *fs; if (fsbuf == NULL) { errno = EFAULT; return -1; } fs = getfsent (); if (fs == NULL) return -1; if (copy_fstab (fsbuf, fs) == -1) { errno = ENOMEM; return -1; } return 0; }
gint32 Mono_Posix_Syscall_getfsspec (const char *special_file, struct Mono_Posix_Syscall__Fstab *fsbuf) { mph_fstab *fs; if (fsbuf == NULL) { errno = EFAULT; return -1; } fs = getfsspec (special_file); if (fs == NULL) return -1; if (copy_fstab (fsbuf, fs) == -1) { errno = ENOMEM; return -1; } return 0; }
gint32 Mono_Posix_Syscall_getfsfile (const char *mount_point, struct Mono_Posix_Syscall__Fstab *fsbuf) { mph_fstab *fs; if (fsbuf == NULL) { errno = EFAULT; return -1; } fs = getfsfile (mount_point); if (fs == NULL) return -1; if (copy_fstab (fsbuf, fs) == -1) { errno = ENOMEM; return -1; } return 0; }