#include "dazuko_transport.h"
#include "dazuko_events.h"
Go to the source code of this file.
Defines | |
#define | DAZUKO_DIFFERENT 0 |
#define | DAZUKO_SUSPICIOUS 1 |
#define | DAZUKO_CHILD 2 |
#define | DAZUKO_SAME 3 |
#define | DAZUKO_NONE 0 |
#define | DAZUKO_REGULAR 1 |
#define | DAZUKO_DIRECTORY 2 |
#define | DAZUKO_LINK 3 |
#define | DPRINT(fmt) |
Functions | |
void | xp_init_mutex (struct xp_mutex *mutex) |
void | xp_down (struct xp_mutex *mutex) |
void | xp_up (struct xp_mutex *mutex) |
void | xp_destroy_mutex (struct xp_mutex *mutex) |
void | xp_init_rwlock (struct xp_rwlock *rwlock) |
void | xp_write_lock (struct xp_rwlock *rwlock) |
void | xp_write_unlock (struct xp_rwlock *rwlock) |
void | xp_read_lock (struct xp_rwlock *rlock) |
void | xp_read_unlock (struct xp_rwlock *rlock) |
void | xp_destroy_rwlock (struct xp_rwlock *rwlock) |
int | xp_init_queue (struct xp_queue *queue) |
int | xp_wait_until_condition (struct xp_queue *queue, int(*cfunction)(void *), void *cparam, int allow_interrupt) |
int | xp_notify (struct xp_queue *queue) |
int | xp_destroy_queue (struct xp_queue *queue) |
void * | xp_malloc (size_t size) |
int | xp_free (void *ptr) |
int | xp_copyin (const void *user_src, void *kernel_dest, size_t size) |
int | xp_copyout (const void *kernel_src, void *user_dest, size_t size) |
int | xp_verify_user_writable (const void *user_ptr, size_t size) |
int | xp_verify_user_readable (const void *user_ptr, size_t size) |
int | xp_is_absolute_path (const char *path) |
int | xp_atomic_set (struct xp_atomic *atomic, int value) |
int | xp_atomic_inc (struct xp_atomic *atomic) |
int | xp_atomic_dec (struct xp_atomic *atomic) |
int | xp_atomic_read (struct xp_atomic *atomic) |
int | xp_sys_hook (void) |
int | xp_sys_unhook (void) |
int | xp_fill_file_struct (struct dazuko_file_struct *dfs) |
int | xp_id_compare (struct xp_daemon_id *id1, struct xp_daemon_id *id2, int check_related) |
int | xp_id_free (struct xp_daemon_id *id) |
xp_daemon_id * | xp_id_copy (struct xp_daemon_id *id) |
int | xp_set_event_properties (struct event_properties *event_p, struct xp_daemon_id *xp_id) |
int | xp_init_cache (unsigned long ttl) |
int | xp_print (const char *fmt,...) |
int | dazuko_vsnprintf (char *str, size_t size, const char *format, va_list ap) |
int | dazuko_snprintf (char *str, size_t size, const char *format,...) |
int | dazuko_is_our_daemon (struct xp_daemon_id *xp_id, struct slot_list **slotlist) |
int | dazuko_get_value (const char *key, const char *string, char **value) |
int | dazuko_unregister_daemon (struct xp_daemon_id *xp_id) |
int | dazuko_handle_user_request (const char *request_buffer, struct xp_daemon_id *xp_id) |
int | dazuko_handle_user_request_compat1 (void *ptr, int cmd, struct xp_daemon_id *xp_id) |
int | dazuko_get_filename_length (const char *filename) |
void | dazuko_bzero (void *p, int len) |
int | dazuko_check_access (unsigned long event, int daemon_is_allowed, struct xp_daemon_id *xp_id, struct slot_list **cached_lookup) |
int | dazuko_process_access (unsigned long event, struct dazuko_file_struct *kfs, struct event_properties *event_p, struct slot_list *cached_lookup) |
int | dazuko_init (void) |
int | dazuko_exit (void) |
|
Definition at line 44 of file dazuko_core.h. Referenced by dazuko_is_our_daemon(), and xp_id_compare(). |
|
Definition at line 42 of file dazuko_core.h. Referenced by xp_id_compare(). |
|
Definition at line 50 of file dazuko_core.h. Referenced by xp_fill_file_struct(). |
|
Definition at line 51 of file dazuko_core.h. Referenced by xp_fill_file_struct(). |
|
Definition at line 48 of file dazuko_core.h. |
|
Definition at line 49 of file dazuko_core.h. Referenced by xp_fill_file_struct(). |
|
Definition at line 45 of file dazuko_core.h. Referenced by _dazuko_find_slot(), dazuko_add_trusted_daemon(), dazuko_is_our_daemon(), dazuko_unregister_trusted_daemon(), and xp_id_compare(). |
|
Definition at line 43 of file dazuko_core.h. Referenced by dazuko_is_our_daemon(), and xp_id_compare(). |
|
|
Definition at line 306 of file dazuko_core.c. 00307 { 00308 /* "zero out" len bytes starting with p */ 00309 00310 char *ptr = (char *)p; 00311 00312 while (len--) 00313 *ptr++ = 0; 00314 }
|
|
Definition at line 3327 of file dazuko_core.c. References access_mask_cache, AMC_UNSET, call_xp_atomic_read(), call_xp_down(), call_xp_up(), dazuko_event2index(), dazuko_is_our_daemon(), NULL, and NUM_EVENTS. Referenced by dazuko_sys_generic(), and linux_dazuko_sys_generic(). 03328 { 03329 int i; 03330 struct slot_list *sl = NULL; 03331 03332 /* do we have any daemons? */ 03333 if (call_xp_atomic_read(&active) <= 0) 03334 return -1; 03335 03336 /* is a group interested in this event type? */ 03337 03338 i = dazuko_event2index(event); 03339 if (i < 0 || i >= NUM_EVENTS) 03340 return -1; 03341 03342 /* DOWN */ 03343 call_xp_down(&mutex_amc); 03344 03345 i = access_mask_cache[i][0]; 03346 03347 call_xp_up(&mutex_amc); 03348 /* UP */ 03349 03350 if (i == AMC_UNSET) 03351 return -1; 03352 03353 if (dazuko_is_our_daemon(xp_id, &sl)) 03354 { 03355 /* should daemons be allowed this event without a scan? */ 03356 if (daemon_is_allowed) 03357 { 03358 /* this is one of our daemons, so we will report as 03359 * as if this event was not in the mask */ 03360 03361 return -1; 03362 } 03363 else 03364 { 03365 /* this is one of our daemons, but the 03366 * other groups must be informed */ 03367 03368 /* if there are no other groups, allow this event */ 03369 if (call_xp_atomic_read(&groupcount) == 1) 03370 return -1; 03371 03372 if (cached_lookup != NULL) 03373 { 03374 /* this slot list (ours) will be skipped */ 03375 *cached_lookup = sl; 03376 } 03377 } 03378 } 03379 03380 /* if we made it this far, then the 03381 * access should be processed */ 03382 03383 return 0; 03384 }
|
|
Definition at line 3458 of file dazuko_core.c. 03459 { 03460 int error; 03461 int i; 03462 int j; 03463 03464 i = call_xp_atomic_read(&active); 03465 03466 if (i != 0) 03467 { 03468 call_xp_print("dazuko: warning: trying to remove Dazuko with %d process%s still registered\n", i, i==1 ? "" : "es"); 03469 return -1; 03470 } 03471 03472 error = call_xp_sys_unhook(); 03473 03474 if (error == 0) 03475 { 03476 call_xp_destroy_mutex(&mutex_unique_count); 03477 call_xp_destroy_mutex(&mutex_amc); 03478 03479 for (i=0 ; i<NUM_SLOT_LISTS ; i++) 03480 { 03481 if (slot_lists[i].slot_list != NULL) 03482 { 03483 dazuko_remove_all_paths(slot_lists[i].slot_list); 03484 03485 if (call_xp_atomic_read(&(slot_lists[i].slot_list->use_count)) != 0) 03486 call_xp_print("dazuko: slot_list count was not 0 (possible bug)\n"); 03487 03488 for (j=0 ; j<NUM_SLOTS ; j++) 03489 { 03490 call_xp_destroy_mutex(&(slot_lists[i].slot_list->slots[j].mutex)); 03491 call_xp_destroy_queue(&(slot_lists[i].slot_list->slots[j].wait_daemon_waiting_until_this_slot_not_READY)); 03492 call_xp_destroy_queue(&(slot_lists[i].slot_list->slots[j].wait_kernel_waiting_until_this_slot_not_WAITING_and_not_WORKING)); 03493 call_xp_destroy_queue(&(slot_lists[i].slot_list->slots[j].wait_daemon_waiting_until_this_slot_not_DONE)); 03494 } 03495 03496 call_xp_destroy_rwlock(&(slot_lists[i].slot_list->lock_lists)); 03497 03498 #ifdef TRUSTED_APPLICATION_SUPPORT 03499 dazuko_remove_all_trusted(slot_lists[i].slot_list); 03500 call_xp_destroy_rwlock(&(slot_lists[i].slot_list->lock_trusted_list)); 03501 #endif 03502 03503 call_xp_destroy_queue(&(slot_lists[i].slot_list->wait_kernel_waiting_for_any_READY_slot_or_zero_use_count)); 03504 03505 if (slot_lists[i].slot_list->reg_name != NULL) 03506 call_xp_free(slot_lists[i].slot_list->reg_name); 03507 slot_lists[i].slot_list->reg_name = NULL; 03508 03509 call_xp_free(slot_lists[i].slot_list); 03510 slot_lists[i].slot_list = NULL; 03511 } 03512 03513 call_xp_destroy_mutex(&(slot_lists[i].mutex)); 03514 } 03515 03516 call_xp_print("dazuko: unloaded, version=%s\n", VERSION_STRING); 03517 } 03518 03519 return error; 03520 }
|
|
Definition at line 1990 of file dazuko_core.c. 01991 { 01992 int len; 01993 01994 for (len=0 ; filename[len] ; len++); 01995 01996 return len; 01997 }
|
|
Definition at line 1310 of file dazuko_core.c. 01311 { 01312 const char *p1; 01313 const char *p2; 01314 int size; 01315 01316 if (value == NULL) 01317 return -1; 01318 01319 *value = NULL; 01320 01321 if (key == NULL || string == NULL) 01322 return -1; 01323 01324 p1 = dazuko_strstr(string, key); 01325 if (p1 == NULL) 01326 return -1; 01327 01328 p1 += dazuko_strlen(key); 01329 01330 for (p2=p1 ; *p2 && *p2!='\n' ; p2++) 01331 continue; 01332 01333 size = (p2 - p1) + 1; 01334 *value = call_xp_malloc(size); 01335 if (*value == NULL) 01336 return -1; 01337 01338 memcpy(*value, p1, size - 1); 01339 (*value)[size - 1] = 0; 01340 01341 return 0; 01342 }
|
|
Definition at line 2711 of file dazuko_core.c. References dazuko_request::buffer, dazuko_request::buffer_size, call_xp_copyin(), call_xp_copyout(), call_xp_free(), call_xp_malloc(), dazuko_bzero(), dazuko_get_value(), dazuko_handle_request(), dazuko_reqstream_chunksize(), dazuko_reqstream_ll2hl(), dazuko_reqstream_updll(), dazuko_strtoul(), NULL, dazuko_request::reply_buffer, dazuko_request::reply_buffer_size, dazuko_request::reply_buffer_size_used, dazuko_request::type, XP_ERROR_FAULT, XP_ERROR_PERMISSION, and xp_free(). 02712 { 02713 int error = 0; 02714 struct dazuko_request *user_request = NULL; 02715 unsigned char *ll_request = NULL; 02716 unsigned char *ll_stream = NULL; 02717 struct dazuko_request *request = NULL; 02718 struct dazuko_request *temp_request = NULL; 02719 char *value; 02720 unsigned char tempslen[4]; 02721 int streamlen = 0; 02722 02723 /* 02724 * some notes on the variables: we allocate a "request" struct which 02725 * has a kernel space address and references data which is _completely_ 02726 * valid from within the kernel, in addition we allocate a 02727 * "temp_request" struct which has a kernel space address and its data 02728 * mirrors the userland struct "user_request", the "ll_stream" byte 02729 * array has a kernel space address and holds a copy of the user space 02730 * request stream 02731 */ 02732 02733 if (request_buffer == NULL || xp_id == NULL) 02734 return XP_ERROR_FAULT; 02735 02736 if (dazuko_get_value("\nra=", request_buffer, &value) == 0) 02737 { 02738 ll_request = (unsigned char *)dazuko_strtoul(value); 02739 xp_free(value); 02740 } 02741 else if (dazuko_get_value("\nRA=", request_buffer, &value) == 0) 02742 { 02743 user_request = (struct dazuko_request *)dazuko_strtoul(value); 02744 xp_free(value); 02745 } 02746 02747 /* 02748 * at least one kind of request presentation needs to be given (having 02749 * multiple kinds does not hurt -- we pick the most portable one and 02750 * process it) 02751 */ 02752 if (ll_request == NULL && user_request == NULL) 02753 return XP_ERROR_FAULT; 02754 02755 /* allocate temp kernel request */ 02756 temp_request = (struct dazuko_request *)call_xp_malloc(sizeof(struct dazuko_request)); 02757 if (temp_request == NULL) 02758 return XP_ERROR_FAULT; 02759 02760 /* allocate kernel request */ 02761 request = (struct dazuko_request *)call_xp_malloc(sizeof(struct dazuko_request)); 02762 if (request == NULL) 02763 { 02764 error = XP_ERROR_FAULT; 02765 goto dazuko_handle_user_request_out; 02766 } 02767 02768 /* request bytes are zero'd out because the "out" will check 02769 * these values */ 02770 dazuko_bzero(request, sizeof(struct dazuko_request)); 02771 02772 if (ll_request != NULL) 02773 { 02774 /* 02775 * this is the "new style ra= (streamed) request" -- we have a 02776 * description which is high level language independent: fill in *OUR* 02777 * C language struct with the data we read in in a portable way 02778 */ 02779 02780 /* copy in the length bytes (4 bytes) */ 02781 if (call_xp_copyin(ll_request, tempslen, 4) != 0) 02782 { 02783 error = XP_ERROR_FAULT; 02784 goto dazuko_handle_user_request_out; 02785 } 02786 02787 if (dazuko_reqstream_chunksize(tempslen, &streamlen) != 0) 02788 { 02789 error = XP_ERROR_FAULT; 02790 goto dazuko_handle_user_request_out; 02791 } 02792 02793 /* allocate a buffer and copyin the stream */ 02794 ll_stream = (unsigned char *)call_xp_malloc(streamlen); 02795 if (ll_stream == NULL) 02796 { 02797 error = XP_ERROR_FAULT; 02798 goto dazuko_handle_user_request_out; 02799 } 02800 02801 if (call_xp_copyin(ll_request, ll_stream, streamlen) != 0) 02802 { 02803 error = XP_ERROR_FAULT; 02804 goto dazuko_handle_user_request_out; 02805 } 02806 02807 /* convert the stream to into a (our) struct */ 02808 if (dazuko_reqstream_ll2hl(ll_stream, temp_request, 0) != 0) 02809 { 02810 error = XP_ERROR_FAULT; 02811 goto dazuko_handle_user_request_out; 02812 } 02813 02814 /* do NOT release the stream buffer here */ 02815 } 02816 else if (user_request != NULL) 02817 { 02818 /* 02819 * this is the "old style (high level language struct) request" -- we 02820 * HAVE TO ASSUME that the memory layout of the application and the 02821 * kernel module match regarding the "struct dazuko_request" data type 02822 * (yes, it's dangerous but we have no means to check anything here) 02823 */ 02824 02825 /* copy in the request */ 02826 if (call_xp_copyin(user_request, temp_request, sizeof(struct dazuko_request)) != 0) 02827 { 02828 error = XP_ERROR_FAULT; 02829 goto dazuko_handle_user_request_out; 02830 } 02831 } 02832 02833 /* 02834 * at this point we have a valid request structure in "temp_request" 02835 * (still pointing to userland buffers for request and reply) 02836 */ 02837 02838 memcpy(request->type, temp_request->type, sizeof(char[2])); 02839 02840 /* sanity check */ 02841 request->buffer_size = temp_request->buffer_size; 02842 if (request->buffer_size < 0 || request->buffer_size > 8192) 02843 { 02844 error = XP_ERROR_FAULT; 02845 goto dazuko_handle_user_request_out; 02846 } 02847 02848 /* sanity check */ 02849 request->reply_buffer_size = temp_request->reply_buffer_size; 02850 if (request->reply_buffer_size < 0 || request->reply_buffer_size > 8192) 02851 { 02852 error = XP_ERROR_PERMISSION; 02853 goto dazuko_handle_user_request_out; 02854 } 02855 02856 if (request->buffer_size > 0) 02857 { 02858 /* allocate request command string buffer */ 02859 request->buffer = (char *)call_xp_malloc(request->buffer_size + 1); 02860 if (request->buffer == NULL) 02861 { 02862 error = XP_ERROR_FAULT; 02863 goto dazuko_handle_user_request_out; 02864 } 02865 02866 } 02867 02868 if (request->reply_buffer_size > 0) 02869 { 02870 /* allocate reply text buffer */ 02871 request->reply_buffer = (char *)call_xp_malloc(request->reply_buffer_size + 1); 02872 if (request->reply_buffer == NULL) 02873 { 02874 error = XP_ERROR_FAULT; 02875 goto dazuko_handle_user_request_out; 02876 } 02877 02878 request->reply_buffer_size_used = 0; 02879 } 02880 02881 if (request->buffer_size > 0) 02882 { 02883 /* copy the buffer from userspace to kernelspace */ 02884 if (call_xp_copyin(temp_request->buffer, request->buffer, request->buffer_size) != 0) 02885 { 02886 error = XP_ERROR_FAULT; 02887 goto dazuko_handle_user_request_out; 02888 } 02889 02890 request->buffer[request->buffer_size] = 0; 02891 } 02892 02893 /* process the request */ 02894 error = dazuko_handle_request(request, xp_id); 02895 02896 /* successfully processed and a response to be transferred back? */ 02897 if (error == 0 && request->reply_buffer_size > 0) 02898 { 02899 request->reply_buffer[request->reply_buffer_size] = 0; 02900 02901 temp_request->reply_buffer_size_used = request->reply_buffer_size_used; 02902 02903 if (ll_request != NULL) 02904 { 02905 /* new style (streamed) request */ 02906 02907 /* update a few return fields */ 02908 if (dazuko_reqstream_updll(temp_request, ll_stream) != 0) 02909 { 02910 error = XP_ERROR_FAULT; 02911 goto dazuko_handle_user_request_out; 02912 } 02913 02914 /* copyout the stream back to the application */ 02915 if (call_xp_copyout(ll_stream, ll_request, streamlen) != 0) 02916 { 02917 error = XP_ERROR_FAULT; 02918 goto dazuko_handle_user_request_out; 02919 } 02920 } 02921 else if (user_request != NULL) 02922 { 02923 /* old style (high level language struct) request */ 02924 02925 /* copyout the complete "struct dazuko_request" struct */ 02926 if (call_xp_copyout(temp_request, user_request, sizeof(struct dazuko_request)) != 0) 02927 { 02928 error = XP_ERROR_FAULT; 02929 goto dazuko_handle_user_request_out; 02930 } 02931 } 02932 02933 /* transfer back the reply data itself */ 02934 if (request->reply_buffer_size_used > 0) 02935 { 02936 /* reply_buffer_size_used already includes the NUL byte */ 02937 if (call_xp_copyout(request->reply_buffer, temp_request->reply_buffer, request->reply_buffer_size_used) != 0) 02938 { 02939 error = XP_ERROR_FAULT; 02940 goto dazuko_handle_user_request_out; 02941 } 02942 } 02943 } 02944 02945 dazuko_handle_user_request_out: 02946 02947 if (request != NULL) 02948 { 02949 if (request->buffer != NULL) 02950 call_xp_free(request->buffer); 02951 02952 if (request->reply_buffer != NULL) 02953 call_xp_free(request->reply_buffer); 02954 02955 call_xp_free(request); 02956 } 02957 02958 if (temp_request != NULL) 02959 call_xp_free(temp_request); 02960 02961 if (ll_stream != NULL) 02962 call_xp_free(ll_stream); 02963 02964 return error; 02965 }
|
|
Definition at line 2967 of file dazuko_core.c. References slot_list::access_mask, call_xp_copyin(), call_xp_copyout(), call_xp_free(), call_xp_id_copy(), call_xp_id_free(), call_xp_malloc(), call_xp_notify(), call_xp_up(), call_xp_verify_user_readable(), call_xp_verify_user_writable(), DAZUKO_BROKEN, dazuko_change_slot_state(), DAZUKO_FILENAME_MAX_LENGTH_COMPAT1, dazuko_find_slot(), dazuko_find_slot_and_slotlist(), dazuko_get_an_access(), dazuko_register_daemon(), dazuko_return_access(), dazuko_set_option(), dazuko_setup_amc_cache(), DAZUKO_WORKING, access_compat1::deny, DPRINT, slot::event, access_compat1::event, slot::event_p, access_compat1::filename, slot::filename, slot::filenamelength, event_properties::flags, handle_event_as_readonly(), IOCTL_GET_AN_ACCESS, IOCTL_RETURN_ACCESS, IOCTL_SET_OPTION, event_properties::mode, slot::mutex, NULL, access_compat1::o_flags, access_compat1::o_mode, event_properties::pid, access_compat1::pid, REGISTER, SET_ACCESS_MASK, event_properties::uid, access_compat1::uid, daemon_id::unique, XP_ERROR_FAULT, XP_ERROR_INTERRUPT, XP_ERROR_INVALID, XP_ERROR_PERMISSION, and daemon_id::xp_id. 02968 { 02969 struct access_compat1 *user_request_1; 02970 struct access_compat1 *temp_request_1; 02971 struct slot_list *sl; 02972 int error = 0; 02973 struct slot *s; 02974 char *k_param; 02975 struct daemon_id did; 02976 int temp_length; 02977 int temp_int; 02978 02979 if (ptr == NULL || xp_id == NULL) 02980 return XP_ERROR_FAULT; 02981 02982 did.xp_id = call_xp_id_copy(xp_id); 02983 did.unique = -1; 02984 02985 switch (cmd) 02986 { 02987 case IOCTL_GET_AN_ACCESS: 02988 /* The daemon is requesting a filename of a file 02989 * to scan. This code will wait until a filename 02990 * is available, or until we should be killed. 02991 * (killing is done if any errors occur as well 02992 * as when the user kills us) */ 02993 02994 user_request_1 = (struct access_compat1 *)ptr; 02995 02996 error = call_xp_verify_user_writable(user_request_1, sizeof(struct access_compat1)); 02997 if (error) 02998 { 02999 error = XP_ERROR_FAULT; 03000 break; 03001 } 03002 03003 /* DOWN? */ 03004 s = dazuko_get_an_access(&did); 03005 03006 if (s == NULL) 03007 { 03008 error = XP_ERROR_INTERRUPT; 03009 break; 03010 } 03011 03012 /* DOWN */ 03013 03014 /* Slot IS in WORKING state. Copy all the 03015 * necessary information to userspace structure. */ 03016 03017 if (s->filenamelength >= DAZUKO_FILENAME_MAX_LENGTH_COMPAT1) 03018 { 03019 /* filename length overflow :( */ 03020 03021 s->filename[DAZUKO_FILENAME_MAX_LENGTH_COMPAT1 - 1] = 0; 03022 temp_length = DAZUKO_FILENAME_MAX_LENGTH_COMPAT1; 03023 } 03024 else 03025 { 03026 temp_length = s->filenamelength + 1; 03027 } 03028 03029 temp_request_1 = (struct access_compat1 *)call_xp_malloc(sizeof(struct access_compat1)); 03030 if (temp_request_1 == NULL) 03031 { 03032 error = XP_ERROR_FAULT; 03033 } 03034 else if (call_xp_copyin(user_request_1, temp_request_1, sizeof(struct access_compat1)) != 0) 03035 { 03036 error = XP_ERROR_FAULT; 03037 } 03038 03039 if (error == 0) 03040 { 03041 temp_request_1->event = s->event; 03042 temp_request_1->o_flags = s->event_p.flags; 03043 temp_request_1->o_mode = s->event_p.mode; 03044 temp_request_1->uid = s->event_p.uid; 03045 temp_request_1->pid = s->event_p.pid; 03046 memcpy(temp_request_1->filename, s->filename, temp_length); 03047 03048 if (call_xp_copyout(temp_request_1, user_request_1, sizeof(struct access_compat1)) != 0) 03049 { 03050 error = XP_ERROR_FAULT; 03051 } 03052 } 03053 03054 call_xp_up(&(s->mutex)); 03055 /* UP */ 03056 03057 if (error) 03058 { 03059 if (dazuko_change_slot_state(s, DAZUKO_WORKING, DAZUKO_BROKEN, 1)) 03060 { 03061 /* slot->state has changed to BROKEN, notifiy appropriate queue */ 03062 call_xp_notify(&(s->wait_kernel_waiting_until_this_slot_not_WAITING_and_not_WORKING)); 03063 } 03064 } 03065 03066 if (temp_request_1 != NULL) 03067 { 03068 call_xp_free(temp_request_1); 03069 } 03070 03071 break; 03072 03073 case IOCTL_RETURN_ACCESS: 03074 /* The daemon has finished scanning a file 03075 * and has the response to give. The daemon's 03076 * slot should be in the WORKING state. */ 03077 03078 user_request_1 = (struct access_compat1 *)ptr; 03079 03080 error = call_xp_verify_user_readable(user_request_1, sizeof(struct access_compat1)); 03081 if (error) 03082 { 03083 error = XP_ERROR_FAULT; 03084 break; 03085 } 03086 03087 temp_request_1 = (struct access_compat1 *)call_xp_malloc(sizeof(struct access_compat1)); 03088 if (temp_request_1 == NULL) 03089 { 03090 error = XP_ERROR_FAULT; 03091 break; 03092 } 03093 03094 if (call_xp_copyin(user_request_1, temp_request_1, sizeof(struct access_compat1)) != 0) 03095 { 03096 error = XP_ERROR_FAULT; 03097 } 03098 03099 temp_int = temp_request_1->deny; 03100 03101 call_xp_free(temp_request_1); 03102 03103 /* find our slot */ 03104 s = dazuko_find_slot(&did, 1, NULL); 03105 03106 if (s == NULL) 03107 { 03108 /* It appears the kernel isn't interested 03109 * in us or our response. It gave our slot away! */ 03110 03111 DPRINT(("dazuko: daemon %d unexpectedly lost slot (by return access compat1)\n", did.unique)); 03112 03113 error = XP_ERROR_FAULT; 03114 } 03115 else if (!handle_event_as_readonly(s)) 03116 { 03117 error = dazuko_return_access(&did, temp_int, s); 03118 } 03119 03120 break; 03121 03122 case IOCTL_SET_OPTION: 03123 /* The daemon wants to set a configuration 03124 * option in the kernel. */ 03125 03126 error = call_xp_verify_user_readable(ptr, 2*sizeof(int)); 03127 if (error) 03128 { 03129 error = XP_ERROR_FAULT; 03130 break; 03131 } 03132 03133 /* copy option type from userspace */ 03134 if (call_xp_copyin(ptr, &temp_int, sizeof(int)) != 0) 03135 { 03136 error = XP_ERROR_FAULT; 03137 break; 03138 } 03139 03140 ptr = ((char *)ptr + sizeof(int)); 03141 03142 /* copy path length from userspace */ 03143 if (call_xp_copyin(ptr, &temp_length, sizeof(int)) != 0) 03144 { 03145 error = XP_ERROR_FAULT; 03146 break; 03147 } 03148 03149 /* sanity check */ 03150 if (temp_length < 0 || temp_length > 4096) 03151 { 03152 error = XP_ERROR_INVALID; 03153 break; 03154 } 03155 03156 ptr = ((char *)ptr + sizeof(int)); 03157 03158 error = call_xp_verify_user_readable(ptr, temp_length); 03159 if (error) 03160 { 03161 error = XP_ERROR_FAULT; 03162 break; 03163 } 03164 03165 k_param = (char *)call_xp_malloc(temp_length + 1); 03166 if (k_param == NULL) 03167 { 03168 error = XP_ERROR_FAULT; 03169 break; 03170 } 03171 03172 /* We must copy the param from userspace to kernelspace. */ 03173 03174 if (call_xp_copyin(ptr, k_param, temp_length) != 0) 03175 { 03176 call_xp_free(k_param); 03177 error = XP_ERROR_FAULT; 03178 break; 03179 } 03180 03181 k_param[temp_length] = 0; 03182 03183 switch (temp_int) 03184 { 03185 case REGISTER: 03186 error = dazuko_register_daemon(&did, k_param, temp_length, 1); 03187 break; 03188 03189 case SET_ACCESS_MASK: 03190 /* find our slot */ 03191 if (dazuko_find_slot_and_slotlist(&did, 1, NULL, &sl) == NULL) 03192 { 03193 error = XP_ERROR_PERMISSION; 03194 } 03195 else if (sl == NULL) 03196 { 03197 error = XP_ERROR_PERMISSION; 03198 } 03199 else 03200 { 03201 sl->access_mask = k_param[0]; 03202 03203 /* rebuild access_mask_cache */ 03204 dazuko_setup_amc_cache(); 03205 } 03206 break; 03207 03208 default: 03209 error = dazuko_set_option(&did, temp_int, k_param, temp_length); 03210 break; 03211 } 03212 03213 call_xp_free(k_param); 03214 03215 break; 03216 03217 default: 03218 error = XP_ERROR_INVALID; 03219 03220 break; 03221 } 03222 03223 call_xp_id_free(did.xp_id); 03224 03225 return error; 03226 }
|
|
Definition at line 3432 of file dazuko_core.c. 03433 { 03434 int i; 03435 int error; 03436 03437 call_xp_init_mutex(&mutex_unique_count); 03438 call_xp_init_mutex(&mutex_amc); 03439 03440 dazuko_bzero(&slot_lists, sizeof(slot_lists)); 03441 03442 memset(&access_mask_cache, AMC_UNSET, sizeof(access_mask_cache)); 03443 03444 for (i=0 ; i<NUM_SLOT_LISTS ; i++) 03445 call_xp_init_mutex(&(slot_lists[i].mutex)); 03446 03447 call_xp_atomic_set(&active, 0); 03448 call_xp_atomic_set(&groupcount, 0); 03449 03450 error = call_xp_sys_hook(); 03451 03452 if (error == 0) 03453 call_xp_print("dazuko: loaded, version=%s\n", VERSION_STRING); 03454 03455 return error; 03456 }
|
|
Definition at line 3228 of file dazuko_core.c. References _dazuko_find_slot(), _remove_trusted_node(), call_xp_down(), call_xp_id_compare(), call_xp_id_copy(), call_xp_id_free(), call_xp_read_lock(), call_xp_read_unlock(), call_xp_up(), DAZUKO_CHILD, DAZUKO_SAME, DAZUKO_SUSPICIOUS, DPRINT, slot_list::lock_trusted_list, trusted_container::next, NULL, slot_list::set_trusted_list, slot_list_container::slot_list, trusted_container::trust_children, slot_list::trusted_list, daemon_id::unique, trusted_container::xp_id, and daemon_id::xp_id. 03229 { 03230 /* Check if the current process is one 03231 * of the daemons. */ 03232 03233 int ret = 0; 03234 struct daemon_id did; 03235 struct slot *s; 03236 int i; 03237 struct slot_list *sl; 03238 #ifdef TRUSTED_APPLICATION_SUPPORT 03239 int cmp; 03240 struct trusted_container *tc; 03241 struct trusted_container *prev; 03242 #endif 03243 03244 did.xp_id = call_xp_id_copy(xp_id); 03245 did.unique = -1; 03246 03247 for (i=0 ; i<NUM_SLOT_LISTS ; i++) 03248 { 03249 /* DOWN */ 03250 call_xp_down(&(slot_lists[i].mutex)); 03251 03252 sl = slot_lists[i].slot_list; 03253 03254 call_xp_up(&(slot_lists[i].mutex)); 03255 /* UP */ 03256 03257 if (sl == NULL) 03258 continue; 03259 03260 s = _dazuko_find_slot(&did, 1, sl); 03261 if (s != NULL) 03262 { 03263 ret = 1; 03264 03265 if (slotlist != NULL) 03266 *slotlist = sl; 03267 03268 break; 03269 } 03270 03271 if (did.xp_id == NULL) 03272 continue; 03273 03274 #ifdef TRUSTED_APPLICATION_SUPPORT 03275 /* This boolean is not protected by a lock on purpose. 03276 * It is used as optimization when there are no trusted 03277 * processes. If it is set, then we will use the lock. */ 03278 if (!(sl->set_trusted_list)) 03279 continue; 03280 03281 /* LOCK */ 03282 call_xp_read_lock(&(sl->lock_trusted_list)); 03283 03284 tc = sl->trusted_list; 03285 prev = NULL; 03286 while (tc != NULL) 03287 { 03288 cmp = call_xp_id_compare(tc->xp_id, did.xp_id, 1); 03289 03290 if (cmp == DAZUKO_SAME || (cmp == DAZUKO_CHILD && tc->trust_children)) 03291 { 03292 ret = 1; 03293 03294 if (slotlist != NULL) 03295 *slotlist = sl; 03296 03297 break; 03298 } 03299 else if (cmp == DAZUKO_SUSPICIOUS) 03300 { 03301 DPRINT(("dazuko: detected suspicios activity, removing trusted daemon [%d]\n", did.unique)); 03302 03303 /* remove invalid trusted node */ 03304 tc = _remove_trusted_node(prev, tc, sl); 03305 break; 03306 } 03307 else 03308 { 03309 prev = tc; 03310 tc = tc->next; 03311 } 03312 } 03313 03314 call_xp_read_unlock(&(sl->lock_trusted_list)); 03315 /* UNLOCK */ 03316 03317 if (ret) 03318 break; 03319 #endif 03320 } 03321 03322 call_xp_id_free(did.xp_id); 03323 03324 return ret; 03325 }
|
|
Definition at line 3386 of file dazuko_core.c. References call_xp_print, dazuko_run_daemon(), NULL, XP_ERROR_INTERRUPT, and XP_ERROR_PERMISSION. Referenced by dazuko_sys_generic(), and linux_dazuko_sys_generic(). 03387 { 03388 /* return codes: 03389 * >0 -> access should be blocked 03390 * <0 -> access should be blocked (because user interrupted) 03391 * 0 -> access is allowed 03392 * 2 -> access is not taken care of (unscanned) 03393 */ 03394 03395 int error = 0; 03396 03397 if (kfs == NULL) 03398 { 03399 /* kfs is required */ 03400 03401 call_xp_print("dazuko: kfs=NULL (possible bug)\n"); 03402 03403 return XP_ERROR_PERMISSION; 03404 } 03405 03406 /* check and handle this event */ 03407 error = dazuko_run_daemon(event, kfs, event_p, cached_lookup); 03408 03409 if (error == 2) 03410 { 03411 /* access will be skipped */ 03412 return 2; 03413 } 03414 else if (error > 0) 03415 { 03416 /* access will be blocked */ 03417 03418 return XP_ERROR_PERMISSION; 03419 } 03420 else if (error < 0) 03421 { 03422 /* user interrupted */ 03423 03424 return XP_ERROR_INTERRUPT; 03425 } 03426 03427 /* access allowed */ 03428 03429 return 0; 03430 }
|
|
Definition at line 294 of file dazuko_core.c. 00295 { 00296 va_list ap; 00297 int ret; 00298 00299 va_start(ap, format); 00300 ret = dazuko_vsnprintf(str, size, format, ap); 00301 va_end(ap); 00302 00303 return ret; 00304 }
|
|
Definition at line 834 of file dazuko_core.c. 00835 { 00836 struct daemon_id did; 00837 int ret; 00838 00839 if (xp_id == NULL) 00840 return 0; 00841 00842 did.unique = -1; 00843 did.xp_id = call_xp_id_copy(xp_id); 00844 00845 ret = _dazuko_unregister_daemon(&did); 00846 00847 call_xp_id_free(did.xp_id); 00848 00849 return ret; 00850 }
|
|
Definition at line 176 of file dazuko_core.c. 00177 { 00178 char *target; 00179 const char *end; 00180 int overflow = 0; 00181 char number_buffer[32]; /* 32 should be enough to hold any number, right? */ 00182 const char *s; 00183 00184 if (str == NULL || size < 1 || format == NULL) 00185 return -1; 00186 00187 target = str; 00188 end = (target + size) - 1; 00189 00190 #define DAZUKO_VSNPRINTF_PRINTSTRING \ 00191 for ( ; *s ; s++) \ 00192 { \ 00193 if (target == end) \ 00194 { \ 00195 overflow = 1; \ 00196 goto dazuko_vsnprintf_out; \ 00197 } \ 00198 *target = *s; \ 00199 target++; \ 00200 } 00201 00202 for ( ; *format ; format++) 00203 { 00204 if (target == end) 00205 { 00206 overflow = 1; 00207 goto dazuko_vsnprintf_out; 00208 } 00209 00210 if (*format == '%') 00211 { 00212 format++; 00213 00214 switch (*format) 00215 { 00216 case 's': /* %s */ 00217 s = va_arg(ap, char *); 00218 if (s == NULL) 00219 s = "(null)"; 00220 DAZUKO_VSNPRINTF_PRINTSTRING 00221 break; 00222 00223 case 'd': /* %d */ 00224 sprintf(number_buffer, "%d", va_arg(ap, int)); 00225 s = number_buffer; 00226 DAZUKO_VSNPRINTF_PRINTSTRING 00227 break; 00228 00229 case 'p': /* %p */ 00230 sprintf(number_buffer, "%p", va_arg(ap, void *)); 00231 s = number_buffer; 00232 DAZUKO_VSNPRINTF_PRINTSTRING 00233 break; 00234 00235 case 'c': /* %c */ 00236 *target = va_arg(ap, int); 00237 target++; 00238 break; 00239 00240 case 'l': /* %lu */ 00241 format++; 00242 if (*format != 'u') 00243 { 00244 /* print error message */ 00245 goto dazuko_vsnprintf_out; 00246 } 00247 sprintf(number_buffer, "%lu", va_arg(ap, unsigned long)); 00248 s = number_buffer; 00249 DAZUKO_VSNPRINTF_PRINTSTRING 00250 break; 00251 00252 case '0': /* %02x */ 00253 format++; 00254 if (*format != '2') 00255 { 00256 /* print error message */ 00257 goto dazuko_vsnprintf_out; 00258 } 00259 format++; 00260 if (*format != 'x') 00261 { 00262 /* print error message */ 00263 goto dazuko_vsnprintf_out; 00264 } 00265 sprintf(number_buffer, "%02x", va_arg(ap, int)); 00266 s = number_buffer; 00267 DAZUKO_VSNPRINTF_PRINTSTRING 00268 break; 00269 00270 default: 00271 /* print error message */ 00272 goto dazuko_vsnprintf_out; 00273 } 00274 } 00275 else 00276 { 00277 *target = *format; 00278 target++; 00279 } 00280 } 00281 00282 dazuko_vsnprintf_out: 00283 00284 *target = 0; 00285 00286 /* We are returning what we've written. If there was an 00287 * overflow, the returned value will match "size" rather 00288 * than being less than "size" 00289 */ 00290 00291 return ((target - str) + overflow); 00292 }
|
|
Definition at line 302 of file daz_main.c. 00303 { 00304 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 00305 #ifdef MODULE 00306 if (atomic == &active) 00307 MOD_DEC_USE_COUNT; 00308 #endif 00309 #endif 00310 00311 atomic_dec(&(atomic->atomic)); 00312 return 0; 00313 }
|
|
Definition at line 289 of file daz_main.c. 00290 { 00291 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 00292 #ifdef MODULE 00293 if (atomic == &active) 00294 MOD_INC_USE_COUNT; 00295 #endif 00296 #endif 00297 00298 atomic_inc(&(atomic->atomic)); 00299 return 0; 00300 }
|
|
Definition at line 315 of file daz_main.c. 00316 { 00317 return atomic_read(&(atomic->atomic)); 00318 }
|
|
Definition at line 283 of file daz_main.c. 00284 { 00285 atomic_set(&(atomic->atomic), value); 00286 return 0; 00287 }
|
|
Definition at line 252 of file daz_main.c. 00253 {
00254 return copy_from_user(kernel_dest, user_src, size);
00255 }
|
|
Definition at line 257 of file daz_main.c. 00258 {
00259 return copy_to_user(user_dest, kernel_src, size);
00260 }
|
|
Definition at line 159 of file daz_main.c. 00160 {
00161 return 0;
00162 }
|
|
Definition at line 233 of file daz_main.c. 00234 {
00235 return 0;
00236 }
|
|
Definition at line 197 of file daz_main.c. 00198 {
00199 return 0;
00200 }
|
|
Definition at line 147 of file daz_main.c. 00148 { 00149 down(&(mutex->mutex)); 00150 return 0; 00151 }
|
|
Definition at line 333 of file daz_main.c. 00334 { 00335 int length; 00336 00337 /* make sure we have access to everything */ 00338 00339 if (dfs == NULL) 00340 return -1; 00341 00342 if (dfs->extra_data == NULL) 00343 return -1; 00344 00345 if (dfs->extra_data->dentry == NULL) 00346 return -1; 00347 00348 if (dfs->extra_data->dentry->d_inode == NULL) 00349 return -1; 00350 00351 /* ok, we have everything we need */ 00352 00353 length = rsbac_get_full_path_length(dfs->extra_data->dentry); 00354 if (length < 1) 00355 return -1; 00356 00357 dfs->extra_data->full_filename = xp_malloc(length + 1); 00358 if (dfs->extra_data->full_filename == NULL) 00359 return -1; 00360 00361 /* the full_filename will need to be deleted later */ 00362 dfs->extra_data->free_full_filename = 1; 00363 00364 if (rsbac_get_full_path(dfs->extra_data->dentry, dfs->extra_data->full_filename, length + 1) < 1) 00365 return -1; 00366 00367 /* find the actual value of the length */ 00368 dfs->extra_data->full_filename_length = dazuko_get_filename_length(dfs->extra_data->full_filename); 00369 00370 /* reference copy of full path */ 00371 dfs->filename = dfs->extra_data->full_filename; 00372 00373 dfs->filename_length = dfs->extra_data->full_filename_length; 00374 00375 dfs->file_p.size = dfs->extra_data->dentry->d_inode->i_size; 00376 dfs->file_p.set_size = 1; 00377 dfs->file_p.uid = dfs->extra_data->dentry->d_inode->i_uid; 00378 dfs->file_p.set_uid = 1; 00379 dfs->file_p.gid = dfs->extra_data->dentry->d_inode->i_gid; 00380 dfs->file_p.set_gid = 1; 00381 dfs->file_p.mode = dfs->extra_data->dentry->d_inode->i_mode; 00382 dfs->file_p.set_mode = 1; 00383 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 00384 dfs->file_p.device_type = dfs->extra_data->dentry->d_inode->i_dev; 00385 #else 00386 dfs->file_p.device_type = dfs->extra_data->dentry->d_inode->i_rdev; 00387 #endif 00388 dfs->file_p.set_device_type = 1; 00389 00390 return 0; 00391 }
|
|
Definition at line 246 of file daz_main.c. 00247 {
00248 kfree(ptr);
00249 return 0;
00250 }
|
|
Definition at line 934 of file dazuko_linux.c. 00935 { 00936 if (id1 == NULL || id2 == NULL) 00937 return DAZUKO_DIFFERENT; 00938 00939 /* if file's are available and they match, 00940 * then we say that the id's match 00941 * ("file" is only used to unregister daemons and 00942 * here we allow other processes to do this) 00943 * Note: this is a Linux-only "hack" */ 00944 if (id1->file != NULL && id1->file == id2->file) 00945 return DAZUKO_SAME; 00946 00947 if (id1->pid == id2->pid && id1->current_p == id2->current_p && id1->files == id2->files) 00948 return DAZUKO_SAME; 00949 00950 if (check_related) 00951 { 00952 if (check_parent(id1->current_p, id2->current_p) == 0) 00953 { 00954 return DAZUKO_CHILD; 00955 } 00956 else if (id1->pid == id2->pid || id1->current_p == id2->current_p || id1->files == id2->files) 00957 { 00958 return DAZUKO_SUSPICIOUS; 00959 } 00960 } 00961 00962 return DAZUKO_DIFFERENT; 00963 }
|
|
Definition at line 442 of file daz_main.c. 00443 { 00444 struct xp_daemon_id *ptr; 00445 00446 if (id == NULL) 00447 return NULL; 00448 00449 ptr = (struct xp_daemon_id *)xp_malloc(sizeof(struct xp_daemon_id)); 00450 00451 if (ptr != NULL) 00452 { 00453 ptr->pid = id->pid; 00454 ptr->file = id->file; 00455 } 00456 00457 return ptr; 00458 }
|
|
Definition at line 435 of file daz_main.c. 00436 { 00437 xp_free(id); 00438 00439 return 0; 00440 }
|
|
Definition at line 1006 of file dazuko_linux.c. 01007 {
01008 return -1;
01009 }
|
|
Definition at line 136 of file daz_main.c. 00137 { 00138 #ifdef init_MUTEX 00139 init_MUTEX(&(mutex->mutex)); 00140 #else 00141 sema_init(&(mutex->mutex), 1); 00142 #endif 00143 00144 return 0; 00145 }
|
|
Definition at line 205 of file daz_main.c. 00206 { 00207 init_waitqueue_head(&(queue->queue)); 00208 return 0; 00209 }
|
|
Definition at line 167 of file daz_main.c. 00168 { 00169 rwlock_init(&(rwlock->rwlock)); 00170 return 0; 00171 }
|
|
Definition at line 275 of file daz_main.c. 00276 { 00277 return (path[0] == '/'); 00278 }
|
|
Definition at line 241 of file daz_main.c. 00242 { 00243 return rsbac_kmalloc(size); 00244 }
|
|
Definition at line 227 of file daz_main.c. 00228 { 00229 wake_up(&(queue->queue)); 00230 return 0; 00231 }
|
|
Definition at line 522 of file daz_main.c. 00523 { 00524 va_list args; 00525 char *p; 00526 size_t size = 1024; 00527 00528 p = (char *)xp_malloc(size); 00529 if (!p) 00530 return -1; 00531 00532 va_start(args, fmt); 00533 dazuko_vsnprintf(p, size-1, fmt, args); 00534 va_end(args); 00535 00536 p[size-1] = 0; 00537 00538 rsbac_printk(p); 00539 00540 xp_free(p); 00541 00542 return 0; 00543 }
|
|
Definition at line 185 of file daz_main.c. 00186 { 00187 read_lock(&(rlock->rwlock)); 00188 return 0; 00189 }
|
|
Definition at line 191 of file daz_main.c. 00192 { 00193 read_unlock(&(rlock->rwlock)); 00194 return 0; 00195 }
|
|
Definition at line 995 of file dazuko_linux.c. References xp_daemon_id::pid.
|
|
Definition at line 463 of file daz_main.c. 00464 { 00465 /* Called insmod when inserting the module. */ 00466 00467 /* register the dazuko device */ 00468 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) 00469 dev_major = register_chrdev(CONFIG_RSBAC_DAZ_DEV_MAJOR, DEVICE_NAME, &fops); 00470 00471 devfs_mk_cdev(MKDEV(dev_major, CONFIG_RSBAC_DAZ_DEV_MAJOR), S_IFCHR | S_IRUSR | S_IWUSR, DEVICE_NAME); 00472 #else 00473 #ifdef CONFIG_DEVFS_FS 00474 dev_major = devfs_register_chrdev(CONFIG_RSBAC_DAZ_DEV_MAJOR, DEVICE_NAME, &fops); 00475 devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, 00476 dev_major, 0, S_IFCHR | S_IRUSR | S_IWUSR, 00477 &fops, NULL); 00478 #else 00479 dev_major = register_chrdev(CONFIG_RSBAC_DAZ_DEV_MAJOR, DEVICE_NAME, &fops); 00480 #endif 00481 #endif 00482 if (dev_major < 0) 00483 { 00484 xp_print("dazuko: unable to register device chrdev, err=%d\n", dev_major); 00485 return dev_major; 00486 } 00487 00488 /* initialization complete */ 00489 00490 return 0; 00491 }
|
|
Definition at line 493 of file daz_main.c. 00494 { 00495 /* Called by rmmod when removing the module. */ 00496 00497 int error; 00498 00499 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) 00500 error = unregister_chrdev(dev_major, DEVICE_NAME); 00501 00502 devfs_remove(DEVICE_NAME); 00503 #else 00504 #ifdef CONFIG_DEVFS_FS 00505 error = devfs_unregister_chrdev(dev_major, DEVICE_NAME); 00506 devfs_unregister(devfs_find_handle(NULL, DEVICE_NAME, dev_major, 0, DEVFS_SPECIAL_CHR, 0)); 00507 #else 00508 error = unregister_chrdev(dev_major, DEVICE_NAME); 00509 #endif 00510 #endif 00511 if (error < 0) 00512 { 00513 xp_print("dazuko: error unregistering chrdev, err=%d\n", error); 00514 } 00515 00516 return 0; 00517 }
|
|
Definition at line 153 of file daz_main.c. 00154 { 00155 up(&(mutex->mutex)); 00156 return 0; 00157 }
|
|
Definition at line 267 of file daz_main.c. 00268 {
00269 return 0;
00270 }
|
|
Definition at line 262 of file daz_main.c. 00263 {
00264 return 0;
00265 }
|
|
Definition at line 211 of file daz_main.c. 00212 { 00213 /* wait until cfunction(cparam) != 0 (condition is true) */ 00214 00215 if (allow_interrupt) 00216 { 00217 return wait_event_interruptible(queue->queue, cfunction(cparam) != 0); 00218 } 00219 else 00220 { 00221 wait_event(queue->queue, cfunction(cparam) != 0); 00222 } 00223 00224 return 0; 00225 }
|
|
Definition at line 173 of file daz_main.c. 00174 { 00175 write_lock(&(rwlock->rwlock)); 00176 return 0; 00177 }
|
|
Definition at line 179 of file daz_main.c. 00180 { 00181 write_unlock(&(rwlock->rwlock)); 00182 return 0; 00183 }
|