データ構造 | |
| struct | message_rec |
| struct | dispatch_fns |
| struct | msg_all |
| struct | messaging_callback |
| struct | messaging_context |
関数 | |
| void | gfree_messages (void) |
| static void | sig_usr1 (void) |
| static void | ping_message (int msg_type, struct process_id src, void *buf, size_t len, void *private_data) |
| BOOL | message_init (void) |
| static TDB_DATA | message_key_pid (struct process_id pid) |
| static NTSTATUS | message_notify (struct process_id procid) |
| static NTSTATUS | message_send_pid_internal (struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, unsigned int timeout) |
| NTSTATUS | message_send_pid (struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) |
| NTSTATUS | message_send_pid_with_timeout (struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, unsigned int timeout) |
| unsigned int | messages_pending_for_pid (struct process_id pid) |
| static BOOL | retrieve_all_messages (char **msgs_buf, size_t *total_len) |
| static BOOL | message_recv (char *msgs_buf, size_t total_len, int *msg_type, struct process_id *src, char **buf, size_t *len) |
| void | message_dispatch (void) |
| void | message_register (int msg_type, void(*fn)(int msg_type, struct process_id pid, void *buf, size_t len, void *private_data), void *private_data) |
| void | message_deregister (int msg_type) |
| static int | traverse_fn (TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) |
| BOOL | message_send_all (TDB_CONTEXT *conn_tdb, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, int *n_sent) |
| Send a message to all smbd processes. | |
| void | message_block (void) |
| void | message_unblock (void) |
| static int | messaging_context_destructor (struct messaging_context *ctx) |
| messaging_context * | messaging_init (TALLOC_CTX *mem_ctx, struct server_id server_id, struct event_context *ev) |
| static void | messaging_callback (int msg_type, struct process_id pid, void *buf, size_t len, void *private_data) |
| NTSTATUS | messaging_register (struct messaging_context *ctx, void *private_data, uint32_t msg_type, void(*fn)(struct messaging_context *msg, void *private_data, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data)) |
| void | messaging_deregister (struct messaging_context *ctx, uint32_t msg_type, void *private_data) |
| NTSTATUS | messaging_send (struct messaging_context *msg, struct server_id server, uint32_t msg_type, DATA_BLOB *data) |
変数 | |
| static TDB_CONTEXT * | tdb |
| static int | received_signal |
The idea is that if a part of Samba wants to do communication with another Samba process then it will do a message_register() of a dispatch function, and use message_send_pid() to send messages to that process.
The dispatch function is given the pid of the sender, and it can use that to reply by message_send_pid(). See ping_message() for a simple example.
Dispatch functions must be able to cope with incoming messages on an *odd* byte boundary.
This system doesn't have any inherent size limitations but is not very efficient for large messages or when messages are sent in very quick succession.
messages.c で定義されています。
| void gfree_messages | ( | void | ) |
messages.c の 78 行で定義されています。
参照先 dispatch_fns::next.
参照元 gfree_all().
00079 { 00080 struct dispatch_fns *dfn, *next; 00081 00082 /* delete the dispatch_fns list */ 00083 dfn = dispatch_fns; 00084 while( dfn ) { 00085 next = dfn->next; 00086 DLIST_REMOVE(dispatch_fns, dfn); 00087 SAFE_FREE(dfn); 00088 dfn = next; 00089 } 00090 }
| static void sig_usr1 | ( | void | ) | [static] |
messages.c の 96 行で定義されています。
参照先 received_signal・sys_select_signal().
参照元 main()・message_init().
00097 { 00098 received_signal = 1; 00099 sys_select_signal(SIGUSR1); 00100 }
| static void ping_message | ( | int | msg_type, | |
| struct process_id | src, | |||
| void * | buf, | |||
| size_t | len, | |||
| void * | private_data | |||
| ) | [static] |
messages.c の 106 行で定義されています。
参照先 message_send_pid()・procid_str_static().
参照元 message_init().
00108 { 00109 const char *msg = buf ? (const char *)buf : "none"; 00110 00111 DEBUG(1,("INFO: Received PING message from PID %s [%s]\n", 00112 procid_str_static(&src), msg)); 00113 message_send_pid(src, MSG_PONG, buf, len, True); 00114 }
| BOOL message_init | ( | void | ) |
messages.c の 120 行で定義されています。
参照先 CatchSignal()・lock_path()・message_register()・ping_message()・register_dmalloc_msgs()・register_msg_pool_usage()・sec_init()・sig_usr1()・tdb・tdb_open_log()・tdb_set_max_dead().
参照元 cli_send_mailslot()・main()・send_message().
00121 { 00122 sec_init(); 00123 00124 if (tdb) 00125 return True; 00126 00127 tdb = tdb_open_log(lock_path("messages.tdb"), 00128 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 00129 O_RDWR|O_CREAT,0600); 00130 00131 if (!tdb) { 00132 DEBUG(0,("ERROR: Failed to initialise messages database\n")); 00133 return False; 00134 } 00135 00136 /* Activate the per-hashchain freelist */ 00137 tdb_set_max_dead(tdb, 5); 00138 00139 CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); 00140 00141 message_register(MSG_PING, ping_message, NULL); 00142 00143 /* Register some debugging related messages */ 00144 00145 register_msg_pool_usage(); 00146 register_dmalloc_msgs(); 00147 00148 return True; 00149 }
| static TDB_DATA message_key_pid | ( | struct process_id | pid | ) | [static] |
messages.c の 155 行で定義されています。
参照先 TDB_DATA::dptr・TDB_DATA::dsize・procid_str_static().
参照元 message_notify()・message_send_pid_internal()・messages_pending_for_pid()・retrieve_all_messages().
00156 { 00157 static char key[20]; 00158 TDB_DATA kbuf; 00159 00160 slprintf(key, sizeof(key)-1, "PID/%s", procid_str_static(&pid)); 00161 00162 kbuf.dptr = (char *)key; 00163 kbuf.dsize = strlen(key)+1; 00164 return kbuf; 00165 }
| static NTSTATUS message_notify | ( | struct process_id | procid | ) | [static] |
messages.c の 172 行で定義されています。
参照先 errno・message_key_pid()・process_id::pid・restore_re_uid_fromroot()・save_re_uid()・set_effective_uid()・strerror()・tdb・tdb_delete().
参照元 message_send_pid_internal().
00173 { 00174 pid_t pid = procid.pid; 00175 int ret; 00176 uid_t euid = geteuid(); 00177 00178 /* 00179 * Doing kill with a non-positive pid causes messages to be 00180 * sent to places we don't want. 00181 */ 00182 00183 SMB_ASSERT(pid > 0); 00184 00185 if (euid != 0) { 00186 /* If we're not root become so to send the message. */ 00187 save_re_uid(); 00188 set_effective_uid(0); 00189 } 00190 00191 ret = kill(pid, SIGUSR1); 00192 00193 if (euid != 0) { 00194 /* Go back to who we were. */ 00195 int saved_errno = errno; 00196 restore_re_uid_fromroot(); 00197 errno = saved_errno; 00198 } 00199 00200 if (ret == -1) { 00201 if (errno == ESRCH) { 00202 DEBUG(2,("pid %d doesn't exist - deleting messages record\n", 00203 (int)pid)); 00204 tdb_delete(tdb, message_key_pid(procid)); 00205 00206 /* 00207 * INVALID_HANDLE is the closest I can think of -- vl 00208 */ 00209 return NT_STATUS_INVALID_HANDLE; 00210 } 00211 00212 DEBUG(2,("message to process %d failed - %s\n", (int)pid, 00213 strerror(errno))); 00214 00215 /* 00216 * No call to map_nt_error_from_unix -- don't want to link in 00217 * errormap.o into lots of utils. 00218 */ 00219 00220 if (errno == EINVAL) return NT_STATUS_INVALID_PARAMETER; 00221 if (errno == EPERM) return NT_STATUS_ACCESS_DENIED; 00222 return NT_STATUS_UNSUCCESSFUL; 00223 } 00224 00225 return NT_STATUS_OK; 00226 }
| static NTSTATUS message_send_pid_internal | ( | struct process_id | pid, | |
| int | msg_type, | |||
| const void * | buf, | |||
| size_t | len, | |||
| BOOL | duplicates_allowed, | |||
| unsigned int | timeout | |||
| ) | [static] |
messages.c の 232 行で定義されています。
参照先 message_rec::dest・TDB_DATA::dptr・TDB_DATA::dsize・errno・message_rec::len・message_key_pid()・message_notify()・message_rec::msg_type・message_rec::msg_version・procid_self()・procid_to_pid()・message_rec::src・tdb・tdb_append()・tdb_chainlock()・tdb_chainlock_with_timeout()・tdb_chainunlock()・tdb_fetch()・tdb_store().
参照元 message_send_pid()・message_send_pid_with_timeout()・messaging_send().
00236 { 00237 TDB_DATA kbuf; 00238 TDB_DATA dbuf; 00239 TDB_DATA old_dbuf; 00240 struct message_rec rec; 00241 char *ptr; 00242 struct message_rec prec; 00243 00244 /* NULL pointer means implicit length zero. */ 00245 if (!buf) { 00246 SMB_ASSERT(len == 0); 00247 } 00248 00249 /* 00250 * Doing kill with a non-positive pid causes messages to be 00251 * sent to places we don't want. 00252 */ 00253 00254 SMB_ASSERT(procid_to_pid(&pid) > 0); 00255 00256 rec.msg_version = MESSAGE_VERSION; 00257 rec.msg_type = msg_type; 00258 rec.dest = pid; 00259 rec.src = procid_self(); 00260 rec.len = buf ? len : 0; 00261 00262 kbuf = message_key_pid(pid); 00263 00264 dbuf.dptr = (char *)SMB_MALLOC(len + sizeof(rec)); 00265 if (!dbuf.dptr) { 00266 return NT_STATUS_NO_MEMORY; 00267 } 00268 00269 memcpy(dbuf.dptr, &rec, sizeof(rec)); 00270 if (len > 0 && buf) 00271 memcpy((void *)((char*)dbuf.dptr+sizeof(rec)), buf, len); 00272 00273 dbuf.dsize = len + sizeof(rec); 00274 00275 if (duplicates_allowed) { 00276 00277 /* If duplicates are allowed we can just append the message and return. */ 00278 00279 /* lock the record for the destination */ 00280 if (timeout) { 00281 if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { 00282 DEBUG(0,("message_send_pid_internal: failed to get " 00283 "chainlock with timeout %ul.\n", timeout)); 00284 SAFE_FREE(dbuf.dptr); 00285 return NT_STATUS_IO_TIMEOUT; 00286 } 00287 } else { 00288 if (tdb_chainlock(tdb, kbuf) == -1) { 00289 DEBUG(0,("message_send_pid_internal: failed to get " 00290 "chainlock.\n")); 00291 SAFE_FREE(dbuf.dptr); 00292 return NT_STATUS_LOCK_NOT_GRANTED; 00293 } 00294 } 00295 tdb_append(tdb, kbuf, dbuf); 00296 tdb_chainunlock(tdb, kbuf); 00297 00298 SAFE_FREE(dbuf.dptr); 00299 errno = 0; /* paranoia */ 00300 return message_notify(pid); 00301 } 00302 00303 /* lock the record for the destination */ 00304 if (timeout) { 00305 if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { 00306 DEBUG(0,("message_send_pid_internal: failed to get chainlock " 00307 "with timeout %ul.\n", timeout)); 00308 SAFE_FREE(dbuf.dptr); 00309 return NT_STATUS_IO_TIMEOUT; 00310 } 00311 } else { 00312 if (tdb_chainlock(tdb, kbuf) == -1) { 00313 DEBUG(0,("message_send_pid_internal: failed to get " 00314 "chainlock.\n")); 00315 SAFE_FREE(dbuf.dptr); 00316 return NT_STATUS_LOCK_NOT_GRANTED; 00317 } 00318 } 00319 00320 old_dbuf = tdb_fetch(tdb, kbuf); 00321 00322 if (!old_dbuf.dptr) { 00323 /* its a new record */ 00324 00325 tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); 00326 tdb_chainunlock(tdb, kbuf); 00327 00328 SAFE_FREE(dbuf.dptr); 00329 errno = 0; /* paranoia */ 00330 return message_notify(pid); 00331 } 00332 00333 /* Not a new record. Check for duplicates. */ 00334 00335 for(ptr = (char *)old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { 00336 /* 00337 * First check if the message header matches, then, if it's a non-zero 00338 * sized message, check if the data matches. If so it's a duplicate and 00339 * we can discard it. JRA. 00340 */ 00341 00342 if (!memcmp(ptr, &rec, sizeof(rec))) { 00343 if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { 00344 tdb_chainunlock(tdb, kbuf); 00345 DEBUG(10,("message_send_pid_internal: discarding " 00346 "duplicate message.\n")); 00347 SAFE_FREE(dbuf.dptr); 00348 SAFE_FREE(old_dbuf.dptr); 00349 return NT_STATUS_OK; 00350 } 00351 } 00352 memcpy(&prec, ptr, sizeof(prec)); 00353 ptr += sizeof(rec) + prec.len; 00354 } 00355 00356 /* we're adding to an existing entry */ 00357 00358 tdb_append(tdb, kbuf, dbuf); 00359 tdb_chainunlock(tdb, kbuf); 00360 00361 SAFE_FREE(old_dbuf.dptr); 00362 SAFE_FREE(dbuf.dptr); 00363 00364 errno = 0; /* paranoia */ 00365 return message_notify(pid); 00366 }
| NTSTATUS message_send_pid | ( | struct process_id | pid, | |
| int | msg_type, | |||
| const void * | buf, | |||
| size_t | len, | |||
| BOOL | duplicates_allowed | |||
| ) |
messages.c の 372 行で定義されています。
参照先 message_send_pid_internal().
参照元 _srv_net_sess_del()・child_msg_onlinestatus()・cli_send_mailslot()・debug_message_send()・debuglevel_message()・fork_child_dc_connect()・main()・msg_pool_usage()・notify_deferred_opens()・ping_message()・print_queue_update()・process_kernel_oplocks()・process_oplock_break_message()・release_level_2_oplocks_on_change()・rename_share_filename()・reply_to_oplock_break_requests()・reqprofile_message()・send_message()・shutdown_other_smbds()・srv_spoolss_drv_upgrade_printer()・srv_spoolss_reset_printerdata()・traverse_fn()・winbind_msg_offline()・winbind_msg_online()・winbind_msg_onlinestatus().
00374 { 00375 return message_send_pid_internal(pid, msg_type, buf, len, 00376 duplicates_allowed, 0); 00377 }
| NTSTATUS message_send_pid_with_timeout | ( | struct process_id | pid, | |
| int | msg_type, | |||
| const void * | buf, | |||
| size_t | len, | |||
| BOOL | duplicates_allowed, | |||
| unsigned int | timeout | |||
| ) |
messages.c の 383 行で定義されています。
参照先 message_send_pid_internal().
00386 { 00387 return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, 00388 timeout); 00389 }
| unsigned int messages_pending_for_pid | ( | struct process_id | pid | ) |
messages.c の 395 行で定義されています。
参照先 buf・TDB_DATA::dptr・TDB_DATA::dsize・message_key_pid()・tdb・tdb_fetch().
00396 { 00397 TDB_DATA kbuf; 00398 TDB_DATA dbuf; 00399 char *buf; 00400 unsigned int message_count = 0; 00401 00402 kbuf = message_key_pid(pid); 00403 00404 dbuf = tdb_fetch(tdb, kbuf); 00405 if (dbuf.dptr == NULL || dbuf.dsize == 0) { 00406 SAFE_FREE(dbuf.dptr); 00407 return 0; 00408 } 00409 00410 for (buf = dbuf.dptr; dbuf.dsize > sizeof(struct message_rec);) { 00411 struct message_rec rec; 00412 memcpy(&rec, buf, sizeof(rec)); 00413 buf += (sizeof(rec) + rec.len); 00414 dbuf.dsize -= (sizeof(rec) + rec.len); 00415 message_count++; 00416 } 00417 00418 SAFE_FREE(dbuf.dptr); 00419 return message_count; 00420 }
| static BOOL retrieve_all_messages | ( | char ** | msgs_buf, | |
| size_t * | total_len | |||
| ) | [static] |
messages.c の 426 行で定義されています。
参照先 TDB_DATA::dptr・TDB_DATA::dsize・message_key_pid()・pid_to_procid()・sys_getpid()・tdb・tdb_chainlock()・tdb_chainunlock()・tdb_fetch()・tdb_store().
参照元 message_dispatch().
00427 { 00428 TDB_DATA kbuf; 00429 TDB_DATA dbuf; 00430 TDB_DATA null_dbuf; 00431 00432 ZERO_STRUCT(null_dbuf); 00433 00434 *msgs_buf = NULL; 00435 *total_len = 0; 00436 00437 kbuf = message_key_pid(pid_to_procid(sys_getpid())); 00438 00439 if (tdb_chainlock(tdb, kbuf) == -1) 00440 return False; 00441 00442 dbuf = tdb_fetch(tdb, kbuf); 00443 /* 00444 * Replace with an empty record to keep the allocated 00445 * space in the tdb. 00446 */ 00447 tdb_store(tdb, kbuf, null_dbuf, TDB_REPLACE); 00448 tdb_chainunlock(tdb, kbuf); 00449 00450 if (dbuf.dptr == NULL || dbuf.dsize == 0) { 00451 SAFE_FREE(dbuf.dptr); 00452 return False; 00453 } 00454 00455 *msgs_buf = dbuf.dptr; 00456 *total_len = dbuf.dsize; 00457 00458 return True; 00459 }
| static BOOL message_recv | ( | char * | msgs_buf, | |
| size_t | total_len, | |||
| int * | msg_type, | |||
| struct process_id * | src, | |||
| char ** | buf, | |||
| size_t * | len | |||
| ) | [static] |
messages.c の 465 行で定義されています。
参照先 message_rec::src.
参照元 message_dispatch().
00467 { 00468 struct message_rec rec; 00469 char *ret_buf = *buf; 00470 00471 *buf = NULL; 00472 *len = 0; 00473 00474 if (total_len - (ret_buf - msgs_buf) < sizeof(rec)) 00475 return False; 00476 00477 memcpy(&rec, ret_buf, sizeof(rec)); 00478 ret_buf += sizeof(rec); 00479 00480 if (rec.msg_version != MESSAGE_VERSION) { 00481 DEBUG(0,("message version %d received (expected %d)\n", rec.msg_version, MESSAGE_VERSION)); 00482 return False; 00483 } 00484 00485 if (rec.len > 0) { 00486 if (total_len - (ret_buf - msgs_buf) < rec.len) 00487 return False; 00488 } 00489 00490 *len = rec.len; 00491 *msg_type = rec.msg_type; 00492 *src = rec.src; 00493 *buf = ret_buf; 00494 00495 return True; 00496 }
| void message_dispatch | ( | void | ) |
messages.c の 505 行で定義されています。
参照先 buf・dispatch_fns::fn・len・message_recv()・dispatch_fns::msg_type・message_rec::msg_type・dispatch_fns::next・dispatch_fns::private_data・procid_to_pid()・received_signal・retrieve_all_messages()・sys_getpid().
参照元 main()・open_sockets_smbd()・process()・process_loop()・receive_message_or_smb()・start_background_queue()・wait_replies().
00506 { 00507 int msg_type; 00508 struct process_id src; 00509 char *buf; 00510 char *msgs_buf; 00511 size_t len, total_len; 00512 int n_handled; 00513 00514 if (!received_signal) 00515 return; 00516 00517 DEBUG(10,("message_dispatch: received_signal = %d\n", received_signal)); 00518 00519 received_signal = 0; 00520 00521 if (!retrieve_all_messages(&msgs_buf, &total_len)) 00522 return; 00523 00524 for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { 00525 struct dispatch_fns *dfn; 00526 00527 DEBUG(10,("message_dispatch: received msg_type=%d " 00528 "src_pid=%u\n", msg_type, 00529 (unsigned int) procid_to_pid(&src))); 00530 00531 n_handled = 0; 00532 for (dfn = dispatch_fns; dfn; dfn = dfn->next) { 00533 if (dfn->msg_type == msg_type) { 00534 DEBUG(10,("message_dispatch: processing message of type %d.\n", msg_type)); 00535 dfn->fn(msg_type, src, 00536 len ? (void *)buf : NULL, len, 00537 dfn->private_data); 00538 n_handled++; 00539 break; 00540 } 00541 } 00542 if (!n_handled) { 00543 DEBUG(5,("message_dispatch: warning: no handler registed for " 00544 "msg_type %d in pid %u\n", 00545 msg_type, (unsigned int)sys_getpid())); 00546 } 00547 } 00548 SAFE_FREE(msgs_buf); 00549 }
| void message_register | ( | int | msg_type, | |
| void(*)(int msg_type, struct process_id pid, void *buf, size_t len, void *private_data) | fn, | |||
| void * | private_data | |||
| ) |
messages.c の 558 行で定義されています。
参照先 dispatch_fns::fn・dispatch_fns::msg_type・dispatch_fns::next.
参照元 blocking_lock_cancel()・debug_init()・do_debuglevel()・do_ping()・do_poolusage()・do_profilelevel()・do_winbind_onlinestatus()・fork_child_dc_connect()・fork_domain_child()・init_oplocks()・main()・message_init()・messaging_register()・nt_printing_init()・open_sockets_smbd()・profile_setup()・push_blocking_lock_request()・register_dmalloc_msgs()・register_msg_pool_usage()・srv_spoolss_replyopenprinter()・start_background_queue().
00563 { 00564 struct dispatch_fns *dfn; 00565 00566 for (dfn = dispatch_fns; dfn; dfn = dfn->next) { 00567 if (dfn->msg_type == msg_type) { 00568 dfn->fn = fn; 00569 return; 00570 } 00571 } 00572 00573 dfn = SMB_MALLOC_P(struct dispatch_fns); 00574 00575 if (dfn != NULL) { 00576 00577 ZERO_STRUCTPN(dfn); 00578 00579 dfn->msg_type = msg_type; 00580 dfn->fn = fn; 00581 dfn->private_data = private_data; 00582 00583 DLIST_ADD(dispatch_fns, dfn); 00584 } 00585 else { 00586 00587 DEBUG(0,("message_register: Not enough memory. malloc failed!\n")); 00588 } 00589 }
| void message_deregister | ( | int | msg_type | ) |
messages.c の 595 行で定義されています。
参照先 dispatch_fns::msg_type・dispatch_fns::next.
参照元 do_debuglevel()・do_ping()・do_poolusage()・do_profilelevel()・do_winbind_onlinestatus()・fork_domain_child()・messaging_context_destructor()・set_domain_online()・srv_spoolss_replycloseprinter().
00596 { 00597 struct dispatch_fns *dfn, *next; 00598 00599 for (dfn = dispatch_fns; dfn; dfn = next) { 00600 next = dfn->next; 00601 if (dfn->msg_type == msg_type) { 00602 DLIST_REMOVE(dispatch_fns, dfn); 00603 SAFE_FREE(dfn); 00604 return; 00605 } 00606 } 00607 }
| static int traverse_fn | ( | TDB_CONTEXT * | the_tdb, | |
| TDB_DATA | kbuf, | |||
| TDB_DATA | dbuf, | |||
| void * | state | |||
| ) | [static] |
messages.c の 622 行で定義されています。
参照先 msg_all::buf・TDB_DATA::dptr・TDB_DATA::dsize・msg_all::duplicates・msg_all::len・message_send_pid()・msg_all::msg_flag・msg_all::msg_type・msg_all::n_sent・procid_str_static()・status・tdb_delete().
参照元 brl_forall()・clear_unexpected()・dump_tdb()・dump_wins_subnet_namelist()・info_tdb()・main()・message_send_all()・share_mode_forall()・wcache_invalidate_cache().
00623 { 00624 struct connections_data crec; 00625 struct msg_all *msg_all = (struct msg_all *)state; 00626 NTSTATUS status; 00627 00628 if (dbuf.dsize != sizeof(crec)) 00629 return 0; 00630 00631 memcpy(&crec, dbuf.dptr, sizeof(crec)); 00632 00633 if (crec.cnum != -1) 00634 return 0; 00635 00636 /* Don't send if the receiver hasn't registered an interest. */ 00637 00638 if(!(crec.bcast_msg_flags & msg_all->msg_flag)) 00639 return 0; 00640 00641 /* If the msg send fails because the pid was not found (i.e. smbd died), 00642 * the msg has already been deleted from the messages.tdb.*/ 00643 00644 status = message_send_pid(crec.pid, msg_all->msg_type, 00645 msg_all->buf, msg_all->len, 00646 msg_all->duplicates); 00647 00648 if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) { 00649 00650 /* If the pid was not found delete the entry from connections.tdb */ 00651 00652 DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n", 00653 procid_str_static(&crec.pid), crec.cnum, crec.servicename)); 00654 tdb_delete(the_tdb, kbuf); 00655 } 00656 msg_all->n_sent++; 00657 return 0; 00658 }
| BOOL message_send_all | ( | TDB_CONTEXT * | conn_tdb, | |
| int | msg_type, | |||
| const void * | buf, | |||
| size_t | len, | |||
| BOOL | duplicates_allowed, | |||
| int * | n_sent | |||
| ) |
Send a message to all smbd processes.
It isn't very efficient, but should be OK for the sorts of applications that use it. When we need efficient broadcast we can add it.
| n_sent | Set to the number of messages sent. This should be equal to the number of processes, but be careful for races. |
| True | for success. |
messages.c の 672 行で定義されています。
参照先 msg_all::buf・msg_all::duplicates・msg_all::len・msg_all::msg_flag・msg_all::msg_type・msg_all::n_sent・tdb_traverse()・traverse_fn().
参照元 _srv_net_share_add()・_srv_net_share_del()・_srv_net_share_set_info()・add_printer_hook()・api_RNetShareAdd()・delete_printer_hook()・send_message()・send_repl_message()・send_stat_cache_delete_message()・send_sync_message().
00676 { 00677 struct msg_all msg_all; 00678 00679 msg_all.msg_type = msg_type; 00680 if (msg_type < 1000) 00681 msg_all.msg_flag = FLAG_MSG_GENERAL; 00682 else if (msg_type > 1000 && msg_type < 2000) 00683 msg_all.msg_flag = FLAG_MSG_NMBD; 00684 else if (msg_type > 2000 && msg_type < 2100) 00685 msg_all.msg_flag = FLAG_MSG_PRINT_NOTIFY; 00686 else if (msg_type > 2100 && msg_type < 3000) 00687 msg_all.msg_flag = FLAG_MSG_PRINT_GENERAL; 00688 else if (msg_type > 3000 && msg_type < 4000) 00689 msg_all.msg_flag = FLAG_MSG_SMBD; 00690 else 00691 return False; 00692 00693 msg_all.buf = buf; 00694 msg_all.len = len; 00695 msg_all.duplicates = duplicates_allowed; 00696 msg_all.n_sent = 0; 00697 00698 tdb_traverse(conn_tdb, traverse_fn, &msg_all); 00699 if (n_sent) 00700 *n_sent = msg_all.n_sent; 00701 return True; 00702 }
| void message_block | ( | void | ) |
messages.c の 709 行で定義されています。
参照先 BlockSignals().
参照元 fork_child_dc_connect()・fork_domain_child().
00710 { 00711 BlockSignals(True, SIGUSR1); 00712 }
| void message_unblock | ( | void | ) |
messages.c の 714 行で定義されています。
参照先 BlockSignals().
参照元 fork_child_dc_connect()・fork_domain_child().
00715 { 00716 BlockSignals(False, SIGUSR1); 00717 }
| static int messaging_context_destructor | ( | struct messaging_context * | ctx | ) | [static] |
messages.c の 738 行で定義されています。
参照先 ctx・message_deregister()・messaging_callback::msg_type・messaging_callback::next.
参照元 messaging_init().
00739 { 00740 struct messaging_callback *cb; 00741 00742 for (cb = ctx->callbacks; cb; cb = cb->next) { 00743 /* 00744 * We unconditionally remove all instances of our callback 00745 * from the tdb basis. 00746 */ 00747 message_deregister(cb->msg_type); 00748 } 00749 return 0; 00750 }
| struct messaging_context* messaging_init | ( | TALLOC_CTX * | mem_ctx, | |
| struct server_id | server_id, | |||
| struct event_context * | ev | |||
| ) |
messages.c の 752 行で定義されています。
参照先 ctx・messaging_context_destructor().
00755 { 00756 struct messaging_context *ctx; 00757 00758 if (!(ctx = TALLOC_ZERO_P(mem_ctx, struct messaging_context))) { 00759 return NULL; 00760 } 00761 00762 ctx->id = server_id; 00763 talloc_set_destructor(ctx, messaging_context_destructor); 00764 return ctx; 00765 }
| static void messaging_callback | ( | int | msg_type, | |
| struct process_id | pid, | |||
| void * | buf, | |||
| size_t | len, | |||
| void * | private_data | |||
| ) | [static] |
messages.c の 767 行で定義されています。
参照先 ctx・data_blob_::data・messaging_callback::fn・id・data_blob_::length・messaging_callback::msg_type・messaging_callback::next・messaging_callback::private_data.
00769 { 00770 struct messaging_context *ctx = talloc_get_type_abort( 00771 private_data, struct messaging_context); 00772 struct messaging_callback *cb, *next; 00773 00774 for (cb = ctx->callbacks; cb; cb = next) { 00775 /* 00776 * Allow a callback to remove itself 00777 */ 00778 next = cb->next; 00779 00780 if (msg_type == cb->msg_type) { 00781 DATA_BLOB blob; 00782 struct server_id id; 00783 00784 blob.data = (uint8 *)buf; 00785 blob.length = len; 00786 id.id = pid; 00787 00788 cb->fn(ctx, cb->private_data, msg_type, id, &blob); 00789 } 00790 } 00791 }
| NTSTATUS messaging_register | ( | struct messaging_context * | ctx, | |
| void * | private_data, | |||
| uint32_t | msg_type, | |||
| void(*)(struct messaging_context *msg, void *private_data, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data) | fn | |||
| ) |
messages.c の 797 行で定義されています。
参照先 ctx・messaging_callback::fn・message_register()・messaging_callback::msg_type・messaging_callback::private_data.
参照元 notify_init().
00804 { 00805 struct messaging_callback *cb; 00806 00807 if (!(cb = talloc(ctx, struct messaging_callback))) { 00808 return NT_STATUS_NO_MEMORY; 00809 } 00810 00811 cb->msg_type = msg_type; 00812 cb->fn = fn; 00813 cb->private_data = private_data; 00814 00815 DLIST_ADD(ctx->callbacks, cb); 00816 message_register(msg_type, messaging_callback, ctx); 00817 return NT_STATUS_OK; 00818 }
| void messaging_deregister | ( | struct messaging_context * | ctx, | |
| uint32_t | msg_type, | |||
| void * | private_data | |||
| ) |
messages.c の 823 行で定義されています。
参照先 ctx・messaging_callback::msg_type・messaging_callback::next・messaging_callback::private_data.
参照元 notify_destructor().
00825 { 00826 struct messaging_callback *cb, *next; 00827 00828 for (cb = ctx->callbacks; cb; cb = next) { 00829 next = cb->next; 00830 if ((cb->msg_type == msg_type) 00831 && (cb->private_data == private_data)) { 00832 DLIST_REMOVE(ctx->callbacks, cb); 00833 TALLOC_FREE(cb); 00834 } 00835 } 00836 }
| NTSTATUS messaging_send | ( | struct messaging_context * | msg, | |
| struct server_id | server, | |||
| uint32_t | msg_type, | |||
| DATA_BLOB * | data | |||
| ) |
messages.c の 841 行で定義されています。
参照先 data_blob_::data・data_blob_::length・message_send_pid_internal()・server.
参照元 notify_send().
00844 { 00845 return message_send_pid_internal(server.id, msg_type, data->data, 00846 data->length, True, 0); 00847 }
TDB_CONTEXT* tdb [static] |
messages.c の 51 行で定義されています。
int received_signal [static] |
1.4.7