xref: /netbsd-src/external/ibm-public/postfix/dist/src/global/dot_lockfile_as.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
1 /*	$NetBSD: dot_lockfile_as.c,v 1.1.1.1 2009/06/23 10:08:45 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	dot_lockfile_as 3
6 /* SUMMARY
7 /*	dotlock file as user
8 /* SYNOPSIS
9 /*	#include <dot_lockfile_as.h>
10 /*
11 /*	int	dot_lockfile_as(path, why, euid, egid)
12 /*	const char *path;
13 /*	VSTRING *why;
14 /*	uid_t	euid;
15 /*	gid_t	egid;
16 /*
17 /*	void	dot_unlockfile_as(path, euid, egid)
18 /*	const char *path;
19 /*	uid_t	euid;
20 /*	gid_t	egid;
21 /* DESCRIPTION
22 /*	dot_lockfile_as() and dot_unlockfile_as() are wrappers around
23 /*	the dot_lockfile() and dot_unlockfile() routines. The routines
24 /*	change privilege to the designated privilege, perform the
25 /*	requested operation, and restore privileges.
26 /* DIAGNOSTICS
27 /*	Fatal error: no permission to change privilege level.
28 /* SEE ALSO
29 /*	dot_lockfile(3) dotlock file management
30 /*	set_eugid(3) switch effective rights
31 /* LICENSE
32 /* .ad
33 /* .fi
34 /*	The Secure Mailer license must be distributed with this software.
35 /* AUTHOR(S)
36 /*	Wietse Venema
37 /*	IBM T.J. Watson Research
38 /*	P.O. Box 704
39 /*	Yorktown Heights, NY 10598, USA
40 /*--*/
41 
42 /* System library. */
43 
44 #include <sys_defs.h>
45 #include <unistd.h>
46 
47 /* Utility library. */
48 
49 #include "msg.h"
50 #include "set_eugid.h"
51 #include "dot_lockfile.h"
52 #include "dot_lockfile_as.h"
53 
54 /* dot_lockfile_as - dotlock file as user */
55 
dot_lockfile_as(const char * path,VSTRING * why,uid_t euid,gid_t egid)56 int     dot_lockfile_as(const char *path, VSTRING *why, uid_t euid, gid_t egid)
57 {
58     uid_t   saved_euid = geteuid();
59     gid_t   saved_egid = getegid();
60     int     result;
61 
62     /*
63      * Switch to the target user privileges.
64      */
65     set_eugid(euid, egid);
66 
67     /*
68      * Lock that file.
69      */
70     result = dot_lockfile(path, why);
71 
72     /*
73      * Restore saved privileges.
74      */
75     set_eugid(saved_euid, saved_egid);
76 
77     return (result);
78 }
79 
80 /* dot_unlockfile_as - dotlock file as user */
81 
dot_unlockfile_as(const char * path,uid_t euid,gid_t egid)82 void     dot_unlockfile_as(const char *path, uid_t euid, gid_t egid)
83 {
84     uid_t   saved_euid = geteuid();
85     gid_t   saved_egid = getegid();
86 
87     /*
88      * Switch to the target user privileges.
89      */
90     set_eugid(euid, egid);
91 
92     /*
93      * Lock that file.
94      */
95     dot_unlockfile(path);
96 
97     /*
98      * Restore saved privileges.
99      */
100     set_eugid(saved_euid, saved_egid);
101 }
102