code: func nextGUID(isSystem bool) (db *dbfile, gid int, err error) {
  	loadConfig()
  
  	db, err = openDBFile(_GROUP_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 minGid, maxGid int
  	if isSystem {
  		minGid, maxGid = config.login.SYS_GID_MIN, config.login.SYS_GID_MAX
  	} else {
  		minGid, maxGid = config.login.GID_MIN, config.login.GID_MAX
  	}
  
  	for {
  		line, _, err := db.rd.ReadLine()
  		if err == io.EOF {
  			break
  		}
  
  		gr, err := parseGroup(string(line))
  		if err != nil {
  			db.close()
  			return nil, 0, err
  		}
  		if gr.GID >= minGid && gr.GID <= maxGid {
  			gid = gr.GID
  		}
  	}
  
  	gid++
  	if gid == maxGid {
  		return nil, 0, &IdRangeError{maxGid, isSystem, false}
  	}
  	return
  }
docs: // nextGUID returns the next free group id to use, according to whether it is a
  // system's group.