<<< DISK$DATA:[NOTES$LIBRARY]VAX_VMS.NOTE;1 >>> -< SIG VAX/VMS >- ================================================================================ Note 1187.0 MAILFILE_OPEN ??? 21 replies DECUSF::QUIVOGNE_L 13 lines 27-FEB-1991 11:54 -------------------------------------------------------------------------------- Où l'on revient sur les callables MAIL ... J'ai perdu mon fort peu de latin à essayer d'ouvrir par MAIL$MAILFILE_OPEN un fichier de mail d'un autre user. Invariablement, quels que soient mes privilèges et/ou les combinaisons dans les items MAILFILE_DEFAULT_NAME et MAILFILE_NAME, cette satanée fonction ouvre mon propre fichier de mail... Quelqu'un a-t-il déjà essayé ?? Merci d'avance... - LQ PS : VMS 5.3-1 ================================================================================ Note 1187.1 MAILFILE_OPEN ??? 1 of 21 DECUSF::PERROT_B "IPN Orsay" 1 line 27-FEB-1991 12:23 -< Oui >- -------------------------------------------------------------------------------- ================================================================================ Note 1187.2 MAILFILE_OPEN ??? 2 of 21 DECUSF::OURGHANLIA_B 1 line 27-FEB-1991 16:20 -< Exemple... >- -------------------------------------------------------------------------------- Voir VMS:MALL.C ================================================================================ Note 1187.3 MAILFILE_OPEN ??? 3 of 21 DECUSF::QUIVOGNE_L 1 line 28-FEB-1991 11:38 -< MERCI >- -------------------------------------------------------------------------------- ================================================================================ Note 1187.4 MAILFILE_OPEN ??? 4 of 21 DECUSF::QUIVOGNE_L 13 lines 1-MAR-1991 09:32 -< MAIL$FILE... suite >- -------------------------------------------------------------------------------- Je crois que je me suis mal fait comprendre... Mon but n'est pas d'avoir des informations sur le profil d'un utilisateur quelconque mais d'ouvrir son fichier de MAIL. C'est-à-dire que ma question porte sur la routine MAIL$MAILFILE_OPEN et non sur les MAIL$USER... ou MAIL$MESSAGE...; J'ai bien récupéré avec MAIL$USER... le path de son fichier de mail que je passe comme argument à MAIL$MAILFILE_OPEN mail sans résultat (LE RESULT_SPEC donne mon propre fichier de MAIL). D'avance merci... P.S. MALL.C donné en exemple dans VMS n'utilise que des MAIL$USER... ================================================================================ Note 1187.5 MAILFILE_OPEN ??? 5 of 21 DECUSF::BERENGUIER_A "Alain, ALCATEL BUSINESS SYSTEM" 9 lines 1-MAR-1991 13:06 -< Eventuellement un set file ?. >- -------------------------------------------------------------------------------- Je ne sais pas si cela repond à votre question mais il met arriver d'ouvrir des mails d'utilisateurs, sans pour cela passer par l'interface "callable". En ayant le privilege readall, il suffit sous mail d'effectuer la commande set file "le nom complet du mail.mai de l'utilisateur". Je pense que si cela s'effectue avec les commandes standart de mail, il doit etre possible de l'effectuer avec les callables. ================================================================================ Note 1187.6 MAILFILE_OPEN ??? 6 of 21 DECUSF::BROWN_N "Nick BROWN, Conseil de l'Europe" 66 lines 1-MAR-1991 18:19 -< Here's some code >- -------------------------------------------------------------------------------- It works fine for me, but I have had a few struggles with callable MAIL. I'm using 5.3-1, and the doc is from 5.4, so maybe a few things are done differently. Some of the problems I have met are: - the return length in the itemlist must in many (all) cases point to a longword, not a word as documented (and as implemented by most other VMS routines). - several routines call LIB$SIGNAL if anything goes wrong, so in C or F*rtran, you may want to establish a condition handler. - I couldn't get the default MAIL$_MAILFILE_NAME to work; I had to supply it myself. Anywhere, here is part of my program which works; but I'm typing it, not uploading it from a working version, so caveat utilator (?)... /* * Return actual count of messages for user, or -1 if error occurs. */ int get_new (char *username, char *fulldir) /* fulldir is returned by MAIL$USER_GET_INFO when you specify MAIL$_USER_FULL_DIRECTORY. Typically it is DEV:[USER], etc. */ { int context, status, messages, file_open; char defspec [255]; ITEMLIST mailfile_list_open_in [] = { { 0 /* fill in later */, MAIL$_MAILFILE_DEFAULT_NAME, defspec, 0 }, { strlen("MAIL"), MAIL$_MAILFILE_NAME, "MAIL", 0 },/* see text above */ { 0, 0, 0, 0 } }; strcpy(defspec, fulldir); strcat(defspec, ".MAI"); /* This default doesn't seem to work either */ mailfile_list_open_in[0].buflen = strlen(defspec); /* as promised */ context = 0; status = mail$mailfile_begin(&context, nulllist, nulllist); if (status) ...etc messages = 0; file_open = 0; status = mail$mailfile_open(&context, mailfile_list_open_in, nulllist); /* This might give you MAIL$_NOMSGS (no file), or RMS$_DNF or RMS$_DEV (dir/dev not there). You need a condition handler to catch them. If you are wildcarding for all users, DO NOT RETURN if you get an error; you MUST have a MAILFILE_END to match the BEGIN or you will run out of context blocks after a number of errors. */ if (status == ... etc) else if (status == SS$_NORMAL) { file_open = 1; } if (file_open) { /* You can now read with the message routines */ status = mail$mailfile_close(&context, nulllist, nulllist); } status = mail$mailfile_end(&context, nulllist, nulllist); /* must do this if the _BEGIN worked, see above */ return messages; /* if you were counting. */ } Hope this helps. (Hope you can read C!) ================================================================================ Note 1187.7 MAILFILE_OPEN ??? 7 of 21 DECUSF::LESUEUR_E "Emmanuel le SUEUR - SOGIDEC/YLYS" 11 lines 2-MAR-1991 00:08 -< Use MAIL$_NOSIGNAL ... >- -------------------------------------------------------------------------------- If you want callable MAILs to return error statuses rather than signaling them, you may add an item-descriptor in your input item-lists, as follows: item_list_in (1).buflen = 0 item_list_in (1).code = MAIL$_NOSIGNAL item_list_in (1).address = 0 item_list_in (1).retlen = 0 Hope it'll help too (hope you can read Fortran ;-)) ================================================================================ Note 1187.8 MAILFILE_OPEN ??? 8 of 21 DECUSF::QUIVOGNE_L 5 lines 4-MAR-1991 11:34 -------------------------------------------------------------------------------- Merci à tous !!!... Je vais essayer tout cela rapidement. LQ ================================================================================ Note 1187.9 MAILFILE_OPEN ??? 9 of 21 DECUSF::QUIVOGNE_L 14 lines 5-MAR-1991 12:28 -< GLURPS ! >- -------------------------------------------------------------------------------- APRÈS ESSAI : Sachant qu'il n'y a pas 100 façons de programmer avec la callable, j'ai pu constater que notre source ressemble mot pour mot à celui donné en .6 (en supposant que de COBOL peut ressembler mot pour mot à du C !) et: même punition ! MAIL$MAILFILE_OPEN me renvoie en résult_spec MON fichier de MAIL et non celui spécifié et MAIL$MAILFILE_INFO_FILE me renvoie par la suite des infos sur MON fichier de MAIL... Commençant à douter de ma santé mentale, peut-on me dire si l'exemple donné tourne effectivement en 5.3-1 avec ou sans PATCH de TELEPATCH... Ou alors, je ne sais pas, n'importe quoi, un soupçon d'espoir, un petit conseil amical, BOOUUUUUUUUH !!!! ================================================================================ Note 1187.10 MAILFILE_OPEN ??? 10 of 21 DECUSF::OURGHANLIA_B 222 lines 5-MAR-1991 13:00 -< ! SPRULG >- -------------------------------------------------------------------------------- Creez un fichier MAILDEF.MAR contenant les lignes suivantes : .TITLE MAILDEF $MAILDEF GLOBAL $MAILMSGDEF GLOBAL .END Creez un fichier MAILSAMPLE.COB contenant les lignes suivantes : identification division. program-id. mailsample. environment division. data division. working-storage section. 01 rstatus pic s9(9) comp. 01 notvalid pic s9(9) comp value external MAIL$_OPENIN. 01 nullist. 05 dummy-1 pic s9(18) comp. 05 dummy-2 pic s9(18) comp. 01 file-list. 05 mail-file-name. 07 file-buflen pic s9(4) comp value 255. 07 file-itmcode pic s9(4) comp value external MAIL$_MAILFILE_NAME. 07 pointer value reference mailfile-name. 07 file-retlenadr pic s9(9) comp value 0. 05 mail-file-nosignal. 07 nosignal-buflen pic s9(4) comp value 2. 07 nosignal-itmcode pic s9(4) comp value external MAIL$_NOSIGNAL. 07 filler pic s9(18) comp value 0. 05 file-terminator pic s9(9) comp value 0. 01 in-list. 05 folder-rtn-list. 07 folder-buflen pic s9(4) comp value 4. 07 folder-itmcode pic s9(4) comp value external MAIL$_MAILFILE_FOLDER_ROUTINE. 07 folder-addr pic s9(9) comp value external folder_rtn. 07 folder-retlenadr pic s9(9) comp value 0. 05 user-data-list. 07 usrdata-buflen pic s9(4) comp value 4. 07 usrdata-itmcode pic s9(4) comp value external MAIL$_MAILFILE_USER_DATA. 07 pointer value reference user-data. 07 usrdata-retlenadr pic s9(9) comp value 0. 05 folder-nosignal. 07 folder-nosignal-buflen pic s9(4) comp value 2. 07 folder-nosignal-itmcode pic s9(4) comp value external MAIL$_NOSIGNAL. 07 filler pic s9(18) comp value 0. 05 info-terminator pic s9(9) comp value 0. 01 out-list. 05 out-buflen pic s9(4) comp value 255. 05 out-itmcode pic s9(4) comp value external MAIL$_MAILFILE_RESULTSPEC. 05 pointer value reference resultant-spec. 05 pointer value reference resultant-len. 05 out-terminator pic s9(9) comp value 0. * * User-data is a longword that will be passed to the folder * routine. It will be used as a counter to sum the folders. * 01 user-data pic s9(9) comp value 0. 01 resultant-len pic s9(4) comp. 01 context pic s9(9) comp value 0. 01 mailfile-name pic x(255). 01 mailfile-name-len pic s9(4) comp. 01 resultant-spec pic x(255). procedure division. start-here. * * call 'mail$mailfile_begin' using by reference context by reference nullist nullist giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. * * Prompt for the name the mail file to be opened. The default * is the current mailfile. * display 'Enter location of mail file: '. display ' '. display 'Format: disk:[dir]mail.mai'. display ' '. display 'If disk is the current disk, it can be omitted'. display 'The mail file name can be omitted, MAIL.MAI is the default.'. accept mailfile-name. call 'str$trim' using by descriptor mailfile-name mailfile-name by reference mailfile-name-len giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. * * Open the mailfile. * call 'mail$mailfile_open' using by reference context file-list nullist giving rstatus. if rstatus = notvalid display ' ' display mailfile-name(1:mailfile-name-len) ' is not a valid mailfile specification' call 'sys$exit' using by value 1 end-call else if rstatus is failure call 'lib$stop' using by value rstatus end-if end-if. * * Get a list of all folders in this mailfile. * call 'mail$mailfile_info_file' using by reference context in-list out-list giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. display ' '. display 'Mailfile: ' resultant-spec(1:resultant-len) ' has ' user-data with conversion ' folder(s)'. * * Close the mail file. * call 'mail$mailfile_close' using by reference context nullist nullist giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. * * Terminate mail file processing. * call 'mail$mailfile_end' using by reference context nullist nullist giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. stop run. end program mailsample. * * Folder routine. This routine will display all the folders * in the specified mailfile. The user-data field passed will be * used to count the folders. This routine is called for each folder * in the mailfile. * identification division. program-id. folder_rtn. data division. working-storage section. 01 file-name pic x(255). 01 rstatus pic s9(9) comp. 01 destination-string pic x(255). 01 source-length pic s9(4) comp. 01 file-address pic s9(9) comp. linkage section. 01 user-data pic s9(9) comp. 01 file-descriptor. 03 file-dsc-len pic s9(4) comp. 03 file-dsc-type pic x(1). 03 file-dsc-class pic x(1). 03 file-dsc-address pic s9(9) comp. procedure division using user-data file-descriptor. pastrtn-paragraph. if file-dsc-len > 0 perform display-folders. exit program. display-folders. move file-dsc-address to file-address. move file-dsc-len to source-length. * * Call STR$COPY_R to get the text of the error by using the address * from the descriptor that is passed to the action routine. * call 'str$copy_r' using by descriptor file-name by reference source-length by value file-address giving rstatus. if rstatus is failure call 'lib$stop' using by value rstatus. display file-name(1:source-length). * * Increment the user-data field. * add 1 to user-data. * end program folder_rtn. Compilez, linkez : $ COBOL MAILSAMPLE $ MACRO MAILDEF $ LINK/NOTRACE MAILSAMPLE,MAILDEF It *SHOULD* work..... mais c'est la 3eme fois que je poste du COBOL dans cette messagerie. Si le maitre des robots me voyait..... ================================================================================ Note 1187.11 MAILFILE_OPEN ??? 11 of 21 DECUSF::BROWN_N "Nick BROWN, Conseil de l'Europe" 34 lines 5-MAR-1991 13:56 -< Bring up the heavies >- -------------------------------------------------------------------------------- When the going gets tough, the tough look for access violations. I'm not quite sure how to do the following in COBOL, but if you're the kind of person who call VMS routines, you probably do. Actually, even I think I might know; you probably want to try some FILLERs. Whenever I get this sort of problem I assume that some part of my data is being clobbered by some other part. As I find the VMS debugger too cumbersome (it takes me four hours to remember how to use it, while my typical bug takes 30 minutes to find), I do the following: Change int suspect_this_gets_clobbered; to static int big_luigi [10000]; /* The Italian bodyguard */ static int suspect_this_gets_clobbered; static int big_ron [10000]; ÿû /* The big London bodyguard */ (The static probably isn't necessary, but I find this way works). My guess in this case is that your context var÷³iable is getting clobbered. The sophisticated alternative to Luigi and Ron is to set a watchpoint in the debugger. Try examining the context through the calls to the MAIL$ routines. One more thought; are your username (etc) buffers 255 long ? According to the MAIL$ doc, they can be any length, but I think I remember one or two errors when I had smaller buffers. Note to BO: nothing I could pin down enough to send an SPR, and anyway, I imagine MAIL$ isn't supported in 5.3-1). ================================================================================ Note 1187.12 MAILFILE_OPEN ??? 12 of 21 DECUSF::OURGHANLIA_B 2 lines 5-MAR-1991 15:33 -< Example... >- -------------------------------------------------------------------------------- Please take a look at VMS:COPY_FOLDER.C for a C example including the current documentation deficencies... ================================================================================ Note 1187.13 MAILFILE_OPEN ??? 13 of 21 DECUSF::QUIVOGNE_L 11 lines 5-MAR-1991 16:43 -< toujours pas >- -------------------------------------------------------------------------------- Hélas, trois fois hélas !!! à .10 : Mon code ressemble maintenant exactement à celui donné en exemple (Au grand DAM du maître des borots !) puisqu'il s'agit maintenant de COBOL et que j'utilise effectivement une folder-routine. Ceci dit (belabès), MAIL$MAILFILE... etc etc etc... à .11 : Je ne suis pas sûr que mon anglais m'ait permis de tout comprendre, cependant un SET WATCH sur le contexte de MAILFILE_CONTEXT provoque un access violation (!) mais j'ai pu m'assurer avec des examine bien sentis qu'il ne changeait pas une fois initialisé. ================================================================================ Note 1187.14 MAILFILE_OPEN ??? 14 of 21 DECUSF::OURGHANLIA_B 2 lines 5-MAR-1991 17:45 -< Est-ce que .10 fonctionne ?? >- -------------------------------------------------------------------------------- Est-ce que le code poste en .10 fonctionne chez vous ? Chez-moi, il fonctionne (en V5.3-2 car je n'ai pas de V5.3-1 pour tester...) ================================================================================ Note 1187.15 MAILFILE_OPEN ??? 15 of 21 DECUSF::BROWN_N "Nick BROWN, Conseil de l'Europe" 15 lines 5-MAR-1991 18:59 -< Not so fast >- -------------------------------------------------------------------------------- > comprendre, cependant un SET WATCH sur le contexte de MAILFILE_CONTEXT > provoque un access violation (!) mais j'ai pu m'assurer avec des > examine bien sentis qu'il ne changeait pas une fois initialisé. Hmmm... this sounds very suspicious. The context seems to have a value like %X00643521, ie definitely not something which should get confused with an address (except in huge programs). Have you tried compiling with /NOOPTIMIZE ? Not that I'm suggesting that it might be a compiler bug, but errors often show up differently when you do this. Otherwise, I suppose you'll have to upload the code for the COBOL experts to have a look at it... ================================================================================ Note 1187.16 MAILFILE_OPEN ??? 16 of 21 DECUSF::LESUEUR_E "Emmanuel le SUEUR - SOGIDEC/YLYS" 18 lines 5-MAR-1991 19:17 -< Ca ne marche pas en 5.3-1 >- -------------------------------------------------------------------------------- A .15 : C'est un des gags arrivant parfois avec DEBUG. Quand vous mettez un watch point sur une variable, DEBUG, si je ne m'abuse, met la page la contenant en READONLY. Ainsi, toute ecriture dans cette variable provoque un ACCVIO que DEBUG trappe, ce qui lui permet d' afficher : "old value: xxx - new value: yyyy" Manque de bol, si vous avez, ce qui peut arriver, d'autre variables dans la meme page memoire que celle ou se trouve la variable observée, et si ces variables (des indices de boucles, par exemple...) varient avant LA variable, c'est l'ACCVIO, non-controlé par DEBUG cette fois-ci. En ce qui concerne MAIL$MAILFILE_OPEN, j'ai constaté le meme symptome que LQ en V5.3-1, par contre ca marche en 5.4 ... Les mysteres de l'informatique sont vraiment impenetrables (de lievre). ================================================================================ Note 1187.17 MAILFILE_OPEN ??? 17 of 21 DECUSF::OURGHANLIA_B 2 lines 6-MAR-1991 08:44 -< Ca marche en V5.2-1.... >- -------------------------------------------------------------------------------- Je n'ai pas de systeme en V5.3-1.... mais ca marche en V5.2-1.... et en V5.3-2.... ================================================================================ Note 1187.18 MAILFILE_OPEN ??? 18 of 21 DECUSF::QUIVOGNE_L 2 lines 6-MAR-1991 11:15 -< glourps !... >- -------------------------------------------------------------------------------- EUH... OUI (HONTEUX) le code en .10 marche... C'était comme le suggérait .11 un problème de buffer length. ================================================================================ Note 1187.19 MAILFILE_OPEN ??? 19 of 21 DECUSF::QUIVOGNE_L 4 lines 6-MAR-1991 13:17 -< buffer length = 255 >- -------------------------------------------------------------------------------- Petit complément à la note précédente. COmme le spécifiait .11, le buffer length doit aabsolument être à 255 et non à une valeur entre 0 et 255 (même si c'est la longueur de la spec) auquel cas on obtient les résultats décrits (longuement ci-dessus) ================================================================================ Note 1187.20 MAILFILE_OPEN ??? 20 of 21 DECUSF::BROWN_N "Nick BROWN, Conseil de l'Europe" 4 lines 6-MAR-1991 13:46 -< Hooray (you've found the right bug) >- -------------------------------------------------------------------------------- Can anyone confirm whether the problem I mentioned in .6 (return length is a longword) is a doc bug or a VMS bug ? As far as I know, ALL other itemlists of this type (DVI, JPI, UAI, ...) say that retlen is a pointer to a WORD... ================================================================================ Note 1187.21 MAILFILE_OPEN ??? 21 of 21 DECUSF::LETERSEC_L "Loic Le Tersec (COGITEL)" 11 lines 19-MAR-1991 15:59 -< Trop compliqué pour moi >- -------------------------------------------------------------------------------- En ce qui me concerne, je suis plutot de l'avis de .5 Ne serait-pas plus simple de passer par SET FILE ? Seule precaution, ne pas tenter de faire DIR/NEW qui vous ramenerait directement sur votre file par defaut, mais un DIR NEWMAIL pour selectionner le folder NEWMAIL du fichier distant. La commande COPY permettant de recuperer tout ou partie des informations ainsi obtenues.