| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | |
| 28 | |
| 29 | |
| 30 | |
| 31 | |
| 32 | |
| 33 | |
| 34 | |
| 35 | #ifdef HAVE_CONFIG_H1 |
| 36 | #include <config.h> |
| 37 | #endif |
| 38 | |
| 39 | #ifdef SYSVNET |
| 40 | #include <interlan/il_types.h> |
| 41 | #define __TYPES__ /* prevent #include <sys/types.h> in Xlib.h */ |
| 42 | #include <interlan/netdb.h> |
| 43 | #include <interlan/socket.h> |
| 44 | #endif /* SYSVNET */ |
| 45 | |
| 46 | #include <X11/IntrinsicP.h> |
| 47 | #include <X11/Xatom.h> |
| 48 | #include <X11/ShellP.h> |
| 49 | #ifdef XTHREADS |
| 50 | #include <X11/Xthreads.h> |
| 51 | #endif |
| 52 | #include <stdio.h> |
| 53 | |
| 54 | #ifndef SYSVNET |
| 55 | #ifdef WIN32 |
| 56 | #include <X11/Xwinsock.h> |
| 57 | #define XOS_USE_MTSAFE_NETDBAPI |
| 58 | #else |
| 59 | #ifndef Lynx |
| 60 | #include <sys/socket.h> |
| 61 | #else |
| 62 | #include <sys/types.h> |
| 63 | #include <socket.h> |
| 64 | #endif |
| 65 | #define XOS_USE_XT_LOCKING |
| 66 | #endif |
| 67 | #define X_INCLUDE_NETDB_H |
| 68 | #include <X11/Xos_r.h> |
| 69 | #endif |
| 70 | |
| 71 | #include <X11/Xos.h> |
| 72 | #include <stdlib.h> |
| 73 | #include "Atoms.h" |
| 74 | #include "StdSel.h" |
| 75 | #include "SysUtil.h" |
| 76 | #include <X11/Xfuncs.h> |
| 77 | |
| 78 | #ifndef OS_NAME |
| 79 | #ifndef X_OS_FILE |
| 80 | #ifdef SYSV /* keep separate until makedepend fixed */ |
| 81 | #define USE_UNAME |
| 82 | #endif |
| 83 | #ifdef SVR4 |
| 84 | #define USE_UNAME |
| 85 | #endif |
| 86 | #ifdef ultrix |
| 87 | #define USE_UNAME |
| 88 | #endif |
| 89 | #ifdef CSRG_BASED |
| 90 | #define USE_UNAME |
| 91 | #endif |
| 92 | #endif /*X_OS_FILE*/ |
| 93 | #ifdef USE_UNAME |
| 94 | #include <sys/utsname.h> |
| 95 | #endif |
| 96 | #endif |
| 97 | |
| 98 | |
| 99 | |
| 100 | |
| 101 | static char *get_os_name(void); |
| 102 | static Boolint isApplicationShell(Widget); |
| 103 | |
| 104 | |
| 105 | |
| 106 | |
| 107 | static char * |
| 108 | get_os_name(void) |
| 109 | { |
| 110 | #ifdef OS_NAME |
| 111 | return XtNewString(OS_NAME)((OS_NAME) != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen( OS_NAME) + 1), OS_NAME)) : ((void*)0)); |
| 112 | #else |
| 113 | #if defined(X_OS_FILE) || defined(MOTD_FILE) |
| 114 | FILE *f = NULL((void*)0); |
| 115 | #endif |
| 116 | |
| 117 | #ifdef USE_UNAME |
| 118 | struct utsname utss; |
| 119 | |
| 120 | if (uname (&utss) >= 0) { |
| 121 | char *os_name; |
| 122 | int len = strlen(utss.sysname) + 1; |
| 123 | #ifndef hpux /* because of hostname length crock */ |
| 124 | len += 2 + strlen(utss.release); |
| 125 | #endif |
| 126 | os_name = XtMalloc (len); |
| 127 | strcpy (os_name, utss.sysname); |
| 128 | #ifndef hpux |
| 129 | strcat (os_name, " "); |
| 130 | strcat (os_name, utss.release); |
| 131 | #endif |
| 132 | return os_name; |
| 133 | } |
| 134 | #endif |
| 135 | |
| 136 | #ifdef X_OS_FILE |
| 137 | f = fopen(X_OS_FILE, "r"); |
| 138 | if (!f) |
| 139 | #endif |
| 140 | #ifdef MOTD_FILE |
| 141 | f = fopen(MOTD_FILE, "r"); |
| 142 | #endif |
| 143 | #if defined(X_OS_FILE) || defined(MOTD_FILE) |
| 144 | if (f) { |
| 145 | char motd[512]; |
| 146 | motd[0] = '\0'; |
| 147 | (void) fgets(motd, 511, f); |
| 148 | fclose(f); |
| 149 | motd[511] = '\0'; |
| 150 | if (motd[0] != '\0') { |
| 151 | int len = strlen(motd); |
| 152 | if (motd[len - 1] == '\n') |
| 153 | motd[len - 1] = '\0'; |
| 154 | return XtNewString(motd)((motd) != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen(motd ) + 1), motd)) : ((void*)0)); |
| 155 | } |
| 156 | } |
| 157 | #endif |
| 158 | |
| 159 | #ifdef sun |
| 160 | return XtNewString("SunOS")(("SunOS") != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen( "SunOS") + 1), "SunOS")) : ((void*)0)); |
| 161 | #else |
| 162 | # if !defined(SYSV) && (defined(CSRG_BASED) || defined(unix1)) |
| 163 | return XtNewString("BSD")(("BSD") != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen("BSD" ) + 1), "BSD")) : ((void*)0)); |
| 164 | # else |
| 165 | return NULL((void*)0); |
| 166 | # endif |
| 167 | #endif |
| 168 | |
| 169 | #endif /*OS_NAME*/ |
| 170 | } |
| 171 | |
| 172 | |
| 173 | |
| 174 | |
| 175 | |
| 176 | |
| 177 | |
| 178 | |
| 179 | |
| 180 | static Boolint |
| 181 | isApplicationShell(Widget w) |
| 182 | { |
| 183 | register WidgetClass c; |
| 184 | |
| 185 | if (!XtIsTopLevelShell(w)(((Object)(w))->object.widget_class->core_class.class_inited & 0x80)) |
| 186 | return False0; |
| 187 | for (c = XtClass(w)((w)->core.widget_class); c; c = c->core_class.superclass) { |
| 188 | if (!strcmp(c->core_class.class_name, "ApplicationShell")) |
| 189 | return True1; |
| 190 | } |
| 191 | return False0; |
| 192 | } |
| 193 | |
| 194 | Boolean |
| 195 | XmuConvertStandardSelection(Widget w, Time time, Atom *selection, Atom *target, |
| 196 | Atom *type, XPointer *value, |
| 197 | unsigned long *length, int *format) |
| 198 | { |
| 199 | Display *d = XtDisplay(w)(((w)->core.screen)->display); |
| 200 | if (*target == XA_TIMESTAMP(d)XmuInternAtom(d, _XA_TIMESTAMP)) { |
| |
| 201 | *value = XtMalloc(4); |
| 202 | if (sizeof(long) == 4) |
| 203 | *(long*)*value = time; |
| 204 | else { |
| 205 | long temp = time; |
| 206 | (void) memmove((char*)*value, ((char*)&temp)+sizeof(long)-4, 4); |
| 207 | } |
| 208 | *type = XA_INTEGER((Atom) 19); |
| 209 | *length = 1; |
| 210 | *format = 32; |
| 211 | return True1; |
| 212 | } |
| 213 | if (*target == XA_HOSTNAME(d)XmuInternAtom(d, _XA_HOSTNAME)) { |
| |
| 214 | char hostname[1024]; |
| 215 | hostname[0] = '\0'; |
| 216 | *length = XmuGetHostname (hostname, sizeof hostname); |
| 217 | *value = XtNewString(hostname)((hostname) != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen (hostname) + 1), hostname)) : ((void*)0)); |
| 218 | *type = XA_STRING((Atom) 31); |
| 219 | *format = 8; |
| 220 | return True1; |
| 221 | } |
| 222 | #if defined(TCPCONN1) |
| 223 | if (*target == XA_IP_ADDRESS(d)XmuInternAtom(d, _XA_IP_ADDRESS)) { |
| |
| 224 | char hostname[1024]; |
| 225 | #ifdef XTHREADS_NEEDS_BYNAMEPARAMS |
| 226 | _Xgethostbynameparams hparams; |
| 227 | #endif |
| 228 | struct hostent *hostp; |
| 229 | |
| 230 | hostname[0] = '\0'; |
| 231 | (void) XmuGetHostname (hostname, sizeof hostname); |
| 232 | |
| 233 | if ((hostp = _XGethostbyname (hostname,hparams)gethostbyname((hostname))) == NULL((void*)0)) |
| 234 | return False0; |
| 235 | |
| 236 | if (hostp->h_addrtype != AF_INET2) return False0; |
| 237 | *length = hostp->h_length; |
| 238 | *value = XtMalloc(*length); |
| 239 | (void) memmove (*value, hostp->h_addrh_addr_list[0], *length); |
| 240 | *type = XA_NET_ADDRESS(d)XmuInternAtom(d, _XA_NET_ADDRESS); |
| 241 | *format = 8; |
| 242 | return True1; |
| 243 | } |
| 244 | #endif |
| 245 | #ifdef DNETCONN |
| 246 | if (*target == XA_DECNET_ADDRESS(d)XmuInternAtom(d, _XA_DECNET_ADDRESS)) { |
| 247 | return False0; |
| 248 | } |
| 249 | #endif |
| 250 | if (*target == XA_USER(d)XmuInternAtom(d, _XA_USER)) { |
| |
| 251 | char *name = (char*)getenv("USER"); |
| 252 | if (name == NULL((void*)0)) return False0; |
| 253 | *value = XtNewString(name)((name) != ((void*)0) ? (strcpy(XtMalloc((unsigned)strlen(name ) + 1), name)) : ((void*)0)); |
| 254 | *type = XA_STRING((Atom) 31); |
| 255 | *length = strlen(name); |
| 256 | *format = 8; |
| 257 | return True1; |
| 258 | } |
| 259 | if (*target == XA_CLASS(d)XmuInternAtom(d, _XA_CLASS)) { |
| |
| 260 | Widget parent = XtParent(w)((w)->core.parent); |
| 261 | char *class; |
| 262 | int len; |
| 263 | while (parent != NULL((void*)0) && !isApplicationShell(w)) { |
| 264 | w = parent; |
| 265 | parent = XtParent(w)((w)->core.parent); |
| 266 | } |
| 267 | if (isApplicationShell(w)) |
| 268 | class = ((ApplicationShellWidget) w)->application.class; |
| 269 | else |
| 270 | class = XtClass(w)((w)->core.widget_class)->core_class.class_name; |
| 271 | *length = (len=strlen(w->core.name)) + strlen(class) + 2; |
| 272 | *value = XtMalloc(*length); |
| 273 | strcpy( (char*)*value, w->core.name ); |
| 274 | strcpy( (char*)*value+len+1, class ); |
| 275 | *type = XA_STRING((Atom) 31); |
| 276 | *format = 8; |
| 277 | return True1; |
| 278 | } |
| 279 | if (*target == XA_NAME(d)XmuInternAtom(d, _XA_NAME)) { |
| |
| 280 | Widget parent = XtParent(w)((w)->core.parent); |
| 281 | |
| 282 | while (parent != NULL((void*)0) && !XtIsWMShell(w)(((Object)(w))->object.widget_class->core_class.class_inited & 0x40)) { |
| 7 | Assuming 'parent' is equal to null |
|
| 8 | Loop condition is false. Execution continues on line 286 |
|
| 283 | w = parent; |
| 284 | parent = XtParent(w)((w)->core.parent); |
| 285 | } |
| 286 | if (!XtIsWMShell(w)(((Object)(w))->object.widget_class->core_class.class_inited & 0x40)) return False0; |
| |
| 287 | *value = XtNewString( ((WMShellWidget) w)->wm.title )((((WMShellWidget) w)->wm.title) != ((void*)0) ? (strcpy(XtMalloc ((unsigned)strlen(((WMShellWidget) w)->wm.title) + 1), ((WMShellWidget ) w)->wm.title)) : ((void*)0)); |
| 288 | *length = strlen(*value); |
| 10 | Null pointer passed as an argument to a 'nonnull' parameter |
|
| 289 | *type = XA_STRING((Atom) 31); |
| 290 | *format = 8; |
| 291 | return True1; |
| 292 | } |
| 293 | if (*target == XA_CLIENT_WINDOW(d)XmuInternAtom(d, _XA_CLIENT_WINDOW)) { |
| 294 | Widget parent = XtParent(w)((w)->core.parent); |
| 295 | while (parent != NULL((void*)0)) { |
| 296 | w = parent; |
| 297 | parent = XtParent(w)((w)->core.parent); |
| 298 | } |
| 299 | *value = XtMalloc(sizeof(Window)); |
| 300 | *(Window*)*value = w->core.window; |
| 301 | *type = XA_WINDOW((Atom) 33); |
| 302 | *length = 1; |
| 303 | *format = 32; |
| 304 | return True1; |
| 305 | } |
| 306 | if (*target == XA_OWNER_OS(d)XmuInternAtom(d, _XA_OWNER_OS)) { |
| 307 | *value = get_os_name(); |
| 308 | if (*value == NULL((void*)0)) return False0; |
| 309 | *type = XA_STRING((Atom) 31); |
| 310 | *length = strlen(*value); |
| 311 | *format = 8; |
| 312 | return True1; |
| 313 | } |
| 314 | if (*target == XA_TARGETS(d)XmuInternAtom(d, _XA_TARGETS)) { |
| 315 | #if defined(unix1) && defined(DNETCONN) |
| 316 | # define NUM_TARGETS8 9 |
| 317 | #else |
| 318 | # if defined(unix1) || defined(DNETCONN) |
| 319 | # define NUM_TARGETS8 8 |
| 320 | # else |
| 321 | # define NUM_TARGETS8 7 |
| 322 | # endif |
| 323 | #endif |
| 324 | Atom* std_targets = (Atom*)XtMalloc(NUM_TARGETS8*sizeof(Atom)); |
| 325 | int i = 0; |
| 326 | std_targets[i++] = XA_TIMESTAMP(d)XmuInternAtom(d, _XA_TIMESTAMP); |
| 327 | std_targets[i++] = XA_HOSTNAME(d)XmuInternAtom(d, _XA_HOSTNAME); |
| 328 | std_targets[i++] = XA_IP_ADDRESS(d)XmuInternAtom(d, _XA_IP_ADDRESS); |
| 329 | std_targets[i++] = XA_USER(d)XmuInternAtom(d, _XA_USER); |
| 330 | std_targets[i++] = XA_CLASS(d)XmuInternAtom(d, _XA_CLASS); |
| 331 | std_targets[i++] = XA_NAME(d)XmuInternAtom(d, _XA_NAME); |
| 332 | std_targets[i++] = XA_CLIENT_WINDOW(d)XmuInternAtom(d, _XA_CLIENT_WINDOW); |
| 333 | #ifdef unix1 |
| 334 | std_targets[i++] = XA_OWNER_OS(d)XmuInternAtom(d, _XA_OWNER_OS); |
| 335 | #endif |
| 336 | #ifdef DNETCONN |
| 337 | std_targets[i++] = XA_DECNET_ADDRESS(d)XmuInternAtom(d, _XA_DECNET_ADDRESS); |
| 338 | #endif |
| 339 | *value = (XPointer)std_targets; |
| 340 | *type = XA_ATOM((Atom) 4); |
| 341 | *length = NUM_TARGETS8; |
| 342 | *format = 32; |
| 343 | return True1; |
| 344 | } |
| 345 | |
| 346 | return False0; |
| 347 | } |