struct tdb_print_db *get_print_db_byname(const char *printername) { struct tdb_print_db *p = NULL, *last_entry = NULL; int num_open = 0; char *printdb_path = NULL; bool done_become_root = False; SMB_ASSERT(printername != NULL); for (p = print_db_head, last_entry = print_db_head; p; p = p->next) { /* Ensure the list terminates... JRA. */ SMB_ASSERT(p->next != print_db_head); if (p->tdb && strequal(p->printer_name, printername)) { DLIST_PROMOTE(print_db_head, p); p->ref_count++; return p; } num_open++; last_entry = p; } /* Not found. */ if (num_open >= MAX_PRINT_DBS_OPEN) { /* Try and recycle the last entry. */ if (print_db_head && last_entry) { DLIST_PROMOTE(print_db_head, last_entry); } for (p = print_db_head; p; p = p->next) { if (p->ref_count) continue; if (p->tdb) { if (tdb_close(print_db_head->tdb)) { DEBUG(0,("get_print_db: Failed to close tdb for printer %s\n", print_db_head->printer_name )); return NULL; } } p->tdb = NULL; p->ref_count = 0; memset(p->printer_name, '\0', sizeof(p->printer_name)); break; } if (p && print_db_head) { DLIST_PROMOTE(print_db_head, p); p = print_db_head; } } if (!p) { /* Create one. */ p = SMB_MALLOC_P(struct tdb_print_db); if (!p) { DEBUG(0,("get_print_db: malloc fail !\n")); return NULL; } ZERO_STRUCTP(p); DLIST_ADD(print_db_head, p); }
static user_struct *get_valid_user_struct_internal(uint16 vuid, enum server_allocated_state server_allocated) { user_struct *usp; int count=0; if (vuid == UID_FIELD_INVALID) return NULL; for (usp=validated_users;usp;usp=usp->next,count++) { if (vuid == usp->vuid) { switch (server_allocated) { case SERVER_ALLOCATED_REQUIRED_YES: if (usp->server_info == NULL) { continue; } break; case SERVER_ALLOCATED_REQUIRED_NO: if (usp->server_info != NULL) { continue; } case SERVER_ALLOCATED_REQUIRED_ANY: break; } if (count > 10) { DLIST_PROMOTE(validated_users, usp); } return usp; } } return NULL; }
files_struct *file_find_dif(struct smbd_server_connection *sconn, struct file_id id, unsigned long gen_id) { int count=0; files_struct *fsp; if (gen_id == 0) { return NULL; } for (fsp=sconn->files; fsp; fsp=fsp->next,count++) { /* We can have a fsp->fh->fd == -1 here as it could be a stat open. */ if (file_id_equal(&fsp->file_id, &id) && fsp->fh->gen_id == gen_id ) { if (count > 10) { DLIST_PROMOTE(sconn->files, fsp); } /* Paranoia check. */ if ((fsp->fh->fd == -1) && (fsp->oplock_type != NO_OPLOCK)) { DEBUG(0,("file_find_dif: file %s file_id = " "%s, gen = %u oplock_type = %u is a " "stat open with oplock type !\n", fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id), (unsigned int)fsp->fh->gen_id, (unsigned int)fsp->oplock_type )); smb_panic("file_find_dif"); } return fsp; } } return NULL; }
files_struct *file_find_fd(struct smbd_server_connection *sconn, int fd) { int count=0; files_struct *fsp; for (fsp=sconn->files; fsp; fsp=fsp->next,count++) { if (fsp->fh->fd == fd) { if (count > 10) { DLIST_PROMOTE(sconn->files, fsp); } return fsp; } } return NULL; }
/**************************************************************************** find a conn given a cnum ****************************************************************************/ connection_struct *conn_find(int cnum) { int count=0; connection_struct *conn; for (conn=Connections;conn;conn=conn->next,count++) { if (conn->cnum == cnum) { if (count > 10) { DLIST_PROMOTE(Connections, conn); } return conn; } } return NULL; }
static BOOL fetch_gid_from_cache(gid_t *pgid, const DOM_SID *psid, enum SID_NAME_USE sidtype) { struct gid_sid_cache *pc; for (pc = gid_sid_cache_head; pc; pc = pc->next) { if (sid_compare(&pc->sid, psid) == 0) { fstring sid; *pgid = pc->gid; DEBUG(3,("fetch uid from cache %u -> %s\n", (unsigned int)*pgid, sid_to_string(sid, psid))); DLIST_PROMOTE(gid_sid_cache_head, pc); return True; } } return False; }
static struct files_struct *file_fnum(struct smbd_server_connection *sconn, uint16 fnum) { files_struct *fsp; int count=0; for (fsp=sconn->files; fsp; fsp=fsp->next, count++) { if (fsp->fnum == fnum) { if (count > 10) { DLIST_PROMOTE(sconn->files, fsp); } return fsp; } } return NULL; }
static BOOL fetch_sid_from_gid_cache(DOM_SID *psid, enum SID_NAME_USE *psidtype, gid_t gid) { struct gid_sid_cache *pc; for (pc = gid_sid_cache_head; pc; pc = pc->next) { if (pc->gid == gid) { fstring sid; *psid = pc->sid; *psidtype = pc->sidtype; DEBUG(3,("fetch sid from gid cache %u -> %s\n", (unsigned int)gid, sid_to_string(sid, psid))); DLIST_PROMOTE(gid_sid_cache_head, pc); return True; } } return False; }
user_struct *get_partial_auth_user_struct(uint16 vuid) { user_struct *usp; int count=0; if (vuid == UID_FIELD_INVALID) return NULL; for (usp=validated_users;usp;usp=usp->next,count++) { if (vuid == usp->vuid && !usp->server_info) { if (count > 10) { DLIST_PROMOTE(validated_users, usp); } return usp; } } return NULL; }
void schedule_deferred_open_smb_message(uint16 mid) { struct pending_message_list *pml; int i = 0; for (pml = deferred_open_queue; pml; pml = pml->next) { uint16 msg_mid = SVAL(pml->buf.data,smb_mid); DEBUG(10,("schedule_deferred_open_smb_message: [%d] msg_mid = %u\n", i++, (unsigned int)msg_mid )); if (mid == msg_mid) { DEBUG(10,("schedule_deferred_open_smb_message: scheduling mid %u\n", mid )); pml->end_time.tv_sec = 0; pml->end_time.tv_usec = 0; DLIST_PROMOTE(deferred_open_queue, pml); return; } } DEBUG(10,("schedule_deferred_open_smb_message: failed to find message mid %u\n", mid )); }
struct tdb_print_db *get_print_db_byname(const char *printername) { struct tdb_print_db *p = NULL, *last_entry = NULL; int num_open = 0; pstring printdb_path; BOOL done_become_root = False; for (p = print_db_head, last_entry = print_db_head; p; p = p->next) { /* Ensure the list terminates... JRA. */ SMB_ASSERT(p->next != print_db_head); if (p->tdb && strequal(p->printer_name, printername)) { DLIST_PROMOTE(print_db_head, p); p->ref_count++; return p; } num_open++; last_entry = p; } /* Not found. */ if (num_open >= MAX_PRINT_DBS_OPEN) { /* Try and recycle the last entry. */ DLIST_PROMOTE(print_db_head, last_entry); for (p = print_db_head; p; p = p->next) { if (p->ref_count) continue; if (p->tdb) { if (tdb_close(print_db_head->tdb)) { DEBUG(0,("get_print_db: Failed to close tdb for printer %s\n", print_db_head->printer_name )); return NULL; } } p->tdb = NULL; p->ref_count = 0; memset(p->printer_name, '\0', sizeof(p->printer_name)); break; } if (p) { DLIST_PROMOTE(print_db_head, p); p = print_db_head; } } if (!p) { /* Create one. */ p = (struct tdb_print_db *)malloc(sizeof(struct tdb_print_db)); if (!p) { DEBUG(0,("get_print_db: malloc fail !\n")); return NULL; } ZERO_STRUCTP(p); DLIST_ADD(print_db_head, p); } pstrcpy(printdb_path, lock_path("printing/")); pstrcat(printdb_path, printername); pstrcat(printdb_path, ".tdb"); if (geteuid() != 0) { become_root(); done_become_root = True; } p->tdb = tdb_open_log(printdb_path, 5000, TDB_DEFAULT, O_RDWR|O_CREAT, 0600); if (done_become_root) unbecome_root(); if (!p->tdb) { DEBUG(0,("get_print_db: Failed to open printer backend database %s.\n", printdb_path )); DLIST_REMOVE(print_db_head, p); SAFE_FREE(p); return NULL; } fstrcpy(p->printer_name, printername); p->ref_count++; return p; }