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