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