user/id.go
func nextUID(isSystem bool) (db *dbfile, uid int, err error) {
	loadConfig()

	db, err = openDBFile(_USER_FILE, os.O_RDWR)
	if err != nil {
		return
	}

	// Seek to file half size.

	info, err := db.file.Stat()
	if err != nil {
		db.close()
		return nil, 0, err
	}
	if _, err = db.file.Seek(info.Size()/2, os.SEEK_SET); err != nil {
		db.close()
		return nil, 0, err
	}
	// To starting to read from a new line
	if _, _, err = db.rd.ReadLine(); err != nil {
		db.close()
		return nil, 0, err
	}

	var minUid, maxUid int
	if isSystem {
		minUid, maxUid = config.login.SYS_UID_MIN, config.login.SYS_UID_MAX
	} else {
		minUid, maxUid = config.login.UID_MIN, config.login.UID_MAX
	}

	for {
		line, _, err := db.rd.ReadLine()
		if err == io.EOF {
			break
		}

		u, err := parseUser(string(line))
		if err != nil {
			db.close()
			return nil, 0, err
		}
		if u.UID >= minUid && u.UID <= maxUid {
			uid = u.UID
		}
	}

	uid++
	if uid == maxUid {
		return nil, 0, &IdRangeError{maxUid, isSystem, true}
	}
	return
}
func nextUID(isSystem bool) (db *dbfile, uid int, err error) {
	loadConfig()

	db, err = openDBFile(_USER_FILE, os.O_RDWR)
	if err != nil {
		return
	}

	// Seek to file half size.

	info, err := db.file.Stat()
	if err != nil {
		db.close()
		return nil, 0, err
	}
	if _, err = db.file.Seek(info.Size()/2, os.SEEK_SET); err != nil {
		db.close()
		return nil, 0, err
	}
	// To starting to read from a new line
	if _, _, err = db.rd.ReadLine(); err != nil {
		db.close()
		return nil, 0, err
	}

	var minUid, maxUid int
	if isSystem {
		minUid, maxUid = config.login.SYS_UID_MIN, config.login.SYS_UID_MAX
	} else {
		minUid, maxUid = config.login.UID_MIN, config.login.UID_MAX
	}

	for {
		line, _, err := db.rd.ReadLine()
		if err == io.EOF {
			break
		}

		u, err := parseUser(string(line))
		if err != nil {
			db.close()
			return nil, 0, err
		}
		if u.UID >= minUid && u.UID <= maxUid {
			uid = u.UID
		}
	}

	uid++
	if uid == maxUid {
		return nil, 0, &IdRangeError{maxUid, isSystem, true}
	}
	return
}
func nextUID ( isSystem bool ) ( db * dbfile , uid int , err error ) { loadConfig ( ) db , err = openDBFile ( _USER_FILE , os . O_RDWR ) if err != nil { return } // Seek to file half size. info , err := db . file . Stat ( ) if err != nil { db . close ( ) return nil , 0 , err } if _ , err = db . file . Seek ( info . Size ( ) / 2 , os . SEEK_SET ) ; err != nil { db . close ( ) return nil , 0 , err } // To starting to read from a new line if _ , _ , err = db . rd . ReadLine ( ) ; err != nil { db . close ( ) return nil , 0 , err } var minUid , maxUid int if isSystem { minUid , maxUid = config . login . SYS_UID_MIN , config . login . SYS_UID_MAX } else { minUid , maxUid = config . login . UID_MIN , config . login . UID_MAX } for { line , _ , err := db . rd . ReadLine ( ) if err == io . EOF { break } u , err := parseUser ( string ( line ) ) if err != nil { db . close ( ) return nil , 0 , err } if u . UID >= minUid && u . UID <= maxUid { uid = u . UID } } uid ++ if uid == maxUid { return nil , 0 , & IdRangeError { maxUid , isSystem , true } } return }
// nextUID returns the next free user id to use, according to whether it is a
// system's user.
nextUID returns the next free user id to use according to whether it is a system s user .