00001
00002
00003 #include "inc.h"
00004
00005
00006 PRIVATE struct data_store ds_store[NR_DS_KEYS];
00007 PRIVATE int nr_in_use;
00008
00009 PRIVATE _PROTOTYPE(int find_key, (int key, struct data_store **dsp));
00010 PRIVATE _PROTOTYPE(int set_owner, (struct data_store *dsp, void *auth_ptr));
00011 PRIVATE _PROTOTYPE(int is_authorized, (struct data_store *dsp, void *auth_ptr));
00012
00013
00014 PRIVATE int set_owner(dsp, ap)
00015 struct data_store *dsp;
00016 void *ap;
00017 {
00018
00019 return(TRUE);
00020 }
00021
00022
00023 PRIVATE int is_authorized(dsp, ap)
00024 struct data_store *dsp;
00025 void *ap;
00026 {
00027
00028 return(TRUE);
00029 }
00030
00031
00032 PRIVATE int find_key(key, dsp)
00033 int key;
00034 struct data_store **dsp;
00035 {
00036 register int i;
00037
00038 *dsp = NULL;
00039 for (i=0; i<NR_DS_KEYS; i++) {
00040 if ((ds_store[i].ds_flags & DS_IN_USE) && ds_store[i].ds_key == key) {
00041 *dsp = &ds_store[i];
00042 return(TRUE);
00043 }
00044 }
00045 return(FALSE);
00046 }
00047
00048
00049 PUBLIC int do_publish(m_ptr)
00050 message *m_ptr;
00051 {
00052 struct data_store *dsp;
00053
00054
00055
00056
00057
00058 if (find_key(m_ptr->DS_KEY, &dsp)) {
00059 if (! is_authorized(dsp,m_ptr->DS_AUTH)) {
00060 return(EPERM);
00061 }
00062 }
00063 else {
00064 if (nr_in_use >= NR_DS_KEYS) {
00065 return(EAGAIN);
00066 } else {
00067 dsp = &ds_store[nr_in_use];
00068 dsp->ds_key = m_ptr->DS_KEY;
00069 if (! set_owner(dsp,m_ptr->DS_AUTH)) {
00070 return(EINVAL);
00071 }
00072 dsp->ds_nr_subs = 0;
00073 dsp->ds_flags = DS_IN_USE;
00074 nr_in_use ++;
00075 }
00076 }
00077
00078
00079
00080
00081 dsp->ds_val_l1 = m_ptr->DS_VAL_L1;
00082 dsp->ds_val_l2 = m_ptr->DS_VAL_L2;
00083
00084
00085
00086
00087
00088 if ((dsp->ds_flags & DS_PUBLIC) && dsp->ds_nr_subs > 0) {
00089
00090
00091 }
00092
00093 return(OK);
00094 }
00095
00096
00097 PUBLIC int do_retrieve(m_ptr)
00098 message *m_ptr;
00099 {
00100 struct data_store *dsp;
00101
00102
00103
00104
00105 if (find_key(m_ptr->DS_KEY, &dsp)) {
00106
00107
00108 if (! dsp->ds_flags & DS_PUBLIC) {
00109 if (! is_authorized(dsp,m_ptr->DS_AUTH)) {
00110 return(EPERM);
00111 }
00112 }
00113
00114
00115 printf("DS retrieves data: key %d (found %d), l1 %u, l2 %u\n",
00116 m_ptr->DS_KEY, dsp->ds_key, dsp->ds_val_l1, dsp->ds_val_l2);
00117 m_ptr->DS_VAL_L1 = dsp->ds_val_l1;
00118 m_ptr->DS_VAL_L2 = dsp->ds_val_l2;
00119 return(OK);
00120 }
00121 return(ESRCH);
00122 }
00123
00124
00125 PUBLIC int do_subscribe(m_ptr)
00126 message *m_ptr;
00127 {
00128
00129
00130
00131
00132
00133 return(ENOSYS);
00134 }
00135
00136
00137
00138
00139
00140 PUBLIC int do_getsysinfo(m_ptr)
00141 message *m_ptr;
00142 {
00143 vir_bytes src_addr, dst_addr;
00144 int dst_proc;
00145 size_t len;
00146 int s;
00147
00148 switch(m_ptr->m1_i1) {
00149 case SI_DATA_STORE:
00150 src_addr = (vir_bytes) ds_store;
00151 len = sizeof(struct data_store) * NR_DS_KEYS;
00152 break;
00153 default:
00154 return(EINVAL);
00155 }
00156
00157 dst_proc = m_ptr->m_source;
00158 dst_addr = (vir_bytes) m_ptr->m1_p1;
00159 if (OK != (s=sys_datacopy(SELF, src_addr, dst_proc, dst_addr, len)))
00160 return(s);
00161 return(OK);
00162 }
00163