comparison src/dbusbind.c @ 93156:3ef12fa772f2

* dbusbind.c (xd_read_message): Removed extra copying of message strings. Check for NULL `interface' or `member'.
author Michael Albinus <michael.albinus@gmx.de>
date Sun, 23 Mar 2008 16:45:39 +0000
parents f42bf2712087
children 629d4147200e
comparison
equal deleted inserted replaced
93155:09cc3d0d41ce 93156:3ef12fa772f2
163 ? XD_SYMBOL_TO_DBUS_TYPE (CAR_SAFE (object)) \ 163 ? XD_SYMBOL_TO_DBUS_TYPE (CAR_SAFE (object)) \
164 : DBUS_TYPE_ARRAY) \ 164 : DBUS_TYPE_ARRAY) \
165 : DBUS_TYPE_INVALID) 165 : DBUS_TYPE_INVALID)
166 166
167 /* Return a list pointer which does not have a Lisp symbol as car. */ 167 /* Return a list pointer which does not have a Lisp symbol as car. */
168 #define XD_NEXT_VALUE(object) \ 168 #define XD_NEXT_VALUE(object) \
169 ((XD_DBUS_TYPE_P (CAR_SAFE (object))) ? CDR_SAFE (object) : object) 169 ((XD_DBUS_TYPE_P (CAR_SAFE (object))) ? CDR_SAFE (object) : object)
170 170
171 /* Compute SIGNATURE of OBJECT. It must have a form that it can be 171 /* Compute SIGNATURE of OBJECT. It must have a form that it can be
172 used in dbus_message_iter_open_container. DTYPE is the DBusType 172 used in dbus_message_iter_open_container. DTYPE is the DBusType
173 the object is related to. It is passed as argument, because it 173 the object is related to. It is passed as argument, because it
1138 DBusConnection *connection; 1138 DBusConnection *connection;
1139 DBusMessage *dmessage; 1139 DBusMessage *dmessage;
1140 DBusMessageIter iter; 1140 DBusMessageIter iter;
1141 unsigned int dtype; 1141 unsigned int dtype;
1142 int mtype; 1142 int mtype;
1143 char uname[DBUS_MAXIMUM_NAME_LENGTH]; 1143 const char *uname, *path, *interface, *member;
1144 char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */
1145 char interface[DBUS_MAXIMUM_NAME_LENGTH];
1146 char member[DBUS_MAXIMUM_NAME_LENGTH];
1147 1144
1148 /* Open a connection to the bus. */ 1145 /* Open a connection to the bus. */
1149 connection = xd_initialize (bus); 1146 connection = xd_initialize (bus);
1150 1147
1151 /* Non blocking read of the next available message. */ 1148 /* Non blocking read of the next available message. */
1173 args = Fnreverse (args); 1170 args = Fnreverse (args);
1174 } 1171 }
1175 1172
1176 /* Read message type, unique name, object path, interface and member 1173 /* Read message type, unique name, object path, interface and member
1177 from the message. */ 1174 from the message. */
1178 mtype = dbus_message_get_type (dmessage); 1175 mtype = dbus_message_get_type (dmessage);
1179 strcpy (uname, dbus_message_get_sender (dmessage)); 1176 uname = dbus_message_get_sender (dmessage);
1180 strcpy (path, dbus_message_get_path (dmessage)); 1177 path = dbus_message_get_path (dmessage);
1181 strcpy (interface, dbus_message_get_interface (dmessage)); 1178 interface = dbus_message_get_interface (dmessage);
1182 strcpy (member, dbus_message_get_member (dmessage)); 1179 member = dbus_message_get_member (dmessage);
1180
1181 /* dbus-registered-functions-table requires non nil interface and member. */
1182 if ((NULL == interface) || (NULL == member))
1183 goto cleanup;
1183 1184
1184 XD_DEBUG_MESSAGE ("Event received: %d %s %s %s %s %s", 1185 XD_DEBUG_MESSAGE ("Event received: %d %s %s %s %s %s",
1185 mtype, uname, path, interface, member, 1186 mtype, uname, path, interface, member,
1186 SDATA (format2 ("%s", args, Qnil))); 1187 SDATA (format2 ("%s", args, Qnil)));
1187 1188
1208 event.frame_or_window = Qnil; 1209 event.frame_or_window = Qnil;
1209 event.arg = Fcons (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))), 1210 event.arg = Fcons (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))),
1210 args); 1211 args);
1211 1212
1212 /* Add uname, path, interface and member to the event. */ 1213 /* Add uname, path, interface and member to the event. */
1213 event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), 1214 event.arg = Fcons (build_string (member), event.arg);
1214 event.arg); 1215 event.arg = Fcons (build_string (interface), event.arg);
1215 event.arg = Fcons ((interface == NULL
1216 ? Qnil : build_string (interface)),
1217 event.arg);
1218 event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), 1216 event.arg = Fcons ((path == NULL ? Qnil : build_string (path)),
1219 event.arg); 1217 event.arg);
1220 event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)), 1218 event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)),
1221 event.arg); 1219 event.arg);
1222 1220
1233 kbd_buffer_store_event (&event); 1231 kbd_buffer_store_event (&event);
1234 } 1232 }
1235 value = CDR_SAFE (value); 1233 value = CDR_SAFE (value);
1236 } 1234 }
1237 1235
1238 /* Cleanup. */ 1236 cleanup:
1239 dbus_message_unref (dmessage); 1237 dbus_message_unref (dmessage);
1240 RETURN_UNGCPRO (Qnil); 1238 RETURN_UNGCPRO (Qnil);
1241 } 1239 }
1242 1240
1243 /* Read queued incoming messages from the system and session buses. */ 1241 /* Read queued incoming messages from the system and session buses. */