xref: /freebsd/lib/libutil/pw_util.3 (revision 42818163b406dca82a55b0bc461b9afaab51d730)
1*42818163SBaptiste Daroussin.\" Copyright (c) 2012 Baptiste Daroussin <bapt@FreeBSD.org>
2*42818163SBaptiste Daroussin.\" All rights reserved.
3*42818163SBaptiste Daroussin.\"
4*42818163SBaptiste Daroussin.\" This software was developed by Pawel Jakub Dawidek under sponsorship from
5*42818163SBaptiste Daroussin.\" the FreeBSD Foundation.
6*42818163SBaptiste Daroussin.\"
7*42818163SBaptiste Daroussin.\" Redistribution and use in source and binary forms, with or without
8*42818163SBaptiste Daroussin.\" modification, are permitted provided that the following conditions
9*42818163SBaptiste Daroussin.\" are met:
10*42818163SBaptiste Daroussin.\" 1. Redistributions of source code must retain the above copyright
11*42818163SBaptiste Daroussin.\"    notice, this list of conditions and the following disclaimer.
12*42818163SBaptiste Daroussin.\" 2. Redistributions in binary form must reproduce the above copyright
13*42818163SBaptiste Daroussin.\"    notice, this list of conditions and the following disclaimer in the
14*42818163SBaptiste Daroussin.\"    documentation and/or other materials provided with the distribution.
15*42818163SBaptiste Daroussin.\"
16*42818163SBaptiste Daroussin.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17*42818163SBaptiste Daroussin.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*42818163SBaptiste Daroussin.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*42818163SBaptiste Daroussin.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20*42818163SBaptiste Daroussin.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*42818163SBaptiste Daroussin.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*42818163SBaptiste Daroussin.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*42818163SBaptiste Daroussin.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*42818163SBaptiste Daroussin.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*42818163SBaptiste Daroussin.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*42818163SBaptiste Daroussin.\" SUCH DAMAGE.
27*42818163SBaptiste Daroussin.\"
28*42818163SBaptiste Daroussin.\" $FreeBSD$
29*42818163SBaptiste Daroussin.\"
30*42818163SBaptiste Daroussin.Dd October 30, 2012
31*42818163SBaptiste Daroussin.Dt PW_UTIL 3
32*42818163SBaptiste Daroussin.Os
33*42818163SBaptiste Daroussin.Sh NAME
34*42818163SBaptiste Daroussin.Nm pw_copy ,
35*42818163SBaptiste Daroussin.Nm pw_dup ,
36*42818163SBaptiste Daroussin.Nm pw_edit ,
37*42818163SBaptiste Daroussin.Nm pw_equal ,
38*42818163SBaptiste Daroussin.Nm pw_fini ,
39*42818163SBaptiste Daroussin.Nm pw_init ,
40*42818163SBaptiste Daroussin.Nm pw_make ,
41*42818163SBaptiste Daroussin.Nm pw_make_v7 ,
42*42818163SBaptiste Daroussin.Nm pw_mkdb ,
43*42818163SBaptiste Daroussin.Nm pw_lock ,
44*42818163SBaptiste Daroussin.Nm pw_scan ,
45*42818163SBaptiste Daroussin.Nm pw_tempname ,
46*42818163SBaptiste Daroussin.Nm pw_tmp
47*42818163SBaptiste Daroussin.Nd "functions for passwd file handling"
48*42818163SBaptiste Daroussin.Sh LIBRARY
49*42818163SBaptiste Daroussin.Lb libutil
50*42818163SBaptiste Daroussin.Sh SYNOPSIS
51*42818163SBaptiste Daroussin.In pwd.h
52*42818163SBaptiste Daroussin.In libutil.h
53*42818163SBaptiste Daroussin.Ft int
54*42818163SBaptiste Daroussin.Fn pw_copy "int ffd" "int tfd" "const struct passwd *pw" "const struct paddwd *oldpw"
55*42818163SBaptiste Daroussin.Ft "struct passwd *"
56*42818163SBaptiste Daroussin.Fn pw_dup "const struct passwd *pw"
57*42818163SBaptiste Daroussin.Ft int
58*42818163SBaptiste Daroussin.Fn pw_edit "int nosetuid"
59*42818163SBaptiste Daroussin.Ft int
60*42818163SBaptiste Daroussin.Fn pw_equal "const struct passwd *pw1" "const struct passwd pw2"
61*42818163SBaptiste Daroussin.Ft void
62*42818163SBaptiste Daroussin.Fn pw_fini "void"
63*42818163SBaptiste Daroussin.Ft int
64*42818163SBaptiste Daroussin.Fn pw_init "const char *dir" const char *master"
65*42818163SBaptiste Daroussin.Ft "char *"
66*42818163SBaptiste Daroussin.Fn pw_make "const struct passwd *pw"
67*42818163SBaptiste Daroussin.Ft "char *"
68*42818163SBaptiste Daroussin.Fn pw_make_v7 "const struct passwd *pw"
69*42818163SBaptiste Daroussin.Ft int
70*42818163SBaptiste Daroussin.Fn pw_mkdb "const char *user"
71*42818163SBaptiste Daroussin.Ft int
72*42818163SBaptiste Daroussin.Fn pw_lock "void"
73*42818163SBaptiste Daroussin.Ft "struct passwd *"
74*42818163SBaptiste Daroussin.Fn pw_scan "const char *line" "int flags"
75*42818163SBaptiste Daroussin.Ft "const char *"
76*42818163SBaptiste Daroussin.Fn pw_tempname "void"
77*42818163SBaptiste Daroussin.Ft int
78*42818163SBaptiste Daroussin.Fn pw_tmp "int mfd"
79*42818163SBaptiste Daroussin.Sh DESCRIPTION
80*42818163SBaptiste Daroussin.Pp
81*42818163SBaptiste DaroussinThe
82*42818163SBaptiste Daroussin.Fn pw_copy
83*42818163SBaptiste Daroussinfunction reads a password file from
84*42818163SBaptiste Daroussin.Vt ffd
85*42818163SBaptiste Daroussinand writes it back out to
86*42818163SBaptiste Daroussin.Vt tfd
87*42818163SBaptiste Daroussinpossibly with modifications:
88*42818163SBaptiste Daroussin.Bl -dash
89*42818163SBaptiste Daroussin.It
90*42818163SBaptiste DaroussinIf
91*42818163SBaptiste Daroussin.Fa pw
92*42818163SBaptiste Daroussinis
93*42818163SBaptiste Daroussin.Dv NULL
94*42818163SBaptiste Daroussinand
95*42818163SBaptiste Daroussin.Fa oldpw
96*42818163SBaptiste Daroussinis not
97*42818163SBaptiste Daroussin.Dv NULL ,
98*42818163SBaptiste Daroussinthen the record represented by
99*42818163SBaptiste Daroussin.Fa oldpw
100*42818163SBaptiste Daroussinwill not be copied (corresponding to user deletion).
101*42818163SBaptiste Daroussin.It
102*42818163SBaptiste DaroussinIf
103*42818163SBaptiste Daroussin.Fa pw
104*42818163SBaptiste Daroussinand
105*42818163SBaptiste Daroussin.Fa oldpw
106*42818163SBaptiste Daroussinare not
107*42818163SBaptiste Daroussin.Dv NULL
108*42818163SBaptiste Daroussinthen the record corresponding to
109*42818163SBaptiste Daroussin.Fa pw
110*42818163SBaptiste Daroussinwill be replace by the record corresponding to
111*42818163SBaptiste Daroussin.Fa oldpw .
112*42818163SBaptiste Daroussin.It
113*42818163SBaptiste DaroussinIf
114*42818163SBaptiste Daroussin.Vt pw
115*42818163SBaptiste Daroussinis set and
116*42818163SBaptiste Daroussin.Vt oldpw
117*42818163SBaptiste Daroussinis
118*42818163SBaptiste Daroussin.Dv NULL
119*42818163SBaptiste Daroussinthen the record corresponding to
120*42818163SBaptiste Daroussin.Vt pw
121*42818163SBaptiste Daroussinwill be appended (corresponding to user addition).
122*42818163SBaptiste Daroussin.El
123*42818163SBaptiste Daroussin.Pp
124*42818163SBaptiste DaroussinThe
125*42818163SBaptiste Daroussin.Fn pw_copy
126*42818163SBaptiste Daroussinfunction returns -1 in case of failure otherwise 0.
127*42818163SBaptiste Daroussin.Pp
128*42818163SBaptiste DaroussinThe
129*42818163SBaptiste Daroussin.Fn pw_dup
130*42818163SBaptiste Daroussinfunction duplicates the
131*42818163SBaptiste Daroussin.Vt struct passwd
132*42818163SBaptiste Daroussinpointed to by
133*42818163SBaptiste Daroussin.Fa pw
134*42818163SBaptiste Daroussinand returns a pointer to the copy, or
135*42818163SBaptiste Daroussin.Dv NULL
136*42818163SBaptiste Daroussinin case of failure.
137*42818163SBaptiste DaroussinThe new
138*42818163SBaptiste Daroussin.Vt struct passwd
139*42818163SBaptiste Daroussinis allocated with
140*42818163SBaptiste Daroussin.Xr malloc 3 ,
141*42818163SBaptiste Daroussinand it is the caller's responsibility to free it with
142*42818163SBaptiste Daroussin.Xr free 3 .
143*42818163SBaptiste Daroussin.Pp
144*42818163SBaptiste DaroussinThe
145*42818163SBaptiste Daroussin.Fn pw_edit
146*42818163SBaptiste Daroussinfunction invokes the command specified by the
147*42818163SBaptiste Daroussin.Ev EDITOR
148*42818163SBaptiste Daroussinenvironment variable (or
149*42818163SBaptiste Daroussin.Pa /usr/bin/vi
150*42818163SBaptiste Daroussinif
151*42818163SBaptiste Daroussin.Ev EDITOR
152*42818163SBaptiste Daroussinis not defined)
153*42818163SBaptiste Daroussinon a temporary copy of the master password file created by
154*42818163SBaptiste Daroussin.Fn pw_tmp .
155*42818163SBaptiste DaroussinIf the file was modified,
156*42818163SBaptiste Daroussin.Fn pw_edit
157*42818163SBaptiste Daroussininstalls it and regenerates the password database.
158*42818163SBaptiste DaroussinThe
159*42818163SBaptiste Daroussin.Fn pw_edit
160*42818163SBaptiste Daroussinfunction returns -1 in case of failure, 0 if the file was not modified,
161*42818163SBaptiste Daroussinand a non-zero positive number if the file was modified and successfully
162*42818163SBaptiste Daroussininstalled.
163*42818163SBaptiste Daroussin.Pp
164*42818163SBaptiste DaroussinThe
165*42818163SBaptiste Daroussin.Fn pw_equal
166*42818163SBaptiste Daroussinfunction compares two
167*42818163SBaptiste Daroussin.Vt struct passwd
168*42818163SBaptiste Daroussinand returns 0 if they are equal.
169*42818163SBaptiste Daroussin.Pp
170*42818163SBaptiste DaroussinThe
171*42818163SBaptiste Daroussin.Fn pw_fini
172*42818163SBaptiste Daroussinfunction destroy the temporary file created by
173*42818163SBaptiste Daroussin.Fn pw_tmp
174*42818163SBaptiste Daroussinif any,
175*42818163SBaptiste Daroussinkills any running instance of
176*42818163SBaptiste Daroussin.Ev EDITOR
177*42818163SBaptiste Daroussinexcuted by
178*42818163SBaptiste Daroussin.Fn pw_edit
179*42818163SBaptiste Daroussinif any,
180*42818163SBaptiste Daroussinand closes the lock created by
181*42818163SBaptiste Daroussin.Fn pw_lock
182*42818163SBaptiste Daroussinif any.
183*42818163SBaptiste Daroussin.Pp
184*42818163SBaptiste DaroussinThe
185*42818163SBaptiste Daroussin.Fn pw_init
186*42818163SBaptiste Daroussininitialize the static variable representing the path a password file.
187*42818163SBaptiste Daroussin.Fa dir
188*42818163SBaptiste Daroussinis the directory where the password file is located.
189*42818163SBaptiste DaroussinIf set to
190*42818163SBaptiste Daroussin.Dv NULL ,
191*42818163SBaptiste Daroussinit will default to
192*42818163SBaptiste Daroussin.Pa /etc .
193*42818163SBaptiste Daroussin.Fa master
194*42818163SBaptiste Daroussinis the name of the password file.
195*42818163SBaptiste DaroussinIf set to
196*42818163SBaptiste Daroussin.Dv NULL?
197*42818163SBaptiste Daroussinit will default to
198*42818163SBaptiste Daroussin.Pa master.passwd
199*42818163SBaptiste Daroussin.Pp
200*42818163SBaptiste DaroussinThe
201*42818163SBaptiste Daroussin.Fn pw_make
202*42818163SBaptiste Daroussinfunction creates a properly formatted
203*42818163SBaptiste Daroussin.Bx
204*42818163SBaptiste Daroussin.Xr passwd 5
205*42818163SBaptiste Daroussinline from a
206*42818163SBaptiste Daroussin.Vt struct passwd ,
207*42818163SBaptiste Daroussinand returns a pointer to the resulting string.
208*42818163SBaptiste DaroussinThe string is allocated with
209*42818163SBaptiste Daroussin.Xr malloc 3 ,
210*42818163SBaptiste Daroussinand it is the caller's responsibility to free it with
211*42818163SBaptiste Daroussin.Xr free 3 .
212*42818163SBaptiste Daroussin.Pp
213*42818163SBaptiste DaroussinThe
214*42818163SBaptiste Daroussin.Fn pw_make_v7
215*42818163SBaptiste Daroussinfunction creates a properly formatted
216*42818163SBaptiste Daroussin.Ux V7
217*42818163SBaptiste Daroussin.Xr passwd 5
218*42818163SBaptiste Daroussinline from a
219*42818163SBaptiste Daroussin.Vt struct passwd ,
220*42818163SBaptiste Daroussinand returns a pointer to the resulting string.
221*42818163SBaptiste DaroussinThe string is allocated with
222*42818163SBaptiste Daroussin.Xr malloc 3 ,
223*42818163SBaptiste Daroussinand it is the caller's responsibility to free it with
224*42818163SBaptiste Daroussin.Xr free 3 .
225*42818163SBaptiste Daroussin.Pp
226*42818163SBaptiste DaroussinThe
227*42818163SBaptiste Daroussin.Fn pw_mkdb
228*42818163SBaptiste Daroussinfunction regenerates the password database by running
229*42818163SBaptiste Daroussin.Xr pw_mkdb 8 .
230*42818163SBaptiste DaroussinIf
231*42818163SBaptiste Daroussin.Fa user
232*42818163SBaptiste Daroussinonly the record corresponding to that user will be updated.
233*42818163SBaptiste DaroussinThe
234*42818163SBaptiste Daroussin.Fn pw_mkdb
235*42818163SBaptiste Daroussinfunction returns 0 in case of success and -1 in case of failure.
236*42818163SBaptiste Daroussin.Pp
237*42818163SBaptiste DaroussinThe
238*42818163SBaptiste Daroussin.Fn pw_lock
239*42818163SBaptiste Daroussinfunction locks the master password file.
240*42818163SBaptiste DaroussinIt returns 0 in case of success and -1 in case of failure.
241*42818163SBaptiste Daroussin.Pp
242*42818163SBaptiste DaroussinThe
243*42818163SBaptiste Daroussin.Fn pw_scan
244*42818163SBaptiste Daroussinfunction is a wrapper around the internal libc function
245*42818163SBaptiste Daroussin.Fn __pw_scan .
246*42818163SBaptiste DaroussinIt scans the master password file for a line corresponding to the
247*42818163SBaptiste Daroussin.Fa line
248*42818163SBaptiste Daroussinprovided and return a
249*42818163SBaptiste Daroussin.Vt struct passwd
250*42818163SBaptiste Daroussinif it matched an existing record.
251*42818163SBaptiste DaroussinIn case of failure, it returns
252*42818163SBaptiste Daroussin.Dv NULL .
253*42818163SBaptiste DaroussinOtherwise, it returns a pointer to a
254*42818163SBaptiste Daroussin.Vt struct passwd
255*42818163SBaptiste Daroussincontaining the matching record.
256*42818163SBaptiste DaroussinThe
257*42818163SBaptiste Daroussin.Vt struct passwd
258*42818163SBaptiste Daroussinis allocated with
259*42818163SBaptiste Daroussin.Xr malloc 3 ,
260*42818163SBaptiste Daroussinand it is the caller's responsibility to free it with
261*42818163SBaptiste Daroussin.Xr free 3 .
262*42818163SBaptiste Daroussin.Pp
263*42818163SBaptiste DaroussinThe
264*42818163SBaptiste Daroussin.Fn pw_tempname
265*42818163SBaptiste Daroussinfunction returns the temporary name of the masterfile created via
266*42818163SBaptiste Daroussin.Fn pw_tmp .
267*42818163SBaptiste Daroussin.Pp
268*42818163SBaptiste DaroussinThe
269*42818163SBaptiste Daroussin.Fn pw_tmp
270*42818163SBaptiste Daroussincreates and opens a presumably safe temporary password file.
271*42818163SBaptiste DaroussinIf
272*42818163SBaptiste Daroussin.Fa mfd
273*42818163SBaptiste Daroussinis a file descriptor to an open password file, it will be read and
274*42818163SBaptiste Daroussinwritten back to the temporary password file.
275*42818163SBaptiste DaroussinOtherwise if should be set -1.
276*42818163SBaptiste DaroussinThe
277*42818163SBaptiste Daroussin.Fn pw_tmp
278*42818163SBaptiste Daroussinreturns an open file descriptor to the temporary password file or -1 in case of
279*42818163SBaptiste Daroussinfailure.
280*42818163SBaptiste Daroussin.Sh AUTHORS
281*42818163SBaptiste Daroussin.Nm pw_util
282*42818163SBaptiste Daroussinwas written by
283*42818163SBaptiste Daroussin.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
284*42818163SBaptiste DaroussinThis manual page was written by
285*42818163SBaptiste Daroussin.An Baptiste Daroussin Aq bapt@FreeBSD.org .
286