1/* $NetBSD$ */ 2 3/*++ 4/* NAME 5/* lstat_as 3 6/* SUMMARY 7/* lstat file as user 8/* SYNOPSIS 9/* #include <sys/stat.h> 10/* #include <lstat_as.h> 11/* 12/* int lstat_as(path, st, euid, egid) 13/* const char *path; 14/* struct stat *st; 15/* uid_t euid; 16/* gid_t egid; 17/* DESCRIPTION 18/* lstat_as() looks up the file status of the named \fIpath\fR, 19/* using the effective rights specified by \fIeuid\fR 20/* and \fIegid\fR, and stores the result into the structure pointed 21/* to by \fIst\fR. A -1 result means the lookup failed. 22/* This call does not follow symbolic links. 23/* DIAGNOSTICS 24/* Fatal error: no permission to change privilege level. 25/* SEE ALSO 26/* set_eugid(3) switch effective rights 27/* LICENSE 28/* .ad 29/* .fi 30/* The Secure Mailer license must be distributed with this software. 31/* AUTHOR(S) 32/* Wietse Venema 33/* IBM T.J. Watson Research 34/* P.O. Box 704 35/* Yorktown Heights, NY 10598, USA 36/*--*/ 37 38/* System library. */ 39 40#include <sys_defs.h> 41#include <sys/stat.h> 42#include <unistd.h> 43 44/* Utility library. */ 45 46#include "msg.h" 47#include "set_eugid.h" 48#include "lstat_as.h" 49#include "warn_stat.h" 50 51/* lstat_as - lstat file as user */ 52 53int lstat_as(const char *path, struct stat * st, uid_t euid, gid_t egid) 54{ 55 uid_t saved_euid = geteuid(); 56 gid_t saved_egid = getegid(); 57 int status; 58 59 /* 60 * Switch to the target user privileges. 61 */ 62 set_eugid(euid, egid); 63 64 /* 65 * Lstat that file. 66 */ 67 status = lstat(path, st); 68 69 /* 70 * Restore saved privileges. 71 */ 72 set_eugid(saved_euid, saved_egid); 73 74 return (status); 75} 76